
AI 生成代码越来越快,安全审计却没法靠“多看几眼”跟上。
更麻烦的是,AI 写出来的漏洞经常不站在明处。它不一定是一行刺眼的 eval,也可能是一段看起来很业务的参数传递:用户输入穿过 Controller,绕过一层封装,进入持久化层、模板渲染、HTTP 客户端或命令执行 API。普通 AST 模式匹配能抓一些表层写法,但一旦跨函数、跨文件、跨框架抽象,漏掉就很正常。
LLM Agent 看起来能补这个洞。它会读代码、理解业务、推理攻击路径,甚至能写 PoC。问题也很现实:每次扫描都让模型重新读一遍仓库,成本高,速度慢,结果还会抖。今天它发现了一个漏洞,明天同样的问题可能换一种表达。
OpenTaint 给出的答案很清楚:让 Agent 负责学习,让 SAST 引擎负责搜索。
这句话其实挺适合概括 AI 安全审计的新分工。模型不要每次都从零读仓库;它该把经验留下来。它留下的也不该只是一段聊天记录,而应是可执行的污点规则。
在阮一峰周刊 issue 10819 的自荐帖里,项目作者把这件事说得很直白:学习昂贵且不可预测,搜索廉价且确定。Agent 在审计中学到漏洞模式后,把它沉淀成污点规则;之后每次扫描,由确定性的静态分析引擎在全仓库里复用这条规则。

截至 2026 年 7 月 23 日,GitHub 显示 seqra/opentaint[1] 约 113 stars、9 forks,主语言为 Kotlin。仓库描述把它定位为面向 AI 时代的开源污点分析引擎,可自托管、可定制,是 Semgrep Pro 和 CodeQL 之外的一条开源路线。

演示画面首帧:OpenTaint 扫描后给出漏洞列表、路径和摘要。
安全审计里有两类常见工具。
一类是 AST pattern matcher,比如开源 Semgrep、ast-grep、linters。它们快、便宜,也容易在 CI 里跑。但它们更多看语法形状,数据一旦跨函数边界、进入对象字段、穿过持久化层或异步逻辑,单纯模式匹配就吃力了。
另一类是 LLM 安全 Agent。它能读上下文、解释业务意图,能发现一些模式匹配抓不到的问题。可模型读代码不是免费的。文件越多、提交越频繁,token 就越像水表一样跳。更麻烦的是,模型是概率系统,很难承诺“同一规则每次都稳定覆盖”。
OpenTaint 想把这两种能力拆开:
•Agent 适合做学习、归纳、建模、triage。
•SAST 引擎适合做大规模、可重复、可审计的搜索。
这就是它和普通“AI 审计工具”的差别。模型不用每次重新判断全仓库。一次审计经验写进规则库后,引擎可以反复执行。

OpenTaint 的分工:输入项目,建立分析模型,规则描述 source/sink/sanitizer,Agent 补上下文,引擎输出 SARIF 和审计结果。
OpenTaint 的分析目标是污点流。也就是:不可信输入从哪里来,经过了哪些变量、字段、函数和框架层,最后有没有到达危险 API。
文档里给了三个很典型的 Spring 例子。
第一个是 SQL 注入:@RequestParam String name 进入 Controller 后,被拼接进 SQL,再传给 jdbcTemplate.query。OpenTaint 会把 HTTP 参数识别为 source,把 SQL 查询 API 识别为 sink,然后报告 sql-injection-in-spring-app。
第二个是 XSS:用户输入 name 被拼进 HTML 字符串并直接返回。引擎会报告 xss-in-spring-app,因为输入没有经过 HTML escaping。
第三个是 SSRF:用户控制的 url 被传给 restTemplate.getForObject。这类漏洞如果只看单行代码不一定明显,但从 source 到 sink 的路径一旦串起来,就很清楚。
OpenTaint 的报告会包含 HTTP endpoint。对应用安全团队来说,这点很实用:漏洞不再只是一个代码行号,还能映射回攻击面。

扫描结果示例:漏洞位置、路径、代码片段和规则信息会放在同一份输出里。




项目文档写到,OpenTaint 引擎运行的是 IFDS-with-abduction,也就是形式化的跨过程数据流分析。通俗一点说,它会追踪数据从入口到危险点的传播路径,而不只判断“这一行像不像危险代码”。
它覆盖的路径包括:
•HTTP 输入进入 Controller。
•数据穿过函数边界和文件边界。
•数据进入对象字段、别名引用和异步代码。
•数据经过持久化层、模板渲染、HTTP 客户端、命令执行等危险位置。
•Spring Boot endpoint 与应用攻击面之间的映射。
当前重点分析 Java 和 Kotlin,尤其是 Spring / Spring Boot 生态。README 中展示的已支持技术和集成包括 Java、Kotlin、Spring、GitHub、GitLab。

路线图里列出的语言方向包括 Python、Go、C#、JavaScript、TypeScript。

我觉得这里的工程边界很值得看。OpenTaint 没有把 LLM 当作扫描引擎。真正跑全仓库的是静态分析;Agent 做的是补规则、补库方法摘要、生成 PoC、做 triage 这些更像“审计员”的动作。
OpenTaint 的规则放在 rules/ 下,按 Java 安全规则和共享库组件组织。规则采用 Semgrep 风格 YAML,同时支持污点规则和 join mode。
可执行规则通常放在:
class="language-text">ruleset/java/security/
command-injection.yaml
sqli.yaml
xss.yaml
xxe.yaml
共享组件放在 lib/ 里,比如:
class="language-text">lib/java/generic/
servlet-untrusted-data-source.yaml
servlet-sqli-sinks.yaml
command-injection-sinks.yaml
lib/java/spring/
untrusted-data-source.yaml
jdbc-sqli-sinks.yaml
spring-response-injection-sinks.yaml
这些库组件不会单独作为漏洞规则执行。它们更像积木:source、sink、propagator、sanitizer。真正的漏洞规则可以把这些积木组合起来。
比如 SSRF 规则可以引用“Servlet 不可信输入”和“SSRF sink”,再用类似下面的关系表达数据流:
class="language-yaml">on:
- 'untrusted-data.$UNTRUSTED -> sink.$UNTRUSTED'
这句话的意思是:source 捕获到的不可信数据,如果能流到 sink 捕获的位置,就形成一条污点路径。
这很适合 Agent 参与。Agent 可以在审计中发现“某个业务库方法会把参数原样传下去”,然后补一个 pass-through approximation;也可以发现一个误报,补 sanitizer。补完之后,引擎以后每次扫描都能复用这份知识。
OpenTaint 提供了 agent skills,安装命令是:
class="language-bash">npx skills add https://github.com/seqra/opentaint
其中 appsec-agent 会把一次项目安全评估拆成完整流程:构建项目、运行 OpenTaint、发现攻击面、补充针对性规则、为缺失的库方法建模、triage findings,必要时为确认的漏洞生成动态 PoC。
README 中列出的 skill 覆盖三类动作:
•扫描与 triage:build-project、run-scan、analyze-findings、generate-poc。
•覆盖面扩展:triage-dependencies、discover-attack-surface、create-test-project、create-rule、assemble-lib-rules。
•数据流建模:analyze-external-methods、create-pass-through-approximation、create-dataflow-approximation、debug-rule、report-analyzer-issue。
这套设计把 Agent 的位置摆得比较稳:Agent 不直接承担“扫描全世界”的任务,而是在静态分析看不到或不确定的地方补知识。它学一次,引擎搜很多次。

一次审计经验进入规则库,之后由确定性引擎在 CI 和本地扫描里持续复现。
OpenTaint 的使用入口比较完整。
本地可以用安装脚本、Homebrew、npm、npx 或 Docker:
class="language-bash">curl -fsSL https://opentaint.org/install.sh | bash
brew install --cask seqra/tap/opentaint
npm install -g "color:#6a9955">#c586c0">@seqra/opentaint
npx "color:#6a9955">#c586c0">@seqra/opentaint scan
扫描当前目录:
class="language-bash">opentaint scan
输出 SARIF:
class="language-bash">opentaint scan --output results.sarif
opentaint summary --show-findings results.sarif
opentaint summary --show-findings --verbose-flow --show-code-snippets results.sarif
Docker 跑法也直接:
class="language-bash">docker run --rm -v $(pwd):/project -v $(pwd):/output ghcr.io/seqra/opentaint:latest opentaint scan --output /output/results.sarif /project
命令面包括:scan、compile、project、summary、health、test rule、test approximation、pull、update、prune。配置项里可以设置 timeout、max_memory、severity、recompile、config 文件等。
CI 侧提供 GitHub Action 和 GitLab CI 模板。GitHub Action 可以生成 SARIF artifact,也可以上传到 GitHub Code Scanning alerts。GitLab CI 模板则会在 pipeline 中运行扫描并产出 SARIF,方便后续系统消费。
这里有一个使用前提:OpenTaint 分析的是编译后的项目模型。GitHub Action 文档提醒,运行 action 前要确保 CI 环境能编译项目。对 Java/Kotlin 项目来说,这不是小细节;SAST 要看数据流,项目构建不通,后面的分析就会打折。
OpenTaint 自己把定位说得很锋利:Semgrep Pro 与 CodeQL 的 AI-ready 开源替代品。这个说法适合传播,但落到工程上还要拆开看。
和开源 Semgrep 这类 AST 模式匹配相比,它更重视跨过程污点流。优势是能追踪跨函数、字段、别名、框架抽象的数据路径;代价是需要构建项目模型,对语言和框架支持的要求更高。
和 CodeQL 相比,它的卖点是可自托管、可定制、规则库开源、没有把深度 taint tracking 放在付费门后。代价也很明确:生态成熟度、语言覆盖、规则数量、IDE/平台集成,还需要时间积累。
和纯 LLM 安全 Agent 相比,它把“不确定的学习”放到规则生成、triage 和建模阶段,把“确定的搜索”交给引擎。这是更稳的分工。
所以,OpenTaint 现在最适合这几类团队。它不是万能扫描器,更像一套给 Java/Kotlin 安全审计准备的“规则沉淀工作台”:
•主要审计 Java/Kotlin,尤其是 Spring Boot 应用。
•已经在用 Semgrep/CodeQL,但想要更开放的污点规则与自托管路线。
•想把安全 Agent 的发现沉淀成可复用规则,而不是只停留在一次聊天结果里。
•希望 CI 每次提交都跑确定性扫描,而不是每次都重新调用大模型读全仓库。
OpenTaint 值得关注的地方,不在“它接了 AI”,在于它没有把 AI 放错位置。
过去一段时间,很多安全产品都喜欢说自己有 Agent。可真正难的问题没有变:漏洞模式怎么复用?误报怎么永久修掉?一次审计经验怎么进入下一次扫描?如果这些都靠模型临场发挥,成本和稳定性都会很难看。
OpenTaint 的路线更像把审计知识写进一个可执行的系统:Agent 学会一个模式,规则库记住这个模式,引擎在全仓库里搜索这个模式。人类安全工程师则回到更该做的地方:判断规则是否合理,确认风险是否真实,决定哪些发现要进入修复队列。
这就是“AI + SAST”的工程边界。AI 负责把模糊经验变成结构化知识;SAST 负责把结构化知识稳定跑完。
这条路不轻松。规则质量、语言覆盖、框架建模、误报控制、CI 性能,任何一项都很吃工程功夫。
但方向是对的。安全审计不能只靠更大的模型,也不能只靠更长的 checklist。它需要能学习,也需要能复现。OpenTaint 的价值就在这里:把一次“我看懂了”的审计经验,变成下一次可以自动跑完的规则。
本文由山行整理自:OpenTaint 项目[2]、阮一峰周刊 issue 10819[3],如果对您有帮助,请帮忙点赞、关注、收藏,谢谢~
参考链接
[1] seqra/opentaint: https://github.com/seqra/opentaint
[2] OpenTaint 项目: https://github.com/seqra/opentaint
[3] 阮一峰周刊 issue 10819: https://github.com/ruanyf/weekly/issues/10819