GB/T39412-2020

信息安全技术代码安全审计规范

Informationsecuritytechnology—Auditspecificationofcodesecurity

本文分享国家标准信息安全技术代码安全审计规范的全文阅读和高清PDF的下载,信息安全技术代码安全审计规范的编号:GB/T39412-2020。信息安全技术代码安全审计规范共有41页,发布于2021-06-01
  • 中国标准分类号(CCS)L80
  • 国际标准分类号(ICS)35.040
  • 实施日期2021-06-01
  • 文件格式PDF
  • 文本页数41页
  • 文件大小3.08M

以图片形式预览信息安全技术代码安全审计规范

信息安全技术代码安全审计规范


国家标准 GB/T39412一2020 信息安全技术代码安全审计规范 nformationseeuritytechnology一Auditspeeifieationofcodeseeurity 2020-11-19发布 2021-06-01实施 国家市场监督管理总局 发布 国家标涯花管理委员会国家标准
GB/39412一2020 目 次 前言 范围 2 规范性引用文件 术语,定义和缩略语 3.1术语和定义 3.2缩略语 审计概述 4.I审计说明 4.2审计目的 4,3审计时机 士.4审计人员 4.5审计方法 审计过程 总体流程 5.l 5.2审计准备 5.3审计实施 5.4审计报告 5.5改进跟踪 安全功能缺陷审计 6.1数据清洗 6.2数据加密与保护 6.3访问控制 6.4日志安全 代码实现安全缺陷审计 ll 7.1面向对象程序安全 1 7.2并发程序安全 12 7.3函数调用安全 13 7.4异常处理安全 14 7.5指针安全 14 7.6代码生成安全 15 资源使用安全缺陷审计 15 8.1资源管理 15 16 8.2内存管理 18 8.3数据库使用 18 8.4文件管理 19 8.5网络传输
GB/T39412一2020 o 19 环境安全缺陷审计 19 9.1遗留调试代码 19 9.2第三方软件安全可靠 20 9.3保护重要配置信息 21 附录A资料性附录代码安全审计报告 + 22 附录B(资料性附录代码示例 37 参考文献
GB/39412一2020 前 言 本标准按照GB/T1.1一2009给出的规则起草 请注意本文件的某些内容可能涉及专利 本文件的发布机构不承担识别这些专利的责任 本标准由全国信息安全标准化技术委员会(SAC/TC260)提出并归口 本标准起草单位;信息安全共性技术国家工程研究中心、科学院信息工程研究所、国家保密科 技测评中心、北京信息安全测评中心、信息安全测评中心、电子技术标准化研究院、公安部第三 研究所、国家计算机网络应急技术处理协调中心 本标准主要起草人;王彦杰,胡建勋、徐根炜、高振鹏,伊鹏达、肖树根,康蕊、霍玮,朴爱花、李丰 何建波、刘国乐、刘海峰,赵章界、李晨肠、王嘉捷、辛伟、孙彦、孙永清、郭运尧、王博、吴倩
GB/39412一2020 信息安全技术代码安全审计规范 范围 本标准规定了代码安全的审计过程以及安全功能缺陷、代码实现安全缺陷、资源使用安全缺陷、环 境安全缺陷等典型审计指标及对应的证实方法 本标准适用于指导代码安全审计相关工作 规范性引用文件 下列文件对于本文件的应用是必不可少的 凡是注日期的引用文件,仅注日期的版本适用于本文 凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件 件 GB/T15272一1994程序设计语言C GB/T25069信息安全技术术语 GB/T35273一2020信息安全技术个人信息安全规范 术语,定义和缩略语 3.1术语和定义 GB/T15272一1994,GB/T25069和GB/T35273一2020界定的以及下列术语和定义适用于本 文件 3.1.1 代码安全审计codeseeurityadit 对代码进行安全分析,以发现代码安全缺陷或违反代码安全规范的动作 3.1.2 安全缺陷seeuritydefeet 代码中存在的某种破坏软件安全能力的问题、错误 3.1.3 跨站脚本攻击crosssiteseript 攻击者向web页面里面插人恶意HTM1代码,当用户浏览该页面时,嵌人到web里面的HTMI 代码会被执行,从而达到攻击者的特殊目的 3.1.4 缓冲区溢出butrerovertow 向程序的缓冲区写人超出其长度的内容,从而破坏程序堆栈,使程序转而执行其他指令,以获取程 序或系统的控制权 3.1.5 死锁deadlock 两个或两个以上的进程在执行过程中,因竞争资源或彼此通信而造成的一种阻塞现象
GB/T39412一2020 3.1.6 错误error 系统运行中出现的可能导致系统崩溃或者暂停运行的非预期问题 3.1.7 特殊元素speeialelements 用于特定表达式或语言中分隔数据不同部分的字节、字符或字的序列 3.1.8 异常eeptun 导致程序中断运行的一种指令流 注如果不对异常进行正确的处理,则可能导致程序的中断执行 3.1.9 SQL注入SQLinjeetiom 将恶意sQL命令插人数据库请求参数,并提交给数据库执行的攻击行为 3.2缩略语 下列缩略语适用于本文件 API:应用程序编程接口(ApplicationProgrammingInterface) CSPRNG;伪随机数产生器(CryptographiceallySecurePseudo-RandomNumberGenerator) DS;域名系统(DomainNameSystem HTMl:超文本标记语言HyperTextMarkupLanguage) HTTP;超级文本传输协议(HyperTextTransferProtocol sQL:结构化查询语言(StructuredQuery Language URL;统一资源定位符(UniformResoureeLocator) 审计概述 4.1审计说明 针对软件系统的代码制定出安全缺陷审计条款,审计时可根据被审计的具体对象及应用场景对相 关条款进行调整 考虑到语言的多样性,以典型的结构化语言(C)和面向对象语言(Java)为目标进行描 述 代码安全审计应包括但不限于如下4个方面的具体条款 其中;安全措施37条审计条款;代码实 现25条审计条款;资源使用32条审计条款;环境安全3条审计条款;总计97条审计条款 4.2审计目的 代码安全审计通过审计发现代码的安全缺陷,以提高软件系统安全性,降低安全风险 鉴于安全漏 洞形成的综合性和复杂性,代码安全审计主要针对代码层面的安全风险、代码质量,以及形成漏洞的各 种脆弱性因素 通过代码审计形成审计报告,列出代码中针对审计列表的符合性/违规性条目,提出对代码修订的 措施和建议 4.3 审计时机 代码安全审计包括内部审计和外部审计 内部审计由单位内部的软件质量保证人员开展,审计的
GB/39412一2020 意义是发现和预防安全问题的发生 外部审计由第三方开展 外部审计需要较多的准备工作,不宜频 繁安排 审计工作可安排在代码编写完成之后系统集成测试之前开展 由于资质认证,政策要求等因 素,开展外部审计应提前通知开发团队,并预留足够时间 内部审计通过代码安全审计,保证软件代码安全质量 内部审计可安排在软件开发生命周期内的 不同阶段 历史审计结果可以作为审计考虑的因素 若审计出的安全问题较多,则应根据实际修复情况适当 增加审计次数 在代码开发过程中,如果有频繁改变代码开发计划或调整里程碑等异常情况时,也应增 加审计次数 4.4审计人员 审计人员的主要工作职能是收集信息和代码缺陷分析等,应具备代码审计的专业知识;应能够客观 地呈现代码的问题,不应隐瞒;应对代码等相关内容保守秘密,不得泄露相关信息 4.5审计方法 代码安全审计常用的方法是将代码安全缺陷形成审计检查列表,对照代码逐一检查 检查列表应 根据被审计的对象和应用场景进行调整 考虑到审计内容的复杂性,审计方法建议采用工具审计和人工审计相结合,多种手段综合运用的 方式 采用专业代码审计工具对代码进行审计,形成审计报告,并对审计出的问题与标准相关审计项逐一 人工核对 对于使用外部开源代码较多的系统,在审计时可先检测开源代码的使用率,开源代码的安全 缺陷可从已知漏洞角度检查 由于审计工具的局限性,不可避免存在误报和漏报 对于误报问题,应采 用人工对比审计核查的方式开展 对于漏报问题应采用多个工具交叉审计的方式开展 人工审计是工 具审计的必要补充,人工审计主要解决工具审计的误报和漏报问题 在人工审计实施中,可借助工具对 代码模块、数据流、控制流等逻辑结构进行分析提取,并逐条比对分析 审计实施过程中,可根据审计工作需要划分工作阶段 如按进度或里程碑划分;按周月、季度划 分;按功能模块实施单元划分;按人员分工交叉审计划分等 对于审计出的缺陷,可根据缺陷的可利用性、影响程度、弥补代价等因素进行分级排序 审计过程 5.1总体流程 审计过程包括四个阶段;审计准备、审计实施、审计报告、改进跟踪 审计准备阶段,主要开展基本 情况调研、签署保密协议、准备检查清单等工作;审计实施阶段,主要开展资料检查、代码审查、结果分析 等工作;报告阶段包括审计结果的总结、陈述等工作,如有必要进行相关问题的澄清和相关资料说明;改 进跟踪工作由代码开发团队进行,主要对审计出的问题进行修复 对于安全缺陷代码修改后,再次进行 审计 代码安全审计流程见图1
GB/T39412一2020 审计准备 明确审计目的 签署保密协议 熟悉代码 制定检查列表 背景调研 审计实施 审计入场 信息收集 代码安全缺陷检测 特殊情形审查 审计报告 改进跟踪 图1代码安全审计流程 5.2审计准备 5.2.1明确审计目的 代码安全审计的目的包括软件采购/外包测试、软件产品的认证测试,公司软件代码安全性自查等 5.2.2签署保密协议 为避免被审计单位的代码被审计方用于非代码审计用途,双方应签署代码审计保密协议,明确双方 的权利和义务 5.2.3背景调研 了解代码的应用场景、目标客户、开发内容、开发者遵循的标准和流程等 5.2.4熟悉代码 通过阅读代码,了解程序代码结构,主要功能模块,以及采用的编程语言 5.2.5制定检查列表 通过明确审计目的、背景调研、熟悉代码等工作,形成代码安全审计要点,制定代码安全的检查列 表 检查列表包括检查项和问题列表 5.3审计实施 5.3.1审计入场 人场实施环节中,审计人员和项目成员(关键代码开发人员等)均应参与 审计人员介绍审计的主 要目标,访谈对象和检查的资料等 项目人员介绍项目进展、项目关键成员、项目背景,实现功能以及项 目的当前状态等 5.3.2信息收集 信息收集环节通过访谈等方式获得代码以及相应需求分析文档、设计文档,测试文档等资料 通过
GB/39412一2020 文档资料了解代码的业务逻辑等信息 在了解代码基本信息的基础上,通过深人分析设计文档访谈关 键开发人员等方式,区分核心代码和一般性代码,其中核心代码一般为涉及核心业务功能和核心软件功 能的代码,一般性代码为非核心业务功能和非核心软件功能的代码 5.3.3代码安全缺陷检测 代码安全缺陷检测环节是根据制定的代码安全的检查项,采用工具审计、人工审计、人工结合工具 审计方式检查是否存在安全缺陷,检测完成后进行安全性分析形成安全审计结果 5.3.4特殊情形审查 在有软件外包/采用开源软件/合作开发情形下,应对开源软件或外包部分进行代码安全审计 对 于核心代码和一般性代码在审计时,采取重点审计和一般性审计措施,其中重点审计主要针对核心代码 进行审计,一般性审计主要针对一般性代码进行审计 5.4审计报告 审计实施完成后,组织召开评审会,将初始审计结果提供给被审计项目成员,并提供澄清误解机会, 允许项目成员提供其他需要补充的信息 评审会结束后,根据评审意见,调整审计结果,形成审计报告 审计报告包括审计的总体描述,审计 结论等内容,并对可能产生的安全风险进行高、中,低分类描述 审计结论给出每条审计条款的符合/不 S 符合的描述 审计报告的内容示例参见附录A 5.5改进跟踪 对审计中发现的问题进行修改,对未修改的应提供理由;对代码的有效变更进行记录存档 对于修 复安全缺陷后的代码,可通过再次审计来确认问题是否解决 安全功能缺陷审计 6.1数据清洗 6.1.1输入验证 6.1.1.1关键状态数据外部可控 审计指标;应避免关键状态数据被外部控制 审计人员应检查代码中是否将与用户信息或软件自身安全密切相关的状态信息,存储在非授权实 体都可以访问的地方,如结果为肯定,则系统可能有关键状态数据能被外部访问或篡改的安全风险 不 规范代码示例参见B.2.1 6.1.1.2数据真实性验证 审计指标;宜验证数据真实性,避免接收无效数据 审计人员宜检查代码是否对数据的真实性进行验证,包括但不限于 宜检查是否有数据源或通信源验证 a 宜检查是否存在未验证或不正确验证数据的数字签名 b 宜检查是否缺失或进行不恰当完整性检查; c d 宜检查安全相关的输人是否仅依赖于加密技术而未进行完整性检查; 宜检查是否验证文件内容而非文件名或扩展名
GB/T39412一2020 fD 宜检查是否验证未经校验和完整性检查的Cookie 不规范代码示例参见B.2.2 如上检查项的任一结果为肯定,则提示存在安全风险 6.1.1.3绕过数据净化和验证 审计指标:宜防止以大小写混合的方式绕过数据净化和验证 审计人员宜检查字符串在查找、替换、比较等操作时,是否存在因大小写问题而被绕过的情况 不 规范代码示例参见B.2.3 6.1.1.4在字符串验证前未进行过滤 审计指标:不宜在过滤字符串之前对字符串进行验证 审计人员宜检查对字符串进行验证之前是否存在对该字符串进行过滤,来防止注人类攻击的发生 6.1.1.5对HTIP头web脚本特殊元素处理 审计指标;应对HTTP头的Web脚本语法中的特殊元素进行过滤和验证 审计人员应检查代码是否对HTTP头中的web脚本特殊元素进行过滤处理 因HT'TP头中的 web脚本含有特殊元素,可能会导致浏览器执行恶意脚本 不规范代码示例参见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对环境变量长度做出假设 审计指标;不应对环境变量的长度做出假设 审计人员应检查代码在使用环境变量时是否对环境变量的长度做出特定值的假设,因环境变量可 由用户进行设置修改,故对环境变量的长度做出假设可能会发生错误 规范/不规范代码示例参见 B.2.8
GB/39412一2020 6.1.1.10条件比较不充分 审计指标:执行比较时不应部分比较或不充分的比较 审计人员应检查比较条件是否充分,防止不充分比较造成逻辑绕过风险 6.1.1.11结构体长度 审计指标;不应将结构体的长度等同于其各个成员长度之和 审计人员应检查代码是否将结构体的长度等同于其各成员长度之和,不应将结构体长度等同于各 成员长度之和 结构对象可能存在无名的填充字符从而造成结构体长度与各个成员长度之和并不相 等 不规范代码示例参见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/T39412一2020 6.1.2输出编码 6.1.2.1 跨站脚本 审计指标;应避免跨站脚本攻击 审计人员应检查代码中用户提交的数据放到页面中,被送到浏览器进行显示前,是否进行了验证或 过滤 6.1.2.2web应用重定向后执行额外代码 审计指标,web应用不宜在重定向后执行额外代码 审计人员宜检查web应用是否存在重定向后执行额外代码的情况,如果结果为肯定,则提示存在 安全风险 6.1.2.3URL重定向 审计指标;不应开放不可信站点的URI 重定向 审计人员应检查代码是否存在URL重定向到不可信站点的情况,因重定向到不可信站点,可能会 发生访问安全风险 6.2数据加密与保护 6.2.1数据加密 6.2.1.1密码安全 审计指标;密码相关实现技术应符合国家密码相关管理规定 审计人员应检查代码中使用的密码相关实现技术是否符合国家密码管理部门相关管理规定,若不 符合,则提示存在安全风险 6.2.1.2随机数安全 审计指标;应确保产生安全的随机数 审计人员应检查代码是否产生安全的随机数,具体审计要求包括但不限于 应检查是否采用能产生充分信息饷的算法或方案 代码的不规范示例参见B.2.13 a bh 应检查是否避免随机数的空间太小 应检查是否避免cSPRNG每次都使用相同的种子,可预测的种子(如进程ID或系统时间的当 c 前值)或空间太小的种子; 应检查是否避免使用具有密码学缺陷的cSPRNG用于加密场景 d 如上检查项的任一结果为否定,则提示存在安全风险 6.2.1.3使用安全相关的硬编码 审计指标:不应使用安全相关的硬编码 审计人员应检查代码中是否存在跟安全相关的硬编码,如果代码泄漏或被非法获取,这些硬编码的 值可能会被攻击者利用 6.2.2数据保护 6.2.2.1敏感信息暴露 审计指标:应避免敏感信息暴露
GB/39412一2020 审计人员应检查代码中是否有敏感信息暴露,重点检查暴露的途径包含但不限于 通过发送数据导致的信息暴露 a b 通过数据查询导致的信息暴露; 通过差异性(响应差异性、行为差异性、时间差异性)导致的信息暴露; d 通过错误消息导致的信息暴露 敏感信息的不恰当跨边界移除导致信息暴露; 通过进程信息导致的信息暴露 通过调试信息导致的信息暴露; 8 h 信息在释放前未清除导致信息暴露 通过输出流或日志将系统数据暴露到未授权控制的范围; j 通过缓存导致的信息暴露; k 通过日志文件导致的信息暴露 通过源代码导致的信息暴露,如测试代码,源代码、注释等 敏感信息使用HTTP请求传递导致信息暴露; m 备份文件导致信息暴露 n 在web登录表单中,宜禁止浏览器的口令自动填充功能 o 不规范代码示例参见B.2.14 6.2.2.2个人信息保护 审计指标;应确保个人信息保护 审计人员应检查代码中对个人信息保护是否符合国家相关法律法规的要求 若存在个人信息保护 不当,可能造成个人信息泄漏 6.3访问控制 6.3.1身份鉴别 6.3.1.1身份鉴别过程中暴露多余信息 审计指标;应避免在处理身份鉴别的过程中暴露多余信息 审计人员应检查账号在注册或认证过程中,是否存在暴露多余信息的情况 攻击者可能会利用获 取到的多余信息,进行认证暴力破解 6.3.1.2身份鉴别被绕过 审计指标;应避免身份鉴别被绕过 审计人员应检查代码中身份鉴别机制是否存在被绕过的路径或通道,鉴别算法的关键步骤是否被 省略或跳过 6.3.1.3身份鉴别尝试频率限制 审计指标;应对身份鉴别连续多次登录失败频率进行限制 审计人员应检查代码中是否实现对身份鉴别多次登录失败的频率进行限制 如结果为否定,则系 统存在身份认证被暴力破解的安全风险 6.3.1.4多因素认证 审计指标;宜使用多因素认证机制
GB/T39412一2020 审计人员宜检查是否采用多因素认证,如果结果为否定,则提示存在安全风险 6.3.2口令安全 6.3.2.1登录口令 审计指标;应确保登录过程中口令不可明文显示 审计人员应检查代码中是否实现在登录过程中口令是否明文显示 6.3.2.2明文存储口令 审计指标;应避免明文存储口令 审计人员应检查代码中是否存在明文存储口令的情况 6.3.2.3明文传递口令 审计指标;应避免明文传递口令 审计人员应检查代码中是否存在明文传递口令的情况 6.3.3权限管理 6.3.3.1 权限访问控制 审计指标:应确保权限管理安全以及其他访问控制措施的安全 审计人员应检查代码中的权限与访问控制功能相关部分,包括但不限于 应检查是否缺失认证机制,如果结果为肯定,则提示存在安全风险 a b 应检查是否缺失授权机制,如果结果为肯定,则提示存在安全风险 应检查是否违背最小特权原则,以高于功能所需的特权级别在执行一些操作,如果结果为肯 定,则提示存在安全风险; 行,是否检查其放弃是否成功,如果结果为否定,则提示存在安全风险; 应检查放弃特权后 应检查是否创建具有正确访问权限的文件,如果结果为否定,则提示存在安全风险; 应检查是否避免关键资源的不正确权限授予,如果结果为否定,则提示存在安全风险; g 应检查是否存在攻击者使用欺骗或捕获重放攻击等手段绕过身份认证的情况,如果结果为肯 定,则提示存在安全风险; 应检查是否避免不恰当地信任反向DNS,如果结果为否定,则提示存在安全风险 代码的不 h 规范/规范用法示例参见B.2.15 对于客户端/服务器架构的产品,应检查是否存在仅在客户端而非服务器端执行认证,如果结 果为肯定,则提示存在安金风险, 应检查是否避免过于严格的账户锁定机制账户锁定保护机制过于严格且容易被触发,就允许 1 攻击者通过锁定合法用户的账户来拒绝服务合法的系统用户),如果结果为否定,则提示存在 安全风险; 应检查是否未对信道两端的操作者进行充分的身份认证,或未充分保证信道的完整性,从而允 许中间人攻击发生,如果结果为肯定,则提示存在安全风险 应检查是否避免通信通道源的验证不当,确保请求来自预期源,如果结果为否定,则提示存在 安全风险; 应检查通信信道是否正确指定目的地来预防如下风险:攻击者在目的地伪装成受信任的服务 m 器来窃取数据或引起拒绝服务 如果结果为否定,则提示存在安全风险 10
GB/39412一2020 6.3.3.2未加限制的外部可访问锁 审计指标;宜对外部可访问锁加以限制,不允许被预期范围之外的实体影响 审计人员宜检查代码中的锁是否可被预期范围之外的实体控制或影响,如结果为肯定,则系统存在 易受到拒绝服务攻击的安全风险 6.4日志安全 6.4.1对输出日志中特殊元素处理 审计指标;应对输出日志中的特殊元素进行过滤和验证 审计人员应检查代码是否对输出日志中的特殊元素做过滤和验证 因对特殊元素未做过滤,可能 会造成信息泄露 6.4.2信息丢失或遗漏 审计指标;宜避免安全相关信息丢失或遗漏 审计人员宜检查代码是否未记录或不恰当记录安全相关信息,安全相关信息丢失或遗漏可能会给 追溯攻击行为带来影响 信息丢失或遗漏形式包含但不限于 截断与安全有关信息的显示.记录或处理,掩盖攻击的来源或属性; b 不记录或不显示信息(如日志),而该信息对确定攻击来源,攻击性质、攻击行动是否安全具有 重要意义 代码实现安全缺陷审计 7.1面向对象程序安全 7.1.1泛型和非泛型数据类型 审计指标:不宜混用具有泛型和非泛型的数据类型 审计人员宜检查代码是否存在泛型和非泛型之间数据类型的混用现象,应避免泛型和非泛型数据 类型的混用 规范/不规范代码示例参见B,3.1! 7.1.2包含敏感信息类的安全 审计指标;包含敏感信息的类不应可复制和可序列化 审计人员应检查代码中包含敏感信息类的相关行为是否安全包括但不限于 应检查代码中包含敏感信息的类是否可复制,如Java语言中实现了Clonenable接口,使类可 复制 包含敏感信息的类不应被复制 应检查代码中包含敏感信息的类是否可实现了序列化接口,使类可序列化 包含敏感信息的 b 类不应可序列化 7.1.3类比较 审计指标;在类进行比较时,不宜只使用名称比较 审计人员宜检查代吗中当判定一个对象是否属于特定的类或两个对象的类是否相同时,宜比较类 对象,不能仅基于类名称进行判定 1
GB/T39412一2020 7.1.4类私有可变成员的引用 审计指标;应禁止返回类的私有可变成员的引用 审计人员应检查代码中是否存在返回类私有可变成员的引用的情况 如结果为肯定,则可能存在 内部状态被非预期修改的风险 7.1.5存储不可序列化的对象到磁盘 审计指标:不应将不可序列化的对象存储到磁盘 审计人员应检查代码是否试图将不可序列化的对象写到磁盘中,将不可序列化的对象存储到磁盘 上,会导致对象反序列化失败,可能引起任意代码执行风险 代码的不规范/规范用法示例参见B.3.2 7.2并发程序安全 7.2.1不同会话间信息泄露 审计指标:代码应避免不同会话之间发生信息泄露 审计人员应检查代码在应用的不同会话之间是否会发生信息泄露,尤其是在多线程环境下 7.2.2发布未完成初始化的对象 审计指标:不宜发布未完成初始化的对象 审计人员宜检查代码在多线程环境中,是否存在对象初始化尚未完成前,就可被其他线程引用的 情况 7.2.3共享资源的并发安全 审计指标;共享资源宜使用正确的并发处理机制 审计人员宜检查代码中共享资源的使用及并发处理的过程,包括但不限于 宜检查代码在多线程环境中对共享数据的访问是否为同步访问,如果结果为否定,则提示存在 a 安全风险 宜检查代码中线程间的共享对象是否声明正确的存储持续期,如果结果为否定,则提示存在安 b 全风险 宜检查代码中是否在并发上下文中使用不可重人的函数,如果结果为肯定,则提示存在安全 风险; 宜检查代码中是否避免了检查时间与使用时间资源冲突 d 宜检查代码中多个线程中等待彼此释放锁的可执行片段是否避免了死锁情况发生,如果结果 为否定,则提示存在安全风险 宜检查代码对共享资源执行敏感操作时是否检查加锁状态,如果结果为否定,则提示存在安全 风险 规范/不规范代码示例参见B.3.3; 宜检查代码是否将敏感信息存储在没有被锁定或被错误锁定的内存中(将敏感信息存储于加 锁不恰当的内存区域,可能会导致该内存通过虚拟内存管理器被写人到在磁盘上的交换文件 中,从而使得数据更容易被外部获取),如果结果为肯定,则提示存在安全风险; h)宜检查代码中是否存在关键资源多重加锁,如果结果为肯定,则提示存在安全风险 宜检查代码中是否存在关键资源多重解锁,如果结果为肯定,则提示存在安全风险 宜检查代码中是否存在对未加锁的资源进行解锁,如果结果为肯定,则提示存在安全风险; j k 宜检查代码中在异常发生时是否释放已经持有的锁,如果结果为否定,则提示存在安全风险 12
GB/39412一2020 7.2.4子进程访问父进程敏感资源 审计指标;在调用子进程之前应关闭敏感文件描述符,避免子进程使用这些描述符来执行未经授权 的I/0操作 审计人员宜检查代码是否存在调用子进程之前有未关闭敏感文件描述符的情形 当一个新进程被 创建或执行时,子进程继承任何打开的文件描述符,如不关闭则可能会造成未经授权的访问 规范/不 规范代码示例参见B.3.4 7.2.5释放线程专有对象 市审计指标;应及时释放线程专有对象 审计人员应检查代码是否及时释放线程专有对象,防止内存泄漏造成拒绝服务攻击 7.3函数调用安全 7.3.1格式化字符串 审计指标;应避免外部控制的格式化字符串 审计人员应检查代码中是否存在函数接受格式化字符串作为参数的情况,格式化字符串是否来自 外部,如果是,则可能引起注人类安全风险 规范/不规范代码示例参见B3.5 7.3.2对方法或函数参数验证 审计指标;宜对方法或函数的参数进行验证 审计人员宜检查代码是否存在对方法或函数的参数进行合法性或安全性校验 规范/不规范代码 示例参见B.3.6 7.3.3参数指定错误 审计指标;函数功能调用宜正确指定参数 审计人员宜检查函数/方法调用时参数指定是否正确,是否存在如下情况 不正确数量的参数; b 参数顺序不正确; 参数类型不正确; d)错误的值 以上检查项的任一结果为肯定,则提示存在安全风险 7.3.4返回栈变量地址 审计指标;不宜返回栈变量地址 审计人员宜检查代码中是否存在在丽数中迟回枝变量地址的情形 因栈变量在函数调用结束后就 会被释放,再使用该变量地址时可能会出现意想不到的结果 不规范代码示例参见B.3.7 7.3.5实现不一致函数 审计指标;不宜使用具有不一致性实现的丽数或方法 审计人员宜检查代码是否存在使用了在不同版本具有不一致实现的丽数或方法 因使用在不同操 作系统或不同版本实现不一致的函数或方法,可能导致代码被移植到不同环境时改变行为 13
GB/T39412一2020 7.3.6暴露危险的方法或函数 审计指标:不应暴露危险的方法或函数 审计人员应检查代码中的API或其他与外部交互的接口是否暴露了危险方法或函数,暴露危险的 方法或函数可能会带来非授权访问攻击 危险方法或函数暴露的形式主要包括方法/函数原本设计为 非外部用户使用、原本设计为部分用户访问等 代码的不规范/规范用法示例参见B.3.8 7.4异常处理安全 审计指标;宜恰当进行异常处理 审计人员宜检查代码中异常处理是否安全,包括但不限于 a 宜检查是否对异常进行检查并处理; b 宜检查是否采用标准化的、一致的异常处理机制来处理代码中的异常; 宜检查错误发生时,是否提供正确的状态代码或返回值来表示发生的错误; 宜检查是否对执行文件1o的返回值进行检查 d 宜检查是否对函数或方法返回值是否为预期值进行了检查 宜检查是否返回定制的错误页面给用户来预防敏感信息的泄露 f 如上检查项的任一结果为否定,则提示存在安全风险 7.5指针安全 7.5.1不兼容的指针类型 审计指标;不宜使用不兼容类型的指针来访问变量 审计人员宜检查代码是否使用不兼容类型的指针来访问变量 通过不兼容类型的指针修改变量可 能会导致不可预测的结果 代码的不规范用法示例参见B.3.9 7.5.2利用指针减法确定内存大小 审计指标:宜避免使用指针的减法来确定内存大小 审计人员宜检查代码是否采用一个指针减去另一个指针的方式来确定内存大小 如果两个指针不 是同一类型,那么使用指针的减法来确定内存大小的计算可能会不正确,导致不可预测的结果 代码的 不规范/规范用法示例参见B.3.10. 7.5.3将固定地址赋值给指针 审计指标;不宜把固定地址赋值给指针 审计人员宜检查代码是否将一个NULL或0以外的固定地址赋值给指针 将固定地址赋值给指 针会降低代码的可移植性,并为攻击者进行注人代码攻击提供便利 7.5.4试图访问非结构体类型指针的数据域 审计指标.不应把指向非结构体类型指针强制转换为指向结构类型的指针并访问其字段 审计人员应检查代码是否将指向非结构体类型的指针,强制转换为指向结构类型的指针并访问其 字段,如果结果为肯定,则可能存在内存访问错误或数据损坏的风险 7.5.5指针偏移越界 审计指标:不应使用偏移越界的指针 14
GB/39412一2020 审计人员应检查代码在使用指针时是否存在偏移越界的情况,因指针偏移越界可能会造成访问缓 冲区溢出风险 7.5.6无效指针使用 审计指标;应避免无效指针的使用 审计人员应检查代码是否存在使用无效指针的情况,因使用无效指针,可能会产生非预期行为 7.6代码生成安全 7.6.1编译环境安全 审计指标;应构建安全的编译环境 审计人员应检查编译环境安全包括但不限于 应检查编译器是否从官方或其他可靠渠道获取,并确保其安全可靠; b)应检查编译器是否存在不必要的编译功能 7.6.2链接环境安全 审计指标;应构建安全的链接环境 审计人员应检查链接环境安全,包括但不限于 应检查编译后的目标文件是否安全,确保链接后生成的可执行文件的安全; a b)应检查链接依赖库是否安全,避免引人不安全的依赖库 资源使用安全缺陷审计 8.1资源管理 8.1.1重复释放资源 审计指标;应避免重复释放资源 审计人员应检查代码是青存在重复释放资源的情况 重复释放资源可能会造成系统崩谈 8.1.2资源或变量不安全初始化 审计指标;宜避免不安全的资源或变量初始化 审计人员宜检查代码是否对资源或变量进行了安全的初始化,包括但不限于 宜检查代码是否对关键变量进行初始化,未初始化关键变量易导致系统按非预期值执行,如结 果为否定,则提示存在安全风险 宜检查代码是否采用了不安全或安全性较差的缺省值来初始化内部变量 缺省值通常和产品 -起发布,容易被熟悉产品的潜在攻击者获取而带来系统安全风险,如结果为肯定,则提示存 在安全风险; 宜检查代码中关键的内部变量或资源是否采用了可信边界外的外部输人值进行初始化,如结 果为肯定,则提示存在安全风险 8.1.3初始化失败后未安全退出 审计指标:初始化失败后应安全退出程序 审计人员应检查代码在初始化失败后能否安全退出 15
GB/T39412一2020 8.1.4引用计数的更新不正确 审计指标;应避免引用计数的更新不正确 审计人员应检查代码中管理资源的引用计数是否正确更新,引用计数更新不正确,可能会导致资源 在使用阶段就被过早释放,或虽已使用完毕但得不到释放的安全风险 8.1.5资源不安全清理 审计指标;宜避免不安全的资源清理 审计人员宜检查代码中资源清理部分的相关功能,检查代码在使用资源后是否恰当地执行临时文 件或辅助资源的清理,避免清理环节不完整 8.1.6将资源暴露给非授权范围 审计指标;不应将资源暴露给非授权的范围 审计人员应检查代码是否将文件和目录等资源暴露给非授权的范围,如果存在,则提示代码存在信 息暴露的风险 8.1.7未经控制的递归 审计指标;应避免未经控制的递归 审计人员应检查代码是否避免未经控制的递归,未控制递归可造成资源消耗过多的安全风险 8.1.8无限循环 审计指标:执行迭代或循环应恰当地限制循环执行的次数,以避免无限循环 审计人员应检查代码中软件执行迭代或循环,是否充分限制循环执行的次数,以避免无限循环的发 生导致攻击者占用过多的资源 8.1.9算法复杂度攻击 审计指标;宜避免算法复杂度攻击 审计人员宜检查代码中算法是否存在最坏情况下非常低效,复杂度高,会严重降低系统性能 如果 是,则攻击者就可以利用精心编制的操作来触发最坏情况的发生,从而引发算法复杂度攻击 8.1.10早期放大攻击 审计指标;宜遵守正确的行为次序避免早期放大攻击数据 审计人员宜检查代码是否存在实体在授权或认证前执行代价高的操作的情况,不合理执行代价高 的操作可能会造成早期放大攻击 规范/不规范代码示例参见B.4.1 8.2内存管理 内存分配释放函数成对调用 8.2.1 审计指标;应成对调用内存分配和释放丽数 审计人员应检查代码中分配内存和释放内存函数是否成对调用,如malloc/free来分配或释放资 源 当内存分配和释放函数不成对调用时,可能会引起程序崩溃的风险 8.2.2堆内存释放 审计指标;应避免在释放堆内存前清理不恰当而导致敏感信息暴露 16
GB/39412一2020 审计人员应检查代码在释放堆内存前是否采用合适的方式进行信息清理 示例;如C语言中是否使用realloc()丽数调整存储敏感信息的缓冲区大小,如存在该操作,将存在可能暴露敏感信 息的风险 realoe()函数不是从内存中删除,而通常是将旧内存块的内容复制到一个新的,更大的内存块,这可能暴露 给攻击者使用“memorydum1 np"或其他方法来进行读取敏感信息的“堆检查"攻击 8.2.3内存未释放 审计指标:宜及时释放动态分配的内存 审计人员宜检查代码是否有动态分配的内存使用完毕后未释放导致内存泄漏的情形 内存泄漏可 能会导致资源耗尽从而带来拒绝服务的安全风险 规范/不规范代码示例参见B.4.2. 8.2.4访问已释放内存 审计指标:不应引用或访问已被释放后的内存 审计人员应检查代码是否存在内存被释放再次被访问的情况 内存被释放后再次访问会出现非预 期行为 8.2.5数据/内存布局 审计指标;不宜依赖数据/内存布局 审计人员宜检查代码逻辑是否依赖于对协议数据或内存在底层组织形式的无效假设 当平台或协 议版本变动时,数据组织形式可能会发生变化从而带来非预期行为 8.2.6内存缓冲区边界操作 审计指标:应避免内存缓冲区边界操作发生越界 审计人员应检查代码在内存缓冲区边界操作时是否存在越界现象,因内存缓冲区访问越界可能会 造成缓冲区溢出漏洞 规范/不规范代码示例参见B.4.3 8.2.7缓冲区复制造成溢出 审计指标;应避免未检查输人数据大小就进行缓冲区复制 审计人员应检查代码在进行缓冲区复制时,是否存在未对输人数据大小进行检查的现象,因未检查 输人数据大小,可能会造成缓冲区溢出 不规范代码示例参见B.4.4 8.2.8使用错误长度访问缓冲区 审计指标;应避免使用错误的长度值访问缓冲区 审计人员应检查代码在访问缓冲区时使用长度值是否正确,因使用错误的长度值来访问缓冲区可 能会造成缓冲区溢出风险 规范/不规范代码示例参见B.4.5 8.2.9堆空间耗尽 审计指标;应限制堆空间的消耗,防止堆空间耗尽 审计人员应检查代码是否有导致堆空间耗尽的情况,具体检查包括但不限于 a 是否存在内存泄漏; b 是否存在死循环; 不受限制的反序列化; c d 创建大量的线程; 解压一个较大压缩文件 17
GB/T39412一2020 8.3数据库使用 8.3.1及时释放数据库资源 审计指标;宜及时释放数据库资源 审计人员宜检查代码中使用数据库后是否及时释放数据库连接或采用数据库连接池,未及时释放 数据库连接可能会造成数据库拒绝服务风险 8.3.2sQL注入 审计指标:应正确处理sQL命令中的特殊元素 审计人员应检查代码利用用户可控的输人数据构造sQL命令时,是否对外部输人数据中的特殊元 素进行处理,如果未处理,那么这些数据有可能被解释为sQL命令而非普通用户的输人数据 攻击者 可对此加以利用来修改查询逻辑,从而绕过安全检查或插人可以修改后端数据库的额外语句 8.4文件管理 8.4.1过期的文件描述符 审计指标;不应使用过期的文件描述符 审计人员应检查代码是否在文件描述符关闭后再次使用 特定文件或设备的文件描述符被释放后 被重用,可能会造成引用了其他的文件或设备 8.4.2不安全的临时文件 审计指标;应安全使用临时文件 审计人员应检查代码中使用临时文件是否安全,因不安全使用临时文件造成敏感信息泄露,包括但 不限于 a)应检查代码中是否创建或使用不安全的临时文件,如果结果为肯定,则提示存在安全风险 应检查代码中临时文件是否在程序终止前移除,如果结果为香定,则提示存在安全风险; b 应检查代码中是否在具有不安全权限的目录中创建临时文件,如果结果为肯定,则提示存在安 c 全风险 8.4.3文件描述符穷尽 审计指标:不宜导致文件描述符穷尽 审计人员宜检查代码是青存在导致文件描述符穷尽情形,包括但不限于 是否对打开文件描述符未做关闭处理 a) b 是否到达关闭阶段之前,失去对文件描述符的所有引用: 进程完成后是否未关闭文件描述符 c 8.4.4路径遍历 审计指标:应避免路径遍历 审计人员应检查代码是否存在由外部输人构造的标识文件或目录的路径名路径遍历会造成非授 权访问资源的风险 注,路径遍历指未将路径名限制在受限目录 8.4.5及时释放文件系统资源 审计指标;应及时释放文件系统资源 18
GB/39412一2020 审计人员应检查代码是否及时释放不再使用的文件句柄,不及时释放文件句柄可能会引起文件资 源占用过多,造成拒绝服务风险 8.5网络传输 8.5.1端口多重绑定 审计指标;不应对同一端口进行多重绑定 审计人员应检查代码是否有多个套接字绑定到相同端口,从而导致该端口上的服务有被盗用或被 欺骗的风险 8.5.2对网络消息容量的控制 审计指标;宜避免对网络消息容量的控制不充分 审计人员宜检查代码是否控制网络传输流量不超过被允许的值 如果代码没有机制来跟踪流量传 输,系统或应用程序会很容易被滥用于传输大流量(超过了请求值或客户端被允许的值),从而带来拒绝 服务的安全风险 8.5.3字节序使用 审计指标;应避免字节序使用不一致性 审计人员应检查代码在跨平台或网络通信处理输人时是否考虑到字节顺序,避免字节序使用不 -致 不能正确处理字节顺序问题,可能会导致不可预期的程序行为 8.5.4通信安全 审计指标:应采用加密传输方式保护敏感数据 审计人员应检查代码是否实现了对网络通信中敏感数据进行加密传输,特别是身份鉴别信息、重要 信息等 8.5.5会话过期机制缺失 审计指标:宜制定会话过期机制 审计人员宜检查代码中会话过程是否存在会话过期机制,如结果为否定,则提示代码存在保护机制 被绕过的风险 规范/不规范代码示例参见B4.6 8.5.6会话标识符 审计指标;宜确保会话标识符的随机性 审计人员宜检查代码中会话标识符是否具有随机性,防止会话标识符被穷举造成安全风险 环境安全缺陷审计 9.1遗留调试代码 审计指标:代码中不应遗留调试代码 审计人员应检查部署到应用环境的代码是否含有调试或测试功能的代码,该部分代码是否会造成 意外的后门人口 9.2第三方软件安全可靠 审计指标;应对第三方代码来源情况进行审计,确保引人的第三方软件安全可靠 19
GB/T39412一2020 审计人员应检查引人的第三方代码来源是否安全可靠,避免不安全的第三方软件引人安全风险 9.3保护重要配置信息 审计指标;宜对重要的配置信息进行安全保护 审计人员宜检查代码中使用的重要配置信息是否进行了安全保护,因对重要配置信息保护不当,可 能带来信息泄漏安全风险 20
GB/39412一2020 录 附 A 资料性附录 代码安全审计报告 A.1 概述 本附录给出了第5章代码安全审计过程中的审计报告的示例 A.2报告内容 A.2.1审计总体信息 审计总体信息应包括但不限于以下信息: 审计日期 aa b 审计团队成员信息; c 审计依据 d)审计原则; 代码的信息,包括但不限于:代码功能描述、被审计代码的版本号、代码语言类型、代码总行 e 数等 A.2.2审计流程与内容 审计流程与内容应包括但不限于 审计流程; aa b)审计方法; 审计内容 c A.2.3发现的安全缺陷汇总 发现的安全缺陷汇总应包括但不限于以下信息 该版本代码发现的异常情况汇总 a 5 可能造成的严重后果 A.2.4发现的安全缺陷分析 发现的安全缺陷分析应包括但不限于以下信息 高风险安全缺陷分析; a b 中风险安全缺陷分析; 低风险安全缺陷分析 c A.2.5审计总结 审计总结应包括但不限于以下信息 审计结果汇总,例如,审计条款符合数量,审计条款不符合数量,审计条款不适用数量,不符合 的审计条款原因等; 残余缺陷分析; b 安全缺陷改进建议 c 21
GB/T39412一2020 附 录 B 资料性附录) 代码示例 B.1概述 本附录给出了第6章,第7章,第8章,第9章代码安全审计要求中各审计条款代码不规范用法示 例和规范用法示例 B.2安全功能 B.2.1关键状态数据被外部控制代码示例 避免关键状态数据被外部控制.以下给出了不规范用法(C语言)示例 示例 #defineDIR"/restriected/direetory" charemd[500] sprint(emd,"Is一1%480s",DIR); RaisePrivileges(); system(cmd; DropPrivileges(); 上述代码本意是执行一个命令,显示一个受限目录的内容,然后执行其他操作 假定它是通过运行setuid权限来绕 过操作系统的权限检查 攻击者只能查看DIR目录下的内容,程序并没有修改“PATH”环境变量,通过设置PATHH为 用户可控制的目录(如“my/dir”),创建恶意程序“l”并放在”/my/dir",通过运行上面的代码,当system()被执行,shell 查询“PATH”找到”I”程序,找到了恶意程序“/my/dir/I”,而找不到”/bin/As” 最终将代码提升权限,执行了恶意 程序 B.2.2验证未经校验和完整性检查的Cookie代码示例 是否验证未经校验和完整性检查的Cookie,以下给出了不规范用法(iava语言)示例 示例 Cookie[cookies request.geCcookies() or(inti=0;i(cookies.length;i十十 ookies[门: Coolkiec= ife.getName(O).equals("role")) userRole=e.getVaue(); 上述代码示例从浏览器cookie读取一个值确定用户的角色,攻击者容易修改本地存储cookie中的“role”值,可能造 成特权升级 B.2.3以大小写混合的方式绕过净化和验证代码示例 对于防止以大小写混合的方式绕过净化和验证的情况,以下给出了不规范用法(java语言)示例 示例 bie nxs(Sirinxiur. Stringprevent Stringmask) returninput.replaceA("serip",mask); 22
GB/39412一2020 上述代码示例只有当输人为“seript”时,代码才会执行,而当输人为“SCRIPT”或者“ScRiP”时并不会通过该方法进 行过滤,将造成xss攻击 B.2.4对IHIP头的web脚本语法中的特殊字符进行过滤和验证代码示例 对HTTP头的web脚本语法中的特殊字符进行过滤和验证,以下给出了不规范用法(java语言) 示例 示例 response.addHeader(HEADER_NAME,untrustedRawlnputData); 上述代码示例中,用户控制的数据被添加到HrTPheader并返回到客户端 由于数据没有经过净化.用户将能够 执行危险脚本标签 B.2.5对数据结构控制域的删除代码示例 避免对数据结构控制域的删除,以下给出了不规范用法(C语言)示例 示例 car关foo: intcounter; oo calloe(sizeof(char)关10); for counter 0;counter!=l0;counter十十 foocounter print("%s\n" foo 上述代码示例创建一个nul结尾字符串并打印内容,字符串foo为9个字符和一个nul终结符提供空间,但是10 个字符被写人foo结果,字符foo没有nll终止,调用printf()时,将可能产生不可预知的结果 B.2.6对数据结构控制域的意外增加代码示例 避免对数据结构控制域的意外增加,以下给出了不规范用法(C语言)示例 示例 ehar关foo foo=maloesizeof(char)*5; foo[o] 'a'; foo[1] 'a'; foo[2] atoigetc(stdin; oo[3]= foo[] =0' printf("%c%e%c%c%e\n”,foo[o],foo[1],foo[2],foo[3],foo[4]); rintf("%s\n",foon 上述代码第一个printf语句将打印每个字符,由空格分隔 若非整形数据通过ete从stdin中读取,则atoi将不进 行转换,并返回0 当foo作为字符串时,字符foo[2]中的0将作为NUL终止符,foo[3]将永远不会被打印 B.2.7字符串的存储具有足够的空间容纳字符数据和结尾符代码示例 保证字符串的存储具有足够的空间容纳字符数据和结尾符,示例1给出了不规范用法(C语言)示 例,示例2给出了规范用法(c语言)示例 示例1: oidcopy(size-tn,charsren],chardest[]) 23
GB/T39412一2020 sizeti or(i=0;srcC门]&.&.(in);十十i dest[门 sre[C] dest[门 \0'; 上述代码中的循环把数据从src复制到d 但终止符可能被不正确地写到dest尾部之后的字节中 dest, 示例2 oidcopysize_tn,eharsre[n],ehardest[n] size_ti fori=0;sre[]&.8.in一1);十十i dest[门=sre[门 =\0' des st[门 该方案对循环终止条件进行修改,在dest的尾部添加终止符 B.2.8对环境变量的长度做出假设代码示例 不对环境变量的长度作出假设,示例1给出了不规范用法(C语言)示例,示例2给出了规范用法(C 语言)示例 示例1 voidf( charpath[PATHL_MAx] strcpypath,getenv("PATH"); 上述代码把getenv()返回的字符串复制到一个固定长度的缓冲区 假设$PATH是已经定义了的,定义PATH MAx并确保paths并没有超过PATH_MAx的特性 环境变量$PATH并不需要比PATH_MMAx字符少,如果它超 过了PATH_MAX字符,可能会导致缓冲区溢出 示例2 oidf( har =NULL path "PATH") constchar关temp=getenv iftemp!=NULl. path=char*mallocstrlen(temp十1); ifpath NUIL else strepypath,temp) 24
GB/39412一2020 该方案采用strlen()函数计算字符串的长度,并动态分配所需要的空间,避免造成缓冲区溢出 B.2.9将结构体的长度等同于其各个成员长度之和代码示例 不将结构体的长度等同于其各个成员长度之和,示例给出了不规范用法(C语言)示例 示例 numbuffer_size=50}; structbuffer ize_tsize; buferC[buffer_size char buff: voidfune(conststruetbuffer关buf) struetbufer关buf_epy struetbufer关malloc( izeof(sixe_)十sizeobuff.bufferC) ifbuf_cpy==NUIlL memcpy(buf_cpy,buf,sizeof(structbuffer); ire(lLspy入 上述代码假设bufer结构的长度等于其各个成员的长度之和,但由于结构填充的原因,bufer结构的实际长度可能 增大 B.2.10数值赋值越界代码示例 避免数值赋值越界,以下给出了不规范用法(C语言)示例 示例 井include《stdio.h》 井include(stdbool.h》 nain(void inti; -2147483648; return(0): 上述代码存在整数下溢的问题,i的值已是最低负值,所以减去1后,新的i值是2147483647 B.2.11除零错误代码示例 避免除零错误,示例1给出了不规范用法(C语言)示例,示例2给出了规范用法(C语言)示例 示例1 doubledivide(doublex,doubley eturn(x/y) 25
GB/T39412一2020 上述代码的函数把两个数值进行相除而没有验证输人作为分母的值是否为零,将导致可能被零除的错误 示例2 doubledividedoublex,doubley f0==y return(x/y); 该方案通过验证分母的输人值,确保除零错误不会发生 B.2.12数值范围比较时遗漏边界值检查代码示例 数值范围比较时,不遗漏边界值检查,示例1给出了不规范用法(C语言)示例,示例2给出了规范 用法(C语言)示例 示例1: intgetValueFromArrayint*array,intlen,intindex intvalue; ifindex(len else printf("Error index mdaxil,%a", value= return(value; 上述代码仅验证给定的数组索引小于数组的最大长度,未检查最小值 将可能发生负值被作为输人的数组索引,导 致越界读取,可能造成访问敏感内存的风险 示例2 0&.& ifindex)》=0 indexlen 该方案检查输人的数组索引以验证数组在所需的最大值和最小范围内,if语句修改为包括最小范围检查 B.2.13采用能产生充分信息嫡的算法或方案代码示例 采用能产生充分信息嫡的算法或方案,示例给出了不规范用法(C语言)示例 示例 longgenerateSessionlDintusrlD srandom(usrlD); returnrandom(); 上述代码的功能是给用户session产生唯一的随机ID 因为伪随机数生成器的种子永远是用户lID,所以产生的 sessionID将会水远相同,攻击者可以预测用户sessionlID并劫持该session. 26

信息安全技术代码安全审计规范GB/T39412-2020解读

随着信息化程度的日益提高,各种应用程序和系统已经渗透到了几乎所有行业。与此同时,黑客攻击、数据泄露等安全问题也愈发严重。在这样的背景下,代码安全审计就显得尤为重要。而信息安全技术代码安全审计规范GB/T39412-2020,则是这方面的重要参考标准。

该规范主要目的是为了规范信息安全产品的代码审计活动,保证软件开发过程中的安全性和合规性。它适用于所有信息安全类产品,包括但不限于操作系统、网络设备、数据库、移动应用程序等各种软件产品。该规范对代码安全审计的整个流程进行了详细规定,包括需求分析、代码审查、测试验证、报告整理等环节。

该规范对于专业人士而言,具有非常重要的指导意义。首先,它可以帮助安全审计人员了解代码安全审计的标准化流程和技术要求,从而提高审计效率和质量。其次,该规范还可以作为企业进行软件开发和采购时的重要参考标准,保证软件产品的安全性和合规性。

需要注意的是,虽然该规范具有非常高的指导性和约束力,但并不能完全保证软件产品的安全性。因此,在实际操作中,安全审计人员还需根据实际情况进行综合分析和判断,并采取相应的安全措施。

和信息安全技术代码安全审计规范类似的标准

信息安全技术术语

信息安全技术政务信息共享数据安全技术要求
上一篇 本文分享国家标准信息安全技术政务信息共享数据安全技术要求的全文阅读和高清PDF的下载,信息安全技术政务信息共享数据安全技术要求的编号:GB/T39477-2020。信息安全技术政务信息共享数据安全技术要求共有22页,发布于2021-06-01
检测实验室安全第6部分:电离辐射因素
本文分享国家标准检测实验室安全第6部分:电离辐射因素的全文阅读和高清PDF的下载,检测实验室安全第6部分:电离辐射因素的编号:GB/T27476.6-2020。检测实验室安全第6部分:电离辐射因素共有49页,发布于2021-06-01 下一篇
相关推荐