声明
本文是学习GB-T 39412-2020 信息安全技术 代码安全审计规范. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们
代码安全审计规范 安全措施缺陷审计列表
数据清洗
关键状态数据外部可控
审计指标:应避免关键状态数据被外部控制。
审计人员应检查代码中是否将与用户信息或软件自身安全密切相关的状态信息,存储在非授权实体都可以访问的地方,如结果为肯定,则系统可能有关键状态数据能被外部访问或篡改的安全风险。代码不规范示例参见附录B.2.1。
数据真实性验证
审计指标:宜验证数据真实性,避免接收无效数据。
审计人员应检查代码是否对数据的真实性进行验证,具体审计要求包括但不限于:
- 宜检查是否有数据源或通信源验证;
- 宜检查是否存在未验证或不正确验证数据的数字签名;
- 宜检查是否缺失或进行不恰当完整性检查;
- 宜检查安全相关的输入是否仅依赖于加密技术而未进行完整性检查;
- 宜检查是否验证文件内容而非文件名或扩展名;
- 宜检查是否验证未经校验和完整性检查的Cookie。代码不规范用法示例参见附录B.2.2。
如上检查项的任一结果为肯定,则提示存在安全风险。
绕过数据净化和验证
审计指标:宜防止以大小写混合的方式绕过数据净化和验证。
审计人员宜检查字符串在查找、替换、比较等操作时,是否存在因大小写问题而被绕过的情况。代码不规范示例参见附录B.2.3。
在字符串验证前未进行过滤
审计指标:不宜在过滤字符串之前对字符串进行验证。
审计人员宜检查对字符串进行验证之前是否存在对该字符串进行过滤,来防止注入类攻击的发生。
对HTTP头WEB脚本特殊元素处理
审计指标:应对HTTP头的WEB脚本语法中的特殊元素进行过滤和验证。
审计人员应检查代码是否对HTTP头中的WEB脚本特殊元素进行过滤处理。因HTTP头中的WEB脚本含有特殊元素,可能会导致浏览器执行恶意脚本。代码不规范示例参见附录B.2.4。
命令行注入
审计指标:应正确处理命令中的特殊元素。
审计人员应检查代码对利用外部输入来构造命令或部分命令时,是否对其中的特殊元素进行了处理,命令注入通常发生在以下但不仅限于:
- 数据从非可信源进入到应用程序中;
- 数据是字符串的一部分,该字符串被应用系统当作命令来执行的;
- 通过执行这个命令,应用程序为攻击者提供了攻击者不应拥有的权限或能力。
数据结构控制域安全
审计指标:宜避免对数据结构控制域的删除或意外增加。
审计人员宜检查代码关于数据结构控制域的操作:
a)宜检查代码是否存在对数据结构控制域的删除而导致系统安全风险。代码不规范示例参见附录B.2.5;
b)宜检查代码是否存在对数据结构控制域的意外增加而导致系统安全风险。代码不规范示例参见附录B.2.6。
忽略字符串结尾符
审计指标:应保证字符串的存储具有足够的空间容纳字符数据和结尾符。
审计人员应检查代码字符串的存储空间是否能容纳下结尾符,字符串不以结尾符结束会造成字符串越界访问。代码规范/不规范示例参见附录B.2.7。
对环境变量长度做出假设
审计指标:不应对环境变量的长度做出假设。
审计人员应检查代码在使用环境变量时是否对环境变量的长度做出特定值的假设,因环境变量可由用户进行设置修改,故对环境变量的长度做出假设可能会发生错误。代码规范/不规范示例参见附录B.2.8。
条件比较不充分
审计指标:执行比较时不应部分比较或不充分的比较。
审计人员应检查比较条件是否充分,防止不充分比较造成逻辑绕过风险。
结构体长度
审计指标:不应将结构体的长度等同于其各个成员长度之和。
审计人员应检查代码是否将结构体的长度等同于其各成员长度之和,不应将结构体长度等同于各成员长度之和。结构对象可能存在无名的填充字符从而造成结构体长度与各个成员长度之和并不相等。代码不规范示例参见附录B.2.9。
数值赋值越界
审计指标:应避免数值赋值越界。
审计人员应检查代码是否存在数值赋值超出数值类型范围,应避免赋值越界。代码不规范示例参见附录B.2.10。
除零错误
审计指标:应避免除零错误。
审计人员应检查代码是否存在除零操作,应避免除零错误。代码规范/不规范示例参见附录B.2.11。
边界值检查缺失
审计指标:数值范围比较时,不宜遗漏边界值检查。
审计人员宜检查代码在进行数值范围比较时,是否遗漏了最小值、最大值边界值检查。代码规范/不规范示例参见附录B.2.12。
数据信任边界的违背
审计指标:代码宜避免将可信和不可信数据组合在同一结构体中,违背信任边界。
审计人员宜检查代码是否将来自可信源和非可信源的数据混合在同一数据结构体或同一结构化的消息体中,模糊了二者的边界。
条件语句缺失默认情况
审计指标:条件语句中不宜缺失默认情况。
审计人员宜检查代码中条件语句是否存在缺失默认情况的情形。
无法执行的死代码
审计指标:不宜包含无法执行的死代码
审计人员宜检查代码是否存在无法执行的死代码。
表达式永真或永假
审计指标:不应出现表达式永真或永假代码。
审计人员应检查代码是否存在表达式逻辑永真或永假代码的情况。
跨站脚本
审计指标:应避免跨站脚本攻击。
审计人员应检查代码中用户提交的数据放到页面中,被送到浏览器进行显示前,是否进行了验证或过滤。
WEB应用重定向后执行额外代码
审计指标:WEB应用不宜在重定向后执行额外代码。
审计人员宜检查WEB应用是否存在重定向后执行额外代码的情况,如果结果为肯定,则提示存在安全风险。
URL重定向
审计指标:不应开放不可信站点的URL重定向。
审计人员应检查代码是否存在URL重定向到不可信站点的情况,因重定向到不可信站点,可能会发生访问安全风险。
数据加密与保护
密码安全
审计指标:密码相关实现技术应符合国家密码相关管理规定。
审计人员应检查代码中使用的密码相关实现技术是否符合国家密码管理部门相关管理规定,若不符合,则提示存在安全风险。
随机数安全
审计指标:应确保产生安全的随机数。
审计人员应检查代码是否产生安全的随机数,具体审计要求包括但不限于:
- 应检查是否采用能产生充分信息熵的算法或方案。代码的不规范示例参见附录B.2.13;
- 应检查是否避免随机数的空间太小;
- 应检查是否避免伪随机数生成器(PRNG)每次都使用相同的种子、可预测的种子(如进程ID或系统时间的当前值)或空间太小的种子;
- 应检查是否避免使用具有密码学缺陷的伪随机数生成器(PRNG)用于加密场景。
如上检查项的任一结果为否定,则提示存在安全风险。
使用安全相关的硬编码
审计指标:不应使用安全相关的硬编码。
审计人员应检查代码中是否存在跟安全相关的硬编码,如果代码泄漏或被非法获取,这些硬编码的值可能会被攻击者利用。
敏感信息暴露
审计指标:应避免敏感信息暴露。
审计人员应检查代码中是否有敏感信息暴露,重点检查暴露的途径包含但不限于:
- 通过发送数据导致的信息暴露;
- 通过数据查询导致的信息暴露;
- 通过差异性(响应差异性、行为差异性、时间差异性)导致的信息暴露;
- 通过错误消息导致的信息暴露;
- 敏感信息的不恰当跨边界移除导致信息暴露;
- 通过进程信息导致的信息暴露;
- 通过调试信息导致的信息暴露;
- 信息在释放前未清除导致信息暴露;
- 通过输出流或日志将系统数据暴露到未授权控制的范围;
- 通过缓存导致的信息暴露;
- 通过日志文件导致的信息暴露;
- 通过源代码导致的信息暴露,如测试代码、源代码、注释等;
- 敏感信息使用HTTP请求传递导致信息暴露;
- 备份文件导致信息暴露;
- 在WEB登录表单中,宜禁止浏览器的口令自动填充功能。
代码不规范示例参见附录B.2.14。
个人信息保护
审计指标:应确保个人信息保护。
审计人员应检查代码中对个人信息保护是否符合国家相关法律法规的要求。若存在个人信息保护不当,可能造成个人信息泄漏。
访问控制
身份鉴别过程中暴露多余信息
审计指标:应避免在处理身份鉴别的过程中暴露多余信息。
审计人员应检查帐号在注册或认证过程中,是否存在暴露多余信息的情况。攻击者可能会利用获取到的多余信息,进行认证暴力破解。
身份鉴别被绕过
审计指标:应避免身份鉴别被绕过。
审计人员应检查代码中身份鉴别机制是否存在被绕过的路径或通道,鉴别算法的关键步骤是否被省略或跳过。
身份鉴别尝试频率限制
审计指标:应对身份鉴别连续多次登录失败频率进行限制。
审计人员应检查代码中是否实现对身份鉴别多次登录失败的频率进行限制。如结果为否定,则系统存在身份认证被暴力破解的安全风险。
多因素认证
审计指标:宜使用多因素认证机制。
审计人员宜检查是否采用多因素认证,如果结果为否定,则提示存在安全风险。
登录口令
审计指标:应确保登录过程中口令不可明文显示。
审计人员应检查代码中是否实现在登录过程中口令是否明文显示。
明文存储口令
审计指标:应避免明文存储口令。
审计人员应检查代码中是否存在明文存储口令的情况。
明文传递口令
审计指标:应避免明文传递口令。
审计人员应检查代码中是否存在明文传递口令的情况。
权限访问控制
审计指标:应确保权限管理安全以及其他访问控制措施的安全。
审计人员应检查代码中的权限与访问控制功能相关部分,具体要求包括但不限于:
- 应检查是否缺失认证机制,如果结果为肯定,则提示存在安全风险;
- 应检查是否缺失授权机制,如果结果为肯定,则提示存在安全风险;
- 应检查是否违背最小特权原则,以高于功能所需的特权级别在执行一些操作,如果结果为肯定,则提示存在安全风险;
- 应检查放弃特权后,是否检查其放弃是否成功,如果结果为否定,则提示存在安全风险;
- 应检查是否创建具有正确访问权限的文件,如果结果为否定,则提示存在安全风险;
- 应检查是否避免关键资源的不正确权限授予,如果结果为否定,则提示存在安全风险;
- 应检查是否存在攻击者使用欺骗或捕获重放攻击等手段绕过身份认证的情况,如果结果为肯定,则提示存在安全风险;
- 应检查是否避免不恰当地信任反向DNS,如果结果为否定,则提示存在安全风险。代码的不规范/规范用法示例参见附录B.2.15;
- 对于客户端/服务器架构的产品,应检查是否存在仅在客户端而非服务器端执行认证,如果结果为肯定,则提示存在安全风险;
- 应检查是否避免过于严格的账户锁定机制(账户锁定保护机制过于严格且容易被触发,就允许攻击者通过锁定合法用户的账户来拒绝服务合法的系统用户),如果结果为否定,则提示存在安全风险;
- 应检查是否未对信道两端的操作者进行充分的身份认证,或未充分保证信道的完整性,从而允许中间人攻击发生,如果结果为肯定,则提示存在安全风险;
- 应检查是否避免通信通道源的验证不当,确保请求来自预期源,如果结果为否定,则提示存在安全风险;
- 应检查通信信道是否正确指定目的地来预防如下风险:攻击者在目的地伪装成受信任的服务器来窃取数据或引起拒绝服务。如果结果为否定,则提示存在安全风险。
未加限制的外部可访问锁
审计指标:宜对外部可访问锁加以限制,不允许被预期范围之外的实体影响。
审计人员宜检查代码中的锁是否可被预期范围之外的实体控制或影响,如结果为肯定,则系统存在易受到拒绝服务攻击的安全风险。
日志安全
审计指标:应对输出日志中的特殊元素进行过滤和验证。
审计人员应检查代码是否对输出日志中的特殊元素做过滤和验证。因对特殊元素未做过滤,可能会造成信息泄露。
审计指标:宜避免安全相关信息丢失或遗漏。
审计人员宜检查代码是否未记录或不恰当记录安全相关信息,安全相关信息丢失或遗漏可能会给追溯攻击行为带来影响。信息丢失或遗漏形式包含但不限于:
- 截断与安全有关信息的显示、记录或处理,掩盖攻击的来源或属性;
- 不记录或不显示信息(如日志),而该信息对确定攻击来源、攻击性质、攻击行动是否安全具有重要意义。
延伸阅读
更多内容 可以 GB-T 39412-2020 信息安全技术 代码安全审计规范. 进一步学习
联系我们
浙江省无人驾驶航空器公共安全管理规定.pdf