GB/T34944-2017

Java语言源代码漏洞测试规范

SourcecodevulnerabilitytestingspecificationforJava

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

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

Java语言源代码漏洞测试规范


国家标准 GB/T34944一2017 Java语言源代码漏洞测试规范 SoureecodlevulnerabilitytestingspeeificationforJava 2017-11-01发布 2018-05-01实施 中华人民共利国国家质量监督检验检疙总局 发布 国家标准化管理委员会国家标准
GB/T34944一2017 次 目 前言 引言 范围 规范性引用文件 术语和定义 缩略语 源代码漏洞测试总则 5.1源代码漏洞测试目的 .2源代码漏洞测试过程 源代码漏洞测试管理 5.3 5.!源代码漏洞测试工具 源代码漏洞测试文档 5.5 源代码漏洞测试内容 6.1源代码漏洞分类 6.2源代码漏洞说明 附录A资料性附录Java语言源代码漏洞测试案例 50 附录B(资料性附录)Java语言源代码漏洞类别与名称 56 参考文献 58
GB/34944一2017 前 言 本标准按照GB/T1.1一2009给出的规则起草 请注意本文件的某些内容可能涉及专利 本文件的发布机构不承担识别这些专利的责任 本标准由全国信息技术标准化技术委员会(SAC/TC28)提出并归口 本标准起草单位:珠海南方软件网络评测中心,杭州安恒信息技术有限公司、厦门理工学院、上海端 玛计算机科技有限公司、电子技术标准化研究院、东信和平科技股份有限公司,远光软件股份有限 公司、南京大学、国家应用软件产品质量监督检验中心,珠海中慧微电子有限公司、广东省科技基础条件 平台中心,珠海市软件行业协会、南昌金庐软件园软件评测培训有限公司、吉林省电子信息产品监督检 验研究院 本标准主要起草人侯建华,黄兆森、王忠福,范渊、杨尚沅、邓人邀、梁建新,张肠肠、李军、李璐 黄华她刘早,辛士界、陈振宇、肖枭、崔建峰、申煜湘 王威、
GB/T34944一2017 引 言 Java语言是一种面向对象的、运行于Java虚拟机之上的高级程序设计语言 它广泛应用于各种大 型信息系统和智能终端应用软件的开发 众所周知,由于各种人为因素影响,每个软件的源代码都难免 会存在漏洞,而软件信息泄露、数据或代码被恶意篡改等安全事件的发生一般都与源代码漏洞有关 为 尽量减少Java语言源代码中存在的漏洞,有必要制定针对Java语言程序的源代码漏洞测试规范 源代码漏洞测试可在开发过程的软件编码活动之后实施,也可在运行和维护过程中实施 本标准的漏洞分类与漏洞说明主要参考了MITRE公司发布的CwE(CommonweaknessEnu ttion),同时结合了当前行业主流的自动化静态分析工具在测试实践中发现的典型漏洞来确定并进 merat 行说明 注,本标准漏洞参考了cwE2.9版本,示例代码适用于本标准选择的漏洞说明 本标准仅针对自动化静态分析工具支持的关键漏洞进行说明,应用本标准开展源代码漏洞测试时 应根据实际需要对漏洞进行裁剪和补充
GB/34944一2017 Java语言源代码漏洞测试规范 范围 本标准规定了Java语言源代码漏洞测试的测试总则和测试内容 本标准适用于开发方或第三方机构的测试人员利用自动化静态分析工具开展的Java语言源代码 漏洞测试活动,Java语言的程序设计和编码人员以及源代码漏洞测试工具的设计人员也可参考使用 规范性引用文件 下列文件对于本文件的应用是必不可少的 凡是注日期的引用文件,仅注日期的版本适用于本文 件 凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件 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/T34944一2017 或使用来自自然语言字典中的单词列表 [GB/T250692010,定义2.2.2.239 域名服务器(DNs)欺骗 domainnameserver(DNS)spofing 攻击者冒充域名服务器的一种欺骗行为 3.8 加密eeypto" 对数据进行密码变换以产生密文的过程 一般包含一个变换集合,该变换使用一套算法和一套输 人参量 输人参量通常被称为密钥 [GB/T250692010,定义2.2.2.60] 3.9 硬编码hardeoding 在软件实现上,把输人或输出的相关参数直接编码在源代码中,而不是从外部来源获得的数据生 成的 3.10 散列值hash-value 散列/杂凑函数的输出的比特串 [GB/T250692010,定义2.2.2.169] 3.11 散列/杂凑函数hashfunetion 将比特串映射为固定长度的比特串的函数,该函数满足下列两特性 -对于给定输出,找出映射为该输出的输人,在计算上是不可行的; 对于给定输人,找出映射为同一输出的第二个输人,在计算上是不可行的 注:计算上的可行性取决于特定安全要求和环境 [GB/T25069-2010,定义2.2.2.166 3.12 注入injeetion 由于字符过滤不严谨导致的漏洞 3.13 单向加密onc-wayeneryptionm -种加密,它只产生密文,而不能将密文再生为原始数据 [[GB/T250692010,定义2.2.2.9] 3.14 最优非对称加密填充optimalasymmetrieeneryptionpadding RSA算法的一种加密填充方案,可将原有的确定性的加密方案转换成一种可能性方案,并能防止 密文的部分解密或其他信息泄露 3.15 填充padding 对数据串附加额外比特 [GB/T25069一2010,定义2.2.2.187] 3.16 口令password 用于身份鉴别的秘密的字、短语、数字或字符序列,通常是被默记的弱秘密
GB/34944一2017 [GB/T25069一2010,定义2.2.2.76] 3.17 明文plaintext 未加密的信息 [GB/T25069一2010,定义2.2.2.135] 3.18 rainbowtable 彩虹表 -个用于加密散列函数逆运算的预先计算好的表,常用于破解加密过的密码散列 3.19 重定向redirect 通过服务器的特殊设置,将访问当前域名的用户引导到指定的另一个网络地址,即将一个域名指向 另一个已经存在的站点,或者将一个页面引导至另一个页面 3.20 反向域名解析reverseDNSresolutiom 通过IP地址查询服务器域名 3.21 盐值salt 作为单向函数或加密函数的二次输人而加人的随机变量,可用于导出口令验证数据 3.22 脚本script 使用一种特定的描述性语言,依据一定的格式编写的纯文本程序 3.23 种子seel -种用作某一确定性随机比特生成器输人的比特串 DRBG的部分状态由种子确定 [[GB/T25069-2010,定义2.2.2.232] 3.24 敏感信息sensitiveinformationm 由权威机构确定的必须受保护的信息.该信息的泄露、修改、破坏或丢失会对人或事产生可预知的 损害 [[GB/T25069-2010,定义2.2.4.7] 3.25 序列化serializationm 将对象的状态信息转换成可以存储或传输的字节序列的过程 3.26 会话session 用于跟踪客户端与服务器间的交互,保存用户身份和信息的对象 3.27 源代码漏洞 vunerabilty S0urcec0de 存在于软件源代码中的漏洞 3.28 漏洞 vunerability 计算机信息系统在需求、设计、实现,配置、运行等过程中,有意或无意产生的缺陷 这些缺陷以不 同形式存在于计算机信息系统的各个层次和环节之中,如果利用不当,就会对计算机信息系统的安全造
GB/T34944一2017 成损害,从而影响计算机信息系统的正常运行 注;改写GBT28458一2012,定义3.2 缩略语 下列缩略语适用于本文件 DNNS;域名服务器(DomainNameServer) eterministicRandomBitGenerator DRRBG;确定性随机比特生成器(Dete HTTP;超文本传输协议(HypertextTransferProtocol HTTPs;安全套接字层超文本传输协议(HypertextTransferProtocolOverSeureSocketLayer) ternetProtocol P;网际协议(Inm seudorandomNumberGenerator PRNG:伪随机数生成器(Pse sQL:结构化查询语言(Sr ructuredQueryLanguage ransmissionControlProtocol TCP:传输控制协议(Tre URL统一资源定位符(UniformResoureLocator) xML可扩展置标语言(ExtensibleMarkup language 5 源代码漏洞测试总则 5.1源代码漏洞测试目的 源代码漏洞测试的目的是: a 发现,定位及解决软件源代码中的漏洞; b)为软件产品的安全性测量和评价提供依据 5.2源代码漏洞测试过程 5.2.1概述 源代码作为软件产品的重要组成部分,其测试过程基本等同软件产品的测试过程 本标准遵循 GB/T155322008的要求将源代码测试过程分为测试策划、测试设计,测试执行和测试总结四个阶段 5.2.2测试策划 测试策划主要对整个源代码漏洞测试的过程进行策划 测试策划应确定测试的目标,范围,依据、 环境和工具,应分析与评估测试风险,并制定应对措施 测试策划应重点明确源代码漏洞测试应划分的 阶段以及各阶段的人员角色、任务,时间和工作成果,形成源代码漏洞测试进度计划表 源代码漏洞测 试进度计划见表1 表1源代码漏洞测试进度计划 任务 时间 测试阶段 人员角色 工作成果 测试策划 《测试计划 测试设计 《测试说明》 测试执行 《测试日志》 测试总结 《测试总结报告》
GB/34944一2017 5.2.3测试设计 测试设计应根据测试目标,结合被测源代码的业务和技术特点,明确测试环境和工具,确定测试需 求、测试方法、测试内容、测试准人条件和测试准出条件 测试方法应采用自动化静态分析工具扫描和 人工分析相结合的方法 Java语言源代码漏洞测试的测试内容宜包括但不限于以下源代码漏洞分类: 行为问题 a 路径错误; b 数据处理; c d 处理程序错误; 不充分的封装; e 安全功能; 时间和状态; 8 h) web问题, 用户界面错误 以上9类源代码漏洞分别对应6.1源代码漏洞相关分类 若被测源代码采用了Java语言的第三方框架,测试人员应根据被测源代码的实际情况在测试内容 中增加第三方框架相关的漏洞 应设计测试用例 源代码漏洞测试的测试用例应包括但不限于以下要素: 名称和编号; a b 自动化静态分析工具的操作步骤和参数配置; 自动化静态分析工具的期望操作结果 c 5.2.4测试执行 测试执行包括自动化静态分析工具扫描和人工分析 应根据测试用例明确的操作步骤,使用自动化静态分析工具执行测试,记录测试执行过程及测试 结果 应对自动化静态分析工具的测试结果进行人工分析,人工分析宜包括但不限于以下任务 宜按漏洞类别或漏洞风险级别从高到低的顺序分析扫描得到的所有源代码漏洞; a 结合源代码的上下文和业务需求,验证疑似漏洞,筛除误报的源代码漏洞, b 与开发人员沟通确认源代码漏洞分析结果 5.2.5测试总结 测试总结应对整个源代码漏洞测试过程进行总结,测试总结应包括但不限于以下任务 核查测试环境、工具、内容、方法和结果是否正确 aa b 确认测试目标和测试需求是否得到满足 总结测试内容、方法和结果,出具测试报告 5.3源代码漏洞测试管理 5.3.1过程管理 应对源代码漏洞测试的过程进行管理,一般包括:
GB/T34944一2017 提出源代码漏洞测试各个阶段的任务要求和质量要求 a b)安排对源代码漏洞测试的过程进行质量监督和阶段评审,包括监督和评审所需的环境,设备、 资金和人员,质量监督的记录应形成文档 对源代码漏洞测试的风险进行管理,提供风险规避所需的相关资源 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 评审测试内容和方法是否符合测试需求;
GB/34944一2017 评审测试用例的操作步骤和参数配置是否详细、正确、可实施; c 评审测试用例的期望结果描述是否准确, d 评审测试人员、环境和工具是否齐备并符合要求 e 5.3.2.4测试执行评审 完成测试执行后,应对测试日志进行评审,形成测试执行评审表 评审的具体内容应包括 评审测试用例执行是否完整; a b 评审操作结果是否真实有效; 评审操作结果描述是否清晰、准确; 对于与预期结果不一致的操作结果,评审是否记录了详细的问题现象; 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源代码漏洞分类 本标准根据软件开发中常用的概念来组织Java语言源代码漏洞的类别,具体分为如下9个类别 a 行为问题--由于应用程序的意外行为而引发的漏洞 b 路径错误 不恰当的处理访问路径而引发的漏洞
GB/T34944一2017 数据处理 -处理数据的功能中发现的漏洞 c d 处理程序错误 -由于处理程序的管理不当而引发的漏洞 e 不充分的封装 未充分封装关键数据或功能而引发的漏洞 fD 安全功能软件安全功能如身份鉴别,访问控制、机密性、密码学和特权管理等相关的漏洞 时间和状态 在多系统、,进程或线程并发计算的环境下由于时间和状态管理不恰当而引发 g 的漏洞 web问题 -web技术相关的漏洞 h 用户界面错误 与用户界面相关的漏洞 Java语言各源代码漏洞的名称及其所属的类别参见附录B 6.2源代码漏洞说明 6.2.1行为问题 6.2.1.1不可控的内存分配 漏洞描述:内存分配的大小受外部控制的输人数据影响,且程序没有指定内存分配大小的上限 漏洞风险;攻击者可以使程序分配大量的内存,程序可能会因为内存资源不足而崩溃 修复或规避建议:在程序中指定内存分配大小的上限,在分配内存前对要分配的内存大小进行验 证,确保要分配的内存大小不超过上限 示例1:不规范用法 ublieclassExamplel publiecintexampleFun(intlength){//length为用户的输人数据 String]buffer; iflength<0)//没有验证length是否超出内存分配的上限 return0; buffer=newString[length] 示例2:规范用法之 ublieclassExamplel staticintMAX_LENGTH 000//指定内存分配的上限或动态判断剩余内存大小自动分配 publieintexampleFun(intlength//length为用户的输人数据 iflength>MAX_LENGTHlllength<0)//对length进行验证 return0. Stringbuffer=newString[Llength]
GB/34944一2017 6.2.2路径错误 不可信的搜索路径 6.2.2.1 漏洞描述;程序使用关键资源时没有指定资源的路径,而是依赖操作系统去搜索资源 漏洞风险;攻击者可以在搜索优先级更高的文件夹中放人相同名称的资源,程序会使用攻击者控制 的资源 修复或规避建议;使用关键资源时指定资源所在的路径 示例1;不规范用法 publicclassExample' privateStringcommand; //本例中command="dir.exeE:\\data" publievoidexampleFun(void) /攻击者可在搜索优先级更高的文件夹中放人和dir.exe同名的恶意程序导致command的内容无法正 确执行 Runtime,getRuntime(),exee(eommand 示例2;规范用法之 publieelass Examplel privateStringcommand 1/本例中command "dir.exeE;\\data" publievoidexampleFun(void /PATH是存放操作系统中dir.exe命令所在完整路径的常量,本例中PATH="c;\\wINDows\ system32\\" PATH十command: Stringcmd 7/使用完整路径确保 nd的内容能正确执行 commanc Runtime,getRuntime(),exee(emd); 6.2.3数据处理 6.2.3.1 相对路径遍历 漏洞描述;路径名受外部控制的输人数据影响,且程序没有使能够解析到目录外位置的字符序列 如“”)失效 漏洞风险;攻击者可以通过输人能够解析到目录外位置的字符序列来访问限制目录之外的文件或 目录 修复或规避建议:在构建路径名前对输人数据进行验证,确保外部输人仅包含允许的构成路径名的 字符
GB/T34944一2017 示例1:不规范用法 importjava,io," publieclassExamplel privateStringdataPath;//本例中允许访问的目录 publievoidexampeFun(Stringfilename 1/ilename为用户的输人数据,不超过10个字符 /filename可能包含“.”字符序列导致访问dataPath目录之外的文件 dataPath十fflename Stringpath try Filefle=newFile(path); if(file.,exists() file.open(); catch(... 示例2;规范用法之 iimportjaya.,io," ublieclassExamplel pprivatesitringdataPath,/本例中允许访问的目录 publievoidexampleFun(Stringfilename)//filename为用户的输人数据,不超过10个字符 Stringregex="-[A-Za-0-9]十\.[a-]]十$";//对文件名进行合法性校验的正则表达式 /参数filename传人的文件名称可能存在漏洞,现通过正则表达式regex校验文件名ilename的合法性 /校验通过则访问文件 if(llename.matehes(regex)) /如果文件名合法,则将路径和文件名组合成完整的文件访问路径 Stringpath=dataPath十filename; try //访问文件,这里的path已经是合法的、安全的文件路径,不存在漏洞 Filefile=newFile(path); if(file.exists()) file.open(O:; eatch( 10
GB/34944一2017 6.2.3.2绝对路径遍历 漏洞描述;路径名由外部控制的输人数据决定,且程序没有限制路径名允许访问的目录 漏洞风险;攻击者可以通过输人路径名来访问任意的文件或目录 修复或规避建议:在程序中指定允许访问的文件或目录,在访问文件或目录前对路径名进行验证, 确保仅允许访问指定的文件或目录 示例1:不规范用法 iimportjava.io *; publieclassExample' publievoidexampleFun(StringabsolutePath)//absolutePhath为用户的输人数据 try Filefile=newFileabsolutePath);//没有限制absolutePath访问的目录 if(ile.exists()6 file.open(); cateh()6 示例2:规范用法之 importjava.io 关 publiccassExample' nbhiectwdewmlefm.sm tePath)(//absolutePath为用户的输人数据 tringabsolute Stringregex="C.l\data\[AZar-]十\.[a习十 $";//用正则表达式设置限制访问的目录 /验证absolutePath是否仅能解析到受限制的目录内 f(absolutePath!=nwll&.& absolutePath.matdhes(regex))8 try Filefle=newFileabsolutePath) if(fle,exists()) file.open(; catch(.6 1
GB/34944一2017 示例1:不规范用法 publicclassExample publieResultSetgetUserData(ServletRequestreqConneetioncon)throwssQLException Stringowner req.getParameter("owner"" //采用拼接字符串的方式形成sQL.语句,没有对用户输人数据owner进行验证 m, FROMuserdatawHEREuserid= Stringquery "SEIECT owner十 Statemmentstatement con.createStatement(" ResultSetresults statement.executeQueryquery); resuts return 示例2:规范用法之一 publieelassExample publicResultSetgetUserData(ServletRequestregcConnectioncon)throwssQLException Stringowner reg.get getParammeter("owner /采用PreparedStatement的方式形成sQL语句 PreparedStatementpreStatement=eon.prepareStatement("SELECT*FROMuser_dataWHERE userid preStatement.setString(l,owner); ResultSetresults preStatement.exeeuteQuery(); returnresults; 示例3:规范用法之一 publieclassExample' ublieResultsetgetUserData(SerletRequestreq,connection.con)throwssQL.Exepion Stringowner req,getParameter("owner" /本例中假设用户名是 3到8位的数字、字母或下划线组成的字符串 (w3.8》S Stringregex /正则表达式 ifowner nl&.&.owner.matehes(regex>))//验证owner是否合法 M" “SEL.C FROMuser_datawHEREuserid=" Stringquery owner十 con,ereateStatement( Statementstatement ResultSetresults preStatement.executeQuery(); returnresults; else 13
GB/T34944一2017 6.2.3.5代码注入 漏洞描述:使用未经验证的输人数据动态构建代码语句 漏洞风险:攻击者可构建任意恶意代码 修复或规避建议:在动态构建代码语句前对输人数据进行验证,确保仅能用于构建允许执行的 代码 示例1不规范用法 iimportjavax.,script,* publicclassExample publievoidexampleFun(Stringcode)//code为用户输人数据 SeriptEngineManagermanager=newSeriptEngineManager(); SeriptEngineengine manager.getEngineByName("javaseript") 中可能含有恶意的可执行代码 engine,evalcode); I/code 示例2;规范用法之 importjavax.script.*; publieclassExample blievoidexampleFun(Stringcode)//code为用户输人数据 =newSeriptEngineManager(; ScriptEngineManagermmanager SeriptEngineengine manager.getEngineByName("javaseript"); "document\.write(ln)\[AZar-]+\八\;$";//正则表达式 Stringregex nl&.&.code.matches(regex))//验证code中的内容是否匹配正则表达式 if(code engine.evalcode); 6.2.3.6进程控制 漏洞描述:使用未经验证的输人数据作为动态加载的库的标识符 漏洞风险;使用未经验证的输人数据作为动态加载的库的标识符使攻击者有机会加载恶意的代 码库 修复或规避建议:在动态加载库前对输人数据进行验证,确保输人数据仅能用于加载允许加载的代 码库 14
GB/34944一2017 示例1:不规范用法 publicclassExample' voidloadlLib(StringlibraryName)(//IibraryName为用户输人数据 c.\”十lbrmryName Stringpath /使用未经验证的输人数据作为动态加载的库可能导致加载恶意代码库 System.oad(path); 示例2规范用法之 publieclassExample' booleanverifieation(String){//验证库是否合法 oadbom山.(srmxlhrarNams)//ihrarName 为用户输人数据 stringpath="c,\\"; /判断libraryName是香合法 if(verifieation(libraryName) path十=libraryNames System.load(path); 6.2.3.7信息通过错误消息泄露 漏洞描述;软件呈现给用户的错误消息中包括与环境,用户或相关数据有关的敏感信息 漏洞风险;对攻击者而言,敏感信息可能本身就是有价值的信息,或者有助于开展进一步的攻击 修复或规避建议;确保错误消息中仅含有对目标受众有用的少量细节 示例1:不规范用法 importjava,.sql." inmportjavax.servet.Servlet:; publieclassExampleextendsServet privateStringdbUrl;//数据库的端口和名称 privateStringusername: privateStringpassword publievoidexampleFun(HttpServletRequestrequest) Conneetioncon=null /连接数据库有可能抛出异常,页面将跳转至默认异常页面,该页面会包含异常的相关信息 sCconetion(dlhUl,username,password) con Driver rAMamgt.set 15
GB/T34944一2017 示例2;规范用法之 iimportjava.sql.×; immportjavax.servlet.Servlet; publicclassExampleextendsServlet' StringdbUrl //数据库的端口和名称 privateStringusername; Stringpassword publievoidexampleFun(HttpServletRequestrequest) null Connectioncon try DriverManager.getConnection(dUrl,username,password);//连接数据库 con catchExceptione)//捕获该异常,不将该异常的相关信息呈现给用户 "Sorry!wewillixtheproblenmsoon!"; Stringmsg request.getSession().setAttribute(msg,errormsg); 示例3:规范用法之 -在配置文件web.xml中添加以下内容-- error-page) exceptiontype)java.lang.Throwable(/exceptiontype) !--要捕捉的异常类型-- oceation)/exception_handler.jsp(/location)>(!--出现异常时跳转的页面,该页面不包含异常相关的信息--y 《/error-page 6.2.3.8信息通过服务器日志文件泄露 漏洞描述;将敏感信息写人服务器日志文件 漏洞风险:攻击者有机会通过访问日志文件读取敏感信息 修复或规避建议;慎重考虑写人日志文件信息的隐私性 不要把敏感信息写人日志文件 示例1:不规范用法 publieclassExamplel publiecvoidwriteL.og(Stringmsg) /将mg写人日志文件中 //判断用户名口令是否正确 privatebooleanisTrue(Stringusername,Stringpassword 16
GB/34944一2017 pubicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) ThrowsSerletException.IOxception Stringusername password" Stringpassword aamr request.getl //用户名和口令正确时调用 log()写人日志 f(isTrue(username,password write Stringmsg and"十password十"correet!";//msg中包含了敏感信息 uSername writel.og(msg)1 示例2;规范用法之 publieclassExample' ublievoidwritelog( g(Sstringmsg)/将m说写人日志文件中 /判断用户名口令是否正确 privatebooleanisTrue(Stringusername,Stringpassword) publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse' ThrowsServletExce 1Dt1O1m IOException6 Stringusername .getParameter("username" euuel .getParameter("password") ingpassword iif(isTrue(username,password) "Loginsues!"//msg中不写人敏感信息 Stringmsg writeLog(msg); 6.2.3.9信息通过调试日志文件泄露 漏洞描述;应用程序没有充分限制对用于调试的日志文件的访问 漏洞风险;调试日志文件通常包含应用程序的敏感信息,攻击者有机会通过访问调试日志文件读取 敏感信息 修复或规避建议:在产品发布之前移除产生日志文件的代码 17
GB/T34944一2017 示例1;不规范用法 --以下为log4j.properties配置文件的部分内容--》 !--设置日志级别为DEBUG- log4j.rootLogger=DEBUG,LOGl --设置日志输出为文件-- log小j.appender,LOGl=org.apache.,log4j.FileAppender --设置日志输出的路径-- log4j.appender.L(0(G1.File=c:/Data,log -设置日志内容样式- .LoG.layout.ConversionPatern=%dyyy-MMddHH;mm;ss)%-p[%]%c%x-%m%nm logij.appender.l. /以下为DataStore,java的部分内容 importorg.apache.log4j.L.ogger publicclassDataStore l.ogger.getl.ogger(DataStore.class): priVatestaticl.oggerlogger privateStringmsg publiecstatiecvoidmain(String[args) logger.debug(msg);//输出msg到日志文件中 示例2:规范用法之 --以下为logj,poperies配置文件的部分内容--) -设置日志级别为INFo,则INFO级别以下的日志将不会得到输出--) =INFO,L0G log4j.rootl.ogger -设置日志输出为文件--) nder.I0G1=org,.apache.log4j.FileAppender og4j,appen -设置日志输出的路径- log4j.appender.LOG1.File=c;/Data.log 设置日志内容样式- log4j.appender.IL0G1.layout.ConversionPattern=%dyyyyMMddHH:mm;ss%-5p[%]%c%x-%m%n /以下为DataStore.java的部分内容 importorg.apache.logjLogger; publicclassDataStore privatestaticl.oggerlogger l.ogger.getlogger(DataStore.class); privateStringmsg; n(String[]args) publicstaticvoidmain ogger.debug(msg);//由于日志级别是INFo,DEBUG级别的日志将不会得到输出 18
GB/34944一2017 6.2.3.10信息通过持久cokie泄露 漏洞描述:将敏感信息存储到持久cookie中 漏洞风险;持久cookie是被存储在浏览器所在的硬盘驱动器上的cookie,攻击者有机会通过访问 硬盘上的cookie文件读取敏感信息 修复或规避建议:不要在持久cookie中保存敏感信息 示例1;不规范用法 pubieclassExample publievoiddoPost(HttpServletRequestrequest,HlttpServletResponseresponse' ThrowsServletException.IOException StringcookieName PdP Stringusername st.getParameter("username" IELlS arameter("password"); Stringpassword reuestgetP" 中保存用户名和口令,用于14天内自动登录 /持久cookie CookiecookieUsername newCookie(cookieName+"Name" usernamme; .setMaxAge(14关24关60关60) cookieUsername,set /存活期为14天 response.addCookie(cookieUsername) newCookie(cookieName "Password",password); CookiecookiePassword lsetMaxAge(14*24"60*60)/存活期为14天 cookieP aSS0a response.addCookie(cookiePassword); 示例2:规范用法之 publicclassExample pubicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse ThrowsServletException,IOException StringcookieName String 11Sename .getl'arameter(username ingpa "password" CookiecookieName "Name",uusername); Cookiecookie0s6 //存活期为14天 cookie 24关60关60); eI1aIIle,SelIVld response,.addCookie(cookieUsername) /由于持久cookie 存储于 于客户端容易被攻击,所以不应将口令保存到持久cookie中 CookiecookiePassword newCookie(cookieNName十"Password",password); cookiePassword.setMaxAge(14关24关60关60);//存活期为14天 rresponse,addCookie(cookiePassword); 19
GB/T34944一2017 6.2.3.11未检查的输入作为循环条件 漏洞描述:软件没有对被用于循环条件的输人进行适当的检查 漏洞风险;攻击者可以让软件循环过多而使软件拒绝服务 修复或规避建议;规定循环次数的上限,在将用户输人的数据用于循环条件前验证用户输人的数据 是否超过上限 示例1不规范用法 publicclassExamplel publievodexampleFun(intcounb)//count为用户输人数据 inti if(count>0){//如果count过大可能使软件拒绝服务 or(i=0;i《count;i "* 示例2:规范用法之 publicclassExamplel privateintMAx_coUNT 1000;//定义最大循环次数 publievoidexampleFun(intcount //count为用户输人数据 inti; f(count>0&.&.count(=MMAx_coUNT)t//判断count是否在限制次数内 or(i=0;icount;i十十 6.2.3.12XPath注入 漏洞描述;使用未经验证的输人动态地构造一个XPath表达式,来从XMI数据库中检索数据 漏洞风险:攻击者可以构造恶意的XPath表达式对XML数据库进行越权操作 修复或规避建议;使用参数化的XPath查询例如使用xQuery),这将有助于确保数据平面和控制 平面相分离 正确验证用户输人,在适当的情况下拒绝数据、过滤数据或对数据进行转义 20
GB/34944一2017 示例1:不规范用法 importjavax,xml,xpath,养 publieclas、Example publicvoiddoPost(HttpServletRequestreqHttpServletResponsersp ThrowsServletException,IOException XQDataSource newSaxonXQDataSource( onnection ds,getConnection( onn.createExpression(); QExpressionexpreSSion Stringauthor req,getParameter("author"); /author r巾可能包含恶意 表达式 for$xindoe(/"books,xtml/")//bookstore//book Stringquery "where$x/author author十 "retum$x/tite" XQResultSequenceres expression.execeuteQueryquery): 示例2:规范用法之 importjavax.xml.xpath *; publieclassExample' pulicvoiddoPost(HttpServletRequestreg, l,HttpServletResponsersp ThrowsServletException,IOException XQDataSourceds SaxonXQDataSource(O XOConn6 .eConneetion( Pt1OOnm ds. conn.createEXpression(O XQExpressionxqexp Stringauthor re.getParameter authon conn.CreateAtomicType(XQItenmType.XQBASETYPE_STRING); XQltemTypestrType null itauthor! Stringquery "declarevariable$authorasxs;stringexternal;" "forSxindoc(/"books,xml /bookstore//book "where$x/author=$author "returnSx/title"; xqexp.bindString(newQName("author"),author,strType) xXQResultSequenceres xqexp.executeQuery(query); 21
GB/T34944一2017 示例3:规范用法之 importjavax,xml.xpath,*; publieclassExamplel privateStringregex "[A-Za-八.]十$";//正则表达式 publievoiddoPost(HttpServletRequestreg,HttpServletResponsersp ThrowsSeryletExeeption,IOExceptiont XQDataSourceds newSaxonX nXQDataSource(O XQConneetionconn ds.getConnection(O XQExpressionexpression conn.createExpression( Stringauthor req.getParameter("author"); if(author" null&.& author,matches(regex))//如果author匹配正则表达式则允许用它构建查询语句 "for$xindoc(/"books.xml/")//bookstore//book Stringquery "where5x//author 十author十 "returnSx/title" XQResultSequenceres expression.executeQueryquery); 6.2.4处理程序错误 6.2.4.1未限制危险类型文件的上传 漏洞描述:软件没有限制允许用户上传的文件的类型 漏洞风险;攻击者可上传具有危险类型的文件,这些文件可能在产品的环境中自动被处理 修复或规避建议;限制允许用户上传的文件的类型 示例1:不规范用法 importorg.apache.commons.ileupload.servlet.ServletFileUpload; commons.fileupload.disk.DiskFileltenmFactory; importorg.apache.con publieclassExample publicvoidexampleFun(HttpServletRequestrequest DskFilelemFiacetory(); skFrlelemFaectoryfaetory new SeryletFileUpload(aetory) new ServletFileUploadupload List(Fileltem》items upload,parseRequest(request); terator(Fileltem》iter items.iterator(); while(iter.hasNext( Fileltemitem iter.next(); //对文件的相关操作,但没有判断文件类型 22
GB/34944一2017 示例2;规范用法之 importorg.apache.commons.fileupload.serlet.SerletFileUpload. mportorg.apacehe.commons.fileupload.disk.DskFilelemFactory pubicclassExample -[gifljpglbmp$";//正则表达式 Drivate Stringregex publievoidexampleFunHtpServletRequestrequest) ,DskFileltemFactory(); new DiskFileltemFactoryfactory ServletFileUpoad(actory)3 new ServletFileUploadupload Listileltemitems upload.parseRequest(request); leltemiter IteatO items,iterator(); wile 1eOdSe leltem em iter.next(); StringfileName iitem.getName(); 将fleNane中的所有0x00字符替换成"",规避00截断上传漏洞 fileName=fileName,replaceAll("\p{Cntrl)", StringfleEnd=fleName.substring(fileName.lastndexO(",")+1).toLowerCase()1 f(fileEnd.matches(regex))(//验证文件类型 /对文件的相关操作 6.2.5不充分的封装 6.2.5.1可序列化的类包含敏感数据 漏洞描述代码包含一个有敏感数据的类,但是类没有显式的拒绝序列化 漏洞风险:攻击者可对包含有敏感数据的类进行序列化.从而使用存储在里面的敏感数据 修复或规避建议;定义writeObjet()方法去抛出一个异常,显式地拒绝序列化 示例1;不规范用法 dlassStafinplementsSerializable(//攻击者可以对此类进行序列化,获得存储在里面的name和password,即 使它们是私有的 privateStringname; privateStringpassword 示例2:规范用法之 lassStafinplementsSerializablel privateStringname privateString ngpassword; privatevoidwriteObjeet(ObjectOutputStreamout){//定义writeO)bjeet()方法显式地拒绝序列化 thrownewException("Cannoteserialized!"); 23
GB/T34944一2017 6.2.5.2违反信任边界 漏洞描述;让数据从不受信任的一边移到受信任的一边却未经验证 漏洞风险;程序员更容易错误地相信那些未被验证的数据,导致未经验证的数据被攻击者利用 信任边界可以被认为是两在程序中的一条线 线的一树是不受信任数据;另一侧,我们认为数据是 可以被信任的 验证逻辑旨在让数据安全地穿过信任边界 从不受信任的一边移到受信任的一边 修复或规避建议;增加验证逻辑让数据安全地穿过信任边界--从不受信任的一边移到受信任的 -边 示例1:不规范用法 publieclassExamplel protectedvoiddoPostHttpServletRequestrequest,HttpServletResponseresponse throwsServletException,IOException Stringusername request.getParameter("username"); Session(true HttpSessionsessionm reguesl.getS //没有验证username 是否可信任 session,set .setAttribute("username username); 示例2;规范用法之 ublieclassExamplel protectedvoiddoPostHttpServletReguestrequest,HttpServletResponseresponse oBxwe hrowsServletException ption t,getParameter("usernanme"; Stringusername TeOieS HttpSessionsession reguest.getSession(true //不把不受信任的数据放到sesion中 session.setAttribute("username username 6.2.6安全功能 6.2.6.1明文存储口令 漏洞描述;将口令明文存储 漏洞风险;明文存储口令会降低攻击的难度,攻击者若获得访问口令存储文件的权限,便可轻易获 取口令 修复或规避建议:尽量避免在容易受攻击的地方存储口令 如果需要,考虑存储口令的加密散列 以替代明文口令存储 24
GB/34944一2017 示例1:不规范用法 publieclassExample' publievoidstorePasswordConneetioncon,Stringid.Stringpassword PreparedStatementps=con.,prepareStatemenmt("UPDATEuserSETpassword=?wHEREd=?"); ps.setString(1,password); //明文存储password ps,.setString(2,id); ResultSetresults=ps.exeeuteQuery(); 示例2:规范用法之 importjava.seurity.MessageDigest publieclassExample' publiestringencrypt(Stringstr)(//加密函数,返回加密后的字符串 MessageDigestmd MessageDigest.getlnstance("SHA-256"); publievoidstorePassword(Connectioncon,Stringid,Stringpassword)' t("UPDATEuserSET ?wHEREid=?") PreparedStatementps=con.prepareStatement( password一 Stringpsw encrypt(password);//加密password ps.setStrng(l,psw)//存储加密后的psw ps.setString(2,id); ResultSetresults=ps,exeeuteQuery(); 6.2.6.2存储可恢复的口令 漏洞描述:采用双向可逆的加密算法加密口令并将口令存储在外部文件或数据库中 漏洞风险;攻击者有机会通过解密算法对口令进行解密 修复或规避建议:当业务不需要取已存储的口令进行还原时,使用单向加密算法对口令进行加密并 存储 示例1;不规范用法 importjavax.erypto,Cipher; publieclassExamplel publicStringenecrypt(Stringstr)6 Ciheeeiphe-ciuhergetbhatae("AEs")/使用双向可逆的AEs算达 publievoidstorePassword(Connectioncon,Stringid,Stringpassword) PreparedStatementps=con,prepareStatemen("UPDATEusersETpassword=?wHEREid=?") 加常s Stringpsw encryptpassword wrd ps,.setString(l,psw); //存储加密后的psw ps.,setString(2,id); ResultSetresults=ps.exeeuteQuery(); 25
GB/T34944一2017 示例2;规范用法之 importjava.security.MessageDigest; publieclassExample( publieStringencrypt(Stringstr) MessageDigestmd=MessageDigest.getlnstance("SHA-256");//使用单向不可逆的SHA256加密算法 publievoidstorePasswordConneetioncon,Stringid.Stringpassword ("UPDATEuserSET ??wHREid=?"). PreparedStatement OS con.prepareStatement(" password= Stringpsw password); //加密password encrypt( //存储加密后的psw ps,setString(l,psw); ps,.setString(2,id); ResultSetresults ps.executeQuery(); 6.2.6.3口令硬编码 漏洞描述:程序代码(包括注释)中包含硬编码口令 漏洞风险;攻击者可以通过反编译或直接读取二进制代码的方式获取硬编码口令 修复或规避建议:使用单向加密算法对口令进行加密并存储在外部文件或数据库中 示例1不规范用法 publieclassExample publiebooleanverifyPassword(Siringpasswordt)//判断口令是否正确 booleanlag false; f("21de6sal846i" ".equnls(password))//程序代码中包含硬编码口令 flag=true:; returnlag; 示例2:规范用法之 importjava.seeurity.MessageDigest: publieclassExample publieStringencrypt(Stringstr)//加密函数,返回加密后的字符串 MessageDigest.getInstance("SHA-256"); MessageDigestmd /从数据库中获得存储的口令 privateStringgetPassword(void) publicbooleanverifyPassword(Stringpassword){//判断口令是否正确 booleanlag=false; 26

Java语言源代码漏洞测试规范GB/T34944-2017解读

随着互联网的迅猛发展,软件应用已经深入到各行各业。而在软件应用中,Java语言源代码漏洞问题一直是开发人员关注的焦点。为了更好地保障软件安全,国家质量监督检验检疫总局发布了Java语言源代码漏洞测试规范GB/T34944-2017。

一、什么是Java语言源代码漏洞测试规范?

Java语言源代码漏洞测试规范是由中国标准化协会、国家质量监督检验检疫总局等单位制定的标准,目的是规范Java语言源代码漏洞测试活动,提高软件开发质量和安全性。

二、为什么需要Java语言源代码漏洞测试规范?

Java语言源代码漏洞测试规范的发布,一方面反映了漏洞测试在软件开发过程中的重要性,另一方面也为企业提供了一个更加系统化、标准化的漏洞测试流程。

漏洞测试是保障软件安全的重要环节,对于软件开发人员来说,发现和修复源代码中的漏洞可以有效地保护软件免受攻击。而Java语言源代码漏洞测试规范则为漏洞测试提供了各个环节的指导和规范。

三、Java语言源代码漏洞测试规范中有哪些内容?

Java语言源代码漏洞测试规范主要包括漏洞测试计划、漏洞测试用例设计、漏洞测试环境搭建、漏洞测试执行、漏洞测试报告等五个方面的内容。

具体来说,漏洞测试计划应该包括测试目标、测试方法、测试环境、测试时间等信息;漏洞测试用例设计应该根据需求分析和设计文档编写测试用例;漏洞测试环境搭建应该包括硬件环境、操作系统环境、数据库环境等;漏洞测试执行应该按照测试用例进行漏洞测试,并记录测试结果;漏洞测试报告应该包括漏洞描述、漏洞严重程度评估、修复建议等内容。

四、Java语言源代码漏洞测试规范的意义是什么?

Java语言源代码漏洞测试规范的发布,可以更加规范化、标准化地进行源代码漏洞测试活动,从而提高软件开发人员的安全意识和能力。同时,规范化的漏洞测试流程还可以使企业在软件开发过程中更好地掌握风险,保障软件的可靠性和安全性。

五、Java语言源代码漏洞测试规范的适用范围是什么?

Java语言源代码漏洞测试规范适用于所有使用Java语言进行软件开发的企业和个人。

在软件开发过程中,漏洞测试是保障软件安全的重要环节。通过遵循Java语言源代码漏洞测试规范,软件开发人员可以更加系统化、标准化地进行漏洞测试活动,提高软件安全性和可靠性。

结论

本文介绍了Java语言源代码漏洞测试规范GB/T34944-2017的相关内容,总结了该标准的意义和适用范围,旨在为软件开发人员提供参考和指导。

在实际工作中,我们应该积极贯彻执行Java语言源代码漏洞测试规范,加强漏洞测试流程管理,不断提高软件开发质量和安全性。

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

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

C/C++语言源代码漏洞测试规范
上一篇 本文分享国家标准C/C++语言源代码漏洞测试规范的全文阅读和高清PDF的下载,C/C++语言源代码漏洞测试规范的编号:GB/T34943-2017。C/C++语言源代码漏洞测试规范共有48页,发布于2018-05-01
信息技术数据溯源描述模型
本文分享国家标准信息技术数据溯源描述模型的全文阅读和高清PDF的下载,信息技术数据溯源描述模型的编号:GB/T34945-2017。信息技术数据溯源描述模型共有10页,发布于2018-05-01 下一篇
相关推荐