GB/T34943-2017

C/C++语言源代码漏洞测试规范

SourcecodevulnerabilitytestingspecificationforC/C++

本文分享国家标准C/C++语言源代码漏洞测试规范的全文阅读和高清PDF的下载,C/C++语言源代码漏洞测试规范的编号:GB/T34943-2017。C/C++语言源代码漏洞测试规范共有48页,发布于2018-05-01
  • 中国标准分类号(CCS)L77
  • 国际标准分类号(ICS)35.080
  • 实施日期2018-05-01
  • 文件格式PDF
  • 文本页数48页
  • 文件大小3.11M

以图片形式预览C/C++语言源代码漏洞测试规范

C/C++语言源代码漏洞测试规范


国家标准 GB/T34943一2017 C/C十十语言源代码漏洞测试规范 Soureecodevulnerabilitytestngspecifieatonftorc/C十+ 2017-11-01发布 2018-05-01实施 国家质量监督检验检疫总局 发布 国家标准化管理委员会国家标准
GB/34943一2017 前 言 本标准按照GB/T1.1一2009给出的规则起草 请注意本文件的某些内容可能涉及专利 本文件的发布机构不承担识别这些专利的责任 本标准由全国信息技术标准化技术委员会(SAC/TC28)提出并归口 本标准起草单位:珠海南方软件网络评测中心,珠海中慧微电子有限公司、广东省科技基础条件平 台中心,电子技术标准化研究院、上海端玛计算机科技有限公司、南昌金庐软件园软件评测培训有 限公司、国家应用软件产品质量监督检验中心,珠海市软件行业协会,东信和平科技股份有限公司、南京 大学 本标准主要起草人:侯建华、邓人邀、王忠福、黄兆森、杨尚沅、张肠肠、赵昌平、张子良、李璐、肖枭、 陈振宇张玉霞、梁建新、蒋蜀鹏、周悦、任佩、杨雪君
GB/T34943一2017 引 言 C语言是一种面向过程的程序设计语言,广泛应用于系统软件与嵌人式软件的开发 本标准的C 语言语法遵循Iso/IEC9899;201l C+十语言是一种面向对象的程序设计语言,它在C语言的基础 上发展而来,与C语言具有许多相同的语法,广泛应用于系统软件与应用软件的开发 本标准的C十十 语言语法遵循ISO/IEC14882:201l语法标准 众所周知,由于各种人为因素影响,每个软件的源代码 都难免会存在漏洞,而软件信息泄露、数据或代码被恶意篡改等安全事件的发生一般都与源代码漏洞有 关 为尽量减少C/C十十语言源代码中存在的漏洞,有必要制定针对C/C十十语言程序的源代码漏洞 测试规范 源代码漏洞测试可在开发过程的软件编码活动之后实施,也可在运行和维护过程中实施 本标准的漏洞分类与漏洞说明主要参考了MITRRE公司发布的CWE(CommonweaknessEnu meration),同时结合了当前行业主流的自动化静态分析工具在测试实践中发现的典型漏洞来确定并进 行说明 注;本标准漏洞参考了cwE2.9版本,示例代码适用于本标准选择的案例 本标准仅针对自动化静态分析工具支持的关键漏洞进行说明,应用本标准开展源代码漏洞测试时 应根据实际需要对漏洞进行裁剪和补充 IN
GB/34943一2017 C/C十十语言源代码漏洞测试规范 范围 本标准规定了c/C十十语言源代码漏洞测试的测试总则和测试内容 本标准适用于开发方或第三方机构的测试人员利用自动化静态分析工具开展的c/C+十语言源代 码漏洞测试活动,C/C+十语言的程序设计和编码人员以及源代码漏洞测试工具的设计人员也可参考 使用 规范性引用文件 下列文件对于本文件的应用是必不可少的 凡是注日期的引用文件,仅注日期的版本适用于本文 件 凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件 GB/T1l457信息技术软件工程术语 GB/T15532一2008计算机软件测试规范 GB/T20158一2006信息技术软件生存周期过程配置管理(Iso/IECTR15846:1998,IDT) 术语和定义 GB/Tl1457界定的以及下列术语和定义适用于本文件 3.1 访问控制aeceesscontrol -种保证数据处理系统的资源只能由被授权主体按授权方式进行访问的手段 [GB/T250692010,定义2.2.1.42 3.2 攻击 attack 在信息系统中,对系统或信息进行破坏、泄露、更改或使其丧失功能的尝试(包括窃取数据》. [[GB/T250692010,定义2.2.1.587 3.3 ”blockehainin 密码分组链接eipher ing 对信息加密时,每一密文块在加密时都依赖于前一文块的方式 3.4 密文ciphertext 利用加密技术,经变换,信息内容被隐藏起来的数据 [GB/T250692010,定义2.2.2.105] 3.5 解密deeryptiom 将密文转换为明文的处理,即加密对应的逆过程 [GB/T25069一2010,定义2.2.2.69
GB/T34943一2017 3.6 字典式攻击dietionaryattaek 用遍历给定口令或密钥列表的方式对密码系统的攻击 如,使用存储的特定口令值或密钥值列表 或使用来自自然语言字典中的单词列表 [GB/T25069一2010,定义2.2.2.2397 3.7 wimg 域名服务器(DNS)欺骗domainnameserver(DNS)spo 攻击者冒充域名服务器的一种欺骗行为 3.8 加密eeryptionm 对数据进行密码变换以产生密文的过程 一般包含一个变换集合,该变换使用一套算法和一套输 人参量 输人参量通常被称为密钥 [GB/T25069-2010,定义2.2.2.6o 3.9 硬编码hartding 在软件实现上,把输人或输出的相关参数直接编码在源代码中,而不是从外部来源获得的数据生 成的 3.10 散列值hash-value 散列/杂凑函数的输出的比特串 LGB/T250692010,定义2.2.2.169] 3.11 散列/杂凑函数hashfunetion 将比特串映射为固定长度的比特串的丽数,该丽数满足下列两特性 -对于给定输出,找出映射为该输出的输人,在计算上是不可行的 -对于给定输人,找出映射为同一输出的第二个输人,在计算上是不可行的 注;计算上的可行性取决于特定安全要求和环境 [GB/T25069一2010,定义2.2.2.1667 3.12 堆 heap 用于动态内存分配的内存空间 3.13 注入injeetion 由于字符过滤不严谨导致的漏洞 3.14 单向加密one-wayencryptionm -种加密,它只产生密文,而不能将密文再生为原始数据 [GB/25069一2010,定义2.2.2.9] 3.15 最优非对称加密填充optimalasymmetric encryimpadlinre RSA算法的一种加密填充方案,可将原有的确定性的加密方案转换成一种可能性方案,并能防止
GB/34943一2017 密文的部分解密或其他信息泄露 3.16 填充padding 对数据串附加额外比特 [GB/T250692010,定义2.2.2.187] 3.17 口令password 用于身份鉴别的秘密的字,短语、数字或字符序列,通常是被默记的弱秘密 [GB/T25069一2010,定义2.2.2.76] 3.18 明文plaintext 未加密的信息 [[GB/T250692010,定义2.2.2.135 3.19 彩虹表rainbowtable -个用于加密散列函数逆运算的预先计算好的表,常用于破解加密过的密码散列 3.20 反向域名解析reverseDNsresolutionm 通过IP地址查询服务器域名 3.21 盐值salt 作为单向函数或加密函数的二次输人而加人的随机变量,可用于导出口令验证数据 3.22 种子seedl -种用作某一确定性随机比特生成器输人的比特串 DRBG的部分状态由种子确定 [[GB/T25069一2010,定义2.2.2.232] 3.23 敏感信息sensitiveinformation 由权威机构确定的必须受保护的信息,该信息的泄露、修改、破坏或丢失会对人或事产生可预知的 损害 [[GB/T25069-2010,定义2.2.4.7刀 3.24 源代码漏洞soureeeodevunerability 存在于软件源代码中的漏洞 3.25 漏洞lnerability 计算机信息系统在需求.设计,实现、配置,运行等过程中有意或无意产生的缺陷 这些缺陷以不 同形式存在于计算机信息系统的各个层次和环节之中,如果利用不当,会对计算机信息系统的安全造成 损害,从而影响计算机信息系统的正常运行 注:改写GB/T28458一2012,定义3.2 缩略语 下列缩略语适用于本文件
GB/T34943一2017 NameServer DNS;域名服务器(Domain DRBG确定性随机比特生成器(DeterministicRandomBitGenerator) IP:网际协议(lnternetProtocol PRRNG;伪随机数生成器(PseudorandomNumberGenerator sQL;结构化查询语言(StrueturedQueryLanguage) 源代码漏洞测试总则 S 5.1源代码漏洞测试目的 源代码漏洞测试的目的是 发现、定位及解决软件源代码中的漏洞; a 为软件产品的安全性测量和评价提供依据 b) 5.2源代码漏洞测试过程 5.2.1概述 源代码作为软件产品的重要组成部分,其测试过程基本等同软件产品的测试过程 本标准遵循 GB/T15532一2008的要求将源代码测试过程分为测试策划、测试设计、测试执行和测试总结四个 阶段 5.2.2测试策划 测试策划主要对整个源代码漏洞测试的过程进行策划 测试策划应确定测试的目标、范围、依据、 环境和工具,应分析与评估测试风险,并制定应对措施 测试策划应重点明确源代码漏洞测试应划分的 阶段以及各阶段的人员角色、任务,时间和工作成果,形成源代码漏洞测试进度计划表 源代码漏洞测 试进度计划见表1 表1源代码漏洞测试进度计划 人员角色 任务 测试阶段 时间 工作成果 测试策划 《测试计划》 测试设计 《测试说明》 测试执行 《测试日志》 测试总结 测试总结报告 5.2.3测试设计 测试设计应根据测试目标,结合被测源代码的业务和技术特点,明确测试环境和工具,确定测试需 求、测试方法、测试内容、测试准人条件和测试准出条件 测试方法应采用自动化静态分析工具扫描和 人工分析相结合的方法 c/C十十语言源代码漏洞测试的测试内容宜包括但不限于以下源代码漏洞 分类 a) 行为问题; 路径错误 b 数据处理, c 错误的AP协议实现 d e 劣质代码;
GB/34943一2017 不充分的封装; f B 安全功能; h)web问题 以上8类源代码漏洞分别对应6.1源代码漏洞相关分类 若被测源代码采用了C/C十十语言的第三方框架,测试人员应根据被测源代码的实际情况在测试 内容中增加第三方框架相关的漏洞 应设计测试用例 源代码漏洞测试的测试用例应包括但不限于以下要素 名称和编号; a b 自动化静态分析工具的操作步骤和参数配置 c 自动化静态分析工具的期望操作结果 5.2.4测试执行 测试执行包括自动化静态分析工具扫描和人工分析 应根据测试用例明确的操作步骤,使用自动化静态分析工具执行测试,记录测试执行过程及测试 结果 应对自动化静态分析工具的测试结果进行人工分析,人工分析宜包括但不限于以下任务 宜按漏洞类别或漏洞风险级别从高到低的顺序分析扫描得到的所有源代码漏洞 aa b 结合源代码的上下文和业务需求,验证疑似漏洞,筛除误报的源代码漏洞 c 与开发人员沟通确认源代码漏洞分析结果 5.2.5测试总结 测试总结应对整个源代码漏洞测试过程进行总结,测试总结应包括但不限于以下任务 核查测试环境、工具、内容、方法和结果是否正确 a b)确认测试目标和测试需求是否得到满足 总结测试内容、方法和结果,出具测试报告 c 5.3源代码漏洞测试管理 5.3.1过程管理 应对源代码漏洞测试的过程进行管理,一般包括: 提出源代码漏洞测试各个阶段的任务要求和质量要求 a 安排对源代码漏洞测试的过程进行质量监督和阶段评审,包括监督和评审所需的环境、设备、 b 资金和人员,质量监督的记录应形成文档 对源代码漏洞测试的风险进行管理,提供风险规避所需的相关资源 d)提供完成源代码漏洞测试各项任务所需的资源保障 包括测试的环境、工具、资金和人员 表2给出了源代码漏洞测试的人员配备的参考 表2源代码漏洞测试人员配备情况表 工作角色 具体职责 管理监督测试项目,提供技术指导,获取适当的资源,制定基线,技术协调,负责项目的安全保 测试项目负责人 密,过程管理和质量管理,负责测试策划和测试总结 开展测试需求分析,确定测试内容、测试方法、测试(软、硬件)环境、测试工具,设计测试用例, 测试设计员 建立测试环境
GB/T34943一2017 表2(续 工作角色 具体职责 测试员 执行测试,记录测试过程和结果 测试分析员 对自动化静态分析工具的测试结果进行人工分析 测试系统管理员 对测试环境和资产进行管理和维护 配置管理员 设置,管理和维护测试配置管理数据库 测试评审员 对测试的各个阶段进行评审 注1;当软件的供方实施测试时,配置管理员由软件开发项目的配置管理员承担;当独立的测试组织实施测试 时,需配备测试活动的配置管理员 注2:一个人可承担多个角色的工作,一个角色可由多个人承担 5.3.2过程评审 5.3.2.1概述 源代码漏洞测试包括测试策划测试设计、测试执行和测试总结四个阶段 每个测试阶段结束时应 开展阶段评审 评审的级别和参加人员要求宜根据被测源代码的重要程度而确定 5.3.2.2测试策划评审 完成测试策划后,应对测试计划进行评审,形成测试策划评审表 评审的具体内容应包括: 评审测试环境、工具等测试实施条件要素考虑是否全面合理 a 评审测试人员分工和进度计划等测试组织要素是否具有可实施性, b) c 评审风险分析是否全面合理以及是否具有可行的应对风险的措施 5.3.2.3测试设计评审 完成测试设计后,应对测试说明和测试就绪情况进行评审,形成测试设计评审表 评审的具体内容 应包括: 评审测试需求分析是否合理; b 评审测试内容和方法是否符合测试需求; 评审测试用例的操作步骤和参数配置是否详细、正确、可实施 o d) 评审测试用例的期望结果描述是否准确 评审测试人员、环境和工具是否齐备并符合要求 5.3.2.4 测试执行评审 完成测试执行后,应对测试日志进行评审,形成测试执行评审表 评审的具体内容应包括 评审测试用例执行是否完整; a b) 评审操作结果是否真实有效 评审操作结果描述是否清晰、准确 c d)对于与预期结果不一致的操作结果,评审是否记录了详细的问题现象; 评审人工分析的结果是否正确 e 5.3.2.5测试总结评审 完成测试总结后,应对测试总结报告进行评审,形成测试总结评审表 评审的具体内容应包括
GB/34943一2017 评审测试需求和测试目标是否全面准确完成 a b 评审测试结论与测试结果追溯的合理性; 评审是否具备测试结束条件; c 评审测试风险规避是否合理 d 5.3.3配置管理 应按照软件配置管理的要求,将测试过程中产生的各种软件工作产品纳人配置管理 配置管理要 求见GB/T201582006 5.4源代码漏洞测试工具 选择源代码漏洞测试工具应首先明确GB/T15532一2008中4.8.2的要求,重点应考虑工具的漏报 率和误报率,可通过调查或比较的方式评估工具的漏报率和误报率 选择的源代码漏洞测试工具应覆盖但不限于本标准的源代码漏洞测试内容,测试前应对工具的漏 洞规则库和测试引擎进行必要的升级和维护 注选择源代码漏洞测试工具建议结合项目的具体需求 如可行,首先考虑选用商业的自动化静态分析工具 若 条件不具备,也可选用开源的自动化静态分析工具 5.5源代码漏洞测试文档 源代码漏洞测试文档一般包括测试计划,测试说明、测试日志和测试总结报告 源代码漏洞测试文 档宜单独出具,也可与其他测试类型出具的测试文档合并 测试文档的基本内容参见附录A的案例 源代码漏洞测试内容 6.1源代码漏洞分类 本标准根据软件开发中常用的概念来组织C/C+十语言源代码漏洞的类别,具体分为如下8个 类别 行为问题 由于应用程序的意外行为而引发的漏洞 a b 路径错误 不恰当的处理访问路径而引发的漏洞 c 数据处理 处理数据的功能中发现的漏洞 -由于软件未按预期用法使用API而引发的漏洞 错误的A!协议实现 d 劣质代码 由于软件编写不规范导致潜在的漏洞 e 不充分的封装- -未充分封装关键数据或功能而引发的漏洞 安全功能软件安全功能如身份鉴别、访问控制、机密性、密码学和特权管理等相关的漏洞 g web问题 h -Web技术相关的漏洞 c/C十十语言各源代码漏洞的名称及其所属的类别参见附录B 6.2源代码漏洞说明 6.2.1行为问题 6.2.1.1不可控的内存分配 漏洞描述.内存分配的大小受外部控制的输人数据影响且程序没有指定内存分配大小的上限 漏洞风险;攻击者可以使程序分配大量的内存,程序可能会因为内存资源不足而崩溃 修复或规避建议;在程序中指定内存分配大小的上限,在分配内存前对要分配的内存大小进行验 证,确保要分配的内存大小不超过上限
GB/T34943一2017 示例1:不规范用法 voidexample_fum(intlength)//length为用户的输人数据 char关buffer f(length<0/没有验证lngth是青超出内存分配的上限 return0 buffer char)malloc(sizeof(ehar)*length); free(buffer); NUuIL buffer 示例2:规范用法之 constintMAX_LENGTH 1024;//指定内存分配的上限或动态判断剩余内存大小自动分配 voidexample_fun(intlength)//length为用户的输人数据 char关buffer; if(length>MMAx_LENGTHlllength<0)//对length进行验证 return0; buffer char)malloc(sizeof(char关length); f(buffer! NULL free(buffer; buffer=NULL; 6.2.2路径错误 6.2.2.1不可信的搜索路径 漏洞描述;程序使用关键资源时没有指定资源的路径,而是依赖操作系统去搜索资源 漏洞风险:攻击者可以在搜索优先级更高的文件夹中放人相同名称的资源,程序会使用攻击者控制 的资源 修复或规避建议;使用关键资源时指定资源所在的路径 示例1;不规范用法 井include〈stdio.h 井includestring.h voidexample_fun(void //攻击者可在搜索优先级更高的文件夹中放人和dir同名的恶意程序导致command的内容无法正确执行 system(command);//本例中command="dir.exeE:l\data"
GB/34943一2017 示例2;规范用法之 井include(stdio.h #ineludestring. voidexample_fun(void //PATH是存放操作系统中dir命令所在完整路径的常量,本例中PATH="c;\\wINDows\\system32\" charcnmd[MAX_SIZE]=PATH;//使用完整路径确保command的内容能正确执行 strcat(emd.command)//本例中command "dir.exeE:\\data" system(emd); 6.2.3数据处理 6.2.3.1相对路径遍历 漏洞描述;路径名受外部控制的输人数据影响,且程序没有使能够解析到目录外位置的字符序列 如“.”)失效 漏洞风险;攻击者可以通过输人能够解析到目录外位置的字符序列来访问限制目录之外的文件或 目录 修复或规避建议:在构建路径名前对输人数据进行验证,确保外部输人仅包含允许的构成路径名的 字符 示例1;不规范用法 井ineludestdio,h #incudestring,.h》 voidexample-_fun(eonstchar*flename) 为用户的输人数据,不超过10个字符 //filename FILE*fle;//待访问的文件 "c,\\data\\";//待访问文件的路径 charpath[32] streat(path,filename); /filename可能包含“”"字符序列导致访问“C;\\data\\”目录之外的文件 file=fopen(path 示例2;规范用法之 井includestdio.h 井ineludestring,h //验证str是否合法,丽数仅供参考 intverification(constchar×str //设置白名单 dharwhitelist[MAx_s12E][16]=("A00l.txt","A002.txt",) intflag=0; inti; 1/循环比较str是否在白名单内 for(i=0;iGB/T34943一2017 if(strcmp(whitelist[门,str 三E 0) flag=l; break returnflag; //filename为用户的输人数据,不超过10个字符 voidexample_fun(constchar关ffilename FILE*ffle;//待访问的文件 harph[32]-"c\daa",/待访问文件的路径 if(verification(filename) //文件名合法则将路径和文件名组合成完整的文件访问路径 strcat(path,filename); file=fopen(path,"r"); 6.2.3.2 绝对路径遍历 漏洞描述;路径名由外部控制的输人数据决定,且程序没有限制路径名允许访问的目录 漏洞风险;攻击者可以通过输人路径名来访问任意的文件或目录 修复或规避建议:在程序中指定允许访问的文件或目录,在访问文件或目录前对路径名进行验证, 确保仅允许访问指定的文件或目录 示例1;不规范用法 井ineludestdio,h 井inelude〈string,h) vodexample_fun(constchar*absolutepath)//absolutepath为用户的输人数据 FILE关file; fle=fopen(absolutepath,"");//攻击者可以访问任意文件或目录 示例2;规范用法之 井include《stdio.h #include(string.h intverification(constchar×str //验证str是否合法,函数仅供参考 //设置白名单 charuserlist[MAX_S1ZE][16]=1"A001.txt","A002.txt",; 10
GB/34943一2017 strcat(emd,command) "\""); strcat(cmd, system(emd); 6.2.3.4sQL注入 漏洞描述;使用未经验证的输人数据采用拼接字符串的方式形成sQL语句 漏洞风险;攻击者可输人任何sQL语句,实现越权查询数据库的敏感数据、非法修改数据库数据和 提升攻击者的数据库权限等目的 修复或规避建议;在拼接sQL语句前对输人数据进行验证,确保输人数据不包含sQL语句的关键 字符;或使用参数化SQL查询语句,并将输人数据作为sQL语句的参数 示例1;不规范用法 井includestdio.h 井ineludestring,h //name为用户输人数据,不超过10个字符 voidsq_query(char黄name /本例中userid是仅由字母和数字组成的长度不超过10位的字符串 charsqlQuery[64们="SELECT关FROMCUSTOMERwIHEREuserid //拼接sql语句前未验证name是否合法 strcat(sqQuery,name); n, strcat(sqlQuery, //在数据库中执行sqQuery语句 示例2;规范用法之 井include(stdio.h 井ineludestring.h 井includeregex,h intverificationconstehar关str) //验证str是否合法,丽数仅供参考 //设置白名单 whitelis[MAx_s1ZE][8]="A001","A002" char ,}; intlag=0; 0: inti 1/循环比较str是否在白名单内 MAx_s1ZEi十十 for(i=0;i if(stremp( whitelist[门 str 0 13
GB/T34943一2017 lag=l; break; returnflag e为用户输人数据,不超过10个字符 voidsgquery(char关name //name //本例中userid是仅由字母和数字组成的长度不超过10位的字符串 wHEREerid "SEL.BcTFROMcUSTOMER charsqlQuery[64们 if(verifcation(name))//在拼接sQL语句前验证name是否合法 strcatsqlQuery,name); strcatsglQuery,""); //在数据库中执行sqQuery语句 示例3;规范用法之 井include〈stdio.h》 井include"stdafx.h" #include(string.h 井inelude〈malloe.h 井includestring usingnamespacestd stringtolegalparam(char关param stringstrSql(param); stringreturnValue string:;size_typepos 0; forinti 0;i strSql.size();i十十 f(strsgl[ A returnValue十= else returnValue十=strSql[] returnreturnValue; voidsqLquery(char关name) //name为用户输人数据,不超过10个字符 14
GB/34943一2017 stringsqQuery "SELEC'T关FRO)MCUSTO)MERWHEREuserid //将参数name转换为合法的sQL字段值 stringstrName=to_legaLparatm(name):; salQuery strName; 11m sqlQuery //在数据库中执行sgQuery语句 6.2.3.5进程控制 漏洞描述:使用未经验证的输人数据作为动态加载的库的标识符 漏洞风险;使用未经验证的输人数据作为动态加载的库的标识符使攻击者有机会加载恶意的代 码库 修复或规避建议:在动态加载库前对输人数据进行验证,确保输人数据仅能用于加载允许加载的代 码库 示例1:不规范用法 井include《windows.h odlonLlh(chaur”lbhrnryNwme) /trr\Nuame为用户输人数据-不超过15个字符 charpath[32] "C;\\"; streat(path,libraryNae) /使用未经验证的输人数据作为动态加载的库可能导致加载恶意代码库 HANDLElib一 l.oadllibrary(path) 示例2;规范用法之 井ineludewindows.》 intverifceation(dhar*);//验证库文件,通过验证则返回1,否则返回0 voidloadIib(char关IibraryName)//IibraryName为用户输人数据,不超过15个字符 eharpat[32] "C\\" if(verifceation(lbraryName))//判断brnaryName是否是合法的库 strcat(path,ibraryName); HANDLElib=LoadLibrary(path); 6.2.3.6缓冲区溢出 漏洞描述:对被分配内存空间之外的内存空间进行读或写操作 漏洞风险:攻击者可利用缓冲区溢出让系统崩溃或者执行恶意代码 15
GB/T34943一2017 修复或规避建议;在对缓冲区进行读或写时,对读写缓冲区的数据长度进行检查,确保读写的内存 在被分配的内存空间之内 示例1;不规范用法 voidexample_fun(O charvalue[11];//本例中假设只允许用户输人10个以下的字符 printf(“EnterTheVaue;”); 1/攻击者可输人大于10个字符的字符串,覆盖栈原来的返回地址,造成缓冲区汹出 scanf(“%s”,value); 示例2;规范用法之 voidexample_fun(O dharvalue[1];/本例中假设只允许用户输人10个以下的字符 printf(“EnterTheVaue:”); //从标准输人读取最多10个字符,并保存在value数组中 scanf(“%10s”,value); 使用外部控制的格式化字符串 6.2.3.7 漏洞描述:printf丽数中的格式化字符串受外部输人数据影响,这可能会导致缓冲区溢出或数据表 示法问题 漏洞风险:攻击者可输人恶意的格式化字符串造成缓冲区溢出,进而导致系统崩溃或者执行恶意 代码 修复或规避建议:确保向所有格式字符串函数都传递一个不能由用户控制的静态格式化字符串,并 且向该函数发送正确数量的参数 示例1:不规范用法 voidexample_fun(char关s)//s为用户输人数据 // /s中可能包含"%n"等格式控制符导致缓冲区溢出 printf(s); 示例2;规范用法之一 voidexampleftn(char*s)//s为用户输人数据 printf("%s",s); /传递一个不能由用户控制的静态格式化字符串 16
GB/34943一2017 6.2.3.8整数溢出 漏洞描述;使用未经验证的整型数据进行算术运算,可能会导致计算结果过大而无法在系统位宽度 范围内存储 漏洞风险;攻击者可输人过大的数据引发软件崩溃或破坏系统重要内存等安全事件 修复或规避建议;在对来自用户的整型数据作算术运算前进行验证,确保运算结果不会溢出 示例1:不规范用法 unsignedintnum;//本例中num值为1000 voidexample_fun(O) /本例代码假设是运行在32位的系统中,32位系统中指针占4字节,unsignedint最大值是0xfflr umnsignedintmrsp=packeLgeLint();//mrsp是来自用户的数据 *攻击者可通过让(mrsp十num)值为0xffff/4十1=1073741825,即mrsp=1073740825,造成整型溢出 *mrsp十num)*sizeof(char*)等效于1073741825关4,溢出后求模后值为4,即为response分配了4字节 的空间 *循环次数为1073740825次,用户数据将覆盖大量的内存空间 char*response malloe((mrsp十num)*sizeof(char*); unsignedinti; for(i=0;i0&.&.UINT_MAx num mrsp /运算前验证mrsp char*response malloe((mrsp十num)*sizeof(char*)); unsignedinti; or(i=0;iGB/T34943一2017 6.2.3.9信息通过错误消息泄露 漏洞描述;软件呈现给用户的错误消息中包括与环境、用户或相关数据有关的敏感信息 漏洞风险;对攻击者而言,敏感信息可能本身就是有价值的信息,或者有助于开展进一步的攻击 修复或规避建议;确保错误消息中仅含有对目标受众有用的少量细节 示例1;不规范用法 voidwrite_wrong_msg(char关);//将错误消息呈现到用户界面 voidexample_fun(O constehar关PATH="C;\lconfig,.txt"; fopen(PATH," 碗le关ile "rw"; if(!file charmsg[128 "Error:" PATH); strcat(msg, strcatmsg,"doesnotexist."); write_wrong_msg(msg);//输出配置目录的完整路径名 示例2;规范用法之 voidwrite_wrong_msg(char关);//将错误消息呈现到用户界面 voidexample_fun( constchar*PATH="C;\\config,txt"; Fle ile=opn(PATH." "rw"; if(!file) charmsg[128]="Sorry!Wewillfixtheproblemsoon!"; write_wrong_msg(msg);//不输出敏感信息 6.2.3.10信息通过服务器日志文件泄露 漏洞描述:将敏感信息写人服务器日志文件 漏洞风险;攻击者有机会通过访问日志文件读取敏感信息 修复或规避建议:慎重考虑写人日志文件信息的隐私性 不要把敏感信息写人日志文件 示例1;不规范用法 intis_trusted(char关,ehar*);//判断用户名口令是否正确,均正确则返回1,否则返回o woidwrite_log(char*)//将消息写人日志文件 voiddatavisit(char关username,char关password //username和password为用户输人数据,均不超过10个 字符 18
GB/34943一2017 if(is_trustedusername,password))//用户名和口令正确时调用write_log()写人日志 charmsg[64; strcatmsg,username); and"); strcat(msg strcat(msg,password); strcat(sg, correct!"; write_log(msg);//msg中包含敏感信息 1/执行访问数据等操作 示例2,规范用法之一 intis_trustedehar关,ehar*);//判断用户名口令是否正确,均正确则返回1,否则返回o oidwrite-_log(char*)//将消息写人日志文件 voiddata_visit(char关username,char关password /username和password为用户输人数据,均不超过10个 字符 if(is_trusted(username,password) char关msg "I.oginsuccess!";//msg中不包含敏感信息 write_log(msg); //执行访问数据等操作 6.2.3.11信息通过调试日志文件泄露 漏洞描述;应用程序没有充分限制对用于调试的日志文件的访问 漏洞风险;调试日志文件通常包含应用程序的敏感信息,攻击者有机会通过访问调试日志文件读取 敏感信息 修复或规避建议在产品发布之前移除产生日志文件的代码 示例1:不规范用法 oidinit_address_book(//地址簿初始化 bookid[8];//地址簿d char charlookpath[64];//地址簿存放路径 //生成调试日志 cCL.0G("AddressBookID:%s\n",bookid). CCIO0G("Path:%s\n",bookpath); 19
GB/T34943一2017 示例2;规范用法之 voidinit_addres说_book(//地址簿初始化 charbookid[8];//地址簿id charbookpath[64];//地址簿存放路径 //程序发布之前将调试代码注释或删制除掉 CCLO(G("AddressBooklD:%s\n",bookid); CCL0Gi("Path:%s\n",bookpath); 6.2.3.12未检查的输入作为循环条件 漏洞描述;软件没有对被用于循环条件的输人进行适当的检查 漏洞风险;攻击者可以让软件循环过多而使软件拒绝服务 修复或规避建议;规定循环次数的上限,在将用户输人的数据用于循环条件前验证用户输人的数据 是否超过上限 示例1:不规范用法 voidexample_fun(intcount)//eount为用户输人数据 inti; if(count>07 /未检查count的值是否过大可能导致软件循环过多而使软件拒绝服务 for(i=0;icount;i十十 示例2;规范用法之 inmtMAx_coUNT=1000//本例中定义循环次数最大为1000次 为用户输人数据 //count voidexample_fun(intcount inti if(count>0&.&.count<=MAX_cOUNT//判断循环次数是否不大于最大循环次数 for(i=0;icount;i十十 20
GB/34943一2017 6.2.4错误的AP协议实现 6.2.4.1 堆检查 漏洞描述;使用realoe()来调整存储敏感信息的缓冲区 漏洞风险;使用realloc()来调整存储敏感信息的缓冲区会将敏感信息暴露给攻击者,因为这些信 息并没有从内存中删除掉,攻击者可能使用“堆检查”方法如内存转储方法)读取堆内存中的敏感 信息 修复或规避建议;使用realloc()函数前先清空该内存块中的敏感信息 示例1;不规范用法 ntget_memory(ehar*ptr,intnew_size) rcealloe(ptr,new-_size);//使用realloc()重新分配内存之前未清空该内存块信息 ptr ifptr) returnl; else return0; 示例2,规范用法之 intget_memory(char关ptr,intnewsize memset(ptr,0,strlen(ptr));//使用memset()置0 realloc(ptr,new_size); ptr if(ptr) returnl else return0; 劣质代码 6.2.5 6.2.5.1敏感信息存储于上锁不正确的内存空间 漏洞描述:程序将敏感信息存储在未被锁定或被错误锁定的内存中 漏洞风险;该敏感信息可能会被虚拟内存管理器从内存写人磁盘的交换文件中,从而使攻击者更容 易访同这些敏感信息 修复或规避建议:选择恰当的平台保护机制锁定存放敏感信息的内存,并检查方法的返回值确保锁 定操作执行正确 21
GB/T34943一2017 示例1:不规范用法 井includestdlib.hy voidexamplefunchar关parameter /parameter 长度不超过20个字符 char关password /password用于存放敏感信息 char×)malloe(30*sizeof(ehar)); password NULL if(password! strepypassword,parameter);//password指向的内存未锁定 示例2;规范用法之 #includestdlib.h 井inelude〈windows,h r长度不超过20个字符 voidexamplefunchar关parameter //parameter //password用于存放敏感信息 char*password password char*)malloc(30*sizeof(char)); iif(password! NULL) if(Virtuall.oek(password,30)) /锁定password指向的内存,并检查返回值确保锁定操作执行正确 strcPypasswrd,parameter; VirtualUnoek(password30);//解锁内存 6.2.6不充分的封装 6.2.6.1 公有函数返回私有数组 漏洞描述;类中定义的私有数组属性在该类的公有丽数中被作为返回值返回 漏洞风险:类中的私有数组作为函数的返回值暴露到了公有区域,存在该私有数组成员在公有区域 被篡改的风险 修复或规避建议:当私有数组成员的数据需要作为公有函数的返回值时,应返回该私有数组的 副本 示例1.不规范用法 easscTest private: charseeret[MAX_SIZE “abcd”; public 22
GB/34943一2017 char口get_value(O returnecret; 示例2;规范用法之 classCTest private harseeret[MAx_SLzE] “abecd” publie: eharcepy_seeret[MAX_S1ZE char口get_value( memcpy(cpy_secret,secret,sizeof(secret));//创建私有数组的副本 returnepy_seeret; 6.2.7安全功能 6.2.7.1明文存储口令 漏洞描述;将口令明文存储 漏洞风险;明文存储口令会降低攻击的难度,攻击者若获得访问口令存储文件的权限,便可轻易获 取口令 修复或规避建议;尽量避免在容易受攻击的地方存储口令 如果需要,考虑存储口令的加密散列 以替代明文口令存储 示例1:不规范用法 voidstore_password(ehar*);//将口令存人数据库 voidexample_fun(char*password store_password(password);//明文存储口令 示例2:规范用法之一 井include"sha.h" ecsypoPP usingnamespace" intencrypt(char关input,char关output)//加密函数,输出参数返回加密后的字符串 SHA256sha256; intr=sha256.ene(input,output);//加密算法,对input加密(为确保此处安全,最好使用不可逆加密算法 23
GB/T34943一2017 voidstore_password(char×;//将口令存人数据库 voidexample_fun(char*password charpsw[l024]=0); enerypt(password,psw);//加密pass intr sword store_password(psw);//存储加密后的psw 6.2.7.2存储可恢复的口令 漏洞描述;采用双向可逆的加密算法加密口令并将口令存储在外部文件或数据库中 漏洞风险;攻击者有机会通过解密算法对口令进行解密 修复或规避建议:当业务不需要取已存储的口令进行还原时,使用单向加密算法对口令进行加密并 存储 示例1:不规范用法 井include"aes.h" ypoPP usingnammespaceCr inteneryptor(char”input,char*output)//加密函数,输出参数返回加密后的字符串 AESEneryptionaesEneryptor: aesEneryptor.encinput,output);//使用双向可逆的AES加密算法 intr voidstore_password(char关);//将口令存放到数据库中 voidexample_fun(char*password charpsw[1024们 0); intr /加密pass word eneryptor(password,psw); store_password(psw);//存放加密后的psw 示例2;规范用法之 井inelude"sha.h" usingnamespaceCryptoPP; /加密函数,输出参数返回加密后的字符串 intenerypt(char关input,char关output SHA256sha256; intr=sha256.enc(imput,output);/使用单向不可逆的sHA256加密算法 voidstore_password(char关);//将口令存放到数据库中 24
GB/34943一2017 voidexample_fun(char关pssword charpsw[1024]=0); intr eneryptor(password,pAw)/加密passwordl store-_password(psw);//存放加密后的psw 6.2.7.3口令硬编码 漏洞描述:程序代码(包括注释)中包含硬编码口令 漏洞风险;攻击者可以通过反编译或直接读取二进制代码的方式获取硬编码口令 修复或规避建议;使用单向不可逆的加密算法对口令进行加密并存储在外部文件或数据库中 示例1;不规范用法 1/判断口令是否正确,是则返回1,不是则返回o intpsw_is_correct(ehar*password ifstremp(password,"jk46k643h9gj9iwd63")==0)//代码中包含硬编码口令 returnl; return0 示例2,规范用法之 井include"sha.h usingnamespaceCryptoPP; intencryptor(ehar*input,ehar*output) 1/加密函数,输出参数返回加密后的字符串 SHA256sha256; sha256.ene(input,output); intr dhar*getpsw(oid);/从数据库获得口令 iintpsw_is_correct(char关password)//判断口令是否正确,是则返回1,不是则返回0 ehar关psw get_psw(1 charhpsw[l1024] 0); encryptor(password,hpsw);//加密password intr (strcemp(hpsw,psw)==0//判断加密后得到的hpsw与数据库中存储的psw是否相同 returnl; return0 25
GB/T34943一2017 6.2.7.4敏感信息明文传输 漏洞描述;敏感信息在传输过程中未进行加密 漏洞风险;攻击者有机会通过在传输过程中截取或复制报文获取敏感信息 修复或规避建议:发送敏感信息前对敏感信息进行加密或采用加密通道传输敏感信息 示例1;不规范用法 e(ehar弟 /将传进来的字符串发送出去 voidsend_message oidexample_fun(char”address)//address是用户的敏感信息 endmessage(address);//传输adress前没有进行加密 示例2;规范用法之 井ineude"aes.h" usingnamespaceCryptoPP; voidsend_message(char*);//将传进来的字符串发送出去 nteneryptor(charinput.char*otput)//加密函数,输出参数返回加密后的字符串 AESEneryptionaesEncryptor; intr aesEncryptor.enc(input,output); voidexample_fun(char×address)//address是用户的敏感信息 intr=eneryptoraddress,addr);//加密address endLmesage(addr);//传输加密得到的addr 6.2.7.5使用已破解或危险的加密算法 漏洞描述;软件采用已破解或自定义的非标准加密算法 漏洞风险;使用已破解或非标准的加密算法是很危险的因为攻击者有可能会破解算法,从而窃取 所保护的数据 修复或规避建议;采用目前加密领域中加密强度较高的标准加密算法 示例1;不规范用法 井include"des.,h" ypoaPP usingnammespaceCr intgeL_key(unsignedchar[])//从安全存储中取密伊 intencryptor(char关input,unsignedcharoutput[] //使用加密强度较低的DES加密算法 key[DES.kKEYLENGTH] unsignedchar DESEncryptiondesEneryptor; 26

C/C++语言源代码漏洞测试规范GB/T34943-2017解析

GB/T34943-2017标准是由国家标准化管理委员会发布的,旨在规范C/C++源代码漏洞测试的流程和方法,以提高软件的安全性。

该标准主要包括以下内容:

  • 漏洞分类:针对C/C++源代码漏洞进行分类,如缓冲区溢出、空指针引用等。
  • 测试环境:规定了测试环境必须满足的条件,如编译器版本、操作系统版本等。
  • 测试工具:推荐使用的测试工具,包括静态分析工具和动态分析工具。
  • 测试流程:详细规定了C/C++源代码漏洞测试的流程,包括需求分析、测试计划编制、测试用例设计、测试执行与管理等。
  • 测试指标:定义了C/C++源代码漏洞测试的主要指标,如漏洞检测率、误报率等。

在实际测试过程中,根据不同的应用场景和需求,可以选择不同的测试方法。例如,对于关键性应用程序或系统,建议采用全面的静态和动态测试方法进行漏洞测试,以保证软件的安全可靠性。

需要注意的是,该标准并非强制性的,但对于开发人员和安全测试人员而言,通过遵守该标准进行漏洞测试,能够提高软件的安全性,降低软件漏洞带来的风险和损失。

总之,GB/T34943-2017为C/C++源代码漏洞测试提供了规范和指导,有助于提高软件的安全性和可靠性。

C/C++语言源代码漏洞测试规范的相关资料

和C/C++语言源代码漏洞测试规范类似的标准

信息安全技术云计算服务安全能力评估方法
上一篇 本文分享国家标准信息安全技术云计算服务安全能力评估方法的全文阅读和高清PDF的下载,信息安全技术云计算服务安全能力评估方法的编号:GB/T34942-2017。信息安全技术云计算服务安全能力评估方法共有126页,发布于2018-05-01
Java语言源代码漏洞测试规范
本文分享国家标准Java语言源代码漏洞测试规范的全文阅读和高清PDF的下载,Java语言源代码漏洞测试规范的编号:GB/T34944-2017。Java语言源代码漏洞测试规范共有62页,发布于2018-05-01 下一篇
相关推荐