GB/T 39412-2020 信息安全技术 代码安全审计规范.pdf

  • GB/T 39412-2020  信息安全技术 代码安全审计规范.pdf为pdf格式
  • 文件大小:3.1 M
  • 下载速度:极速
  • 文件评级
  • 更新时间:2020-12-10
  • 发 布 人: 13648167612
  • 文档部分内容预览:
  • 代码安全缺陷检测环节是根据制定的代码安全的检查项,采用工具审计、人工审计、人工结合 计方式检查是否存在安全缺陷,检测完成后进行安全性分析形成安全审计结果

    5.3.4特殊情形审查

    仕有软件补包/米 丰或外包部分进行代码安全审计 核心代码和一般性代码在审计时,采取重点审计和一般性审计措施,其中重点审计主要针对核心 行审计,一般性审计主要针对一般性代码进行审计

    审计实施完成后,组织召开评审会,将初始审计结果提供给被审计项目成员,并提供澄清误解机会 允许项目成员提供其他需要补充的信息。 评审会结束后,根据评审意见,调整审计结果测绘标准,形成审计报告。审计报告包括审计的总体描述、审计 结论等内容,并对可能产生的安全风险进行高、中、低分类描述。审计结论给出每条审计条款的符合/不 符合的描述。审计报告的内容示例参见附录A

    对审计中发现的问题进行修改,对未修改的应提供理由;对代码的有效变更进行记录存档。对于修 复安全缺陷后的代码,可通过再次审计来确认问题是否解决

    6.1.1.1关键状态数据外部可控

    审计指标:应避免关键状态数据被外部控制。 审计人员应检查代码中是否将与用户信息或软件自身安全密切相关的状态信息,存储在非授 都可以访问的地方,如结果为肯定,则系统可能有关键状态数据能被外部访问或套改的安全风险 范代码示例参见B.2.1

    6.1.1.2数据真实性验证

    审计指标:宜验证数据真实性,避免接收无效数据。 审计人员宜检查代码是否对数据的真实性进行验证,包括但不限于: a)宜检查是否有数据源或通信源验证; b)宜检查是否存在未验证或不正确验证数据的数字签名; c)宜检查是否缺失或进行不恰当完整性检查; d)宜检查安全相关的输入是否仅依赖于加密技术而未进行完整性检查; e)宜检查是否验证文件内容而非文件名或扩展名:

    f)宜检查是否验证未经校验和完整性检查的Cookie。不规范代码示例参见B.2.2。 如上检查项的任一结果为肯定,则提示存在安全风险

    6.1.1.3绕过数据净化和验证

    审计指标:宜防止以大小写混合的方式绕过数据净化和验证。 审计人员宜检查字符串在查找、替换、比较等操作时,是否存在因大小写问题而被绕过的情况。不 规范代码示例参见B.2.3。

    6.1.1.4在字符串验证前未进行过滤

    审计指标:不直任过滤字符串之前对宁 审计人员宜检查对字符串进行验证之前是否存在对该字符串进行过滤,来防止注入类攻击的发生

    6.1.1.5对HTTP头Web脚本特殊元素处理

    审计指标:应对HTTP头的Web脚本语法中的特殊元素进行过滤和验证。 审计人员应检查代码是否对HTTP头中的Web脚本特殊元素进行过滤处理。因HTTP头中 脚本含有特殊元素,可能会导致浏览器执行恶意脚本。不规范代码示例参见B.2.4。

    6.1.1.6命令行注入

    审计指标:应正确处理命令中的特殊元素。 审计人员应检查代码对利用外部输入来构造命令或部分命令时,是否对其中的特殊元素进行了处 理,命令注人通常发生在以下但不仅限于: a)数据从非可信源进人到应用程序中: b) 数据是字符串的一部分,该字符串被应用系统当作命令来执行的; c)通过执行这个命令,应用程序为攻击者提供了攻击者不应拥有的权限或能力。

    6.1.1.7数据结构控制域安全

    审计指标:宜避免对数据结构控制域的删除或意外增加。 审计人员检查代码关于数据结构控制域的操作: a 宜检查代码是否存在对数据结构控制域的删除而导致系统安全风险。不规范代码示例参见 B.2.5。 b 宜检查代码是否存在对数据结构控制域的意外增加而导致系统安全风险。不规范代码示例参 见B.2.6

    6.1.1.8忽略字符串结尾符

    审计指标:应保证字符串的存储具有足够的空间容纳字符数据和结尾符 审计人员应检查代码字符串的存储空间是否能容纳下结尾符,字符串不以结尾符结束会造成字符 串越界访问。规范/不规范代码示例参见B.2.7。

    6.1.1.9对环境变量长度做出假设

    审计指标:不应对环境变量的长度做出假设。 审计人员应检查代码在使用环境变量时是否对环境变量的长度做出特定值的假设,因环境变量 户进行设置修改,故对环境变量的长度做出假设可能会发生错误。规范/不规范代码示例参 8

    6.1.1.10条件比较不充分

    审计指标:执行比较时不应部分比较或不充分的比较。 审计人员应检查比较条件是否充分,防止不充分比较造成逻辑绕过风险

    6.1.1.11结构体长度

    GB/T39412—2020

    审计指标:不应将结构体的长度等同于其各个成员长度之和, 审计人员应检查代码是否将结构体的长度等同于其各成员长度之和,不应将结构体长度等同于各 成员长度之和。结构对象可能存在无名的填充字符从而造成结构体长度与各个成员长度之和并不相 等。不规范代码示例参见B.2.9

    6.1.1.12数值赋值越界

    审计指标:应避免数值赋值越界 审计人员应检查代码是否存在数值赋值超出数值类型范围,应避免赋值越界。不规范代码示例参 见B.2.10

    6.1.1.13除零错误

    审计指标:应避免除零错误。 审计人员应检查代码是否存在除零操作.应避免除零错误。规范/不规范代码示例参见B.2.11

    6.1.1.14边界值检查缺失

    审计指标:数值范围比较时,不宜遗漏边界值检查。 审计人员宜检查代码在进行数值范围比较时,是否遗漏了最小值、最大值边界值检查。规范/ 代码示例参见B.2.12。

    6.1.1.15数据信任边界的违背

    审计指标:代码宜避免将可信和不可信数据组合在同一结构体中,违背信任边界。 审计人员宜检查代码是否将来自可信源和非可信源的数据混合在同一数据结构体或同一结构作 息体中,模糊了二者的边界,

    6.1.1.16条件语句缺失默认情况

    审计指标:条件语句中不宜缺失默认情况。 审计人员宜检查代码中条件语句是否存在缺失默认情况的情形

    6.1.1.17无法执行的死代码

    审计指标:不宜包含无法执行的死代码。 审计人员宜检查代码是否存在无法执行的死代

    6.1.1.18表达式永真或永假

    审计指标:不应出现表达式永真或永假代码。 审计人员应检查代码是否存在表达式逻辑永真或永假代码的情况。

    GB/T 394122020

    6. 1.2 输出编码

    6.1.2.1跨站脚本

    审计指标:应避免跨站脚本攻击, 审计人员应检查代码中用户提交的数据放到页面中,被送到浏览器进行显示前,是否进行了验证或 过滤。

    6.1.2.2Web应用重定向后执行额外代码

    审计指标:Web应用不宜在重定向后执行额外代码, 审计人员宜检查Web应用是否存在重定向后执行额外代码的情况,如果结果为肯定,则提示存在 安全风险。

    6.1.2.3URL重定向

    审计指标:不应开放不可信站点的URL重定向。 审计人员应检查代码是否存在URL重定向到不可信站点的情况,因重定向到不可信站点,可能 访问安全风险

    6.2.1.1密码安全

    审计指标:密码相关实现技术应符合国家密码相关管理规定。 审计人员应检查代码中使用的密码相关实现技术是否符合国家密码管理部门相关管理规定,若不 符合,则提示存在安全风险。

    6.2.1.2随机数安全

    审计指标:应确保产生安全的随机数 审计人员应检查代码是否产生安全的随机数,具体审计要求包括但不限于: a)应检查是否采用能产生充分信息嫡的算法或方案。代码的不规范示例参见B.2.13; b)应检查是否避免随机数的空间太小; C 应检查是否避免CSPRNG每次都使用相同的种子、可预测的种子(如进程ID或系统时间的当 前值)或空间太小的种子; d)应检查是否避免使用具有密码学缺陷的CSPRNG用于加密场景。 如上检查项的任一结果为否定,则提示存在安全风险

    6.2.1.3使用安全相关的硬编码

    审计指标:不应使用安全相关的硬编码 审计人员应检查代码中是否存在跟安全相关的硬编码,如果代码泄漏或被非法获取,这些硬编码 能会被攻击者利用

    6.2.2.1敏感信息暴露

    审计指标:应避免敏感信息暴露。

    GB/T39412—2020

    审计人员应检查代码中是否有敏感信息暴露,重点检查暴露的途径包含但不限于: a)通过发送数据导致的信息暴露; b)通过数据查询导致的信息暴露; 通过差异性(响应差异性、行为差异性、时间差异性)导致的信息暴露; d)通过错误消息导致的信息暴露; e 敏感信息的不恰当跨边界移除导致信息暴露; f)通过进程信息导致的信息暴露; g 通过调试信息导致的信息暴露; h)信息在释放前未清除导致信息暴露; 通过输出流或日志将系统数据暴露到未授权控制的范围; 通过缓存导致的信息暴露; k)通过日志文件导致的信息暴露; 通过源代码导致的信息暴露,如测试代码、源代码、注释等; m)敏感信息使用HTTP请求传递导致信息暴露; n)备份文件导致信息暴露; o)在Web登录表单中,宜禁止浏览器的口令自动填充功能。 不规范代码示例参见B.2.14。

    6.2.2.2个人信息保护

    审计指标:应确保个人信息保护。 审计人员应检查代码中对个人信息保护是否符合国家相关法律法规的要求。若存在个人信息保护 不当,可能造成个人信息泄漏

    6.3.1.1身份鉴别过程中暴露多余信息

    6.3.1.2身份鉴别被绕过

    审计指标:应避免身份鉴别被绕过。 审计人员应检查代码中身份鉴别机制是否存在被绕过的路径或通道,鉴别算法的关键步骤是否被 省略或跳过

    6.3.1.3身份鉴别尝试频率限制

    6.3.1.4多因素认证

    审计指标:宜使用多因素认证机制!

    审计人员宜检查是否采用多因素认证,如果结果为否定,则提示存在安全风险。

    6.3.2.1登录口令

    审计指标:应确保登录过程中口令不可明文显示, 审计人员应检查代码中是否实现在登录过程中口令是否明文显示

    审计指标:应确保登录过程中口令不可明文显示 审计人员应检查代码中是否实现在登录过程中口令是否明文显示。

    6.3.2.2明文存储口令

    审计指标:应避免明文存储口令。 审计人员应检查代码中是否存在明文存储口令的情况

    6.3.2.3明文传递口令

    审计指标:应避免明文传递口令 审计人员应检查代码中是否存在明文传递口令的情况

    6.3.3.1权限访问控制

    审计指标:应确保权限管理安全以及其他访问控制措施的安全。 审计人员应检查代码中的权限与访问控制功能相关部分,包括但不限于: a 应检查是否缺失认证机制,如果结果为肯定,则提示存在安全风险; b)应检查是否缺失授权机制,如果结果为肯定,则提示存在安全风险; C 应检查是否违背最小特权原则,以高于功能所需的特权级别在执行一些操作,如果结果为肯 定,则提示存在安全风险; d 应检查放弃特权后,是否检查其放弃是否成功,如果结果为否定,则提示存在安全风险; 应检查是否创建具有正确访问权限的文件,如果结果为否定,则提示存在安全风险; 应检查是否避免关键资源的不正确权限授予,如果结果为否定,则提示存在安全风险; 应检查是否存在攻击者使用欺骗或捕获重放攻击等手段绕过身份认证的情况,如果结果为肯 定,则提示存在安全风险; h 应检查是否避免不恰当地信任反向DNS,如果结果为否定,则提示存在安全风险。代码的不 规范/规范用法示例参见B.2.15; 1 对于客户端/服务器架构的产品,应检查是否存在仅在客户端而非服务器端执行认证,如果结 果为肯定,则提示存在安全风险; j 应检查是否避免过于严格的账户锁定机制(账户锁定保护机制过于严格且容易被触发,就充许 攻击者通过锁定合法用户的账户来拒绝服务合法的系统用户),如果结果为否定,则提示存在 安全风险; k)应检查是否未对信道两端的操作者进行充分的身份认证,或未充分保证信道的完整性,从而允 许中间人攻击发生,如果结果为肯定,则提示存在安全风险; 1) 应检查是否避免通信通道源的验证不当,确保请求来自预期源,如果结果为否定,则提示存在 安全风险; m)应检查通信信道是否正确指定目的地来预防如下风险:攻击者在目的地伪装成受信任的服务 器来窃取数据或引起拒绝服务。如果结果为否定,则提示存在安全风险

    审计指标:应确保权限管理安全以及其他访问控制措施的安全。 审计人员应检查代码中的权限与访问控制功能相关部分,包括但不限于: a 应检查是否缺失认证机制,如果结果为肯定,则提示存在安全风险; b)应检查是否缺失授权机制,如果结果为肯定,则提示存在安全风险; 应检查是否违背最小特权原则,以高于功能所需的特权级别在执行一些操作,如果结果为肯 定,则提示存在安全风险; 应检查放弃特权后,是否检查其放弃是否成功,如果结果为否定,则提示存在安全风险: e) 应检查是否创建具有正确访问权限的文件,如果结果为否定,则提示存在安全风险; f) 应检查是否避免关键资源的不正确权限授予,如果结果为否定,则提示存在安全风险; g) 应检查是否存在攻击者使用欺骗或捕获重放攻击等手段绕过身份认证的情况,如果结果为肯 定,则提示存在安全风险; h厂 应检查是否避免不恰当地信任反向DNS,如果结果为否定,则提示存在安全风险。代码的不 规范/规范用法示例参见B.2.15; 对于客户端/服务器架构的产品,应检查是否存在仅在客户端而非服务器端执行认证,如果结 果为肯定,则提示存在安全风险; j 应检查是否避免过于严格的账户锁定机制(账户锁定保护机制过于严格且容易被触发,就允许 攻击者通过锁定合法用户的账户来拒绝服务合法的系统用户),如果结果为否定,则提示存在 安全风险; k)应检查是否未对信道两端的操作者进行充分的身份认证,或未充分保证信道的完整性,从而允 许中间人攻击发生,如果结果为肯定,则提示存在安全风险; 1 应检查是否避免通信通道源的验证不当,确保请求来自预期源,如果结果为否定,则提示存在 安全风险; m)应检查通信信道是否正确指定目的地来预防如下风险:攻击者在目的地伪装成受信任的服务 器来窃取数据或引起拒绝服务。如果结果为否定,则提示存在安全风险

    6.3.3.2未加限制的外部可访问锁

    GB/T39412—2020

    审计指标:宜对外部可访问锁加以限制,不充允许被预期范围之外的实体影响。 审计人员宜检查代码中的锁是否可被预期范围之外的实体控制或影响,如结果为肯定,则系统存在 易受到拒绝服务攻击的安全风险

    6.4.1对输出目志中特殊元素处理

    审计指标:应对输出日志中的特殊元素进行过滤和验证 审计人员应检查代码是否对输出日志中的特殊元素做过滤和验证。因对特殊元素未做过滤,市 造成信息泄露

    6.4.2信息丢失或遗漏

    申计指标:宜避免安全相关信息去失或遗漏。 审计人员宜检查代码是否未记录或不恰当记录安全相关信息,安全相关信息丢失或遗漏可能会给 追溯攻击行为带来影响。信息丢失或遗漏形式包含但不限于: a)截断与安全有关信息的显示、记录或处理,掩盖攻击的来源或属性; b)不记录或不显示信息(如志),而该信息对确定攻击来源、攻击性质、攻击行动是否安全具有 重要意义。

    7代码实现安全缺陷审计

    7.1面向对象程序安全

    审计指标:不宜混用具有泛型和非泛型的数据类型, 审计人员宜检查代码是否存在泛型和非泛型之间数据类型的混用现象,应避免泛型和非泛型 型的混用。规范/不规范代码示例参见B.3.1。

    7.1.2包含敏感信息类的安全

    审计指标:包含敏感信息的类不应可复制和可序列化。 审计人员应检查代码中包含敏感信息类的相关行为是否安全,包括但不限于: a)应检查代码中包含敏感信息的类是否可复制,如Java语言中实现了Clonenable接口,使类可 复制。包含敏感信息的类不应被复制。 b) 应检查代码中包含敏感信息的类是否可实现了序列化接口,使类可序列化。包含敏感信息的 类不应可序列化。

    审计指标:在类进行比较时,不宜只使用名称比较 审计人员宜检查代码中当判定一个对象是否属于特定的类或两个对象的类是否相同时,宜比车 象,不能仅基于类名称进行判定

    GB/T39412—2020

    7.1.4类私有可变成员的引用

    审计指标:应禁止返回类的私有可变成员的引用。 审计人员应检查代码中是否存在返回类私有可变成员的引用的情况。如结果为肯定,则可能存在 内部状态被非预期修改的风险

    7.1.5存储不可序列化的对象到磁盘

    审计人员应检查代码是否试图将不可, 化的对象写到磁盘中,将不可序列化的对象存储到磁盘 代码的不规范/规范用法示例参见B.3.2。

    7.2.1不同会话间信息泄露

    审计指标:代码应避免不同会话之间发生信息泄露 审计人员应检查代码在应用的不同会话之间是否会发生信息泄露,尤其是在多线程环境下

    7.2.2发布未完成初始化的对象

    审计指标:不宜发布未完成初始化的对象。 审计人员宜检查代码在多线程环境中,是否存在对象初始化尚未完成前,就可被其他线 情况。

    7.2.3共享资源的并发安全

    审计指标:共享资源宜使用正确的并发处理机制 审计人员宜检查代码中共享资源的使用及并发处理的过程,包括但不限于: a)宜检查代码在多线程环境中对共享数据的访问是否为同步访问,如果结果为否定,则提示存在 安全风险; b)宜检查代码中线程间的共享对象是否声明正确的存储持续期,如果结果为否定,则提示存在安 全风险; c)宜检查代码中是否在并发上下文中使用不可重人的函数,如果结果为肯定,则提示存在安全 风险; d 宜检查代码中是否避免了检查时间与使用时间资源冲突: 宜检查代码中多个线程中等待彼此释放锁的可执行片段是否避免了死锁情况发生,如果结果 为否定,则提示存在安全风险; 宜检查代码对共享资源执行敏感操作时是否检查加锁状态,如果结果为否定,则提示存在安全 风险。规范/不规范代码示例参见B.3.3; g)宜检查代码是否将敏感信息存储在没有被锁定或被错误锁定的内存中(将敏感信息存储于加 锁不恰当的内存区域,可能会导致该内存通过虚拟内存管理器被写入到在磁盘上的交换文件 中,从而使得数据更容易被外部获取),如果结果为肯定,则提示存在安全风险; h 宜检查代码中是否存在关键资源多重加锁,如果结果为肯定,则提示存在安全风险; i)宜检查代码中是否存在关键资源多重解锁,如果结果为肯定,则提示存在安全风险: 1 宜检查代码中是否存在对未加锁的资源进行解锁,如果结果为肯定,则提示存在安全风险; k)宜检查代码中在异常发生时是否释放已经持有的锁,如果结果为否定,则提示存在安全风险

    7.2.4子进程访问父进程敏感资源

    GB/T39412—2020

    审计指标:在调用子进程之前应关闭敏感文件描述符,避免子进程使用这些描述符来执行未经授权 的1/0操作。 审计人员宜检查代码是否存在调用子进程之前有未关闭敏感文件描述符的情形。当一个新进程被 创建或执行时,子进程继承任何打开的文件描述符,如不关闭则可能会造成未经授权的访问。规范/不 规范代码示例参见B.3.4

    7.2.5释放线程专有对象

    审计指标:应及时释放线程专有对象。 审计人员应检查代码是否及时释放线程专有对象.防止内存泄漏造成拒绝服务攻击

    7.3.1格式化字符串

    审计指标:应避免外部控制的格式化字符串。 审计人员应检查代码中是否存在函数接受格式化字符串作为参数的情况,格式化字符串是否来自 外部,如果是,则可能引起注人类安全风险。规范/不规范代码示例参见B.3.5

    7.3.2对方法或函数参数验证

    审计指标:宜对方法或函数的参数进行验证。 审计人员宜检查代码是否存在对方法或函数的参数进行合法性或安全性校验。规范/不规范代码 示例参见B.3.6

    7.3.3参数指定错误

    审计指标:函数功能调用宜正确指定参数。 审计人员宜检查函数/方法调用时参数指定是否正确,是否存在如下情况: a)不正确数量的参数; b) 参数顺序不正确; 参数类型不正确; d)错误的值。 以上检查项的任一结果为肯定,则提示存在安全风险

    7.3.4 返回栈变量地圳

    审计指标:不宜返回栈变量地址 因栈变量在函数调用结束 被释放,再使用该变量地址时可能

    7.3.5实现不一致函数

    审计指标:不宜使用具有不一致性实现的函数或方法。 审计人员宜检查代码是否存在使用了在不同版本具有不一致实现的函数或方法。因使用在不同 系统或不同版本实现不一致的函数或方法,可能导致代码被移植到不同环境时改变行为

    GB/T 394122020

    7.3.6暴露危险的方法或函数

    审计指标:不应暴露危险的方法或函数, 审计人员应检查代码中的API或其他与外部交互的接口是否暴露了危险方法或函数,暴露危险的 方法或函数可能会带来非授权访问攻击。危险方法或函数暴露的形式主要包括方法/函数原本设计为 非外部用户使用、原本设计为部分用户访问等。代码的不规范/规范用法示例参见B.3.8

    审计指标:宜恰当进行异常处理。 审计人员宜检查代码中异常处理是否安全,包括但不限于: a)宜检查是否对异常进行检查并处理; b)宜检查是否采用标准化的、一致的异常处理机制来处理代码中的异常: c)宜检查错误发生时,是否提供正确的状态代码或返回值来表示发生的错误; d)宜检查是否对执行文件I/O的返回值进行检查; e)宜检查是否对函数或方法返回值是否为预期值进行了检查; f)宜检查是否返回定制的错误页面给用户来预防敏感信息的泄露。 如上检查项的任一结果为否定,则提示存在安全风险

    .5.1不兼容的指针类型

    审计指标:不宜使用不兼容类型的指针来访问变量 审计人员宜检查代码是否使用不兼容类型的指针来访问变量。通过不兼容类型的指针修改变量可 能会导致不可预测的结果。代码的不规范用法示例参见B.3.9

    工程标准规范范本7.5.2利用指针减法确定内存大小

    审计指标:宜避免使用指针的减法来确定内存天小。 审计人员宜检查代码是否采用一个指针减去另一个指针的方式来确定内存大小。如果两个指针 一类型,那么使用指针的减法来确定内存大小的计算可能会不正确,导致不可预测的结果。代码 范/规范用法示例参见B.3.10。

    7.5.3将固定地址赋值给指针

    审计指标:不宜把固定地址赋值给指针。 审计人员宜检查代码是否将一个NULL或0以外的固定地址赋值给指针。将固定地址赋值给指 针会降低代码的可移植性,并为攻击者进行注入代码攻击提供便利

    7.5.4试图访问非结构体类型指针的数据域

    审计指标:不应把指向非结构体类型指针强制转换为指向结构类型的指针并访问其字段, 审计人员应检查代码是否将指向非结构体类型的指针电缆标准,强制转换为指向结构类型的指针并访问其 字段,如果结果为肯定,则可能存在内存访问错误或数据损坏的风险

    7.5.5指针偏移越界

    审计指标:不应使用偏移越界的指针

    ....
  • 相关专题: 信息安全  

相关下载

常用软件