GB/T 38674-2020 信息安全技术 应用软件安全编程指南
GB/T 38674-2020 Information security technology—Guideline on secure coding of application software
基本信息
本标准适用于客户端/服务器架构的应用软件开发,其他架构的应用软件开发也可参照使用,并根据其应用环境的特性补充必要的安全防护措施。
发布历史
-
2020年04月
研制信息
- 起草单位:
- 国家计算机网络应急技术处理协调中心、北京邮电大学、北京奇虎测腾安全技术有限公司、中国电力科学研究院有限公司、上海计算机软件技术开发中心、海通证券股份有限公司、北京银行股份有限公司、信息安全共性技术国家工程研究中心
- 起草人:
- 舒敏、王博、吴倩、王文磊、黄元飞、张家旺、林星辰、陈禹、王鹏翩、李燕伟、高强、杨鹏、陈亮、范乐君、张晓娜、杜薇、夏剑锋、李晔、张淼、徐国爱、郭燕慧、李祺、杨昕雨、王晨宇、葛慧晗、黄永刚、韩建、章磊、王彦杰、胡建勋、李凌
- 出版信息:
- 页数:134页 | 字数:257 千字 | 开本: 大16开
内容描述
35.040
0
中华人民共和国国家标准
—
386742020
应用软件安全编程指南
20200428发布
国家市场监督管理总局
发布
国家标准化管理委员会
目次
前言…………………………Ⅰ
1范围………………………1
2规范性引用文件…………………………1
术语和定义缩略语
3、………………………1
3.1术语和定义…………………………1
3.2缩略语………………3
4概述………………………3
5安全功能实现……………4
5.1数据清洗……………4
5.2数据加密与保护……………………5
5.3访问控制……………6
5.4日志安全……………8
6代码实现安全……………9
6.1面向对象程序安全…………………9
6.2并发程序安全………………………10
6.3函数调用安全………………………10
6.4异常处理安全………………………11
6.5指针安全……………11
6.6代码生成安全………………………11
7资源使用安全……………12
7.1资源管理……………12
7.2内存管理……………12
7.3数据库管理…………………………13
7.4文件管理……………13
7.5网络传输……………14
8环境安全…………………15
8.1第三方软件使用安全………………15
8.2开发环境安全………………………15
8.3运行环境安全………………………16
附录(资料性附录)代码示例…………
A17
A.1概述………………17
A.2安全功能实现……………………17
A.3代码实现安全……………………48
A.4资源使用安全……………………98
A.5环境安全…………………………129
参考文献……………………131
前言
本标准按照/—给出的规则起草。
GBT112009
Ⅰ
应用软件安全编程指南
1范围
本标准提出了应用软件安全编程的通用框架从提升软件安全性的角度对应用软件编程过程进行
,
指导。
本标准适用于客户端服务器架构的应用软件开发其他架构的应用软件开发也可参照使用并根
/,,
据其应用环境的特性补充必要的安全防护措施。
2规范性引用文件
下列文件对于本文件的应用是必不可少的凡是注日期的引用文件仅注日期的版本适用于本文
。,
件。,()。
凡是不注日期的引用文件其最新版本包括所有的修改单适用于本文件
术语和定义缩略语
3、
3.1术语和定义
界定的以及下列术语和定义适用于本文件为了便于使用以下重复列出了
/—。,
GBT250692010
/—中的某些术语和定义。
GBT250692010
3.1.1
缓冲区溢出犫狌犳犳犲狉狅狏犲狉犳犾狅狑
,,,
向程序的缓冲区写入超出其长度的内容从而破坏程序堆栈使程序转而执行其他指令以获取程
序或系统的控制权。
3.1.2
命令注入犮狅犿犿犪狀犱犻狀犲犮狋犻狅狀
犼
,。
通过应用程序将用户输入的恶意内容拼接到命令中并提交给后台引擎执行的攻击行为
3.1.3
应用软件日志犪犾犻犮犪狋犻狅狀狊狅犳狋狑犪狉犲犾狅
狆狆犵
用于记录系统操作事件的文件集合。
3.1.4
线程安全狋犺狉犲犪犱狊犪犳犲
某个函数函数库在多线程环境中被调用时能够正确地处理多个线程之间的共享变量使程序功能
、,
正确执行的能力。
3.1.5
线程同步狋犺狉犲犪犱狊狀犮犺狉狅狀犻狕犪狋犻狅狀
狔
多个线程通过特定手段来控制线程之间执行顺序的一种机制。
注:,,,,
当有一个线程在对内存进行操作时其他线程就不能对该内存地址执行操作直到该线程操作完成此时其他
线程被设置处于等待状态。
1
/—
犌犅犜386742020
3.1.6
死锁犱犲犪犱犾狅犮犽
,。
两个或两个以上的进程在执行过程中因竞争资源或彼此通信而造成的一种阻塞现象
3.1.7
阻塞犫犾狅犮犽
进程线程暂停执行过程等待请求被应答的状态
/,。
3.1.8
游标犮狌狉狊狅狉
一种用于操纵数据库查询返回的多行结果集的机制。
3.1.9
敏感数据狊犲狀狊犻狋犻狏犲犱犪狋犪
必须受保护的其泄露修改破坏或丢失会对人或事产生可预知的损害的信息
,、、。
注常见的敏感数据包括但不限于身份鉴别数据会话标识符口令连接字符串等
:、、、。
3.1.10
秘密数据狊犲犮狉犲狋犱犪狋犪
为了执行特定安全功能策略只能由授权用户或被评对象安全功能知晓的信息
,。
3.1.11
添加变量狊犪犾狋
作为单向函数或加密函数的二次输入而加入的随机变量可用于导出口令验证数据
,。
[定义
/—,]
GBT2506920102.2.2.186
3.1.12
信任边界狋狉狌狊狋犫狅狌狀犱犪狉
狔
由编程人员直接控制的系统部件组成。
3.1.13
线程挂起狋犺狉犲犪犱狊狌狊犲狀狊犻狅狀
狆
暂停线程运行的操作。
注:,。
在线程挂起后可以通过重新唤醒线程使之恢复运行
3.1.14
异常犲狓犮犲狋犻狅狀
狆
导致程序中断运行的一种指令流。
注:,。
如果不对异常进行正确的处理则可能导致程序的中断执行
3.1.15
错误犲狉狉狅狉
系统运行中出现的可能导致系统崩溃或者暂停运行的非预期问题。
3.1.16
硬编码犺犪狉犱犮狅犱犲
在编码过程中将可变变量用一个固定数值表示。
3.1.17
封装犲狀犮犪狊狌犾犪狋犻狅狀
狆
将系统功能一组数据和在这些数据上的操作隔离在一个模块中并为该模块提供精确的规格说明
、,
的软件开发技术。
2
/—
犌犅犜386742020
3.1.18
泛型犲狀犲狉犻犮狋犲
犵狔狆
程序设计语言的一种特性。
注:,,
通过引入参数化数据类型允许程序员在强类型程序设计语言中定义类型时包含一些可变部分这些部分在使
用前应作出指明。
3.1.19
堆污染犺犲犪狅犾犾狌狋犻狅狀
狆狆
当将一个参数化的数据类型指向一个对象而该对象不是参数化数据类型或不是同类型的参数化
,,
数据类型时,。
会产生堆污染
3.1.20
嵌套类狀犲狊狋犲犱犮犾犪狊狊
声明在另一个类或接口代码块中的任意类。
3.1.21
并发程序犮狅狀犮狌狉狉犲狀狋狉狅狉犪犿
狆犵
、,。
可通过多进程多线程机制实现的允许在同一时间段执行多个程序模块的机制
3.2缩略语
下列缩略语适用于本文件。
:()
API应用程序编程接口AlicationProramminInterface
ppgg
域名系统
:()
DNSDomainNameSstem
y
文件传输协议
:()
FTPFileTransferProtocol
:()
HTTP超级文本传输协议HerTextTransferProtocol
yp
互联网消息访问协议
:()
IMAPInternetMessaeAccessProtocol
g
轻量目录访问协议
:()
LDAPLihtweihtDirectorAccessProtocol
ggy
邮局协议
:()
POPPostOfficeProtocol
:()
SQL结构化查询语言StructuredQuerLanuae
ygg
安全套接子层
:()
SSLSecureSocketsLaer
y
传输层安全
:()
TLSTransortLaerSecurit
pyy
:统一资源定位符()
URLUniformResourceLocator
:()
UTF8针对Unicode的可变长度字符编码8bitUnicodeTransformationFormat
:()
XML可扩展置标语言ExtensibleMarkuLanuae
pgg
4概述
。,
本标准从程序安全和环境安全两个方面提出了提升应用软件安全性的编程最佳实践其中程序
代码实现安全功能方面的安全技术规范环境安全部分描述软件的安
安全部分描述软件在资源使用、、,
全管理配置规范。图给出了应用软件编程安全框架。
1
3
/—
犌犅犜386742020
图应用软件编程安全框架
1
5安全功能实现
5.1数据清洗
5.1.1输入验证
应用软件需确保对所有输入到应用的数据进行验证拒绝接受验证失败的数据在设计和实现数
,。
据验证功能时需重点关注以下方面内容包括但不限于
,:
验证所有输入数据的安全性包括但不限于
a),:
———检测输入数据的数据类型。
———检测输入数据的长度验证允许输入的最小和最大长度
,。
———检测输入数据的值包括进行最小值最大值边界值检查
,、。
验证文件的安全性见
———[)]。
7.4c
b)特别关注如下场景的数据验证:
,,,,
———验证来自HTTP请求中的所有数据恶意数据可以从表单域URL参数cookieHTTP
头以及URL自身传入。
验证来自重定向输入的数据攻击者可能向重定向的目标直接提交恶意代码从而避开
。,
———
所以对重定向输入数据需再次验证
应用程序逻辑以及在重定向前执行的验证,。
对来自命令行环境以及配置文件的输入进行校验
、。
———
———对发送给文件系统浏览器数据库或者其他系统的命令进行验证防止采用不可信来源
、、,
的数据构建命令。
对重要业务操作相关的输入数据验证数据的真实性和完整性宜验证数据发送方的数字签
),,
c
名,。
以确认数据发送方的身份
对输入的数据进行过滤或标准化处理然后进行验证
d),。
4
/—
犌犅犜386742020
),
e禁止试图对验证失败的数据进行修复自动错误恢复代码很可能改变请求的初始意图或者截
断验证逻辑。
)在可信任环境中执行输入验证。
f
集中输入验证把输入验证作为软件框架的一部分为应用程序提供一个统一的输入验证
g),,
策略。
为所有输入明确恰当的字符集例如确定系统是否支持扩展字符集如果支
),:。,
hUTF8UTF8
持在解码完成以后进行输入验证
,UTF8。
在程序中定义清晰的信任边界将可信和不可信数据比如数据库文件流分别存储当数
),(:,)。
i
,。
据要从不可信的一侧传输到可信一侧的时候使用验证逻辑进行判断
相关的规范和不规范的代码示例参见附录的。
AA.2.1.1
5.1.2输出净化
,。
应用软件需对所有输出到客户端的来自于应用程序信任边界之外的数据进行净化应用软件在
包括但不限于
设计和实现输出净化功能时需重点关注以下方面内容,:
除非明确对目标编译器是安全的否则对所有字符进行编码
a),。
b)在可信任环境中执行输出编码。
以国际国家行业标准为基础结合实际情况制定编码规则
)、、,。
c
)、,,
关注和查询语句以及操作系统命令这些命令可能存在潜在的危险字符
dSQLXMLLDAP
需进行语义净化。
)禁止将重定向到用户可控的不可信站点。
eURL
相关的规范和不规范的代码示例参见A.2.1.2。
5.2数据加密与保护
5.2.1数据加密
应用软件应对敏感数据进行加密数据加密的设计和实现需关注以下方面内容包括但不限于
,,:
)、、、,
a凡涉及采用密码技术解决保密性完整性真实性不可否认性需求的应遵循国家有关法律
法规。
),。
b即使在服务器端仍然要加密存储敏感数据
)在可信任环境中执行数据的加密过程。
c
),。
d确保密码运算过程安全基于指定的算法和特定长度的密钥来进行密码运算
)。,。
e安全地处理加密模块的失败操作如果加密模块加密失败或报错需重新加密
)按照用途尽量减少需要保存的秘密信息。
f
建立并使用相关的安全策略和流程以实现加解密的密钥管理
g)、。
h)使用安全的随机数生成器:
———采用能产生充分信息熵的算法或方案。
———避免将具有密码学弱点的伪随机数生成器()用于加密场景。
PRNG
使用密码学的伪随机数生成器时使用信息熵最大的信息作为密码学伪随机数生成器的
,
———
种子如果信息熵不可用可使用变化的种子来降低安全威胁避免使用可预测的种子
。,,
()、。
如进程或系统时间的当前值或空间太小的种子
ID
)维护密钥的安全:
i
,。
———规定安全的密钥强度仅使用高于规定强度的密钥
5
/—
犌犅犜386742020
———,。
规定密钥有效期禁止使用已经过期的密钥
———禁止使用硬编码密钥硬编码密钥将显著增加加密数据被攻击者破解的可能性
,。
相关的规范和不规范的代码示例参见A.2.2.1。
5.2.2数据保护
,:
应用软件需要注意从以下方面保护数据的安全包括但不限于
明确应用软件中的敏感数据隐私数据的范围以及有权访问这些数据的用户范围
a)、,。
在软件中明确划定信任边界禁止敏感数据跨越信任边界
b),。
)对数据的授权访问遵循最小权限原则。
c
d)按照5.2.1的内容对敏感数据进行加密存储和传输。
)对重要数据进行完整性检查。
e
尽量缩短敏感数据的存储时间并减少敏感数据的存储地点以降低敏感数据泄露的风险
),,。
f
)、、、、。
g避免在错误消息进程信息调试信息日志文件源代码或注释中包含敏感数据
在设计登录表单的时候可考虑禁止浏览器的口令自动填充功能
h)WEB,。
)在资源释放前清理敏感数据。
i
保护所有在服务器上缓存的或临时拷贝的敏感数据并在不需要时尽快清除
),。
j
k)禁止在客户端保存敏感数据。
),。
l当敏感数据丢失或破坏时确保可通过备份数据进行数据恢复
),
m在将数据发送到客户端的时候基于任何通过客户端共享的数据都是不安全的假设对数据进
行操作。
相关的规范和不规范的代码示例参见A.2.2.2。
5.3访问控制
5.3.1身份鉴别
身份鉴别的设计和实现需注意以下方面内容包括但不限于
,:
)、。
a建立并使用标准的已通过测试的身份鉴别策略
),。
b根据业务安全要求选择身份鉴别方式安全性要求高的系统建议采用多因素身份鉴别方式
),。
c为所有身份鉴别使用一个集中实现的方法包括利用库文件请求外部身份鉴别服务
所有的身份鉴别过程应在可信任环境中执行且在每次用户登录时进行身份鉴别避免仅在
d),。
客户端而非服务器端执行身份鉴别。
),,。
e最小化角色授权一个账号对应一个人而不是一个组使用软件的每个人拥有唯一的用户名
),:
f在进行关键的安全操作时避免依赖不可靠信息进行身份鉴别
———避免信任cookie中的数据。
———避免依赖反向DNS解析获取的主机信息。
验证数字证书应检查证书的状态和证书持有者只有有效的未过期的且证书的实际持有者
g)。,、
与证书中声明的持有者一致的证书才能被信任和使用。
h)避免鉴别过程被绕过:
———严格控制用户访问系统的可选途径或通道保证用户只能通过指定的途径或通道访问系
,
统,。
避免身份鉴别被绕过
———使用安全的鉴别算法且算法的关键步骤没有被省略或跳过
,。
)避免在处理身份鉴别的过程中透露多余信息:
i
6
/—
犌犅犜386742020
———。
处理每个认证请求所花费的时间相同避免攻击者根据登录尝试失败的时间来判断登录
尝试是否成功。
———安全地处理未成功的认证认证和注册的错误信息不能包含可被攻击者利用的信息例
。,
判断一个特定的用户名是否有效的信息
如,。
———
确保鉴别反馈的内容中不包含敏感数据。
对鉴别尝试的频率进行限制连续多次登录失败强制锁定账户
),:
j
———
限制同一个账号能够进行鉴别尝试的频率和次数。
———设定用户登录失败次数的阈值在用户登录失败次数达到阈值后锁定用户账号防止攻击
,,
者进行暴力破解。
),,,
k如果允许一次身份鉴别后可进行较长时间的通话则需要周期性地重新鉴别用户的身份以
。,,。
确保其权限没有改变如果发生改变注销该用户并强制重新执行身份鉴别
)(),,
l在用户执行关键或者不可逆的操作如修改口令之前再次鉴别用户身份以减少不安全会话
带来的损失。
)(,
m避免使用过于严格的账户锁定机制账户锁定保护机制过于严格且容易被触发就允许攻击者
通过锁定合法用户的账户来拒绝服务合法的系统用户)。
n)实现用户与主体的绑定:
———用户进程与所有者用户相关联使用户进程的行为可以追溯到进程的所有者用户
,。
———系统进程与当前服务要求者用户动态关联使系统进程的行为可以追溯到当前服务要求
,
者用户。
相关的规范和不规范的代码示例参见A.2.3.1。
5.3.2口令安全
,:
应用软件需从以下方面保护口令的安全包括但不限于
),。
a登录过程中确保口令不可见
使用强口令口令的复杂度包括口令组成口令长度等需要满足安全策略要求
b),(、)。
)、。
c禁止使用弱口令空口令或已泄露的口令
),。
d对于默认的初始口令强制用户初次登录时更改默认口令
)不使用过期口令:
e
———过期口令不可继续使用。
———定期更改口令关键系统可要求更频繁地更改
,。
———明确口令更改时间周期。
)保护口令重置信息:
f
———使用保护口令信息的安全策略保护口令重置信息。
、。
———口令重置操作采取与账户创建身份鉴别同等级别的安全控制策略
———口令重置问题宜支持尽可能随机的提问。
g)安全地存储口令:
———禁止明文存储口令。
———使用不可逆的加密算法或单向杂凑函数对口令进行加密存储。
———
,。
在散列过程使用添加变量将口令转化为不可还原或难以使用字典攻击猜测的形式
———将加密后的口令存储在配置文件数据库或者其他外部数据源中
、。
———禁止在源代码中写入口令。
7
/—
犌犅犜386742020
h)所有的口令加密过程必须在可信任环境中执行。
尽可能地减少口令加密密钥的保存时间
)、。
i
)使用安全的口令传输:
j
禁止在不安全的信道中传输口令也禁止接受来自不安全信道的口令
,。
———
———禁止传递明文口令。
传统协议如以及需要在使用了安全传输协议例如的
———,,,,()
FTPHTTPPOPIMAPSSL
情况下才可被用于传输口令。
k)用户信息改变时使用单独的信道通知:
———允许用户改变其口令当用户改变其账号信息时例如重置口令需要发送确认信息并使
,(),
用单独的通道发送确认信息。
———
推荐标准
- DB36/T 814.1-2014 钬铁合金化学分析方法 第1部分:稀土总量的测定 重量法 2014-11-27
- DB36/T 814.2-2014 钬铁合金化学分析方法 第2部分:稀土杂质含量的测定 电感耦合等离子体发射光谱法 2014-11-27
- DB42/T 349.4-2014 武汉市主要行业取(用)水定额 第4部分:宾馆 2014-07-08
- DB42/T 1011-2014 柑橘大实蝇预测预报技术规范 2014-07-08
- DB42/T 349.2-2014 武汉市主要行业取(用)水定额 第二部分:机关 2014-07-08
- DB44/T 1424-2014 知识产权服务规范 一般要求 2014-11-10
- DB44/T 1455-2014 气凝胶绝热材料 2014-11-10
- DB42/T 349.3-2014 武汉市主要行业取(用)水定额 第三部分:医院 2014-07-08
- DB42/T 1024-2014 牛支原体肺炎诊断技术规程 2014-09-12
- DB36/T 812-2014 蜜蜂免移虫技术规程 2014-11-27