GB/T34946-2017

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

SourcecodevulnerabilitytestingspecificationforC#

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

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

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


国家标准 GB/T34946一2017 C井语言源代码漏洞测试规范 SoureeeodevulnerabilitytestingspeeifieationforC井 2017-11-01发布 2018-05-01实施 国家质量监督检验检疫总局 发布 国家标准化管理委员会国家标准
GB/34946一2017 前 言 本标准按照GB/T1.1一2009给出的规则起草 请注意本文件的某些内容可能涉及专利 本文件的发布机构不承担识别这些专利的责任 本标准由全国信息技术标准化技术委员会(SAC/TC28)提出并归口 本标准起草单位:珠海南方软件网络评测中心、广东省科技基础条件平台中心、电子技术标准 化研究院、珠海中慧微电子有限公司、吉林省电子信息产品监督检验研究院、上海端玛计算机科技有限 公司、南京大学国家应用软件产品质量监督检验中心,珠海市软件行业协会、南昌金庐软件园软件评测 培训有限公司 本标准主要起草人:侯建华、梁建新,黄兆森、杨尚沅、陆薇、张肠肠、邓人邀、潘宇聪、李璐、倪玉华、 周悦,黄华键、刘早,、辛士界,吴小勇,王丽明、陈振宇、肖枭、杨雪君
GB/T34946一2017 引 言 C井语言是一种面向对象的、运行于.NETFrt ramew ork之上的高级程序设计语言 它广泛应用于 windows平台应用软件的开发,是.NET开发的首选语言 本标准的C井语言语法遵循 1sO/IC23270;2006 众所周知,由于各种人为因素影响,每个软件的源代码都难免会存在漏洞,而软 件信息泄露、数据或代码被恶意篡改等安全事件的发生一般都与源代码漏洞有关 为尽量减少C井语 言源代码中存在的漏洞,有必要制定针对C井语言程序的源代码漏洞测试规范 源代码漏洞测试可在开发过程的软件编码活动之后实施,也可在运行和维护过程中实施 3mmonweaknessEnu 本标准的漏洞分类与漏洞说明主要参考了MITRE公司发布的CwE(Con meration),同时结合了当前行业主流的自动化静态分析工具在测试实践中发现的典型漏洞来确定并进 行说明 注:本标准漏洞参考了cwE2.9版本,示例代码适用于本标准选择的漏洞说明 本标准仅针对自动化静态分析工具支持的关键漏洞进行说明,应用本标准开展源代码漏洞测试时 应根据实际需要对漏洞进行裁剪和补充 IN
GB/34946一2017 C#语言源代码漏洞测试规范 范围 本标准规定了C井语言源代码漏洞测试的测试总则和测试内容 本标准适用于开发方或第三方机构的测试人员利用自动化静态分析工具开展的C井语言源代码测 试活动,C井语言的程序设计和编码人员以及源代码漏洞测试工具的设计人员也可参考使用 规范性引用文件 下列文件对于本文件的应用是必不可少的 凡是注日期的引用文件,仅注日期的版本适用于本文 件 凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件 GB/T11457信息技术软件工程术语 GB/T15532一2008计算机软件测试规范 GB/T201582006信息技术软件生存周期过程配置管理(IsO/IECTR15846;1998,IDT 术语和定义 GB/T11457界定的以及下列术语和定义适用于本文件 3.1 访问控制aeceesscontrol -种保证数据处理系统的资源只能由被授权主体按授权方式进行访问的手段 [GB/T25069一2010,定义2.2.1.42] 3.2 攻击attack 在信息系统中,对系统或信息进行破坏、泄露、更改或使其丧失功能的尝试(包括窃取数据) [GB/T250692010,定义2.2.1.58 3.3 密码分组链接eipherbloekchaining 对信息加密时,每一密文块在加密时都依赖于前一密文块的方式 密文ciphertext 利用加密技术,经变换,信息内容被隐藏起来的数据 [GB/T250692010,定义2.2.2.105] 3.5 解密deeryption 将密文转换为明文的处理,即加密对应的逆过程 [GB/T250692010,定义2.2.2.69] 3.6 字典式攻击dietid iomaryattack 用遍历给定口令或密钥列表的方式对密码系统的攻击 如,使用存储的特定口令值或密钥值列表
GB/T34946一2017 或使用来自自然语言字典中的单词列表 [GB/T250692010,定义2.2.2.239 域名服务器(DNS)欺骗 domainnameserver(DNS)spofing 攻击者冒充域名服务器的一种欺骗行为 3.8 加密eeypto" 对数据进行密码变换以产生密文的过程 一般包含一个变换集合,该变换使用一套算法和一套输 人参量 输人参量通常被称为密钥 [GB/T250692010,定义2.2.2.60] 3.9 硬编码harteding 在软件实现上,把输人或输出的相关参数直接编码在源代码中,而不是从外部来源获得的数据生 成的 3.10 散列值hash-yalue 散列/杂凑函数的输出的比特串 [GB/T250692010,定义2.2.2.169] 3.11 散列/杂凑函数hashfunetion 将比特串映射为固定长度的比特串的函数,该函数满足下列两特性: -对于给定输出,找出映射为该输出的输人.在计算上是不可行的 -对于给定输人,找出映射为同一输出的第二个输人,在计算上是不可行的 注:计算上的可行性取决于特定安全要求和环境 [GB/T25069一2010,定义2.2.2.1667 3.12 注入injeetion 由于字符过滤不严谨导致的漏洞 3.13 单向加密one-wayeneryptiom -种加密,它只产生密文,而不能将密文再生为原始数据 [GB/T250692010,定义2.2.2.9 3.14 最优非对称加密填充optimalasymmetrieencryptionpadding RSA算法的一种加密填充方案,可将原有的确定性的加密方案转换成一种可能性方案,并能防止 密文的部分解密或其他信息泄露 3.15 填充padding 对数据串附加额外比特 [GB/T25069一2010,定义2.2.2.187] 3.16 口令 pasSword 用于身份鉴别的秘密的字、短语、数字或字符序列,通常是被默记的弱秘密
GB/34946一2017 [GB/T25069一2010,定义2.2.2.76] 3.17 明文plaintext 未加密的信息 [[GB/T250692010,定义2.2.2.135 3.18 彩虹表rainbowtahle -个用于加密散列函数逆运算的预先计算好的表,常用于破解加密过的密码散列 3.19 重定向redireet 通过服务器的特殊设置,将访问当前域名的用户引导到指定的另一个网络地址,即将一个域名指向 一个已经存在的站点,或者将一个页面引导至另一个页面 另 3.20 反向域名解析reverseDNSresolutionm 通过IP地址查询服务器域名 3.21 盐值 Salt 作为单向函数或加密函数的二次输人而加人的随机变量,可用于导出口令验证数据 3.22 脚本script 使用一种特定的描述性语言,依据一定的格式编写的纯文本程序 3.23 种子 seed -种用作某一确定性随机比特生成器输人的比特串 DRBG的部分状态由种子确定 [[GB/T250692010,定义2.2.2.232] 3.24 敏感信息sensitiveinformatiom 由权威机构确定的必须受保护的信息,该信息的泄露、修改、破坏或丢失会对人或事产生可预知的 损害 [GB/T250692010,定义2.2.4.7] 3.25 会话 sessio 用于跟踪客户端与服务器间的交互.,保存用户身份和信息的对象 3.26 源代码漏洞sourecodevulnerability 存在于软件源代码中的漏洞 3.27 漏洞 Vulnera rability 计算机信息系统在需求、设计,实现,配置,运行等过程中,有意或无意产生的缺陷 这些缺陷以不 同形式存在于计算机信息系统的各个层次和环节之中,如果利用不当,就会对计算机信息系统的安全造 成损害,从而影响计算机信息系统的正常运行 注改写GB/T28458一2012,定义 3.2
GB/T34946一2017 缩略语 下列缩略语适用于本文件 DNS;域名服务器(DomainNameServer) DRBG;确定性随机比特生成器(DeterministieRandomBitGenerator) HTTP;超文本传输协议(HypertextTransferProtoeol) HTTPs;安全套接字层超文本传输协议(HypertextTransferProtoeolOvyerSeeureSoeketl.ayer) IP;网际协议(InternetProtocolD PRRNG伪随机数生成器(PseudorandonmNumberGenerator SQL;:结构化查询语言(StructuredQuerylanguage TCP:传输控制协议TransmissionControlProtocol URL:统一资源定位符(UniformResourelocator) XML:可扩展置标语言(ExtensibleMarkupLanguage) 5 源代码漏洞测试总则 5.1源代码漏洞测试目的 源代码漏洞测试的目的是: 发现定位及解决软件源代码中的漏洞 a b)为软件产品的安全性测量和评价提供依据 5.2源代码漏洞测试过程 5.2.1概述 源代码作为软件产品的重要组成部分,其测试过程基本等同软件产品的测试过程 本标准遵循 GB/T155322008的要求将源代码测试过程分为测试策划、测试设计、测试执行和测试总结四个 阶段 5.2.2测试策划 测试策划主要对整个源代码漏洞测试的过程进行策划 测试策划应确定测试的目标、范围、依据、 环境和工具,应分析与评估测试风险,并制定应对措施 测试策划应重点明确源代码漏洞测试应划分的 阶段以及各阶段的人员角色、任务,时间和工作成果,形成源代码漏洞测试进度计划表 源代码漏洞测 试进度计划见表1 表1源代码漏洞测试进度计划 测试阶段 人员角色 任务 时间 工作成果 测试策划 《测试计划》 测试设计 《测试说明》 测试执行 测试日志 测试总结 《测试总结报告》
GB/34946一2017 5.2.3测试设计 测试设计应根据测试目标,结合被测源代码的业务和技术特点,明确测试环境和工具,确定测试需 求、测试方法、测试内容、测试准人条件和测试准出条件 测试方法应采用自动化静态分析工具扫描和 人工分析相结合的方法 C井语言源代码漏洞测试的测试内容宜包括但不限于以下源代码漏洞分类 行为问题 a 路径错误 b 数据处理 c d 处理程序错误; 不充分的封装; 安全功能 时间和状态; h)web问题 用户界面错误 以上9类源代码漏洞分别对应6.1源代码漏洞相关分类 若被测源代码采用了C#语言的第三方框架,测试人员应根据被测源代码的实际情况在测试内容 中增加第三方框架相关的漏洞 应设计测试用例 源代码漏洞测试的测试用例应包括但不限于以下要素 名称和编号; a b 自动化静态分析工具的操作步骤和参数配置; 自动化静态分析工具的期望操作结果 c 5.2.4测试执行 测试执行包括自动化静态分析工具扫描和人工分析 应根据测试用例明确的操作步骤,使用自动化静态分析工具执行测试,记录测试执行过程及测试 结果 应对自动化静态分析工具的测试结果进行人工分析,人工分析宜包括但不限于以下任务 宜按漏洞类别或漏洞风险级别从高到低的顺序分析扫描得到的所有源代码漏洞; a b)结合源代码的上下文和业务需求,验证疑似漏洞,筛除误报的源代码漏洞 与开发人员沟通确认源代码漏洞分析结果 c 5.2.5测试总结 测试总结应对整个源代码漏洞测试过程进行总结,测试总结应包括但不限于以下任务 核查测试环境、工具、内容,方法和结果是否正确 a b)确认测试目标和测试需求是否得到满足; 总结测试内容、方法和结果,出具测试报告 C 5.3源代码漏洞测试管理 5.3.1过程管理 应对源代码漏洞测试的过程进行管理,一般包括: 提出源代码漏洞测试各个阶段的任务要求和质量要求 a b 安排对源代码漏洞测试的过程进行质量监督和阶段评审,包括监督和评审所需的环境、设备、
GB/T34946一2017 资金和人员,质量监督的记录应形成文档 c 对源代码漏洞测试的风险进行管理,提供风险规避所需的相关资源 d)提供完成源代码漏洞测试各项任务所需的资源保障 包括测试的环境、工具、资金和人员 表2给出了源代码漏洞测试的人员配备的参考 表2源代码漏洞测试人员配备情况 工作角色 具 体职责 管理监督测试项目,提供技术指导,获取适当的资源,制定基线,技术协调,负责项目的安 测试项目负责人 全保密,过程管理和质量管理,负责测试策划和测试总结 开展测试需求分析,确定测试内容,测试方法,测试(软、硬件)环境、测试工具,设计测试 测试设计员 用例,建立测试环境 测试员 执行测试,记录测试过程和结果 测试分析员 对自动化静态分析工具的测试结果进行人工分析 测试系统管理员 对测试环境和资产进行管理和维护 配置管理员 设置、管理和维护测试配置管理数据库 测试评审员 对测试的各个阶段进行评审 注1:当软件的供方实施测试时,配置管理员由软件开发项目的配置管理员承担;当独立的测试组织实施测试时, 需配备测试活动的配置管理员 注2;一个人可承担多个角色的工作,一个角色可由多个人承担 5.3.2过程评审 5.3.2.1 概述 源代码漏洞测试包括测试策划、测试设计、测试执行和测试总结四个阶段 每个测试阶段结束时应 开展阶段评审 评审的级别和参加人员要求宜根据被测源代码的重要程度而确定 5.3.2.2测试策划评审 完成测试策划后,应对测试计划进行评审,形成测试策划评审表 评审的具体内容应包括 a 评审测试环境、工具等测试实施条件要素考虑是否全面合理 b)评审测试人员分工和进度计划等测试组织要素是否具有可实施性 c 评审风险分析是否全面合理以及是否具有可行的应对风险的措施 5.3.2.3测试设计评审 完成测试设计后,应对测试说明和测试就绪情况进行评审,形成测试设计评审表 评审的具体内容 应包括: 评审测试需求分析是否合理; a b 评审测试内容和方法是否符合测试需求; 评审测试用例的操作步骤和参数配置是否详细、正确可实施; c 评审测试用例的期望结果描述是否准确; d 评审测试人员、环境和工具是否齐备并符合要求
GB/34946一2017 5.3.2.4测试执行评审 完成测试执行后,应对测试日志进行评审,形成测试执行评审表 评审的具体内容应包括: 评审测试用例执行是否完整; a b 评审操作结果是否真实有效; 评审操作结果描述是否清晰、准确; c d 对于与预期结果不一致的操作结果,评审是否记录了详细的问题现象; 评审人工分析的结果是否正确 5.3.2.5测试总结评审 完成测试总结后,应对测试总结报告进行评审,形成测试总结评审表 评审的具体内容应包括 评审测试需求和测试目标是否全面准确完成 a b) 评审测试结论与测试结果追溯的合理性; 评审是否具备测试结束条件; c d)评审测试风险规避是否合理 5.3.3配置管理 应按照软件配置管理的要求,将测试过程中产生的各种软件工作产品纳人配置管理 配置管理要 求见GB/T20158一2006 5.4源代码漏洞测试工具 选择源代码漏洞测试工具应首先明确GB/T15532一2008中4.8.2的要求,重点应考虑工具的漏报 率和误报率,可通过调查或比较的方式评估工具的漏报率和误报率 选择的源代码漏洞测试工具应覆盖但不限于本标准的源代码漏洞测试内容,测试前应对工具的漏 洞规则库和测试引擎进行必要的升级和维护 注:选择源代码漏洞测试工具建议结合项目的具体需求 如可行,首先考虑选用商业的自动化静态分析工具 若 条件不具备也可选用开源的自动化静态分析工具 5.5源代码漏洞测试文档 源代码漏洞测试文档一般包括测试计划、测试说明、测试日志和测试总结报告 源代码漏洞测试文 档宜单独出具,也可与其他测试类型出具的测试文档合并 测试文档的基本内容参见附录A的案例 源代码漏洞测试内容 6.1源代码漏洞分类 本标准根据软件开发中常用的概念来组织C井语言源代码漏洞的类别,具体分为如下9个类别 行为问题 由于应用程序的意外行为而引发的漏洞 a 路径错误 不恰当的处理访问路径而引发的漏洞 b 数据处理- 处理数据的功能中发现的漏洞 c d 处理程序错误 -应用程序未正确处理运行时出现的错误而引发的漏洞 不充分的封装 -未充分封装关键数据或功能而引发的漏洞 e 安全功能软件安全功能如身份鉴别、访问控制、机密性、密码学和特权管理等相关的漏洞 时间和状态 在多系统、进程或线程并发计算的环境下由于时间和状态管理不恰当而引发 g
GB/T34946一2017 的漏洞 h) web问题 web技术相关的漏洞 i) 用户界面错误 -与用户界面相关的漏洞 C井语言各源代码漏洞的名称及其所属的类别参见附录B. 6.2源代码漏洞说明 6.2.1行为问题 6.2.1.1不可控的内存分配 漏洞描述:内存分配的大小受外部控制的输人数据影响,且程序没有指定内存分配大小的上限 漏洞风险;攻击者可以使程序分配大量的内存,程序可能会因为内存资源不足而崩溃 修复或规避建议:在程序中指定内存分配大小的上限,在分配内存前对要分配的内存大小进行验 证,确保要分配的内存大小不超过上限 示例1:不规范用法 lassExatmple intExampleFun(intsize)//size为用户的输人数据 if(size<0)//没有验证size是否超出内存分配的上限 returnnull yte buff=newbyte[size]; or(inti=0;iMAX_LENGTH)//验证size rreturnnul: try
GB/34946一2017 byte口]buff=newbytesize] or(inti=0;iGB/T34946一2017 示例2:规范用法之 usingSystem.Diagnostics; classExample voidExampleFu "dir.exeE" run(stringcommand//本例中 command Processp=newProcess(; /PATH是存放操作系统中cnmd.exe所在完整路径的常量,本例中PATH="c\\wINDows\systen32\" p.Startlnfo.FileName PATH十"emd.exe";//使用完整路径确保能运行正确的cnmd.exe PATH /使用完整路径确保cmd命令能正确执行 command: stringcmd p.Startlnfo,Argument cmd; p.Start(); 6.2.3数据处理 6.2.3.1 相对路径遍历 漏洞描述;路径名受外部控制的输人数据影响,且程序没有使能够解析到目录外位置的字符序列 如“.”)失效 漏洞风险;攻击者可以通过输人能够解析到目录外位置的字符序列来访问限制目录之外的文件或 目录 修复或规避建议:在构建路径名前对输人数据进行验证,确保外部输人仅包含允许的构成路径名的 字符 示例1:不规范用法 usingSystem.IO: classExample voidExampleFun(stringfilename' //filename为用户的输人数据 /filename可能包含“”字符序列导致访问受限目录之外的文件 Pat山h.GetFullPath(ilename) stringpath Directorynfoinfo=newDireetorylnfo(path); 示例2:规范用法之 usingSystem.IO: usingSystem.Text.RegularExpressions; lassExatmpl stringGetUserFileDir(O 10
GB/34946一2017 //返回应用程序配置的用户文件存放目录的路径 oidExampleFun(stringfilename)//flename为用户的输人数据 stringregex="-[A-Za-0-9]+\.[a-]+$";//对文件名进行合法性校验的正则表达式 /参数filename传人的文件名称可能存在漏洞,现通过正则表达式regex校验文件名ile 的合法性 ename /校验通过则访问文件 if(Regex.isMatchflename,regex)) stringpath GetUserFileDir十filename:; Drectorylnfoinfo=newDirectorylnfo(path); 6.2.3.2绝对路径遍历 漏洞描述;路径名由外部控制的输人数据决定,且程序没有限制路径名允许访问的目录 漏洞风险;攻击者可以通过输人路径名来访问任意的文件或目录 修复或规避建议在程序中指定允许访问的文件或目录,在访问文件或目录前对路径名进行验证、 确保仅允许访问指定的文件或目录 示例1:不规范用法 usingSystem.IO; usingSystem.Text.RegularExpressions:; cdas、Example boolFileExists(stringpath)//判断文件是否存在,存在则返回true //absolute tePath为用户的输人数据 stringExampleFun(stringabsolutePath if(FileExists(absolutePath))//判断文件是否存在 Direetorylnfodir=newDirectorylnfo(absolutePath);//没有限制absolutePath访问的目录 1
GB/T34946一2017 示例2:规范用法之 usingSystem.IO; usingSystem.Text.RegularExpressions; classExample 1FilaExists(stringpath)//判断文件是青存在,存在则返回rue boo absolutePath//absolutePath为用户的输人数据 stringExampleFun(stringa /用正则表达式设置限制访问的目录,用户只能影响文件名 "C;\ldata\[A-Za-z0-9十\.[a-幻十$" stringregeX if(FileExists(absolutePath)//判断文件是否存在 /验证absolutePath是否仅能解析到受限制的目录内 if(Regex.isMatch(absolutePath,regex) Directorylnfodir=newDireetorylnfo(absolutePath); 6.2.3.3命令注入 漏洞描述:使用未经验证的输人数据构建命令 漏洞风险;攻击者可执行任意命令 修复或规避建议;在构建命令前对输人数据进行验证,确保输人数据仅能用于构成允许的命令 示例1:不规范用法 usingsystem.Diagnostics classExample voidRurnCmd(stringcommand)//command为用户的输人数据 Processp=newProcess(); /PATH是存放操作系统中cenmd.exe所在完整路径的常量 ,FileName PATH p,Startlnfo. "emd.exe", INIcMD PATH十"emd.exe/c\"dir.exe" stringl if(command!=null//未对command d进行验证,攻击者可输人"&.&."等字符串执行恶意命令 wn INIT_CMD stringcmd command十 p,Startnfo.Argument cmd p.Start( 12
GB/T34946一2017 SqlDataAdaptersda=newSqlDataAdapter(query,conn); DataTabledt newDataTabe(); sda.Fill(dt); 示例2:规范用法之一 usingSystem.Data.SqlClient .web usingSystem. dlassExample privatevoidExampleFun(objectsender,EventArgse /连接数据库 SqConnectionconn; stringuserName UserName.,Text;//UserName是一个asp:TextBox 使用参数化的sql语句 SEIET FROMitemsWHEREowner @owner"; query SglCommand(query,conn); er",SnlDbType.VarChar,30)7 arameters.Add("(aowner" Idl, cmd.Parameters["@owner"].Value=userName; newSqlDataAdapter(emd); SglDataAdaptersda DataTabledt newDataTable(); ssda.Fill(dt) 示例3:规范用法之一 usingSystem.Data,SqlClient; usingSystem.web classExample priatevoidExampleFun(objeesender,EentArgse) 1/连接数据库 SalConnectionconn; UserName.Text /UserName是一个asp,TextBox stringuserName //本例中假设用户名是一个3到8位的数字、字母或下划线组成的字符串 strimgregex="(\w)3,8$";//正则表达式 f(Regex.isMatch(userName,regex))//验证userName是否合法 Stringquery="SELECT FROMitemswHEREowner- X userName十 SqlDataAdaptersda=newSqlDataAdapter(query,conn)1 DataTabledt=newDataTable(): 14
GB/34946一2017 sda.Fill(dt); else 6.2.3.5代码注入 漏洞描述;使用未经验证的输人数据动态构建代码语句 漏洞风险;攻击者可构建任意恶意代码 修复或规避建议;在动态构建代码语句前对输人数据进行验证,确保仅能用于构建允许执行的 代码 示例1:不规范用法 usingSystem.CodeDom.CodeCompiler; dlassExample voidExampleFun(stringcode)//code来自用户输人 CodeCompilerobjCodeCompiler=newCodeCompiler(); newCompilerParameter(; CompilerParameteroptions options,(GenerateExecutable false; options.GeneratelnMemory true; 可能包含恶意代码 /code objCodeCompiler,FormSource(options,code); 示例2;规范用法之 usingSystem.CodeDom.CodeCompiler; dlassExample boolVerifieation(stringcode /通过正则表达式、字符串比对等白名单的方式验证code是否允许被编译执行 voidExampeFun(stringcode)//code来自用户输人 CodeCompilerobjCodeCompiler=newCode(Compiler(); newCompilerParameter(; CompilerParameteroptions options.(GenerateExecutable false; options.GeneratenMemory true; ifVerification(code 15
GB/T34946一2017 objCodeCompiler.FormSource(options,code) else 6.2.3.6信息通过错误消息泄露 漏洞描述;软件呈现给用户的错误消息中包括与环境、用户或相关数据有关的敏感信息 漏洞风险;对攻击者而言,敏感信息可能本身就是有价值的信息,或者有助于开展进一步的攻击 修复或规避建议;确保错误消息中仅含有对目标受众有用的少量细节 示例1:不规范用法 usingSystem.IO; dlassExample voidExampleFun(HttpResponseresponse) stringilepath; .. /从flepath中删除空目录有可能抛出异常,页面将跳转至默认异常页面,该页面包含异常相关的信息 Directory.Delete(filepath); 示例2:规范用法之 usingSystem.IO; lassExatmple oidExampleFun(HttpResponseresponse stringfilepath; try Dleilwth Directory,D 1/其他可能产生异常的代码 catch(IOExceptione) //捕获所有异常,不将异常的相关信息呈现给用户 stringmsg="Sorry!wewilixtheproblemsoon!" 16
GB/34946一2017 response.Write(msg); 6.2.3.7信息通过服务器日志文件泄露 漏洞描述;将敏感信息写人服务器日志文件 漏洞风险:攻击者有机会通过访问日志文件读取敏感信息 修复或规避建议;慎重考虑写人日志文件信息的隐私性 不要把敏感信息写人日志文件 示例1:不规范用法 wsingsystem.web1 usingSystem.Collections,Speeialized.NameValueColleetion; publicclassExample publievoidwriteMyl.og(stringmsg //将msg写人日志文件 privateboolUserExists(stringusername,stringpassword)//判断用户名口令是否正确 publievoidExampleFun(HttpRequestrequest) NameValueCollectionformColleet request.Form; formCollect.Get("username") strlngusn formColeet.Get("password"); stringpassword ifUserExists(username, password))//用户名和口令正确时调用writeMyLog()写人日志 //msg中包含了敏感信息 username stringmsg and”十password十"correct!"; WriteMyLog(msg); 示例2:规范用法之 usingSystem.Web; usingSystem.Colleetions.Speeialized.NameValueColleetion; publieclassExample pblievoidwriteMylog(stringmsg)//将msg写人日志文件 17
GB/T34946一2017 privateboolUserExists(stringusername,stringpassword /判断用户名口令是否正确 publiecvoidExampleFun(HttpRequestrequest) NameValueColectionformColeet=request.Form; formColeet.(Get("usernanme"); stringusername stringpassword formCollect.Get("password"); if(UserExists(username,password) tringmsg "L.oginsuccess!";//msg中不包含敏感信息 writeMylog(msg); 6.2.3.8信息通过调试日志文件泄露 漏洞描述;应用程序没有充分限制对用于调试的日志文件的访问 漏洞风险;调试日志文件通常包含应用程序的敏感信息,攻击者有机会通过访问调试日志文件读取 敏感信息 修复或规避建议;在产品发布之前移除产生日志文件的代码 示例1,不规范用法 usingSystem.Diagnostics,Trace usingSystem.Diagnostics.TextWriterTraceListener; publicclassExample publicExample(O //将调试信息的输出路径设置为当前目录下的Example.log Trace.Listeners.Clear(); Trace.AutoFlush=true; Trace,Listeners.Add(newTextwriterTraceListener("Example.log")); publievoidExampleFun( /sceurityPah为本例应用程序的敏感信息 stringSecurityPath; /输出调试信息并生成调试日志文件,此时调试日志文件中包含敏感信息 Trace.writeLine("Cannotfindfilesin”十SecurityPath); 18
GB/34946一2017 示例2;规范用法之 usingSystem.Diagnosties,Trace; usingSystem.Diagnostics.TextWriterTraceListener publieclassExample publicExample(O /将调试信息的输出路径设置为当前目录下的Example.og Trace.Listeners.Clear(); Trace,AutoFush=true; Trace.Listeners.Add(newTextwriterTmcelListener("Example.log")). publievoidExampleFun(O stringSecurityPath//SecurityPath为本例应用程序的敏感信息 /在产品发布之前移除产生日志文件的代码 /Trace.WriteLine("Cannotfindfilesin"十SeeurityPath); 6.2.3.9信息通过持久cokie泄露 漏洞描述:将敏感信息存储到持久cookie中 漏洞风险持久cwk他是被存储在浏览器所在的硬盘驱动器上的cokie.攻击者有机会通过访问 硬盘上的cookie文件读取敏感信息 修复或规避建议;不要在持久cookie中保存敏感信息 示例1:不规范用法 usingSystem.Web; usingSystenm.web.UI publicclassExampleextendsPage privatestringuserlD; privatestringpassword protectedvoidExampleFun(objeetsender,EventArgse ic"Mcokie") HttpCookiecookie=newHttpCookieG DateTimedt=DateTime.Now; newTimeSpan(14,0,0,0)//eookie持续时间为14天 Timespnts cookie.Expires=dt.Add(ts); //持久cookie中保存用户名和口令,用于14天内自动登录 cookie.Values,Add("userlD",userlD); cookie.Values.Add("password",password); 19
GB/T34946一2017 Response.AppendCookie(cookie) 示例2:规范用法之 usingSystem.web; usingSystem.web.UI publieclassExampleextendsPage privatestringuserlID; privatestringpassword: proteetedvoidExampleFun(objecetsender,EventArgse "MyCookie"); HttpCookiecookie=newHttpCookie( DateTimedt=DateTime.Now TinmeSpants newTimeSpan(14,0,0,0); //cookie 持续时间为14天 dt.Add(ts); cookie,Expires cookie.Values.Add("userlD",userlD); /由于持久cookie存储于客户端,容易被攻击,所以不应将口令保存到持久cookie中 1/cookie.Values.Add("password",password); Response.AppendCookie(cookie 6.2.3.10未检查的输入作为循环条件 漏洞描述;软件没有对被用于循环条件的输人进行适当的检查 漏洞风险;攻击者可以让软件循环过多而使软件拒绝服务 修复或规避建议;规定循环次数的上限,在将用户输人的数据用于循环条件前验证用户输人的数据 是否超过上限 示例1;不规范用法 clas、Example oidExampleFun(intcount)//coumt为用户可影响或可被篡改的数据 inti if(count>0 /如果count过大可能使软件拒绝服务 for(i=0;icount;i十十 20
GB/34946一2017 示例2;规范用法之 lassExample intMAx_coUNT /定义最大循环次数 =1000; voidExampeFun(intcount)//count为用户可影响或可被篡改的数据 inti; if(count>0&.&.count之=MAXcOUNT//判断count 是否在限制次数内 or(i=0;iGB/T34946一2017 示例2:规范用法之 nXML usingSystem.X usingSystem.web; usingSystem.Text,.RegularExpressions,Regex; usingSystem.Collections.Specialized.NameValue(Collection; publicclassExample privatestringxmlpath; "[AZa八.]十$";//正则表达式 privatestringregex mblievodExampleFun(HtpReuestreuesD NameValueCollectionformColeet reguest.Form; stringauthor=formColleet.(Get("author"); XmlNodexnode newXmlDoeument( xnode.load(xmlpath); /如果author匹配正则表达式则允许用来构建XPath语句 if(Regex.isMateh(author,regex) stringxpath-"//bookstore/Mook[author/ext()-"十author十"]/title/text(O)"" xmlNodeListbookNodes=xnode,SeletNodes(xpath)/根据xPath语句获得符合条件的节点列表 6.2.4处理程序错误 6.2.4.1未限制危险类型文件的上传 漏洞描述:软件没有限制允许用户上传的文件的类型 漏洞风险:攻击者可上传具有危险类型的文件,这些文件可能在产品的环境中自动被处理 修复或规避建议;限制允许用户上传的文件的类型 示例1:不规范用法 usingSystem.Web; publicclassExample privatestringpath;//文件存储的物理路径 publievoidExampleFun(HtpPostedlFilefle)//存储用户已上传的图像文件 file.SaveAs(path);//文件类型可能不是图像文件 22
GB/34946一2017 示例2:规范用法之 usingSystem.web publieclassExample privatestringpath;/文件存储的物理路径 privateboolIslmage(stringfiletype)//判断文件类型是否为图像文件 aFilefle)//存储用户已上传的图像文件 publicvoidExampleFun(HttpPosted strimgfleype一ifle.ConemTye: if(Islmagefiletype)//判断文件是否为图像文件 file.SaveAs(path); 6.2.5不充分的封装 6.2.5.1违反信任边界 漏洞描述;让数据从不受信任的一边移到受信任的一边却未经验证 漏洞风险,程序员更容易错误地相信那些未被验证的数据,导致未经验证的数据被攻击者利用 信任边界可以被认为是画在程序中的一 -条线 线的一侧是不受信任数据;另一侧,我们认为数据是 可以被信任的 验证逻辑旨在让数据安全地穿过信任边界从不受信任的一边秘到受信任的 一边 修复或规避建议;增加验证逻辑让数据安全地穿过信任边界 -从不受信任的一边移到受信任的 边 示例1;不规范用法 usingSystem.web usingSystem.Collections.Speeialized.NameValueColleetion: publicclassExample publicvoidExampleFunHttpReguestrequest NameValueCollectionformCollect=request.Form; stringusermame formColect.(Get("username"); HttpContext.Current.Session HttpSessionStatesession session.Add("username username); //将未验证的usermame保存到session中 23
GB/T34946一2017 示例2:规范用法之 usingSystem.Web; usingSystem,Collections,Speeialized.NameValueColleetion; publicclassExample boolIsCredible( le(stringkey,stringvalue //根据不同的key调用不同的处理程序对value进行安全校验 publicvoidExatmpleFun(Ht tpReguestreguest NameValueColleetionformCollect=request.Form; formColleet.Get("username"); stringusernamme HttpContext.Current.Session; HttpSessionStatesession //非可信来源的数据需作安全检查 if(!IsCredible("username" username session.Add("UserExists","nvalid")//数据未通过验证则记录该用户不合法 else //数据通过验证则记录到s session.Add("u "username",username) session中 6.2.6安全功能 6.2.6.1明文存储口令 漏洞描述:将口令明文存储 漏洞风险;明文存储口令会降低攻击的难度,攻击者若获得访问口令存储文件的权限,可轻易获 取口令 修复或规避建议;尽量避免在容易受攻击的地方存储口令 如果需要,考虑存储口令的加密散列, 以替代明文口令存储 示例1:不规范用法 wsingsystem.Data.SsClient; classExample //id,password长度最大为15个字符 voidStorePassword(SqlConnectioncon,stringid,stringpassword "UPDATEusersETpassword lwHEREid @id" stringquery @password SqlCommandcmd newSlCommandquery,con); md.Parameters.Add("@password",sqlDbType.VarChar,l5); cmd.Parameters["@password"].Value=password;//明文存储口令 cmd.Parameters.Add("@id",SIDbType.VarChar,15); 24
GB/34946一2017 cmd.Parameters["@id"].Value=id 示例2;规范用法之 usingSystem.Data.SqlClient; usingSystem.Seeurity.Cryptography dlassExample tringEnerypt(stringstr)//加密函数,返回加密后的字符串 SHA256sha=newSHA256Managed(); oidSsiorePassword(Snlconneeioncon,stringid,stringpassword//id,password长度最大为15个字符 /加密password stringpsw Encrypt(password); "UPDATEuserSETpassword @passwordwHHEREid=@id"; strlngquery SqlCommandcmd newSqlCommandquery,con); .Parameters.AN Add("@password",SqlDbType.VarChar,15); 0a cmd.Parameters["@password"].Value=psw;//存储加密后的psw md.Parameters.Add("@id",SsIDbType.VarChar,l5); cmd.Parameters["@id"].Value=id 6.2.6.2存储可恢复的口令 漏洞描述;采用双向可逆的加密算法加密口令并将口令存储在外部文件或数据库中 漏洞风险;攻击者有机会通过解密算法对口令进行解密 修复或规避建议;当业务不需要取已存储的口令进行还原时,使用单向加密算法对口令进行加密并 存储 示例1;不规范用法 wsingSystem.Data.SsClient usingSystem.Seeurity.Cryptography; classExample stringEneryp(stringsr,imtlength)//加密丽数,返回长度为length的字符串 AESaes=AES,Create();//使用双向可逆的AES加密算法 oidSstorePhassword(snCconeetioncon,stringid,stringpassword)//password长度最大为15个字符 25
GB/T34946一2017 stringpsw=Enerypt(password,l5);//加密password "UPDATEuserSETpasswordl @passwordwHEREid @id" stringguery SqlCommandcmd newSqlCommandquery,con); cmd.Parameters.Add("@password",SqlDbType.VarChar,l5); rd"].Value //存储加密后的psw cmd.Parameters["@password" psw; 示例2:规范用法之 Data.SnCent usingSystem.D usingSystem.Security.Cryptography; classExample stringEncrypt(stringstr,intlength)//加密函数,返回长度为length的字符串 SHA256sha=newSHA256Managed();//使用单向不可逆的SHA256加密算法 oidStorePassword(SglConneetioncon,stringid,stringpassword) /password长度最大为15个字符 Encrypt(password,15). /加密password stringpsw "UPDATEusersETpassword 1wHEREid @id" stringquery @password SqlCommandcmd newSglCommandquery,con); cmd.Parameters.Add("@password" .suDType.vaChrl) cmd.Parameters["@password"].Value=psw; //存储加密后的psw 6.2.6.3口令硬编码 漏洞描述;程序代码包括注释)中包含硬编码口令 漏洞风险;攻击者可以通过反编译或直接读取二进制代码的方式获取硬编码口令 修复或规避建议;使用单向加密算法对口令进行加密并存储在外部文件或数据库中 示例1:不规范用法 classExample //判断口令是香正确 oolExampleFun(stringpassword if(password.CompareTo("15ds45ghel2sdgl35")==0//代码中包含硬编码口令 returntrue rreturnfalse; 26

C#语言源代码漏洞测试规范GB/T34946-2017解读

随着信息技术的飞速发展,软件已经渗透到人们生产和生活的各个领域。然而,在软件开发过程中,由于各种原因,可能会出现源代码漏洞,给软件的安全性带来威胁。因此,制定一套严格的源代码漏洞测试规范对于确保软件的高质量和安全性至关重要。GB/T34946-2017就是这样一套规范,下面我们来深入了解。

1. C#语言源代码漏洞测试规范的定义

C#语言源代码漏洞测试规范是指为了保证C#语言程序源代码的安全性,按照一定标准对源代码进行检查和测试的方法和流程标准。该规范规定了源代码漏洞测试的目标、原则、流程、方法、结果等方面的标准和要求,以确保软件产品满足安全性和高质量性要求。

2. C#语言源代码漏洞测试规范的构成

C#语言源代码漏洞测试规范由以下几部分组成:

  • 术语和定义:对规范中涉及到的术语和概念进行解释和定义,使读者能够清晰理解规范内容。
  • 测试目标和原则:明确源代码漏洞测试的目标和原则,为后续的测试流程提供指导。
  • 测试流程:按照一定的顺序和步骤,对源代码进行安全测试。
  • 测试方法和技术:介绍测试过程中常用的方法和技术,例如静态测试和动态测试等。
  • 测试结果评价与处理:对测试结果进行评价和处理,制定相应的修复计划或改进措施。

3. C#语言源代码漏洞测试规范在软件开发中的重要性

C#语言源代码漏洞测试规范对于保障软件的稳定性、安全性和质量至关重要。具体表现在以下几个方面:

  • 降低漏洞风险:源代码漏洞是软件开发中常见的问题之一,通过严格按照规范进行测试可以降低漏洞风险。
  • 提高程序质量:C#语言源代码漏洞测试规范可以帮助开发人员识别并修复错误和漏洞,从而提高程序的质量。
  • 增强软件安全性:源代码漏洞很可能会被攻击者 用于攻击软件系统,通过遵循规范来进行源代码漏洞测试可以增强软件的安全性。
  • 节省成本和时间:源代码漏洞测试是软件开发中一个非常重要的环节,严格按照规范测试可以减少后期修复错误所需的成本和时间。

4. 总结

C#语言源代码漏洞测试规范GB/T34946-2017确保了C#语言程序源代码的安全性,为软件开发人员提供了保障和指导。对于保障软件的稳定性、安全性和质量具有重要意义。在软件开发过程中,开发者应该严格按照规范进行源代码漏洞测试,以保证软件产品满足安全性和高质量性要求。

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

计算机软件测试规范

无线局域网测试规范

信息技术数据溯源描述模型
上一篇 本文分享国家标准信息技术数据溯源描述模型的全文阅读和高清PDF的下载,信息技术数据溯源描述模型的编号:GB/T34945-2017。信息技术数据溯源描述模型共有10页,发布于2018-05-01
信息技术汉语拼音双拼和三拼输入通用要求
本文分享国家标准信息技术汉语拼音双拼和三拼输入通用要求的全文阅读和高清PDF的下载,信息技术汉语拼音双拼和三拼输入通用要求的编号:GB/T34947-2017。信息技术汉语拼音双拼和三拼输入通用要求共有5页,发布于2018-05-01 下一篇
相关推荐