讲讲 Fortity 等代码审计工具原理
Fortify 等代码审计工具的原理
Fortify、Checkmarx、SonarQube 等自动化代码审计工具,其核心原理是静态应用安全测试(Static Application Security Testing, SAST)。它们不对程序进行实际运行,而是通过分析程序的源代码、字节码或二进制文件,来识别其中的安全漏洞
这就像一个医生在给病人看病时,不是通过观察病人的症状,而是直接通过分析病人的基因图谱来预测潜在的疾病风险。
这些工具的工作流程通常分为以下几个阶段:
- 解析(Parsing) 这是工具的第一步,也是最重要的一步。它会像编译器一样,对输入的源代码进行词法分析、语法分析和语义分析,将代码转换为一个更容易分析的中间表示,通常是抽象语法树(Abstract Syntax Tree, AST)
- 目的:将代码的文本形式转换为结构化的数据,方便后续的分析
- 数据流分析(Data Flow Analysis) 这个阶段是 SAST 工具的核心。它会追踪程序中数据的流动路径,特别是从外部输入源(Source)到敏感操作(Sink)的路径
- 外部输入源(Source):指那些可能被用户控制的输入,例如 HTTP 请求的参数(
$_GET
、$_POST
)、文件上传、数据库查询结果等 - 敏感操作(Sink):指那些可能引发安全漏洞的操作,例如执行系统命令(
system()
)、执行 SQL 查询(mysqli_query()
)、写入文件等 - 分析过程:工具会模拟数据从 Source 流向 Sink 的过程。如果发现一个未经验证或过滤的外部输入直接进入了敏感操作,它就会标记为一个潜在的漏洞
- 例如:当一个用户输入的
$username
直接被拼接到 SQL 查询语句中,工具就会识别出这是一个潜在的 SQL 注入漏洞
- 外部输入源(Source):指那些可能被用户控制的输入,例如 HTTP 请求的参数(
- 控制流分析(Control Flow Analysis) 这个阶段分析程序执行的所有可能的路径。它会构建一个控制流图(Control Flow Graph, CFG),来模拟程序在不同条件分支(
if/else
、for
、while
)下的执行路径- 目的:结合数据流分析,判断漏洞是否在可达的执行路径上。如果一个漏洞位于一个永远不会被执行到的代码块中,那么它就是一个假阳性
- 例如:一个敏感操作被放在一个永远为
false
的if
语句中,那么工具会识别出这个漏洞无法被触发
- 规则匹配(Rule Matching) Fortify 等工具内置了一个庞大的漏洞规则库,这些规则定义了各种已知的漏洞模式。在分析了数据流和控制流之后,工具会将分析结果与规则库进行匹配
- 规则库:包含了各种语言(Java、PHP、Python 等)的常见漏洞,例如命令注入、跨站脚本(XSS)、文件上传漏洞等
- 匹配过程:如果一个数据流路径符合某个漏洞规则,工具就会生成一个漏洞报告