声明
本文是学习GB-T 39412-2020 信息安全技术 代码安全审计规范. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们
资源使用安全缺陷审计列表
资源管理
审计指标:应避免重复释放资源。
审计人员应检查代码是否存在重复释放资源的情况。重复释放资源可能会造成系统崩溃。
审计指标:宜避免不安全的资源或变量初始化。
审计人员宜检查代码是否对资源或变量进行了安全的初始化,具体要求包括但不限于:
a) 宜检查代码是否对关键变量进行初始化,未初始化关键变量易导致系统按非预期值执行,如结果为否定,则提示存在安全风险;
b) 宜检查代码是否采用了不安全或安全性较差的缺省值来初始化内部变量。缺省值通常和产品一起发布,容易被熟悉产品的潜在攻击者获取而带来系统安全风险,如结果为肯定,则提示存在安全风险;
c) 宜检查代码中关键的内部变量或资源是否采用了可信边界外的外部输入值进行初始化,如结果为肯定,则提示存在安全风险。
审计指标:初始化失败后应安全退出程序。
审计人员应检查代码在初始化失败后能否安全退出。
审计指标:应避免引用计数的更新不正确。
审计人员应检查代码中管理资源的引用计数是否正确更新,引用计数更新不正确,可能会导致资源在使用阶段就被过早释放,或虽已使用完毕但得不到释放的安全风险。
审计指标:宜避免不安全的资源清理。
审计人员宜检查代码中资源清理部分的相关功能,检查代码在使用资源后是否恰当地执行临时文件或辅助资源的清理,避免清理环节不完整。
审计指标:不应将资源暴露给非授权的范围。
审计人员应检查代码是否将文件和目录等资源暴露给非授权的范围,如果存在,则提示代码存在信息暴露的风险。
审计指标:应避免未经控制的递归。
审计人员应检查代码是否避免未经控制的递归,未控制递归可造成资源消耗过多的安全风险。
审计指标:执行迭代或循环应恰当地限制循环执行的次数,应避免无限循环。
审计人员应检查代码中软件执行迭代或循环,是否充分限制循环执行的次数,以避免无限循环的发生导致攻击者占用过多的资源。
审计指标:宜避免算法复杂度攻击。
审计人员宜检查代码中算法是否存在最坏情况下非常低效,复杂度高,会严重降低系统性能。如果是,则攻击者就可以利用精心编制的操作来触发最坏情况的发生,从而引发算法复杂度攻击。
审计指标:宜遵守正确的行为次序避免早期放大攻击数据。
审计人员宜检查代码是否存在实体在授权或认证前执行代价高的操作的情况,不合理执行代价高的操作可能会造成早期放大攻击。代码规范/不规范示例参见附录B.4.1。
内存管理
审计指标:应成对调用内存分配和释放函数。
审计人员应检查代码中分配内存和释放内存函数是否成对调用,如malloc/free来分配或释放资源。当内存分配和释放函数不成对调用时,可能会引起程序崩溃的风险。
审计指标:应避免在释放堆内存前清理不恰当而导致敏感信息暴露。
审计人员应检查代码在释放堆内存前是否采用合适的方式进行信息清理。如C语言中是否使用realloc()函数调整存储敏感信息的缓冲区大小,如存在该操作,将存在可能暴露敏感信息的风险。 realloc()函数不是从内存中删除,而通常是将旧内存块的内容复制到一个新的、更大的内存块,这可能暴露给攻击者使用“memory dump”或其他方法来进行读取敏感信息的“堆检查”攻击。
审计指标:宜及时释放动态分配的内存。
审计人员宜检查代码是否有动态分配的内存使用完毕后未释放导致内存泄漏的情形。内存泄漏可能会导致资源耗尽从而带来拒绝服务的安全风险。代码规范/不规范示例参见附录 B.4.2。
审计指标:不应引用或访问已被释放后的内存。
审计人员应检查代码是否存在内存被释放再次被访问的情况。内存被释放后再次访问会出现非预期行为。
审计指标:不宜依赖数据/内存布局。
审计人员宜检查代码逻辑是否依赖于对协议数据或内存在底层组织形式的无效假设。当平台或协议版本变动时,数据组织形式可能会发生变化从而带来非预期行为。
审计指标:应避免内存缓冲区边界操作发生越界。
审计人员应检查代码在内存缓冲区边界操作时是否存在越界现象,因内存缓冲区访问越界可能会造成缓冲区溢出漏洞。代码规范/不规范示例参见附录B.4.3。
审计指标:应避免未检查输入数据大小就进行缓冲区复制。
审计人员应检查代码在进行缓冲区复制时,是否存在未对输入数据大小进行检查的现象,因未检查输入数据大小,可能会造成缓冲区溢出。代码不规范示例参见附录B.4.4。
审计指标:应避免使用错误的长度值访问缓冲区。
审计人员应检查代码在访问缓冲区时使用长度值是否正确,因使用错误的长度值来访问缓冲区可能会造成缓冲区溢出风险。代码规范/不规范示例参见附录B.4.5。
审计指标:应限制堆空间的消耗,防止堆空间耗尽。
审计人员应检查代码是否有导致堆空间耗尽的情况,具体检查包括但不限于:
- 是否存在内存泄漏;
- 是否存在死循环;
- 不受限制的反序列化;
- 创建大量的线程;
- 解压一个较大压缩文件。
数据库使用
审计指标:宜及时释放数据库资源。
审计人员宜检查代码中使用数据库后是否及时释放数据库连接或采用数据库连接池,未及时释放数据库连接可能会造成数据库拒绝服务风险。
审计指标:应正确处理SQL命令中的特殊元素。
审计人员应检查代码利用用户可控的输入数据构造SQL命令时,是否对外部输入数据中的特殊元素进行处理,如果未处理,那么这些数据有可能被解释为SQL命令而非普通用户的输入数据。攻击者可对此加以利用来修改查询逻辑,从而绕过安全检查或插入可以修改后端数据库的额外语句。
文件管理
审计指标:不应使用过期的文件描述符。
审计人员应检查代码是否在文件描述符关闭后再次使用。特定文件或设备的文件描述符被释放后被重用,可能会造成引用了其他的文件或设备。
审计指标:应安全使用临时文件
审计人员应检查代码中使用临时文件是否安全,因不安全使用临时文件造成敏感信息泄露,具体要求包括:
- 应检查代码中是否创建或使用不安全的临时文件,如果结果为肯定,则提示存在安全风险;
- 应检查代码中临时文件是否在程序终止前移除,如果结果为否定,则提示存在安全风险;
- 应检查代码中是否在具有不安全权限的目录中创建临时文件,如果结果为肯定,则提示存在安全风险。
审计指标:不宜导致文件描述符穷尽。
审计人员宜检查代码是否存在导致文件描述符穷尽情形。具体检查项包括但不限于:
- 是否对打开文件描述符未做关闭处理;
- 是否到达关闭阶段之前,失去对文件描述符的所有引用;
- 进程完成后是否未关闭文件描述符。
审计指标:应避免路径遍历。
审计人员应检查代码是否存在由外部输入构造的标识文件或目录的路径名,路径遍历会造成非授权访问资源的风险。
- 路径遍历指未将路径名限制在受限目录。
审计指标:应及时释放文件系统资源。
审计人员应检查代码是否及时释放不再使用的文件句柄,不及时释放文件句柄可能会引起文件资源占用过多,造成拒绝服务风险。
网络传输
审计指标:不应对同一端口进行多重绑定。
审计人员应检查代码是否有多个套接字绑定到相同端口,从而导致该端口上的服务有被盗或被欺骗的风险。
审计指标:宜避免对网络消息容量的控制不充分。
审计人员宜检查代码是否控制网络传输流量不超过被允许的值。如果代码没有机制来跟踪流量传输,系统或应用程序会很容易被滥用于传输大流量(超过了请求值或客户端被允许的值),从而带来拒绝服务的安全风险。
审计指标:应避免字节序使用不一致性。
审计人员应检查代码在跨平台或网络通信处理输入时是否考虑到字节顺序,避免字节序使用不一致。
不能正确处理字节顺序问题,可能会导致不可预期的程序行为。
审计指标:应采用加密传输方式保护敏感数据。
审计人员应检查代码在网络通信中敏感数据是否加密传输,特别是身份鉴别信息、重要信息等。
审计指标:宜制定会话过期机制。
审计人员宜检查代码中会话过程是否存在会话过期机制,如结果为否定,则提示代码存在保护机制被绕过的风险。代码规范/不规范示例参见附录B.4.6。
审计指标:宜确保会话标识符的随机性。
审计人员宜检查代码中会话标识符是否具有随机性,防止会话标识符被穷举造成安全风险。
延伸阅读
更多内容 可以 GB-T 39412-2020 信息安全技术 代码安全审计规范. 进一步学习
联系我们
DB65-T 3635-2014 组织机构代码业务受理规范 新疆维吾尔自治区.pdf