资料介绍
ICS 35 . 080 L 77
中 华 人 民 共 和 国 国 家 标 准
GB/T 34943—2017
C/C++语言源代码漏洞测试规范
SourcecodevulnerabilitytestingspecificationforC/C+ +
2017-1 1-01 发布 2018-05-01 实施
中华人民共和国国家质量监督检验检疫总局中 国 国 家 标 准 化 管 理 委 员 会
发
布
GB/T 34943—20 17
GB/T 34943—20 17
前 言
本标准按照 GB/T 1 . 1—2009 给出的规则起草。
请注意本文件的某些内容可能涉及专利。 本文件的发布机构不承担识别这些专利的责任。
本标准由全国信息技术标准化技术委员会(SAC/TC 28)提出并归口 。
本标准起草单位:珠海南方软件网络评测中心、珠海中慧微电子有限公司、广东省科技基础条件平台中心、中国电子技术标准化研究院、上海端玛计算机科技有限公司、南昌金庐软件园软件评测培训有限公司、国家应用软件产品质量监督检验中心、珠海市软件行业协会、东信和平科技股份有限公司、南京大学。
本标准主要起草人:侯建华、邓人逃、王忠福、黄兆森、杨尚沅、张旸旸、赵昌平、张子良、李璐、肖枭、陈振宇、张玉霞、梁建新、蒋蜀鹏、周悦、任佩、杨雪君。
GB/T 34943—20 17
引
言
C语言是一种面向过程的程序设计语言,广泛应用于系统软件与嵌入式软件的开发。 本标准的 C语言语法遵循 ISO/IEC 9899 : 2011 。C++语言是一种面向对象的程序设计语言,它在 C语言的基础上发展而来,与 C语言具有许多相同的语法,广泛应用于系统软件与应用软件的开发。 本标准的 C++语言语法遵循 ISO/IEC 14882 : 2011 语法标准。 众所周知,由于各种人为因素影响,每个软件的源代码都难免会存在漏洞,而软件信息泄露、数据或代码被恶意篡改等安全事件的发生一般都与源代码漏洞有关 。为尽量减少 C/C++语言源代码中存在的漏洞,有必要制定针对 C/C++语言程序的源代码漏洞测试规范。
源代码漏洞测试可在开发过程的软件编码活动之后实施,也可在运行和维护过程中实施。
本标准的漏洞分类与漏洞说明主要参考了 MITRE 公司发布的 CWE (Common Weakness Enu-
meration), 同时结合了当前行业主流的自动化静态分析工具在测试实践中发现的典型漏洞来确定并进行说明。
注:本标准漏洞参考了 CWE2 . 9 版本,示例代码适用于本标准选择的案例。
本标准仅针对自动化静态分析工具支持的关键漏洞进行说明,应用本标准开展源代码漏洞测试时应根据实际需要对漏洞进行裁剪和补充。
GB/T 34943—20 17
C/C++语言源代码漏洞测试规范
1 范围
本标准规定了 C/C++语言源代码漏洞测试的测试总则和测试内容。
本标准适用于开发方或第三方机构的测试人员利用自动化静态分析工具开展的 C/C++语言源代码漏洞测试活动,C/C++语言的程序设计和编码人员以及源代码漏洞测试工具的设计人员也可参考使用。
2 规范性引用文件
下列文件对于本文件的应用是必不可少的。 凡是注 日期的引用文件,仅注 日期的版本适用于本文件 。凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件。
GB/T 11457 信息技术 软件工程术语
GB/T 15532—2008 计算机软件测试规范
GB/T 20158—2006 信息技术 软件生存周期过程 配置管理(ISO/IEC TR 15846:1998, IDT)
3 术语和定义
GB/T 11457 界定的以及下列术语和定义适用于本文件。
3 . 1
访问控制 accesscontrol
一种保证数据处理系统的资源只能由被授权主体按授权方式进行访问的手段。
[GB/T 25069—2010,定义 2 . 2 . 1 . 42]
3.2
攻击 attack
在信息系统中,对系统或信息进行破坏、泄露、更改或使其丧失功能的尝试(包括窃取数据)。
[GB/T 25069—2010,定义 2 . 2 . 1 . 58]
3.3
密码分组链接 cipherblockchaining
对信息加密时,每一密文块在加密时都依赖于前一密文块的方式。
3.4
密文 ciphertext
利用加密技术,经变换,信息内容被隐藏起来的数据。
[GB/T 25069—2010,定义 2 . 2 . 2 . 105]
3.5
解密 decryption
将密文转换为明文的处理,即加密对应的逆过程。
[GB/T 25069—2010,定义 2 . 2 . 2 . 69]
GB/T 34943—20 17
3.6
字典式攻击 dictionaryattack
用遍历给定口令或密钥列表的方式对密码系统的攻击。 如,使用存储的特定口令值或密钥值列表,或使用来自 自然语言字典中的单词列表。
[GB/T 25069—2010,定义 2 . 2 . 2 . 239]
3.7
域名服务器(DNS)欺骗 domainnameserver(DNS)spoofing
攻击者冒充域名服务器的一种欺骗行为。
3.8
加密 encryption
对数据进行密码变换以产生密文的过程。 一般包含一个变换集合,该变换使用一套算法和一套输入参量。 输入参量通常被称为密钥。
[GB/T 25069—2010,定义 2 . 2 . 2 . 60]
3.9
硬编码 hard-coding
在软件实现上,把输入或输出的相关参数直接编码在源代码中,而不是从外部来源获得的数据生成的。
3 . 10
散列值 hash-value
散列/杂凑函数的输出的比特串。
[GB/T 25069—2010,定义 2 . 2 . 2 . 169]
3 . 1 1
散列/杂凑函数 hashfunction
将比特串映射为固定长度的比特串的函数,该函数满足下列两特性:
— 对于给定输出,找出映射为该输出的输入,在计算上是不可行的;
— 对于给定输入,找出映射为同一输出的第二个输入,在计算上是不可行的。
注:计算上的可行性取决于特定安全要求和环境。
[GB/T 25069—2010,定义 2 . 2 . 2 . 166]
3 . 12
堆 heap
用于动态内存分配的内存空间。
3 . 13
注入 injection
由于字符过滤不严谨导致的漏洞。
3 . 14
单向加密 one-wayencryption
一种加密,它只产生密文,而不能将密文再生为原始数据。
[GB/T 25069—2010,定义 2 . 2 . 2 . 9]
3 . 15
最优非对称加密填充 optimalasymmetricencryptionpadding
RSA算法的一种加密填充方案,可将原有的确定性的加密方案转换成一种可能性方案,并能防止
GB/T 34943—20 17
密文的部分解密或其他信息泄露。
3 . 16
填充 padding
对数据串附加额外比特。
[GB/T 25069—2010,定义 2 . 2 . 2 . 187]
3 . 17
口令 password
用于身份鉴别的秘密的字、短语、数字或字符序列,通常是被默记的弱秘密。
[GB/T 25069—2010,定义 2 . 2 . 2 . 76]
3 . 18
明文 plaintext
未加密的信息。
[GB/T 25069—2010,定义 2 . 2 . 2 . 135]
3 . 19
彩虹表 rainbow table
一个用于加密散列函数逆运算的预先计算好的表,常用于破解加密过的密码散列。
3 .20
反向域名解析 reverseDNSresolution
通过 IP地址查询服务器域名。
3 .2 1
盐值 salt
作为单向函数或加密函数的二次输入而加入的随机变量,可用于导出口令验证数据。
3 .22
种子 seed
一种用作某一确定性随机比特生成器输入的比特串。 DRBG 的部分状态由种子确定。
[GB/T 25069—2010,定义 2 . 2 . 2 . 232]
3 .23
敏感信息 sensitiveinformation
由权威机构确定的必须受保护的信息,该信息的泄露、修改、破坏或丢失会对人或事产生可预知的损害。
[GB/T 25069—2010,定义 2 . 2 . 4 . 7]
3 .24
源代码漏洞 sourcecodevulnerability
存在于软件源代码中的漏洞。
3 .25
漏洞 vulnerability
计算机信息系统在需求、设计、实现、配置、运行等过程中,有意或无意产生的缺陷。 这些缺陷以不同形式存在于计算机信息系统的各个层次和环节之中,如果利用不当,会对计算机信息系统的安全造成损害,从而影响计算机信息系统的正常运行。
注:改写 GB/T 28458—2012,定义 3 . 2 。
4 缩略语
下列缩略语适用于本文件。
GB/T 34943—20 17
DNS:域名服务器(Domain Name Server)
DRBG:确定性随机比特生成器(Deterministic Random Bit Generator)
IP:网际协议 (Internet Protocol)
PRNG:伪随机数生成器(Pseudorandom Number Generator)
SQL:结构化查询语言(Structured Query Language)
5 源代码漏洞测试总则
5 . 1 源代码漏洞测试目的
源代码漏洞测试的 目的是:
a) 发现、定位及解决软件源代码中的漏洞;
b) 为软件产品的安全性测量和评价提供依据。
5 . 2 源代码漏洞测试过程
5 . 2 . 1 概述
源代码作为软件产品的重要组成部分,其测试过程基本等同软件产品的测试过程。 本标准遵循GB/T 15532—2008 的要求将源代码测试过程分为测试策划、测试设计、测试执行和测试总结四个阶段。
5 . 2 . 2 测试策划
测试策划主要对整个源代码漏洞测试的过程进行策划。 测试策划应确定测试的 目标、范围、依据、环境和工具,应分析与评估测试风险,并制定应对措施。 测试策划应重点明确源代码漏洞测试应划分的阶段以及各阶段的人员角色、任务、时间和工作成果,形成源代码漏洞测试进度计划表。 源代码漏洞测试进度计划见表 1 。
表 1 源代码漏洞测试进度计划
5 . 2 . 3 测试设计
测试设计应根据测试目标,结合被测源代码的业务和技术特点,明确测试环境和工具,确定测试需求、测试方法、测试内容、测试准入条件和测试准出条件。 测试方法应采用 自动化静态分析工具扫描和人工分析相结合的方法。 C/C++语言源代码漏洞测试的测试内容宜包括但不限于以下源代码漏洞分类:
a) 行为问题;
b) 路径错误;
c) 数据处理;
d) 错误的 API协议实现;
e) 劣质代码;
GB/T 34943—20 17
f) 不充分的封装;
g) 安全功能;
h) Web 问题。
以上 8 类源代码漏洞分别对应 6 . 1 源代码漏洞相关分类。
若被测源代码采用了 C/C++语言的第三方框架,测试人员应根据被测源代码的实际情况在测试内容中增加第三方框架相关的漏洞。
应设计测试用例。 源代码漏洞测试的测试用例应包括但不限于以下要素:
a) 名称和编号;
b) 自动化静态分析工具的操作步骤和参数配置;
c) 自动化静态分析工具的期望操作结果。
5 . 2 . 4 测试执行
测试执行包括自动化静态分析工具扫描和人工分析。
应根据测试用例明确的操作步骤,使用 自动化静态分析工具执行测试,记录测试执行过程及测试结果。
应对自动化静态分析工具的测试结果进行人工分析,人工分析宜包括但不限于以下任务:
a) 宜按漏洞类别或漏洞风险级别从高到低的顺序分析扫描得到的所有源代码漏洞;
b) 结合源代码的上下文和业务需求,验证疑似漏洞,筛除误报的源代码漏洞;
c) 与开发人员沟通确认源代码漏洞分析结果。
5 . 2 . 5 测试总结
测试总结应对整个源代码漏洞测试过程进行总结,测试总结应包括但不限于以下任务:
a) 核查测试环境、工具、内容、方法和结果是否正确;
b) 确认测试目标和测试需求是否得到满足;
c) 总结测试内容、方法和结果,出具测试报告。
5 . 3 源代码漏洞测试管理
5 . 3 . 1 过程管理
应对源代码漏洞测试的过程进行管理,一般包括:
a) 提出源代码漏洞测试各个阶段的任务要求和质量要求。
b) 安排对源代码漏洞测试的过程进行质量监督和阶段评审,包括监督和评审所需的环境、设备、资金和人员,质量监督的记录应形成文档。
c) 对源代码漏洞测试的风险进行管理,提供风险规避所需的相关资源。
d) 提供完成源代码漏洞测试各项任务所需的资源保障。 包括测试的环境、工具、资金和人员。
表 2 给出了源代码漏洞测试的人员配备的参考。
表 2 源代码漏洞测试人员配备情况表
GB/T 34943—20 17
表 2(续)
5 . 3 . 2 过程评审
5 . 3 . 2 . 1 概述
源代码漏洞测试包括测试策划、测试设计、测试执行和测试总结四个阶段。 每个测试阶段结束时应开展阶段评审。 评审的级别和参加人员要求宜根据被测源代码的重要程度而确定。
5 . 3 . 2 . 2 测试策划评审
完成测试策划后,应对测试计划进行评审,形成测试策划评审表。 评审的具体内容应包括:
a) 评审测试环境、工具等测试实施条件要素考虑是否全面合理;
b) 评审测试人员分工和进度计划等测试组织要素是否具有可实施性;
c) 评审风险分析是否全面合理以及是否具有可行的应对风险的措施。
5 . 3 . 2 . 3 测试设计评审
完成测试设计后,应对测试说明和测试就绪情况进行评审,形成测试设计评审表。 评审的具体内容应包括:
a) 评审测试需求分析是否合理;
b) 评审测试内容和方法是否符合测试需求;
c) 评审测试用例的操作步骤和参数配置是否详细、正确、可实施;
d) 评审测试用例的期望结果描述是否准确;
e) 评审测试人员、环境和工具是否齐备并符合要求。
5 . 3 . 2 . 4 测试执行评审
完成测试执行后,应对测试日志进行评审,形成测试执行评审表。 评审的具体内容应包括:
a) 评审测试用例执行是否完整;
b) 评审操作结果是否真实有效;
c) 评审操作结果描述是否清晰、准确;
d) 对于与预期结果不一致的操作结果,评审是否记录了详细的问题现象;
e) 评审人工分析的结果是否正确。
5 . 3 . 2 . 5 测试总结评审
完成测试总结后,应对测试总结报告进行评审,形成测试总结评审表。 评审的具体内容应包括:
GB/T 34943—20 17
a) 评审测试需求和测试目标是否全面准确完成;
b) 评审测试结论与测试结果追溯的合理性;
c) 评审是否具备测试结束条件;
d) 评审测试风险规避是否合理。
5 . 3 . 3 配置管理
应按照软件配置管理的要求,将测试过程中产生的各种软件工作产品纳入配置管理。 配置管理要求见 GB/T 20158—2006 。
5 . 4 源代码漏洞测试工具
选择源代码漏洞测试工具应首先明确 GB/T 15532—2008 中 4 . 8 . 2 的要求,重点应考虑工具的漏报率和误报率,可通过调查或比较的方式评估工具的漏报率和误报率。
选择的源代码漏洞测试工具应覆盖但不限于本标准的源代码漏洞测试内容,测试前应对工具的漏洞规则库和测试引擎进行必要的升级和维护。
注:选择源代码漏洞测试工具建议结合项目的具体需求。 如可行,首先考虑选用商业的 自动化静态分析工具。 若条件不具备,也可选用开源的 自动化静态分析工具。
5 . 5 源代码漏洞测试文档
源代码漏洞测试文档一般包括测试计划、测试说明、测试日志和测试总结报告。 源代码漏洞测试文档宜单独出具,也可与其他测试类型出具的测试文档合并。 测试文档的基本内容参见附录 A 的案例。
6 源代码漏洞测试内容
6 . 1 源代码漏洞分类
本标准根据软件开发中常用的概念来组织 C/C++语言源代码漏洞的类别,具体分为如下 8 个类别:
a) 行为问题 — 由于应用程序的意外行为而引发的漏洞。
b) 路径错误 —不恰当的处理访问路径而引发的漏洞。
c) 数据处理 —处理数据的功能中发现的漏洞。
d) 错误的 API协议实现 — 由于软件未按预期用法使用 API 而引发的漏洞。
e) 劣质代码 — 由于软件编写不规范导致潜在的漏洞。
f) 不充分的封装 —未充分封装关键数据或功能而引发的漏洞。
g) 安全功能 —软件安全功能如身份鉴别、访问控制、机密性、密码学和特权管理等相关的漏洞。
h) Web 问题 —Web 技术相关的漏洞。
C/C++语言各源代码漏洞的名称及其所属的类别参见附录 B。
6 . 2 源代码漏洞说明
6 . 2 . 1 行为问题
6 . 2 . 1 . 1 不可控的内存分配
漏洞描述:内存分配的大小受外部控制的输入数据影响,且程序没有指定内存分配大小的上限。
漏洞风险:攻击者可以使程序分配大量的内存,程序可能会因为内存资源不足而崩溃。
修复或规避建议:在程序中指定内存分配大小的上限,在分配内存前对要分配的内存大小进行验证,确保要分配的内存大小不超过上限。
GB/T 34943—20 17示例 1 :不规范用法
示例 2:规范用法之 一
6 . 2 . 2 路径错误
6 . 2 . 2 . 1 不可信的搜索路径
漏洞描述:程序使用关键资源时没有指定资源的路径,而是依赖操作系统去搜索资源。
漏洞风险:攻击者可以在搜索优先级更高的文件夹中放入相同名称的资源,程序会使用攻击者控制的资源。
修复或规避建议:使用关键资源时指定资源所在的路径。
示例 1 :不规范用法
GB/T 34943—20 17
示例 2:规范用法之 一
6 . 2 . 3 数据处理
6 . 2 . 3 . 1 相对路径遍历
漏洞描述:路径名受外部控制的输入数据影响,且程序没有使能够解析到 目录外位置的字符序列(如“..”)失效。
漏洞风险:攻击者可以通过输入能够解析到目录外位置的字符序列来访问限制 目录之外的文件或
目录。
修复或规避建议:在构建路径名前对输入数据进行验证,确保外部输入仅包含允许的构成路径名的字符。
示例 1 :不规范用法
示例 2:规范用法之 一
GB/T 34943—20 17
6 . 2 . 3 . 2 绝对路径遍历
漏洞描述:路径名由外部控制的输入数据决定,且程序没有限制路径名允许访问的 目录。
漏洞风险:攻击者可以通过输入路径名来访问任意的文件或目录。
修复或规避建议:在程序中指定允许访问的文件或目录,在访问文件或 目录前对路径名进行验证,确保仅允许访问指定的文件或目录。
示例 1 :不规范用法
示例 2:规范用法之 一
GB/T 34943—20 17
6 . 2 . 3 . 3 命令注入
漏洞描述:使用未经验证的输入数据构建命令。
漏洞风险:攻击者可执行任意命令。
修复或规避建议:在构建命令前对输入数据进行验证,确保输入数据仅能用于构成允许的命令。
示例 1 :不规范用法
GB/T 34943—20 17
示例 2:规范用法之 一
GB/T 34943—20 17
6.2.3.4 SQL注入
漏洞描述:使用未经验证的输入数据采用拼接字符串的方式形成 SQL语句。
漏洞风险:攻击者可输入任何 SQL语句,实现越权查询数据库的敏感数据、非法修改数据库数据和提升攻击者的数据库权限等目的。
修复或规避建议:在拼接 SQL语句前对输入数据进行验证,确保输入数据不包含 SQL语句的关键字符;或使用参数化 SQL查询语句,并将输入数据作为 SQL语句的参数。
示例 1 :不规范用法
示例 2:规范用法之 一
GB/T 34943—20 17
示例 3:规范用法之 一
GB/T 34943—20 17
6 . 2 . 3 . 5 进程控制
漏洞描述:使用未经验证的输入数据作为动态加载的库的标识符。
漏洞风险:使用未经验证的输入数据作为动态加载的库的标识符使攻击者有机会加载恶意的代码库。
修复或规避建议:在动态加载库前对输入数据进行验证,确保输入数据仅能用于加载允许加载的代码库。
示例 1 :不规范用法
示例 2:规范用法之 一
6 . 2 . 3 . 6 缓冲区溢出
漏洞描述:对被分配内存空间之外的内存空间进行读或写操作。
漏洞风险:攻击者可利用缓冲区溢出让系统崩溃或者执行恶意代码。
GB/T 34943—20 17
修复或规避建议:在对缓冲区进行读或写时,对读写缓冲区的数据长度进行检查,确保读写的内存在被分配的内存空间之内。
示例 1 :不规范用法
示例 2:规范用法之 一
6 . 2 . 3 . 7 使用外部控制的格式化字符串
漏洞描述:printf 函数中的格式化字符串受外部输入数据影响,这可能会导致缓冲区溢出或数据表示法问题。
漏洞风险:攻击者可输入恶意的格式化字符串造成缓冲区溢出,进而导致系统崩溃或者执行恶意代码。
修复或规避建议:确保向所有格式字符串函数都传递一个不能由用户控制的静态格式化字符串,并且向该函数发送正确数量的参数。
示例 1 :不规范用法
示例 2:规范用法之 一
GB/T 34943—20 17
6 . 2 . 3 . 8 整数溢出
漏洞描述:使用未经验证的整型数据进行算术运算,可能会导致计算结果过大而无法在系统位宽度范围内存储。
漏洞风险:攻击者可输入过大的数据引发软件崩溃或破坏系统重要内存等安全事件。
修复或规避建议:在对来自用户的整型数据作算术运算前进行验证,确保运算结果不会溢出。
示例 1 :不规范用法
示例 2:规范用法之 一
GB/T 34943—20 17
6 . 2 . 3 . 9 信息通过错误消息泄露
漏洞描述:软件呈现给用户的错误消息中包括与环境、用户或相关数据有关的敏感信息。
漏洞风险:对攻击者而言,敏感信息可能本身就是有价值的信息,或者有助于开展进一步的攻击。
修复或规避建议:确保错误消息中仅含有对目标受众有用的少量细节。
示例 1 :不规范用法
示例 2:规范用法之 一
6 . 2 . 3 . 10 信息通过服务器日志文件泄露
漏洞描述:将敏感信息写入服务器日志文件。
漏洞风险:攻击者有机会通过访问 日志文件读取敏感信息。
修复或规避建议:慎重考虑写入日志文件信息的隐私性。 不要把敏感信息写入日志文件。
示例 1 :不规范用法
GB/T 34943—20 17
示例 2:规范用法之 一
6 . 2 . 3 . 1 1 信息通过调试日志文件泄露
漏洞描述:应用程序没有充分限制对用于调试的 日志文件的访问。
漏洞风险:调试日志文件通常包含应用程序的敏感信息,攻击者有机会通过访问调试日志文件读取敏感信息。
修复或规避建议:在产品发布之前移除产生日志文件的代码。
示例 1 :不规范用法
GB/T 34943—20 17
示例 2:规范用法之 一
6 . 2 . 3 . 12 未检查的输入作为循环条件
漏洞描述:软件没有对被用于循环条件的输入进行适当的检查。
漏洞风险:攻击者可以让软件循环过多而使软件拒绝服务。
修复或规避建议:规定循环次数的上限,在将用户输入的数据用于循环条件前验证用户输入的数据是否超过上限。
示例 1 :不规范用法
示例 2:规范用法之 一
GB/T 34943—20 17
6 . 2 . 4 错误的 API协议实现
6 . 2 . 4 . 1 堆检查
漏洞描述:使用 realloc()来调整存储敏感信息的缓冲区。
漏洞风险:使用 realloc()来调整存储敏感信息的缓冲区会将敏感信息暴露给攻击者,因为这些信息并没有从内存中删除掉,攻击者可能使用 “堆检查”方法(如内存转储方法)读取堆内存中的敏感信息。
修复或规避建议:使用 realloc()函数前先清空该内存块中的敏感信息。
示例 1 :不规范用法
示例 2:规范用法之 一
6 . 2 . 5 劣质代码
6 . 2 . 5 . 1 敏感信息存储于上锁不正确的内存空间
漏洞描述:程序将敏感信息存储在未被锁定或被错误锁定的内存中。
漏洞风险:该敏感信息可能会被虚拟内存管理器从内存写入磁盘的交换文件中,从而使攻击者更容易访问这些敏感信息。
修复或规避建议:选择恰当的平台保护机制锁定存放敏感信息的内存,并检查方法的返回值确保锁定操作执行正确。
GB/T 34943—20 17示例 1 :不规范用法
示例 2:规范用法之 一
6 . 2 . 6 不充分的封装
6 . 2 . 6 . 1 公有函数返回私有数组
漏洞描述:类中定义的私有数组属性在该类的公有函数中被作为返回值返回。
漏洞风险:类中的私有数组作为函数的返回值暴露到了公有区域,存在该私有数组成员在公有区域被篡改的风险。
修复或规避建议:当私有数组成员的数据需要作为公有函数的返回值时,应返回该私有数组的副本。
示例 1 :不规范用法
GB/T 34943—20 17
示例 2:规范用法之 一
6 . 2 . 7 安全功能
6 . 2 . 7 . 1 明文存储口令
漏洞描述:将口令明文存储。
漏洞风险:明文存储口令会降低攻击的难度,攻击者若获得访问口令存储文件的权限,便可轻易获取口令。
修复或规避建议:尽量避免在容易受攻击的地方存储口令。 如果需要,考虑存储口令的加密散列,以替代明文口令存储。
示例 1 :不规范用法
示例 2:规范用法之 一
GB/T 34943—20 17
6 . 2 . 7 . 2 存储可恢复的口令
漏洞描述:采用双向可逆的加密算法加密口令并将口令存储在外部文件或数据库中。
漏洞风险:攻击者有机会通过解密算法对口令进行解密。
修复或规避建议:当业务不需要取已存储的口令进行还原时,使用单向加密算法对口令进行加密并存储。
示例 1 :不规范用法
示例 2:规范用法之 一
GB/T 34943—20 17
6 . 2 . 7 . 3 口令硬编码
漏洞描述:程序代码(包括注释)中包含硬编码口令。
漏洞风险:攻击者可以通过反编译或直接读取二进制代码的方式获取硬编码口令。
修复或规避建议:使用单向不可逆的加密算法对口令进行加密并存储在外部文件或数据库中。
示例 1 :不规范用法
示例 2:规范用法之 一
GB/T 34943—20 17
6 . 2 . 7 . 4 敏感信息明文传输
漏洞描述:敏感信息在传输过程中未进行加密。
漏洞风险:攻击者有机会通过在传输过程中截取或复制报文获取敏感信息。
修复或规避建议:发送敏感信息前对敏感信息进行加密或采用加密通道传输敏感信息。
示例 1 :不规范用法
示例 2:规范用法之 一
6 . 2 . 7 . 5 使用已破解或危险的加密算法
漏洞描述:软件采用已破解或自定义的非标准加密算法。
漏洞风险:使用已破解或非标准的加密算法是很危险的,因为攻击者有可能会破解算法,从而窃取所保护的数据。
修复或规避建议:采用目前加密领域中加密强度较高的标准加密算法。
示例 1 :不规范用法
GB/T 34943—20 17
示例 2:规范用法之 一
6 . 2 . 7 . 6 可逆的散列算法
漏洞描述:软件采用的散列算法具有可逆算法,该算法可利用生成的散列值确定原始输入,或者可以找到一个输入产生相同的散列值。
漏洞风险:攻击者可通过逆向算法获取原始输入或产生相同散列值的输入,进而绕过依赖散列算法的安全认证。
修复或规避建议:采用当前公认的不可逆标准散列算法。
示例 1 :不规范用法
示例 2:规范用法之 一
GB/T 34943—20 17
6 . 2 . 7 . 7 密码分组链接模式未使用随机初始化矢量
漏洞描述:密码分组链接模式使用的初始化向量不是一个随机数。
漏洞风险:攻击者有机会通过字典式攻击读取加密的数据。
修复或规避建议:密码分组链接模式使用随机的初始化向量。
示例 1 :不规范用法
示例 2:规范用法之 一
6 . 2 . 7 . 8 不充分的随机数
漏洞描述:软件在安全相关代码中依赖不充分的随机数。
漏洞风险:攻击者可以预测将生成的随机数,绕过依赖随机数的安全保护。
GB/T 34943—20 17
修复或规避建议:使用 目前被业界专家认为较强的经过良好审核的加密 PRNG算法,初始化随机数生成器时使用具有足够长度且不固定的种子。
示例 1 :不规范用法
示例 2:规范用法之 一
6 . 2 . 7 . 9 安全关键的行为依赖反向域名解析
漏洞描述:通过反向域名解析获取 IP地址的域名,然后依赖域名对主机进行身份鉴别。
漏洞风险:攻击者可通过 DNS欺骗修改 IP地址与域名的对应关系,从而绕过依赖域名的主机身份鉴别。
修复或规避建议:通过用户名口令、数字证书等其他手段对主机身份进行鉴别。
示例 1 :不规范用法
GB/T 34943—20 17
示例 2:规范用法之 一
6 . 2 . 7 . 10 没有要求使用强口令
漏洞描述:软件没有要求用户使用具有足够复杂度的口令。
漏洞风险:攻击者可以很容易地猜出用户的口令或实施暴力破解攻击。
修复或规避建议:要求用户使用具有足够复杂度的口令。 口令强度策略应包含下列属性:
— 最小和最大长度;
— 包含字母、数字和特殊字符;
— 不包含用户名;
— 定期更改口令;
— 不使用用过的口令;
— 身份鉴别失败一定次数后锁定用户。
示例 1 :不规范用法
示例 2:规范用法之 一
GB/T 34943—20 17
GB/T 34943—20 17
6 . 2 . 7 . 1 1 没有对口令域进行掩饰
漏洞描述:用户输入口令时没有对口令域进行掩饰。
漏洞风险:增加了攻击者通过观察屏幕获取到口令的可能性。
修复或规避建议:用户输入口令时对口令域进行掩饰。 通常,用户输入的每一个字符都应该以星号形式回显。
示例 1 :不规范用法
示例 2:规范用法之 一
GB/T 34943—20 17
6 . 2 . 7 . 12 通过用户控制的 SQL关键字绕过授权
漏洞描述:软件使用的数据库表其中包括了某个用户不应有权访问的记录,但该软件执行的一个SQL语句中的关键字却可以受该用户控制。
漏洞风险:如果用户可以将关键字设置为任何值,那么该用户就可以修改该关键字指向未经授权的记录。
修复或规避建议:对用户输入的关键字进行验证,确保其只能访问该用户有权访问的记录。
示例 1 :不规范用法
示例 2:规范用法之 一
GB/T 34943—20 17
6 . 2 . 7 . 13 未使用盐值计算散列值
漏洞描述:软件针对口令等不应可逆的输入使用了单向加密散列,但未使用盐值。
漏洞风险:如果未使用盐值计算散列值,攻击者就更容易利用彩虹表等字典攻击技术破解口令。
修复或规避建议:使用盐值计算散列值,增加攻击者破解口令的难度。
示例 1 :不规范用法
示例 2:规范用法之 一
GB/T 34943—20 17
6 . 2 . 7 . 14 RSA算法未使用最优非对称加密填充
漏洞描述:使用 RSA加密算法时未使用最优非对称加密填充。
漏洞风险:未使用最优非对称加密填充将降低攻击者解密的难度。修复或规避建议:使用 RSA加密算法时使用最优非对称加密填充。
示例 1 :不规范用法
示例 2:规范用法之 一
GB/T 34943—20 17
6 . 2 . 8 web问题
6 . 2 . 8 . 1 跨站脚本
漏洞描述:使用未经验证的输入数据构建 Web 页面。
漏洞风险:攻击者可构建任意 Web 页面,并在页面中植入恶意脚本。
修复或规避建议:在构建 Web 页面前对输入数据进行验证或编码,确保输入数据不影响页面的结构。
示例 1 :不规范用法
示例 2:规范用法之 一
GB/T 34943—20 17
附 录 A
(资料性附录)
C/C++语言源代码漏洞测试案例
A.1 范围
本案例为第三方机构的测试人员利用 自动化静态分析工具开展的 C++语言源代码漏洞测试案
例。本次测试选择 C++语言开发的开源密码学库“Crypto++Library”(版本号 5.2. 1) 共 60765 行源
代码进行测试。
A.2 测试依据
GB/T 34943—2017《C/C++语言源代码漏洞测试规范》。
A.3 测试目的
本次测试的目的如下:
a) 指导 GB/T 34943—2017《C/C++语言源代码漏洞测试规范》的读者理解该标准;
b ) 发现及定位软件源代码中的漏洞。
A.4 测试过程
本案例的测试过程包括测试策划、测试设计、测试执行和测试总结四个阶段。
A.4 . 1 测试策划
A.4 . 1 . 1 确定测试工具
本项目将采用 Checkmarx CxEnterprise工具进行测试。
A.4 . 1 . 2 确定测试环境
本项目采用的测试工具不依赖被测源代码的开发环境,只需要将被测源代码传到测试工具所在的计算机即可,测试环境为测试工具安装的环境。
A.4 . 1 . 3 分析与评估测试风险并制定应对措施
本项目存在以下风险:
a) 测试工具无法正常对被测源代码进行扫描。
应对措施:查看测试工具记录的 日志,查找问题原因,若无法找到问题原因,则联系测试工具厂商提供技术支持。
b ) 由于技术问题等原因导致实际进度滞后于计划进度。
应对措施:若实际进度滞后于计划进度,则在人工分析时增加人员进行测试结果分析。
GB/T 34943—20 17
A.4 . 1 . 4 制定测试进度计划
本项目的测试进度安排见表 A. 1 。
表 A.1 crypto++Library源代码漏洞测试进度安排表
A.4 . 1 . 5 形成测试计划
整理以上 A. 4 . 1 . 1~A. 4 . 1 . 4 的内容,形成《测试计划》文档。
A.4 . 1 . 6 评审测试策划
组织管理层对该项目的测试策划进行评审,评审结果如下:
a) 测试计划明确了测试需要的工具和环境,测试实施条件要素考虑全面合理;
b ) 测试计划明确的测试人员分工和进度计划具有可实施性;
c) 测试计划中的测试风险分析全面合理,且具有可行的应对风险的措施。
A.4 . 2 测试设计
A.4 . 2 . 1 分析测试需求
Crypto++Library是 C++语言开发的开源密码学库,与软件安全功能相关。 由于该软件是开源代码,容易导致安全攻击。 因此,本次将重点针对‘安全功能’类 14 个源代码漏洞指标进行测试。
A.4 . 2 . 2 确定测试内容
根据以上测试需求分析,本项目将对以下 C++语言源代码漏洞进行测试:
安全功能:
a) 明文存储口令;
b ) 存储可恢复的口令;
c) 口令硬编码;
d) 敏感信息明文传输;
e) 使用已破解或危险的加密算法;
f) 可逆的散列算法;
g) 密码分组链接模式未使用随机初始化矢量;
GB/T 34943—20 17
h) 不充分的随机数;
i ) 安全关键的行为依赖反向域名解析;
j) 没有要求使用强口令;
k) 没有对口令域进行掩饰;
l ) 通过用户控制的 SQL关键字绕过授权;
m ) 未使用盐值计算散列值;
n) RSA算法未使用最优非对称加密填充。
A.4 . 2 . 3 确定测试方法
本项目将首先采用自动化静态分析工具对被测源代码进行漏洞扫描,然后人工分析自动化静态分析工具的扫描结果,筛除误报的源代码漏洞。
A.4 . 2 . 4 明确测试工具
本项目采用的自动化静态分析工具名称和版本号为“Checkmarx CxEnterprise 6.2.0”。
A.4 . 2 . 5 明确测试环境
本项目的测试环境见表 A. 2 。
表 A.2 crypto++Library源代码漏洞测试环境
A.4 . 2 . 6 设计测试用例
本项目的测试用例见表 A. 3 。
表 A.3 crypto++Library源代码漏洞测试用例
GB/T 34943—20 17
A.4 . 2 . 7 形成测试说明
整理以上 A. 4 . 2 . 1~A. 4 . 2 . 6 的内容,形成《测试说明》文档。
A.4 . 2 . 8 评审测试设计
组织管理层对该项目的测试设计进行评审,评审结果如下:
a) 测试需求分析合理;
b ) 测试内容和方法符合测试需求;
c) 测试用例的操作步骤和输入数据详细、正确、可实施;
d) 测试用例的期望结果描述准确;
e) 测试人员、环境和工具齐备并符合要求。
A.4 . 3 测试执行
A.4 . 3 . 1 执行测试并记录测试过程和结果
根据测试用例执行测试,测试记录见表 A. 4 。
表 A.4 crypto++Library源代码漏洞测试记录
A.4 . 3 . 2 分析测试结果
通过人工分析发现,自动化静态分析工具由于不识别部分加密函数导致出现 7 个误报,误报的源代码漏洞已在自动化静态分析工具中进行了标记和说明。
A.4 . 3 . 3 形成测试日志
整理以上 A. 4 . 3 . 1 和 A. 4 . 3 . 2 的内容,形成《测试日志》文档。
A.4 . 3 . 4 评审测试执行
组织管理层对该项目的测试执行进行评审,评审结果如下:
a) 测试用例执行已达到 100% ;
GB/T 34943—20 17
b ) 操作结果真实有效;
c) 操作结果描述清晰、准确;
d) 本次测试未出现与预期结果不一致的操作结果;
e) 经复核,人工分析的结果正确。
A.4 . 4 测试总结
相关推荐
- GB/T 20139.1-2016 电气绝缘系统 已确定等级的电气绝缘系统(EIS)组分调整的热评定 第1部分:散绕绕组EIS
- GB/T 41515-2022 涂布机术语
- GB/T 37243-2019 危险化学品生产装置和储存设施外部安全防护距离确定方法
- GB/T 27050.2-2006 合格评定 供方的符合性声明 第2部分:支持性文件
- GB/T 5621-2008 凿岩机械与气动工具 性能试验方法
- GB/Z 41305.1-2022 环境条件 电子设备振动和冲击 第1部分:动力学数据的验证过程
- GB 55037-2022 建筑防火通用规范
- GB/T 41749-2022 热轧型钢表面质量一般要求
- GB∕T 40383-2021 商品级双辊铸轧热轧碳素钢薄钢板及钢带
- GB/T 32533-2016 高强钢焊条


