SAST DAST 扫描引擎原理
- 前置:先分清「白盒」和「黑盒」
扫描器的一切都从有没有拿到源码分叉:
白盒:能看源码 / 编译产物 → 静态分析。
黑盒:只看运行时的输入输出 → 动态分析。
这俩入口,就是 SAST 和 DAST 的根。
- SAST(静态应用安全测试)
关键词:不运行程序。
链路三步:
把源码解析成 AST(抽象语法树),再建数据流 / 控制流图。
做污点跟踪(taint tracking)——这是 SAST 的灵魂,单独拆开讲(见第 4 点)。
规则引擎按规则匹配,命中就报。
一句话:SAST 是在代码的「结构」里找漏洞。优势是能覆盖所有代码路径、定位到具体行;劣势是不理解运行时上下文,误报率高。
- DAST(动态应用安全测试)
关键词:运行程序。
链路三步:
爬取 / 被动代理收集接口和参数。
往参数里注入 payload(SQLi / XSS / 路径穿越 / SSRF…)。
用响应特征判断命中(回显、报错、时间差、外带)。
一句话:DAST 是从「外面」打。优势是命中即真实可利用、误报低;劣势是覆盖不到没暴露的路径和深层逻辑。
- 污点跟踪三要素(SAST 必考,重点记)
source(污点源):不可信输入进来的地方,如 request.getParameter。
sink(汇点):危险执行点,如 SQL 执行、命令执行。
sanitizer(清洗/过滤):中间对输入做的过滤转义。
逻辑:污点从 source 流出 → 一路追踪 → 看它到没到 sink,中间有没有被 sanitizer 拦住。到了 sink 且没被拦 = 报漏洞。
[SAST 误报为什么高」,根子就在这:静态分析不知道「某个 sanitizer 在实际运行时到底有没有生效」,所以要么漏报要么误报。
- 插件化规则(引擎与规则解耦)
扫描引擎分两层:
引擎核心:调度、输入输出、报告、去重去噪。
规则 / 插件:定义「检测什么」。
插件化的意义:新增一种漏洞检测能力,不改引擎核心,只加一个规则插件。
规则描述(DSL)对应前面:
SAST 规则 ≈ source + propagator + sink + sanitizer 的组合声明。
DAST 规则 ≈ 请求模板 + payload 集 + 响应匹配特征。
6. 去重 vs 去噪(别混,是两个动作)
DAST 去重(dedup):同一个洞被多个 payload / 多条路径重复触发,合并成一条。判据 = 同类型 + 同 sink/接口 + 同参数。
SAST去噪(误报过滤):把「不是洞」的结果滤掉。手段 = 回显差分、二次验证、环境剔除。
规律记牢:SAST 误报高 → 靠去噪;DAST 重复多 → 靠去重。

浙公网安备 33010602011771号