### 讲讲 Fortity 等代码审计工具原理

Fortify 等代码审计工具的原理

Fortify、Checkmarx、SonarQube 等自动化代码审计工具，其核心原理是静态应用安全测试（Static Application Security Testing, SAST）。它们不对程序进行实际运行，而是通过分析程序的源代码、字节码或二进制文件，来识别其中的安全漏洞

这就像一个医生在给病人看病时，不是通过观察病人的症状，而是直接通过分析病人的基因图谱来预测潜在的疾病风险。

这些工具的工作流程通常分为以下几个阶段：

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