### 讲讲 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）、文件上传漏洞等
   - **匹配过程**：如果一个数据流路径符合某个漏洞规则，工具就会生成一个漏洞报告