首页 > 国家标准(GB) > GB/T 38674-2020 信息安全技术 应用软件安全编程指南
GB/T 38674-2020

基本信息

标准号: GB/T 38674-2020

中文名称:信息安全技术 应用软件安全编程指南

标准类别:国家标准(GB)

标准状态:现行

出版语种:简体中文

下载格式:.zip .pdf

相关标签: 信息安全 技术 应用软件 安全 编程 指南

标准分类号

关联标准

出版信息

相关单位信息

标准简介

GB/T 38674-2020.Information security technology-Guideline on secure coding of application software.
1范围
GB/T 38674提出了应用软件安全编程的通用框架,从提升软件安全性的角度对应用软件编程过程进行指导。
GB/T 38674适用于客户端/服务器架构的应用软件开发,其他架构的应用软件开发也可参照使用,并根据其应用环境的特性补充必要的安全防护措施。
2规范性引用文件
下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件,仅注日期的版本适用于本文件。凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件。
GB/T 25069-2010 信息安全技术 术语
3术语和定义、缩略语
3.1术语和定义
GB/T 25069-2010 界定的以及下列术语和定义适用于本文件。为了便于使用,以下重复列出了GB/T 25069-2010 中的某些术语和定义。
3.1.1
缓冲区溢出 buffer overflow
向程序的缓冲区写人超出其长度的内容,从而破坏程序堆栈,使程序转而执行其他指令,以获取程序或系统的控制权。
3.1.2
命令注入 command injection
通过应用程序将用户输入的恶意内容拼接到命令中,并提交给后台引擎执行的攻击行为。
3.1.3
应用软件日志 application softwarelog
用于记录系统操作事件的文件集合。
3.1.4
线程安全 thread safe
某个函数、函数库在多线程环境中被调用时能够正确地处理多个线程之间的共享变量,使程序功能正确执行的能力。
3.1.5
线程同步 thread synchronization
多个线程通过特定手段来控制线程之间执行顺序的一种机制。
注:当有一个线程在对内存进行操作时,其他线程就不能对该内存地址执行操作,直到该线程操作完成,此时,其他线程被设置处于等待状态。

标准图片预览






标准内容

ICS35.040
中华人民共和国国家标准
GB/T38674-—2020
信息安全技术
应用软件安全编程指南
Information securitytechnologyGuideline on secure coding of application software2020-04-28发布
国家市场监督管理总局
国家标准化管理委员会
2020-11-01实施
GB/T38674—2020
规范性引用文件
3术语和定义、缩略语·
术语和定义
缩略语
安全功能实现
数据清洗
数据加密与保护
访间控制
日志安全
代码实现安全
面向对象程序安全
并发程序安全
函数调用安全
异常处理安全
指针安全
代码生成安全
资源使用安
资源管理·
内存管理
数据库管理
文件管理
网络传输
8环境安全
第三方软件使用安全
8.2开发环境安全
8.3运行环境安全
附录A(资料性附录)
代码示例
安全功能实现
代码实现安全
资源使用安全
环境安全
参考文献bzxz.net
........
本标准按照GB/T1.120C9给出的规则起草。GB/T38674—2020
请注意本文件的某些内容可能涉及专利。本文件的发布机构不承担识别这些专利的责任。本标准由全国信息安全标准化技术委员会(SAC/TC260)提出并归口。本标准起草单位:国家计算机网络应急技术处理协调中心、北京邮电大学、北京奇虎测腾安全技术有限公司、中国电力科学研究院有限公司、上海计算机软件技术开发中心、海道证券股份有限公司北京银行股份有限公司、信息安全共性技术国家工程研究中心。本标准主要起草人:舒敏、王博、吴倩、王文磊、黄元飞、张家旺、林星辰、陈禹、王鹏翩、李燕伟、高强、杨鹏、陈亮、范乐君、张晓娜、杜薇、夏剑锋、李哔,张淼、徐国爱、郭燕慧、李祺、杨昕雨、工晨宇、葛慧哈、黄永刚、韩建、章磊、王彦杰、胡建勋、李凌。I
1范围
应用软件安全编程指南
信息安全技术
GB/T38674—2020
本标准提出了应用软件安全编程的通用框架,从提升软件安全性的角度对应用软件编程过程进行指导。
本标准适用于客广端/服务器架构的应用软件开发,其他架构的应用软件开发也可参照使用,并根据其应用环境的特性补充必要的安全防护措施。规范性引用文件
下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件,仅注日期的版本适用于本文件。凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件GB/T25069—2010信息安全技术术语3术语和定义、缩略语
3.1术语和定义
GB/T25069一2010界定的以及下列术语和定义适用于本文件,为了便于使用:以下重复列出了GB/T250692010中的某些术语和定义3.1.1
缓冲区溢出bufferoverflow
向程序的缓冲区写人超出其长度的内容,从而破坏程序堆栈,使程序转而执行其他指令,以获取程序或系统的控制权。
commandinjection
命令注入
通过应用程序将用户输入的恶意内容拼接到命令中,并提交给后台引擎执行的攻击行为。3.1.3
应用软件日志applicationsoftwarelog用于记录系统操作事件的文件集合。3.1.4
线程安全thread safe
某个函数、函数库在多线程环境中被调用时能够正确地处理多个线程之间的共享变量,使程序功能正确执行的能力。
线程同步thread synchronization多个线程通过特定手段来控制线程之间执行顺序的一种机制。注:当有一个线程在对内存进行操作时,其他线程就不能对该内存地址执行操作,直到该线程操作完成,此时,其他线程被设置处于等待状态。
GB/T38674—2020
死锁deadlock
两个或两个以上的进程在执行过程中,因竞争资源或彼此通信而造成的一种阻塞现象。3.1.7
阻塞block
进程/线程暂停执行过程,等待请求被应答的状态。3.1.8
cursor
种用于操纵数据库查询返回的多行结果集的机制。3.1.9
敏感数据
sensitive data
必须受保护的,其泄露、修改、破坏或丢失会对人或事产生可预知的损害的信息。注:常见的敏感数据包括但不限于身份鉴别数、会话标识符、口令、连按宇符串等3.1.10
秘密数据
secret data
为了执行特定安全功能策略,只能由授权用户或被评对象安全功能知晓的信息。3.1.11
添加变量
作为单向丽数或加密函数的二次输人而加人的随机变量,可用于导出口令验证数据。[GB/T25069—2010,定义2.2.2.186]3.1.12
trusthoundary
信任边界
由编程人员直接控制的系统部件组成。3.1.13
thread suspension
线程挂起
暂停线程运行的操作。
注:在线程挂起后,可以通过重新唤醒线程使之恢复运行3.1.14
exception
导致程序中断运行的一种指令流。注:如果不对异常行正确的处理,则可能导致程序的中断执行。3.1.15
错误error
系统运行中出现的可能导致系统崩溃或者暂停运行的非预期问题。3.1.16
硬编码
hardcode
在编码过程中将可变变量用一个固定数值表示。3.1.17
encapsulation
将系统功能、一组数据和在这些数据上的操作隔离在一个模块中,并为该模块提供精确的规格说明的软件开发技术。
泛型generictype
程序设计语言的一种特性,
GB/T38674—2020
注:通过引人参数化数据类型,允许程序员在类型程序设计语言中定义类型时包含一此可变部分,这业部分在使用前应作出指明。
堆污染
heappollution
当将一个参数化的数据类型指向一个对象,而该对象不是参数化数据类型,或不是同类型的参数化数据类型时,会产生堆污染。
嵌套类
nestedelass
声明在另一个类或接口代码块中的任意类3.1.21
并发程序
concurrentprogram
可通过多进程,多线程机制实现的,允许在同一时间段执行多个程序模块的机制3.2
2缩略语
下列缩略语适用于本文件。
API:应用程序编程接口(ApplicationProgrammingInterlace)DNS:域名系统(DomainNameSystem)FTP:文件传输协议(FileTransferProtocol)HTTP:超级文本传输协议(HyperTextTransferProtocol)IMAP:互联网消息访间协议(InternetMessageAccessProtocol)LDAP:轻量目录访间协议(LightweightDirectaryAccessProlocal)POP:邮局协议(PostOfficeProtocol)SQL:结构化查询语言(StructuredQueryLanguage)SSL:安全套接子层(SecureSocketsLayer)TLS:传输层安全(TransportLayerSecurity)URL:统一资源定位符(UniformResourceLocator)UTF-8:针对Unicade的可变长度字符编码(8-bitUnicodeTransformationFormat)XML:可扩展置标语言(ExtensibleMarkupLanguage)4概述
本标准从程序安全和环境安全两个方面提出了提升应用软件安全性的缩程最佳实践。其中,程序安全部分描述软件在资源使用,代码实现、安全功能方面的安全技术规范,环境安全部分描述软件的安全管理配置规范。图1给出了应用软件编程安全框架。3
GB/T38674—2020
安全功能实现
数据清洗
输入验证
输出净化
代码实现安全
面向对象程序安全
异常处理安全
资源使用安全
内存管理
5安全功能实现
数据清洗
5.1.1输入验证
程序安全
数据加密
数据保护
访问控制
身份鉴别
口令安全
权限管理
并发程序安全
指针安全
数据库管理
文件管理
日志安全
函数调用安全
代码生成安全
网络传输
图1应用软件编程安全框架
环境安全
第三方软件安全
开发环境安全
运行环境安全
应用软件需确保对所有输入到应用的数据进行验证,拒绝接受验证失的数据。在设计和实现数据验证功能时需重点关注以下方面内容,包括但不限于:a)验证所有输人数据的安全性,包括但不限于:检测输入数据的数据类型。
检测输人数据的长度,验证允许输人的最小和最大长度。检测输入数据的值,包括进行最小值、最大值边界值检查。验证文件的安全性[见7.4c)]。
b)特别关注如下场景的数据验证:验证来自HTTP请求中的所有数据,恶意数据可以从表单域,URL参数,cookie,HTTP头以及URL白身传入。
验证来自重定向输入的数据。攻击者可能向重定向的目标直接提交恶意代码,从而避开应用程序逻辑以及在重定向前执行的验证,所以对重定向输入数据需再次验证。对来自命令行,环境以及配置文件的输人进行校验。对发送给文件系统、浏览器、数据库或者其他系统的命令进行验证,防止采用不可信来源的数据构建命令。
对重要业务操作相关的输人数据,验证数据的真实性和完整性,宜验证数据发送方的数字签c
名,以确认数据发送方的身份。d)对输入的数据进行过滤或标准化处理,然后进行验证。GB/T38674—2020
e)禁止试图对验证失败的数据进行修复,自动错误恢复代码很可能改变请求的初始意图或者截断验证逻辑。
f)在可信任环境中执行输入验证。g)集中输入验证,把输人验证作为软件框架的一部分,为应用程序提供一个统一的输人验证策略。
h)为所有输人明确恰当的字符集,例如:UTF-8。确定系统是否支持UTF-8扩展字符集,如果支持,在UTF-8解码完成以后进行输人验证。在程序中定义清晰的信任边界,将可信和不可信数据(比如:数据库,文件流)分别存储。当数据要从不可信的一侧传输到可信一侧的时候,使用验证逻辑迹行判断。相关的规范和不规范的代码示例参见附录A的A.2.1.1。5.1.2输出净化
应用软件需对所有输出到客户端的,来自于应用程序信任边界之外的数据建行净化。应用软件在设计和实现输出净化功能时需重点关注以下方面内容,包括但不限于:a)除非明确对目标综译器是安全的,否则对所有字符进行编码。b)在可信任环境中执行输出编码c)
以国际、国家、行业标准为基础,结合实际情况制定编码规则关注SQL、XML和LDAP查询语句以及操作系统命令,这些命令可能存在潜在的危险字符!d)
需进行语义净化。
C)禁止将URL重定向到用户可控的不可信站点。相关的规范和不规范的代码示例参见A.2.1.2。5.2
数据加密与保护
5.2.1数据加密
应用软件应对敏感数据进行加密,数据加密的设计和实现需关注以下方面内容,包括但不限于:a)凡涉及采用密码技术解决保密性、完整性、真实性、不可否认性需求的,应遵循国家有关法律法规。
即使在服务器端,仍然要加密存储敏感数据b)
在可信任环境中执行数据的加密过程c)
确保密码运算过程安全,基于指定的算法和特定长度的密钥来近行密码运算。e)
安全地处理加密模块的失败操作。如果加密模块加密失败或报错,需重新加密。按照用途尽量减少需要保存的秘密信息g)
建立并使用相关的安全策略和流程以实现加、解密的密钥管理使用安全的随机数生成器:
采用能产生充分信息嫡的算法或方案。避免将具有密码学弱点的伪随机数生成器(PRNG)用于加密场景。使用密码学的伪随机数生成器时,使用信息嫡最大的信息作为密码学伪随机数生成器的种子。如果信息炳不可用,可使用变化的种子来降低安全威胁,避免使用可预测的种子(如进程ID或系统时间的当前值)、或空间太小的种子。i)维护密钥的安全:
规定资全的密钥强度,仅使用高于规定强度的密钥。5
GB/T38674—2020
规定密钥有效期,禁止使用已经过期的密钥。一一禁止使用硬编码密钥,硬缩编码密钥将显著增加加密数据被攻击者破解的可能性,相关的规范和不规范的代码示例参见A.2.2.1。5.2.2数据保护
应用软件需要注意从以下方面保护数据的安全,包括但不限于:明确应用软件中的敏感数据、隐私数据的范围,以及有权访问这些数据的用户范围。a
b)在软件中明确划定信任边界,禁止敏感数据跨越信任边界。c)对数据的授权访问遵循最小权限原则。按照5.2.1的内容对敏感数据进行加密存储和传输。d)
对重要数据进行完整性检查。
尽量缩短敏感数据的存储时间,并减少敏感数据的存储地点,以降低敏感数据泄露的风险。避免在错误消息、进程信息、调试信息、日志义件、源代码或注释中包含敏感数据:g)
在设计WEB登录表单的时候,可考虑禁止浏览器的口令自动填充功能h)
在资源释放前清理敏感数据。
保护所有在服务器上缓存的或临时拷贝的敏感数据,并在不需要时尽快清除。禁止在客户端保存敏感数据。
当敏感数据害失或破坏时,确保可通过备份数据近行数据恢复在将数据发送到客户端的时候,基于任何通过客户端共享的数据都是不安全的假设对数据进m)
行操作。
相关的规范和不规范的代码示例参见A.2.2.2。5.3访问控制
5.3.1身份鉴别
身份鉴别的设计和实现需注意以下方面内容,包括但不限于:建立并使用标准的、已通过测试的身份鉴别策略。a)
根据业务安全要求选择身份鉴别方式,安全性要求高的系统建议采用多因素身份鉴别方式。b
为所有身份鉴别使用一个集中实现的方法,包括利用库文件请求外部身份鉴别服务。a)所有的身份鉴别过程应在可信任环境中执行,且在每次用户登录时进行身份鉴别。避免仅在客户端而非服务器端执行身份鉴别e)最小化角色授权,一个账号对应一个人而不是一个组,使用软件的每个人拥有唯一的用户名。f)在进行关键的安全操作时,避免依赖不可靠信息进行身份鉴别避免信任cookie中的数据。
避免依赖反向DNS解析获取的主机信息。g)验证数字证书。应检查证书的状态和证书持有者,只有有效的,未过期的且证书的实际持有者与证中声明的持有者一致的证才能被信任和使用。h)避免鉴别过程被绕过:
产严格控制用户访问系统的可选途径或通道,保证用户只能道过指定的途径或通道访问系统,避免身份鉴别被绕过。
使用安全的鉴别算法,且算法的关键步骤没有被省略或跳过。i)避免在处理身份鉴别的过程中透露多余信息6
GB/T38674—2020
处理每个认证请求所花费的时间相同。避免攻击者根据登录尝试失败的时间来判断登录尝试是否成功。
安全地处理未成功的认证,。认证和注册的错误信息不能包含可被攻击者利用的信息,例如,判断一个特定的用户名是否有效的信息。确保鉴别反馈的内容中不包含敏感数据。i)对鉴别尝试的频率进行限制,连续多次登录失败强制锁定账户:限制同一个账号能够进行鉴别尝试的频率和次数。设定用户登录失败次数的國值,在用户登录失败次数达到國值后锁定用户账号,防止攻击者进行暴力破解。
k)如果允许一次身份鉴别后,可进行较长时间的通话,则需要周期性地重新鉴别用户的身份,以确保其权限没有改变。如果发生改变,注销该用户,并强制重新执行身份鉴别。在用户执行关键或者不可逆的操作如修改口令)之前,再次鉴别用户身份,以减少不安全会话带来的损失,
m)避免使用过于严格的账户锁定机制(账广户锁定保扩机制过于严格且容易被触发,就允许攻击者通过锁定合法用户的账户来拒绝服务合法的系统用户)。n)实现用户与主体的绑定:
用户进程与所有者用户相关联,使用户进程的行为可以追溯到进程的所有者用户。系统进程与当前服务要求者用户动态关联,使系统进程的行为可以追溯到当前股务要求者用户。
相关的规范和不规范的代码示例参见A,2.3.1。5.3.2口令安全
应用软件需从以下方面保护口令的安全,包括但不限于:a)登录过程中,确保口令不可见。使用强口令,口令的复杂度(包括口令组成、口令长度等)需要满足安全策略要求。b)
禁止使用弱口令、空口令或已泄露的口令。e)
d)对于默认的初始口令,强制用户初次登录时更改默认口令。e)不使用过期口令:
过期口令不可继续使用。
定期更改口令,关键系统可要求更频繁地更改。明确口令更改时间周期
f)保护口令重置信息:
使用保护口令信息的安全策略保护口令重置信息口令重置操作采取与账户创建、身份鉴别同等级别的安全控制策略。一口令重置问题宜支持尽可能随机的提问。g)安全地存储口令:
禁止明文存储口令。
使用不可递的加密算法或单向杂凑函数对口令进行加密存储在散列过程使用添加变量,将口令转化为不可还原或难以使用字典攻击猜测的形式。将加密后的口令存储在配置文件数据库或者其他外部数据源中。禁止在源代码中写入门令。
GB/T38674—2020
h)所有的口令加密过程必须在可信任环境中执行。尽可能地减少口令、加密密钥的保存时间。i)
使用安全的口令传输:
禁止在不安全的信道中传输口令,也禁止接受来自不安全信道的口令。禁止传递明文口令。
传统协议,如FTP,HTTP,POP以及IMAP,需要在使用了安全传输协议(例如SSL)的情况下才可被用于传输口令。
k)用户信息改变时使用单独的信道通知:允许用户改变其口令,当用户改变其账号信息时(例如重置口令)需要发送确认信息,并使用单独的通道发送确认信息
可要求用户通过邮件等方式来确认信息的变更,但禁止在确认邮件中包含身份鉴别信息。一当用户改变其联系信息时,发送两次变更通知:分别包含旧的和新的信息。相关的规范和不规范的代码示例参见A.2.3.2。5.3.3权限管理
应用软件对干权限管理的设计和实现需重点关注以下方面内容,包括但不限于:a)遵循最小权限原则;
确保服务账户或连接到外部系统的账号,仅具有执行经授权的任务所需的最小权限(或最低的安全许可)。
将许可权限尽可能地细化,使用细粒度的访问控制。6)所有的访问授权操作需在可信任环境中执行。将访问控制作为集中化程序框架的一部分,建立统一的访问控制策略。c
对每个用户交互都要检测访问控制状态。d)
确保访问控制策略检查了用户访问或操作的数据e)
只有授权的用户才能访问秘密数据或放感数据。道常,这类数据有:与用户信息或应用软件自身安全密切相关的状态信息、文件或其他资源、受保护的URL、受保护的功能、直接对象引用、应用程序数据以及与安全相关的配置信息等。g)执行账户审计并强制失效长期不使用的账户。建议明确允许账户不使用的最长期限,支持账户的强制失效,并在账户停止时终止会话。相关的规范和不规范的代码示例参见A.2.3.3。5.4日志安全
应用软件日志记录了系统运行状况,通常包括软硬件故障、系统重要事件等。日志记录的设计和实现需从以下方面提升安全性,包括但不限于:a)保护日志文件:
对日志文件进行安全存储。例如将日志文件独立保存于应用程序目录外,使用严格的访问权限来控制日志文件使用。
使用消息摘要算法以验证日志记录的完整性。b)在可信任的环境中执行日志记录操作。c)将日志记录作为集中化程序框架的一部分。d)在每个日志条目中增加精确的时间截,同时确保时间截的可靠性。8
小提示:此标准内容仅展示完整标准里的部分截取内容,若需要完整标准请到上方自行免费下载完整标准文档。