IRIS 用 LLM 辅助污点规格推断
一句话
据论文,IRIS 用 LLM 推断 taint sources / sinks,并结合全仓污点分析检测 Java 项目中的传统安全漏洞。
为什么读这篇
IRIS 是 ToLOScanner 的最近邻学术基线:二者都把 LLM 放进静态污点分析流程。
但对照点关键:IRIS 让 LLM 在 detection time 生成 spec;ToLOScanner 应固定 spec(S_LLM / 七子类 / C_SAFE),只把 LLM 用于 triage / 解释。
读完它,你应能精确说出:“LLM-assisted SAST 不等于 ToLOScanner”。两者都用 LLM 辅助,但 LLM 的角色完全不同。
核心贡献
- 提出 LLM-assisted static analysis 工作流
- 构建
CWE-Bench-Java—— 120 个真实 Java 项目漏洞基准 - 用 LLM 过滤候选污点路径(post-analysis triage)
它解决的问题
传统 SAST(CodeQL / Semgrep / Coverity)的痛点:
- 写 spec 成本高:每种 CWE / 每个框架,都要手写 source / sink / sanitizer。
- 覆盖率低:CodeQL 的 standard library 覆盖热门框架,但长尾框架基本没人写。
- 误报多:静态分析路径合并产生很多 path 实际 unreachable。
IRIS 用 LLM 解决:
- 让 LLM 看代码 + CWE 描述,自动写 spec。
- 让 LLM 看候选路径,过滤明显误报。
方法摘要
据论文,IRIS 流程:
Step 1: 输入 = (项目源码, 目标 CWE) ↓Step 2: LLM 推断 taint specification: - source: 哪些 API / 字段是 untrusted input? - sink: 哪些 API 是危险操作? - sanitizer: 哪些函数算清洗? ↓Step 3: 用推断的 spec 跑全仓 taint analysis(基于 CodeQL) ↓Step 4: LLM contextual analysis 对候选路径**排序和过滤** - 阅读路径上下文,判断是不是真的可达 - 输出 ranked alerts其目标是减轻人工编写 CodeQL / Semgrep 规则的负担。
与 ToLO 的关联
IRIS 是 ToLOScanner 的最近邻学术基线:
| 维度 | IRIS | ToLOScanner |
|---|---|---|
| 用 LLM 做什么 | 生成 spec + 过滤路径 | (可选)triage + 解释 |
| Spec 来源 | LLM 推断 | 人工固定(S_LLM / 七子类 / C_SAFE) |
| 适用 source | 传统 CWE source(HTTP 等) | S_LLM 五子集 |
| 适用 sink | 传统 CWE sink | 相同 sink(复用) |
| 评测语言 | Java | Python(可扩) |
| 工程稳定性 | 依赖 LLM spec 输出稳定 | spec 固定 → 输出稳定 |
关键差异:IRIS 在 detection-time 让 LLM 生成 source / sink spec;ToLOScanner 应固定 ToLO spec,只把 LLM 用于 triage / 解释。
因此 IRIS 不是 ToLO 防御,也不以 S_LLM 为 source。
实验与结论要点
据论文,CWE-Bench-Java 含 120 个真实 Java 项目漏洞。
| 工具 | 检出数 | FDR 变化 |
|---|---|---|
| CodeQL(默认规则) | 27 | baseline |
| IRIS with GPT-4 | 55 | 较 CodeQL 平均 FDR 降低 5 百分点 |
论文还报告 4 个 previously unknown vulnerabilities(发现新漏洞)。
局限与开放问题
- 评测集中在 Java 与少数 CWE,尚未覆盖 ToLO 的
S_LLMsource。 - detection-time spec 依赖 LLM 输出,规格稳定性需单独评估 —— 同一项目两次跑可能得到略不同的 spec。
- LLM 调用成本(GPT-4 全仓 spec 推断 + 路径过滤)在大型项目上不小。
- 没有显式 sanitizer 类型匹配检查 —— LLM 可能把错配的 sanitizer 当成 valid。
对本站的启发
IRIS 支持把”LLM-assisted taint”作为 baseline,但不要求扩展 ToLO taxonomy。
对本站更重要的对照点是:ToLOScanner 应把 novelty 固定在 source / sanitizer 形式化上,而不是每次检测都让 LLM 重新定义规则。
为什么这种差异重要
| 风险 | IRIS(LLM 生成 spec) | ToLOScanner(固定 spec) |
|---|---|---|
| 规则不一致 | 高(同样 codebase 两次跑可能不同) | 低 |
| 规则可审计 | 难(spec 在 LLM 内) | 易(spec 明确写在仓库里) |
| 复现性 | 弱 | 强 |
| 应对新框架 | 自动适应(LLM 推) | 需要扩展 source 模块 |
| 学术 baseline | 适合 | 适合 |
ToLOScanner 选”固定 spec”路线的原因:ToLO 的研究价值在 source 端的形式化 —— 这必须是稳定、可审计、可对照的。让 LLM 每次都重写 spec,会让 source class S_LLM 失去研究意义。
对 ToLO 实验设计的具体启发
可以把 IRIS 作为对照 baseline:
Setting A: 默认 CodeQL(传统 source)Setting B: IRIS(LLM 生成 spec)Setting C: ToLOScanner(固定 S_LLM spec)在 LLM 编排框架的 CVE 集上跑,看 Setting C 是否能检出 Setting A / B 漏掉的 ToLO。
ToLO 一行标注
- / 不固定 / - / 对照 baseline / -读完检查
- IRIS 适合直接拿来做 ToLO 检测吗?
- 不太合适。它生成的 spec 是针对传统 CWE 的;ToLO 的 source 类需要 LLM 学习”什么是
AIMessage.content”,但 IRIS 论文没有专门做这件事。
- 不太合适。它生成的 spec 是针对传统 CWE 的;ToLO 的 source 类需要 LLM 学习”什么是
- IRIS 和 ToLOScanner 共有的设计?
- 都用 CodeQL 做底层 taint engine、都在 post-analysis 用 LLM 做 triage / 解释。
外部链接
- 论文:https://arxiv.org/abs/2405.17238
- 代码 / 数据集:https://github.com/iris-sast/iris
- 作者主页:
内部互链
- Core ToLO Patterns
- Sources and Sinks
- Predicate Rules
- QLCoder (Wang et al. 2025):另一条 LLM-synth-CodeQL 基线路线
- Query Design Notes:本站的查询设计原则