顾名思义就是检查源代码中的安全缺陷,检查程序源代码是否存在安全隐患,或者有编码不规范的地方,通过自动化工具或者人工审查的方式,对程序源代码逐条进行检查和分析,发现这些源代码缺陷引发的安全漏洞,并提供代码修订措施和建议。
简介代码审计(Code audit)是一种以发现程序错误,安全漏洞和违反程序规范为目标的源代码分析。软件代码审计是对编程项目中源代码的全面分析,旨在发现错误,安全漏洞或违反编程约定。 它是防御性编程范例的一个组成部分,它试图在软件发布之前减少错误。 C和C ++源代码是最常见的审计代码,因为许多高级语言(如Python)具有较少的潜在易受攻击的功能(例如,不检查边界的函数)。
对象我们的代码审计对象包括并不限于对Windows和Linux系统环境下的以下语言进行审核:java、C、C#、ASP、PHP、JSP、.NET。
内容包括1.前后台分离的运行架构
2.WEB服务的目录权限分类
3.认证会话与应用平台的结合
4.数据库的配置规范
5.SQL语句的编写规范
6WEB服务的权限配置
7.对抗爬虫引擎的处理措施
具体过程审核软件时,应对每个关键组件进行单独审核,并与整个程序一起进行审核。 首先搜索高风险漏洞并解决低风险漏洞是个好主意。 高风险和低风险之间的漏洞通常存在,具体取决于具体情况以及所使用的源代码的使用方式。 应用程序渗透测试试图通过在可能的访问点上启动尽可能多的已知攻击技术来尝试降低软件中的漏洞,以试图关闭应用程序。这是一种常见的审计方法,可用于查明是否存在任何特定漏洞,而不是源代码中的漏洞。 一些人声称周期结束的审计方法往往会压倒开发人员,最终会给团队留下一长串已知问题,但实际上并没有多少改进; 在这些情况下,建议采用在线审计方法作为替代方案。
高风险漏洞由于使用以下原因,可能存在一些常见的高风险漏洞:
非边界检查函数(例如,strcpy,sprintf,vsprintf和sscanf)可能导致缓冲区溢出漏洞
可能干扰后续边界检查的缓冲区的指针操作,例如:if((bytesread = net_read(buf,len))> 0)buf + = bytesread;
调用像execve(),执行管道,system()和类似的东西,尤其是在使用非静态参数调用时
输入验证,例如(在SQL中):statement:=“SELECT * FROM users WHERE name ='”+ userName +“';”是一个SQL注入漏洞的示例
文件包含功能,例如(在PHP中):include($ page。'。php');是远程文件包含漏洞的示例
对于可能与恶意代码链接的库,返回对内部可变数据结构(记录,数组)的引用。恶意代码可能会尝试修改结构或保留引用以观察将来的更改。
低风险漏洞以下是审计代码时应该找到的低风险漏洞列表,但不会产生高风险情况。
客户端代码漏洞不影响服务器端(例如,跨站点脚本)
用户名枚举
目录遍历(在Web应用程序中)1
工具源代码审计工具通常会查找常见漏洞,仅适用于特定的编程语言。 这种自动化工具可用于节省时间,但不应依赖于深入审计。 建议将这些工具作为基于政策的方法的一部分。
要求如果设置为低阈值,则大多数软件审计工具会检测到许多漏洞,尤其是在以前未审核过代码的情况下。 但是,这些警报的实际重要性还取决于应用程序的使用方式。 可能与恶意代码链接的库(并且必须对其免疫)具有非常严格的要求,例如克隆所有返回的数据结构,因为有意破坏系统的尝试是预期的。 只能暴露于恶意输入(如Web服务器后端)的程序必须首先关心此输入(缓冲区溢出,SQL注入等)。 对于仅受保护基础结构中的授权用户内部使用的程序,可能永远不会发生此类攻击。2
本词条内容贡献者为:
王慧维 - 副研究员 - 西南大学