讲讲 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/elseforwhile)下的执行路径
    • 目的:结合数据流分析,判断漏洞是否在可达的执行路径上。如果一个漏洞位于一个永远不会被执行到的代码块中,那么它就是一个假阳性
    • 例如:一个敏感操作被放在一个永远为 falseif 语句中,那么工具会识别出这个漏洞无法被触发
  4. 规则匹配(Rule Matching) Fortify 等工具内置了一个庞大的漏洞规则库,这些规则定义了各种已知的漏洞模式。在分析了数据流和控制流之后,工具会将分析结果与规则库进行匹配
    • 规则库:包含了各种语言(Java、PHP、Python 等)的常见漏洞,例如命令注入、跨站脚本(XSS)、文件上传漏洞等
    • 匹配过程:如果一个数据流路径符合某个漏洞规则,工具就会生成一个漏洞报告
Copyright © 版权信息 all right reserved,powered by Gitbook该文件修订时间: 2025-09-25 03:13:02

results matching ""

    No results matching ""