信息安全技术应用软件安全编程指南(GB-T 38674-2020).pdf
《信息安全技术应用软件安全编程指南(GB-T 38674-2020).pdf》由会员分享,可在线阅读,更多相关《信息安全技术应用软件安全编程指南(GB-T 38674-2020).pdf(140页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、ICS 35.040L80中中 华华 人人 民民 共共 和和 国国 国国 家家 标标 准准信息安全技术 应用软件安全编程指南Information security techniquesGuideline on secure coding ofapplication software(报批稿)(本稿完成日期:2019 年 4 月)在提交反馈意见时,请将您知道的相关专利连同支持性文件一并附上。XXXX-XX-XX 发布XXXX-XX-XX 实施GB/T XXXXXXXXGB/T XXXXXXXXXI目次前言.II1范围.12规范性引用文件.13术语、定义和缩略语.13.1术语和定义.14概述.4
2、5安全功能实现.45.1数据清洗.45.2数据加密与保护.55.3访问控制.65.4日志安全.86代码实现安全.96.1面向对象程序安全.96.2并发程序安全.106.3函数调用安全.116.4异常处理安全.116.5指针安全.116.6代码生成安全.117资源使用安全.127.1资源管理.127.2内存管理.127.3数据库管理.137.4文件管理.137.5网络传输.148环境安全.158.1第三方软件使用安全.158.2开发环境安全.158.3运行环境安全.16附录A(资料性附录)代码示例.17A.1 概述.17A.2 安全功能实现.17A.3 代码实现安全.49A.4 资源使用安全.1
3、02A.5 环境安全.134参考文献.136GB/T XXXXXXXXXII前言本标准依据 GB/T 1.1-2009 给出的规则起草。本标准由全国信息安全标准化技术委员会(SAC/TC 260)提出并归口。本标准起草单位:国家计算机网络应急技术处理协调中心、北京邮电大学、北京奇虎测腾安全技术有限公司、中国电力科学研究院、上海计算机软件技术开发中心、海通证券股份有限公司、北京银行、信息安全共性技术国家工程研究中心。本标准主要起草人:舒敏、王博、吴倩、王文磊、黄元飞、张家旺、林星辰、陈禹、王鹏翩、李燕伟、高强、杨鹏、陈亮、范乐君、张淼、徐国爱、郭燕慧、李祺、杨昕雨、王晨宇、葛慧晗、黄永刚、韩建、
4、章磊、王彦杰、胡建勋。GB/T XXXXXXXXX1信息安全技术应用软件安全编程指南1范围本标准依据最佳实践提出应用软件安全编程的通用框架,从提升软件安全性的角度针对应用软件编程过程进行规范和指导。依照本标准进行软件开发能有效降低软件安全风险。本标准中的应用软件为针对特定应用开发的业务处理软件。本标准描述对各领域、采用各种编程语言的应用软件普遍适用的通用安全编程规范。本标准主要适用于客户端/服务器架构的应用软件开发,其他架构的应用软件开发也可参照使用,并根据其应用环境的特性补充必要的安全防护措施。2规范性引用文件下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件,仅注日期的版本适用于本
5、文件。凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件。GB/T 16264.8-2005 信息技术 开放系统互连 目录 公钥和属性证书框架(ISO/IEC9594-8-2001,IDT)GB/T 25069-2010 信息安全技术术语GB/T 36624-2018 信息技术 安全技术 可鉴别的加密机制GM/T 0028-2014 密码模块安全技术要求ISO/IEC 9798-1:2010 信息技术安全技术实体鉴别 第 1 部分:总则(Informationtechnology-Security techniques-Entity authentication-Part 1:
6、General)ISO/IEC 27034:2011 信息技术安全技术应用安全(Information technology-Securitytechniques-Application security)3术语、定义和缩略语3.1 术语和定义GB/T25069 中界定的下列术语和定义适用于本文件。3.1.1缓冲区溢出 buffer overflow当应用程序向为某特定数据结构分配的内存空间边界之外写入数据时,即会发生缓冲区溢出。注:缓冲区溢出被用来作为一种软件系统的攻击手段,通过往程序的缓冲区写入超出其长度的内容,造成缓冲区溢出,从而破坏程序堆栈,使程序转而执行其它指令,以达到攻击的目的。3
7、.1.2命令注入 commandinjection通过应用程序将用户输入的(恶意)内容拼接到命令中,并提交给后台引擎执行的攻击行为。3.1.3GB/T XXXXXXXXX2应用软件日志 application softwareLog用于记录系统操作事件的文件集合。3.1.4线程安全 thread safe某个函数、函数库在多线程环境中被调用时能够正确地处理多个线程之间的共享变量,使程序功能正确执行的能力。3.1.5线程同步 thread synchronization多个线程通过特定手段来控制线程之间执行顺序的一种机制。注:当有一个线程在对内存进行操作时,其它线程就不能对该内存地址执行操作,直
8、到该线程操作完成,此时,其它线程被设置处于等待状态。3.1.6死锁 deadlock两个或两个以上的进程在执行过程中,因竞争资源或因彼此通信而造成的一种阻塞现象,此时这些相互等待的进程称为死锁进程,该系统处于死锁状态或者产生了死锁。3.1.7阻塞 block进程/线程暂停执行过程,等待请求被应答的状态。3.1.8游标 cursor一种用于操纵数据库查询返回的多行结果集的机制。3.1.9敏感数据 sensitive data必须受保护的信息,该信息的泄露、修改、破坏或丢失会对人或事产生可预知的损害。常见的敏感数据包括但不限于身份鉴别数据、会话标识符、口令、连接字符串等。3.1.10秘密数据 se
9、cret data为了执行特定安全功能策略,只能由授权用户或被评对象安全功能知晓的信息。3.1.11信任边界 trust boundary由编程人员直接控制的系统部件组成。3.1.12线程挂起 suspend暂停线程运行的操作。在线程挂起后,可以通过重新唤醒线程使之恢复运行。3.1.13GB/T XXXXXXXXX3异常 exception导致程序中断运行的一种指令流。如果不对异常进行正确的处理,则可能导致程序的中断执行。3.1.14错误 error系统运行中出现的非预期问题,可能导致系统崩溃或者暂停运行。3.1.15硬编码 hardcode在编码过程中将可变变量用一个固定数值表示。3.1.1
10、6封装 encapsulation将系统功能、一组数据和在这些数据上的操作隔离在一个模块中,并为该模块提供精确的规格说明的软件开发技术。3.1.17泛型 generictype程序设计语言的一种特性。通过引入参数化数据类型,允许程序员在强类型程序设计语言中定义类型时包含一些可变部分,这些部分在使用前必须作出指明。3.1.18堆污染 heappollution当将一个参数化的数据类型指向一个对象,而该对象不是参数化数据类型,或不是同类型的参数化数据类型时,会产生堆污染。3.1.19嵌套类 nestedclass声明在另一个类(或接口)代码块中的任意类。3.1.20并发程序 concurrent
11、program允许在同一时间段执行多个程序模块的机制,可通过多进程、多线程机制实现。3.2 缩略语下列缩略语适用于本文件。HTTP 超级文本传输协议(HyperText Transfer Protocol)LDAP 轻量目录访问协议(Lightweight Directory Access Protocol)SQL 结构化查询语言(Structured Query Language)SSL 安全套接子层(Secure Sockets Layer)TLS 传输层安全(Transport Layer Security)UTF-8 针对 Unicode 的可变长度字符编码(8-bit Unicode
12、 Transformation Format)XML 可扩展置标语言(Extensible Markup Language)GB/T XXXXXXXXX44概述本指南从程序安全和环境安全两个方面提出了提升应用软件安全性的编程最佳实践。其中,程序安全部分描述软件在资源使用、代码实现、安全功能方面的安全技术规范,环境安全部分描述软件的安全管理配置规范。图 1 为本标准描述的应用软件编程安全框架。图1应用软件编程安全框架5安全功能实现5.1 数据清洗5.1.1输入验证应用软件应确保对所有输入到应用的数据进行验证,拒绝接受验证失败的数据。在设计和实现数据验证功能时需关注以下方面内容,包括但不限于:a)
13、验证所有输入数据的安全性,包括但不限于以下方面的验证:检测输入数据的数据类型。检测输入数据的长度,验证允许输入的最小和最大长度。检测输入数据的值,包括进行最小值、最大值边界值检查。参考 7.4(c)验证文件的安全性。b)应特别关注如下场景的数据验证:验证来自 HTTP 请求中的所有数据,恶意数据可以从表单域,URL 参数,cookie,HTTP 头以及 URL 自身传入。验证来自重定向输入的数据。攻击者可能向重定向的目标直接提交恶意代码,从而避开应用程序逻辑以及在重定向前执行的验证,所以对重定向输入数据应再次验证。对来自命令行、环境以及配置文件的输入进行校验。GB/T XXXXXXXXX5对发
14、送给文件系统、浏览器、数据库或者其他系统的命令进行验证,防止采用不可信来源的数据构建命令。c)对重要业务操作相关的输入数据,应验证数据的真实性和完整性,宜验证数据发送方的数字签名,以确认数据发送方的身份。d)对输入的数据进行过滤或标准化处理,然后进行验证。e)禁止试图对验证失败的数据进行修复,自动错误恢复代码很可能改变请求的初始意图或者截断验证逻辑。f)在可信任环境中执行输入验证。g)集中输入验证,把输入验证作为软件框架的一部分,为应用程序提供一个统一的输入验证策略。h)为所有输入明确恰当的字符集,比如:UTF-8。确定系统是否支持 UTF-8 扩展字符集,如果支持,在 UTF-8 解码完成以
15、后进行输入验证。i)在程序中定义清晰的信任边界,将可信和不可信数据(比如:数据库,文件流)分别存储。当数据要从不可信的一侧传输到可信一侧的时候,应使用验证逻辑进行判断。相关的规范和不规范的代码示例参见附录 A.2.1.1。5.1.2输出净化应用软件应对所有输出到客户端的,来自于应用程序信任边界之外的数据进行净化。应用软件在设计和实现输出净化功能时需关注以下方面内容,包括但不限于:a)除非明确对目标编译器是安全的,否则对所有字符进行编码。b)在可信任环境中执行输出编码。c)应以国际、国家、行业标准为基础,结合实际情况制定编码规则。d)关注 SQL、XML 和 LDAP 查询语句以及操作系统命令,
16、这些命令可能存在潜在的危险字符,应语义净化。e)应禁止将 URL 重定向到用户可控的不可信站点。相关的规范和不规范的代码示例参见附录 A.2.1.2。5.2 数据加密与保护5.2.1加密规范应用软件应对敏感数据进行加密保护,数据加密的设计和实现需关注以下方面内容,包括但不限于:a)凡涉及采用密码技术解决保密性、完整性、真实性、不可否认性需求的,须遵循国家有关法律法规。b)即使在服务器端,仍然要加密存储敏感数据。c)在可信任环境中执行数据的加密过程。d)确保密码运算过程安全。应基于指定的算法和特定长度的密钥来进行密码运算。e)安全地处理加密模块的失败操作。如果加密模块加密失败或报错,需重新加密。
17、f)应当按照用途尽量减少需要保存的秘密信息。g)建立并使用相关的安全策略和流程以实现加、解密的密钥管理。h)使用安全的随机数生成器:应采用能产生充分信息熵的算法或方案。避免将具有密码学弱点的伪随机数生成器(PRNG)用于加密场景。GB/T XXXXXXXXX6使用密码学的伪随机数生成器时,应使用信息熵最大的信息作为密码学伪随机数生成器的种子。如果信息熵不可用,可使用变化的种子来降低安全威胁,但应避免使用可预测的种子(如进程 ID 或系统时间的当前值)、或空间太小的种子。i)维护密钥的安全:应规定安全的密钥强度,仅使用高于规定强度的密钥。应规定密钥有效期,禁止使用已经过期的密钥。禁止使用硬编码密
18、钥,硬编码密钥将显著增加加密数据被攻击者破解的可能性。相关的规范和不规范的代码示例参见附录 A.2.2.1。5.2.2数据保护应用软件应从以下方面保护数据的安全,包括但不限于:a)应明确应用软件中的敏感数据、隐私数据的范围,以及有权访问这些数据的用户范围。b)在软件中明确划定信任边界,禁止敏感数据跨越信任边界。c)对数据的授权访问遵循最小权限原则。d)应参照 5.2.1 节的内容对敏感数据进行加密存储和传输。e)对重要数据进行完整性检查。f)尽量缩短敏感数据的存储时间,并减少敏感数据的存储地点,以降低敏感数据泄露的风险。g)避免在错误消息、进程信息、调试信息、日志文件、源代码或注释中包含敏感数
19、据。h)在设计 WEB 登录表单的时候,可考虑禁止浏览器的口令自动填充功能。i)资源释放前应清理敏感数据。j)保护所有在服务器上缓存的或临时拷贝的敏感数据,并在不需要时尽快清除。k)禁止在客户端保存敏感数据。l)当敏感数据丢失或破坏时,确保可通过备份数据进行数据恢复。m)在将数据发送到客户端的时候,应基于任何通过客户端共享的数据都是不安全的假设对数据进行操作。相关的规范和不规范的代码示例参见附录 A.2.2.2。5.3 访问控制5.3.1身份鉴别身份鉴别的设计和实现应注意以下方面内容,包括但不限于:a)建立并使用标准的、已通过测试的身份鉴别策略,如可参照 ISO/IEC 9798-1:2010
20、信息技术安全技术实体鉴别 第 1 部分:总则 中的要求设计和实现身份鉴别策略。b)根据业务安全要求选择身份鉴别方式,安全性要求高的系统建议采用多因素身份鉴别方式。c)为所有身份鉴别使用一个集中实现的方法,包括利用库文件请求外部身份鉴别服务。d)所有的身份鉴别过程必须在可信任环境中执行,且在每次用户登录时进行身份鉴别。避免仅在客户端而非服务器端执行身份鉴别。e)最小化角色授权,一个账号对应一个人而不是一个组,使用软件的每个人应拥有唯一的用户名。f)避免依赖不可靠信息进行身份鉴别。在进行关键的安全操作时:不应信任 cookie 中的数据。GB/T XXXXXXXXX7不应依赖反向 DNS 解析获取
21、的主机信息。g)验证数字证书。必须检查证书的状态和证书持有者,只有有效的、未过期的且证书的实际持有者与证书中声明的持有者一致的证书才能被信任和使用。h)避免鉴别过程被绕过:严格控制用户访问系统的可选途径或通道,保证用户只能通过指定的途径或通道访问系统,避免身份鉴别被绕过。应使用安全的鉴别算法,且算法的关键步骤没有被省略或跳过。i)避免在处理身份鉴别的过程中透露多余信息:处理每个认证请求所花费的时间相同。避免攻击者根据登录尝试失败的时间来判断登录尝试是否成功。安全地处理未成功的认证。认证和注册的错误信息不能包含可被攻击者利用的信息,例如,判断一个特定的用户名是否有效的信息。确保鉴别反馈的内容中不
22、包含敏感数据。j)对鉴别尝试的频率进行限制,连续多次登录失败强制锁定账户:限制同一个账号能够进行鉴别尝试的频率和次数。应设定用户登录失败次数的阈值,在用户登录失败次数达到阈值后应锁定用户账号,防止攻击者进行暴力破解。k)如果允许一次身份鉴别后,可进行较长时间的通话,则应周期性地重新鉴别用户的身份,以确保其权限没有改变。如果发生改变,注销该用户,并强制重新执行身份鉴别。l)在用户执行关键或者不可逆的操作(如修改口令)之前,再次鉴别用户身份,以减少不安全会话带来的损失。m)避免使用过于严格的账户锁定机制(账户锁定保护机制过于严格且容易被触发,就允许攻击者通过锁定合法用户的账户来拒绝服务合法的系统用
23、户)。n)实现用户与主体的绑定:用户进程应与所有者用户相关联,使用户进程的行为可以追溯到进程的所有者用户。系统进程应与当前服务要求者用户动态关联,使系统进程的行为可以追溯到当前服务要求者用户。相关的规范和不规范的代码示例参见附录 A.2.3.1。5.3.2口令安全应用软件需从以下方面保护口令的安全,包括但不限于:a)登录过程中,应确保口令不可见。b)使用强口令,口令的复杂度(包括口令组成、口令长度等)应满足安全策略要求。c)禁止使用弱口令、空口令或已泄露的口令。d)对于默认的初始口令,强制用户初次登录时更改默认口令。e)不使用过期口令:过期口令不可继续使用。应定期更改口令,关键系统可要求更频繁
24、地更改。应明确口令更改时间周期。f)保护口令重置信息:应使用保护口令信息的安全策略保护口令重置信息。口令重置操作应采取与账户创建、身份鉴别同等级别的安全控制策略。GB/T XXXXXXXXX8口令重置问题应当支持尽可能随机的提问。g)安全地存储口令:禁止明文存储口令。应使用不可逆的加密算法或单向杂凑函数对口令进行加密存储。在散列过程加入盐,将口令转化为不可还原或难以使用字典攻击猜测的形式。应将加密后的口令存储在配置文件、数据库或者其它外部数据源中。禁止在源代码中写入口令。h)所有的口令加密过程必须在可信任环境中执行。i)尽可能地减少口令、加密密钥的保存时间。j)使用安全的口令传输:禁止在不安全
25、的信道中传输口令,也禁止接受来自不安全信道的口令。禁止传递明文口令。传统协议,如 FTP,TELNET,HTTP,POP 以及 IMAP,应在使用了安全传输协议(例如 SSL)的情况下才可被用于传输口令。k)用户信息改变时使用单独的信道通知:允许用户改变其口令,当用户改变其账号信息时(例如重置口令)需要发送确认信息,确认信息应使用单独的通道发送。可要求用户通过邮件等方式来确认信息的变更,但禁止在确认邮件中包含身份鉴别信息。当用户改变他们的联系信息时,应发送两次变更通知:分别包含旧的和新的信息。相关的规范和不规范的代码示例参见附录 A.2.3.2。5.3.3权限管理应用软件对于权限管理的设计和实
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信息安全技术应用软件安全编程指南GB-T 38674-2020 信息 安全技术 应用软件 安全 编程 指南 GB 38674 2020
限制150内