标准规范下载简介
GB/T 39412-2020 信息安全技术 代码安全审计规范.pdf审计人员宜检查代码中使用数据库后是否及时释放数据库连接或采用数据库连接池,未及时释放 数据库连接可能会造成数据库拒绝服务风险
审计指标:应正确处理SQL命令中的特殊元素 审计人员应检查代码利用用户可控的输入数据构造SQL命令时,是否对外部输人数据中的特殊元 素进行处理,如果未处理,那么这些数据有可能被解释为SQL命令而非普通用户的输入数据。攻击者 可对此加以利用来修改查询逻辑,从而绕过安全检查或插入可以修改后端数据库的额外语句
8.4.1过期的文件描述符
审计指标:不应使用过期的文件描述符。 审计人员应检查代码是否在文件描述符关闭后再次使用。特定文件或设备的文件描述符被释放后 被重用,可能会造成引用了其他的文件或设备
甘肃省市政工程预算定额2018 第八册 路灯工程.4.2不安全的临时文件
审计指标:应安全使用临时文件。 审计人员应检查代码中使用临时文件是否安全,因不安全使用临时文件造成敏感信息泄露,包括但 不限于: a 应检查代码中是否创建或使用不安全的临时文件,如果结果为肯定,则提示存在安全风险; b) 应检查代码中临时文件是否在程序止前移除,如果结果为否定,则提示存在安全风险; 应检查代码中是否在具有不安全权限的目录中创建临时文件,如果结果为肯定,则提示存在安 全风险
8.4.3文件描述符穷尽
审计指标:不宜导致文件描述符穷尽 审计人员宜检查代码是否存在导致文件描述符穷尽情形,包括但不限于: a)是否对打开文件描述符未做关闭处理; b 是否到达关闭阶段之前,失去对文件描述符的所有引用; C 进程完成后是否未关闭文件描述符,
审计指标:应避免路径遍历。 审计人员应检查代码是否存在由外部输人构造的标识文件或目录的路径名,路径遍历会造成非授 权访问资源的风险。 注:路径递历指未将路径名限制在受限目录
3.4.5及时释放文件系统
审计指标:应及时释放文件系统资源
审计人员应检查代码是否及时释放不再使用的文件句柄,不及时释放文件句柄可能会引起文件资 原占用过多,造成拒绝服务风险
8.5.1端口多重绑定
审计指标:不应对同一端口进行多重绑定 审计人员应检查代码是否有多个套接字绑定到相同端口,从而导致该端口上的服务有被盗用或 骗的风险。
8.5.2对网络消息容量的控制
审计指标:宜避免对网络消息容量的控制不充分, 审计人员宜检查代码是否控制网络传输流量不超过被允许的值。如果代码没有机制来跟踪流量传 输,系统或应用程序会很容易被滥用于传输大流量(超过了请求值或客户端被允许的值),从而带来拒绝 服务的安全风险
审计指标:应避免字节序使用不一致性。 审计人员应检查代码在跨平台或网络通信处理输人时是否考虑到字节顺序,避免字节序使用不 致 不能正确处理字节顺序问题,可能会导致不可预期的程序行为
审计指标:应采用加密传输方式保护敏感数据 审计人员应检查代码是否实现了对网络通信中敏感数据进行加密传输,特别是身份鉴别信息、重 息等。
8.5.5会话过期机制缺失
审计指标:宜制定会话过期机制。 审计人员宜检查代码中会话过程是否存在会话过期机制,如结果为否定,则提示代码存在保护 绕过的风险。规范/不规范代码示例参见B.4.6
审计指标:宜确保会话标识符的随机性 审计人员宜检查代码中会话标识符 防止会话标识符被穷举造成安全风险
审计指标:代码中不应遗留调试代码 审计人员应检查部署到应用环境的代码是否含有调试或测试功能的代码,该部分代码是否会造成 意外的后门人口。
对第三方代码来源情况进行审计,确保引入的第
审计人员应检查引人的第三方代码来源是否安全可靠,避免不安全的第三方软件引人安全风险
9.3保护重要配置信息
审计指标:宜对重要的配置信息进行安全保护 审计人员宜检查代码中使用的重要配置信息是否进行了安全保护,因对重要配置信息保护不当 寺来信息泄漏安全风险
审计指标:宜对重要的配置信息进行安全保护 审计人员宜检查代码中使用的重要配置信息是否进行了安全保护,因对重要配置信息保护不当,可 能带来信息泄漏安全风险
录给出了第5章代码安全审计过程中的审计报告
A.2.1审计总体信息
审计总体信息应包括但不限于以下信息: a 审计日期;SAC b)审计团队成员信息; c)审计依据; d)审计原则; e) 代码的信息,包括但不限于:代码功能描述、被审计代码的版本号、代码语言类型、代码总行 数等。
A.2.2审计流程与内容
A.2.3发现的安全缺陷汇总
发现的安全缺陷汇总应包括但不限于以下信息: )该版本代码发现的异常情况汇总; b)可能造成的严重后果
A.2.4发现的安全缺陷分析
发现的安全缺陷分析应包括但不限于以下信息: a)高风险安全缺陷分析; b)中风险安全缺陷分析; c)低风险安全缺陷分析
审计总结应包括但不限于以下信息: a)审计结果汇总,例如,审计条款符合数量,审计条款不符合数量,审计条款不适用数量,不符合 的审计条款原因等; b)残余缺陷分析; c)安全缺陷改进建议
审计总结应包括但不限于以下信息: )审计结果汇总,例如,审计条款符合数量,审计条款不符合数量,审计条款不适用数量,不符 的审计条款原因等; b)残余缺陷分析; )安全缺陷改进建议
本附录给出了第6章、第7章、第8章、第9章代码安全审计要求中各审计条款代码不规范用法示 例和规范用法示例
B.2.1关键状态数据被外部控制代码示例
避免关键状态数据被外部控制,以下给出了不规范用法(C语言)示例。 示例: #defineDIR"/restricted/directory" charcmd[500]; sprintf(cmd, "1s 1 %480s", DIR); RaisePrivileges(...); system(cmd); DropPrivileges(·..); 上述代码本意是执行一个命令,显示一个受限目录的内容,然后执行其他操作。假定它是通过运行setuid权限来绕 过操作系统的权限检查。攻击者只能查看DIR目录下的内容,程序并没有修改“PATH"环境变量,通过设置PATH为 用户可控制的目录(如"my/dir"),创建恶意程序“ls"并放在”/my/dir”,通过运行上面的代码,当system()被执行,shell 查询"PATH”找到"Is”程序,找到了恶意程序“/my/dir/ls”,而找不到”/bin/ls”。最终将代码提升权限,执行了恶意 程序
B.2.2验证未经校验和完整性检查的Cookie代码示例
2.2验证未经校验和完整性检查的Cookie代码
是否验证未经校验和完整性检查的Cookie,以下给出了不规范用法(java语言)示例 示例: Cookie[J cookies =request.getCookies(); for (int i =0; i B.2.3以大小写混合的方式绕过净化和验证代码示例 对于防止以大小写混合的方式绕过净化和验证的情况,以下给出了不规范用法(java语言 示例: public StringpreventXSS(String input,String mask)( returninput.replaceAll("script",mask); GB/T39412—2020 上述代码示例只有当输人为“script"时,代码才会执行,而当输人为“SCRIPT”或者“ScRiPt”时并不会通过该方法进 行过滤将造成SS 攻击 IP头的Web脚本语法中的特殊字符进行过滤和 B.2.5对数据结构控制域的删除代码示例 避免对数据结构控制域的删除,以下给出了不规范用法(C语言)示例。 示例: char *foo; intcounter; foo = calloc(sizeof(char)*1o); for(counter=O;counter!=1O;counter++) foo[counter]='a'; printf("%s/n"foo); 上述代码示例创建一个null结尾字符串并打印内容,字符串foo为9个字符和一个null终结符提供空间,但是10 字符被写入foo结果,字符foo没有null终止,调用printf()时,将可能产生不可预知的结果 避免对数据结构控制域的意外增加,以下给出了不规范用法(C语言)示例, 示例: char*foo; foo=malloc(sizeof(char)*5); foo[o]='a'; foo[1] ='a'; foo[2] =atoi(getc( stdin)); foo[3]=c; foo[4]='lo'; SZ1C printf("%c%c%c%c%c\n"foo[0],foo[1],foo[2],foo[3]foo[4]); printf("%s/n",foo); 上述代码第一个printf语句将打印每个字符,由空格分隔。若非整形数据通过getc从stdin中读取,则atoi将不进 转换,并返回0。当foo作为字符串时,字符foo[2]中的0将作为NULL终止符,foo[3]将永远不会被打印。 字符串的存储具有足够的空间容纳字符数据和 B.2.8对环境变量的长度做出假设代码示例 GB/T39412—2020 该方案采用strlen)函数计算字符串的长度,并动态分配所需要的空间,避免造成缓冲区溢出。 9将结构体的长度等同于其各个成员长度之和 B.2.10数值赋值越界代码示例 B.2.11除零错误代码示例 避免除零错误,示例1给出了不规范用法(C语言)示例,示例2给出了规范用法(C语言)示例 示例1: double divide(double x, double y) return(x/y): 避免除零错误,示例1给出了不规范用法(C语言)示例,示例2给出了规范用法(C语言)示例。 示例1: double divide( double x, double y) return(x/y) GB/T 394122020 上述代码的函数把两个数值进行相除而没有验证输人作为分母的值是否为零,将导致可能被零除的错误。 示例2: double divide( double x, double y ) if (0==y) ( return(x / y); 该方案通过验证分母的输人值.确保除零错误不会发4 B.2.12数值范围比较时遗漏边界值检查代码去 数值范围比较时,不遗漏边界值检查,示例1给出了不规范用法(C语言)示例,示例2给出了规范 用法(C语言)示例。 示例1: intgetValueFromArray( int * array, intlen, int index) intvalue; if (index B.2.13采用能产生充分信息炳的算法或方案代码示例 采用能产生充分信息嫡的算法或方案,示例给出了不规范用法(C语言)示例, 示例: longgenerateSessionID(intusrlD) srandom(usrID ); returnrandom() ; 上述代码的功能是给用户session产生唯一的随机ID。因为伪随机数生成器的种子永远是用户ID,所以产生的 essionID将会永远相同,攻击者可以预测用户sessionID并劫持该session。 采用能产生充分信息嫡的算法或方案,示例给出了不规范用法(C语言)示例, 示例: longgenerateSessionID(intusrlD) srandom(usrID ); returnrandom() ; 上述代码的功能是给用户session产生唯一的随机ID。因为伪随机数生成器的种子永远是用户ID,所以产生的 essionID将会永远相同,攻击者可以预测用户sessionID并劫持该session。 B.2.14信息泄露代码示例 GB/T39412—2020 B.2.15不恰当地信任反向DNS代码示例 B.3.2将不可序列化的对象存储到磁盘上代码示 GB/T39412—2020 B.3.3加锁检查缺失代码示例 GB/T 51334-2018 城市综合交通调查技术标准亲免子进程使用敏感文件描述符来执行未经授权 GB/T39412—2020 B.4.1遵守正确的行为次序避免早期放大攻击数据代码示例 B.4.5使用错误的长度值访问缓冲区代码示例 避免使用错误的长度值访问缓冲区,示例1给出了不规范用法(C语言)示例,示例2给出了规范用 法(C语言)示例 示例1: char source[21] ="the character string"; chardest[12]; 21 strncpy(dest, source, sizeof(source)—1) ; 上述代码使用方法strncpy,将源字符串复制到dest字符串中。strncpy函数中源字符串用sizeof确定字符数,因源 字符串的长度大于目的缓冲区的大小,将会导致缓冲区溢出。 示例2: char source[21] ="the character string"; chardest[12]; strncpy(dest, source, sizeof(dest)1); 该方案根据目的缓冲区的大小决定字符串的复制长度 B.4.6有session过期机制代码示例 session过期机制,示例1给出了不规范用法(java语言)示例,示例2给出了规范用法(java语言 示例。 示例1: HttpSessionsesssion = request.getSession(true) ; sesssion.setMaxlnactivelnterval(1); 上述代码示例设置setMaxInactivelnterval为负值,使会话保持无限期的活动状态,会话持续时间越长,攻击者危害 用户账户的机会就越大。如果创建大量的会话,较长的会话超时时间还会阻止系统释放内存,可能导致拒绝服务, 示例2: HttpSessionsesssion = request.getSession(true) ; sesssion,setMaxInactivelnterval(1800); 该方案设置session的有效期在一个安全的时间内 JJG(交通) 133-2017 落锤式弯沉仪GB/T39412—2020