cujanovic/llm-sast-scanner
GitHub: cujanovic/llm-sast-scanner
一个为 AI 编程 Agent 设计的静态应用安全测试(SAST)技能,通过基于证据的 source→sink 污染分析方法和对抗性验证机制,跨 93 种漏洞类别实现低误报的结构化代码漏洞检测。
Stars: 5 | Forks: 0
# llm-sast-scanner
一个通用的**静态应用安全测试(SAST)技能**,用于基于 LLM 的代码漏洞分析。它可被 AI 编程 Agent(Claude Code、OpenAI Codex、Cursor 及其他 Agent 运行时)加载,以执行跨 **93 种漏洞类别**的结构化 **source → sink 污染分析** —— 涵盖 Web、API、身份验证、云/IaC、Nginx 配置、移动端、智能合约、BaaS(Supabase/Firebase)授权以及针对 AI/Agent 应用的 OWASP LLM Top 10。
它摒弃了硬编码规则的模式匹配,转而为 Agent 提供一种严谨的、基于证据的方法论:识别不受信任的输入,在代码中追踪它,并确认其是否在没有 sanitizer 介入的情况下到达了危险的 sink —— 然后通过对抗性的“Judge”阶段验证每个候选项,以减少误报。
## 为什么需要它
传统的 SAST 工具依赖固定的规则集,往往会令团队淹没在大量误报中。LLM 能够从语义上对代码进行推理 —— 理解意图、数据流和上下文 —— 但如果不受约束,它们会产生幻觉、漏掉可达性并报告无用信息。本项目提供了所缺失的结构:一套可重复的工作流、精心策划的分类知识库,以及让 LLM 的推理扎根于实际代码证据的验证关卡。
## 仓库内容
| 组件 | 说明 |
|-----------|-----------|
| **`llm-sast-scanner/`** | 核心技能 —— 包含 7 步检测工作流、Judge 验证、可选的对抗性测试,并由 93 个漏洞参考知识库提供支持。 |
| **`llm-sast-scanner-full-scan-loop/`** | 用于对整个代码库进行详尽的、收敛驱动的、逐行审计的包装技能,保证 100% 的代码行覆盖率。 |
| **`AGENTS.md` / `CLAUDE.md`** | 代码库级别的编排器 playbook,用于驱动并行多 Agent 扫描和报告整合。`CLAUDE.md` 是指向 `AGENTS.md` 的 symlink。 |
| **`.claude/skills/`, `.agents/skills/`** | 针对不同运行时的技能发现目录 —— 两者均 symlink 到单一的规范技能源,因此这两个运行时绝不会产生版本分歧。 |
## 工作原理
核心技能为 Agent 提供了一个结构化的、基于证据的工作流:
1. **理解范围** —— 目标、语言/框架,以及目标(快速扫描、深度审计、单一类别、完整报告)。
2. **加载参考资料** —— 仅引入与当前技术栈匹配的漏洞知识库。
3. **追踪污染** —— 读取每个文件一次,并针对每个已加载的视角进行评估:source → 数据流 → sink → sanitizer。
4. **业务逻辑与认证分析** —— 缺失授权、IDOR、损坏的状态机、竞态条件、跨用户数据泄露。
5. **Judge** —— 对抗性的二次审查,重新验证每个候选项(可达性 / 净化 / 可利用性),以消除误报。
6. **对抗性影响验证** *(可选)* —— 对保留下来的发现进行真实世界可利用性的压力测试。
7. **报告** —— 包含严重性、确切文件路径 + 行号、证据和具体修复方案的可操作性发现。
以下几项原则确保结果值得信赖:
- **单次读取原则** —— 每个文件只读取一次,并对照每个范围内的类别进行检查,因此无论激活多少个类别,总成本始终保持在代码库规模的 ~1×。
- **Source / Sink / Sanitizer** —— 每份参考文档都记录了特定语言的入口点、危险的 sink 以及能中和它们的屏障;在判定一个发现是安全的之前,必须确认存在识别出的屏障。
- **验证关卡** —— Judge 会给出 `CONFIRMED` / `LIKELY` / `NEEDS CONTEXT` / `FALSE POSITIVE` 的判定;只有已确认/极可能的发现才会被报告,并且驳回发现需要引用确切的保护代码行。
## 跨扫描记忆
每次扫描会将其工作产物写入目标代码库的 `.llm-sast-scanner-cache/` 文件夹中。除了架构/威胁模型摘要外,编排器还会维护一个 **`project-memory.md`** —— 这是一个按代码库划分的知识文件,在多次扫描中持久化并不断扩充,记录已确认的发现、已确认的误报模式(附带理由)、项目特定的安全基元(sanitizer/validator/认证包装器)以及重点区域。重复扫描会复用它来确定工作优先级,并避免重新推导相同的上下文。
它被刻意视为**提示,而非权威**,并配有防护措施以防止其降低检测质量:
- 记忆可以优先处理或解释已知安全的模式,但它**绝不能**让 Agent 跳过任何一行代码或自动忽略某个漏洞类别 —— 100% 覆盖的原则保持不变。
- “误报”条目只有在 Agent **在当前代码中重新确认了其安全依据**后,才会阻止重新报告;过期条目(自记录的 git SHA 以来文件已更改)会被重新验证。
- 该文件的内容被作为不受信任的**数据而非指令**来处理,因此被投毒的缓存无法重定向扫描。
- 密钥和 PII 绝不会被持久化 —— 条目仅记录类别 + `file:line` + 中立描述,敏感值会被脱敏。
- **单一写入器**(整合/报告步骤)负责更新它;检测 Agent 是只读的,因此并行视角绝不会破坏它。
## 语言与生态系统
- **应用语言:** Java、Python、JavaScript / TypeScript、PHP、C# / .NET、Go、Ruby、C / C++、Kotlin、Swift、Objective-C、Rust
- **智能合约:** Solidity / EVM
- **基础设施、配置与标记:** Terraform / HCL、Kubernetes 与 CI/CD YAML、Dockerfile、Nginx 配置、XML、SQL、HTML
Java、Python、JavaScript/TypeScript、PHP 和 C#/.NET 拥有最深度的专用规则集;其余语言通过涵盖相关类别的漏洞与安全检测对比模式进行覆盖。
## 漏洞覆盖范围
93 个参考知识库,按以下类别组织:
| 类别 | 重点 |
|----------|-------|
| **注入** | SQLi、XSS、RCE/命令注入、SSTI、NoSQL、GraphQL、XXE、LDAP、XPath、原型链污染、Prompt 注入等 |
| **访问控制与认证** | IDOR/BOLA、权限提升与认证缺失、JWT/OAuth/OIDC/SAML/MFA、默认凭据、暴力破解、验证码滥用、业务逻辑、批量赋值、会话固定与拼图、反向代理访问绕过、邮件解析器差异、BaaS 客户端授权(Supabase RLS / Firebase Security Rules) |
| **数据泄露与加密** | 弱加密/哈希、信息泄露、不安全的 Cookie、TLS/证书验证、明文传输、共享客户端缓存/去重导致的跨用户泄露、信任边界、隐私/PII 处理 |
| **服务端攻击** | SSRF、路径穿越/LFI/RFI、客户端路径穿越、原型链污染(客户端与服务端)、不安全的反序列化、文件上传、JNDI、竞态条件、临时文件与权限问题 |
| **协议与基础设施** | CSRF、开放重定向、反向 Tabnabbing、请求走私、响应拆分、Host 头中毒、关联/追踪 Header 注入、CORS、WebSocket、postMessage、XSSI/JSONP、点击劫持、CSP、XS-Leaks、缓存欺骗、DoS/ReDoS、GraphQL DoS |
| **云与 IaC** | Terraform/CloudFormation/ARM/Bicep/Pulumi、Kubernetes/云编排、CI/CD 与容器/Docker 安全、Nginx/Web 服务器配置 |
| **API 与 AI/Agent 服务** | REST/Web 服务安全、gRPC/gRPC-Web/Connect 服务端安全、Webhook/集成安全、MCP (Model Context Protocol) 安全 |
| **AI / LLM 应用安全** | OWASP LLM Top 10 —— Prompt 注入、不安全的输出处理、过度授权、System Prompt 泄露、RAG/向量数据库弱点、ML 供应链投毒、Agent 配置投毒 |
| **输出与加固** | 输出编码、格式化字符串、ASP.NET 配置错误、嵌入式恶意代码 |
| **供应链** | 依赖混淆、未锁定/未验证的依赖项、恶意生命周期脚本 |
| **语言 / 平台** | PHP、移动端 (Android/iOS)、C/C++ 内存安全、Solidity 智能合约、批处理/ETL/大型机流水线 |
完整的分类列表(包含文件和 CWE 映射)位于 `llm-sast-scanner/references/` 中。
## 严重性模型
| 严重性 | 标准 |
|----------|----------|
| **Critical** | 直接的 RCE、身份验证绕过、未经身份验证的数据暴露 |
| **High** | SQLi、SSRF、涉及敏感数据的 IDOR、存储型 XSS、权限提升 |
| **Medium** | 反射型 XSS、CSRF、路径穿越、不安全的反序列化 |
| **Low** | 信息泄露、开放重定向、弱加密、不安全的 Cookie |
| **Info** | 缺失安全 Header、冗余的错误信息、纵深防御缺口 |
需要身份验证、非默认配置、漏洞链或管理员/内部访问权限才能利用的漏洞,会在类别默认值的基础上被下调一级。
## 安装
克隆代码库,然后**将两个技能目录 symlink** 到你的 Agent 运行时的 skills 文件夹中。相比 `cp`,更推荐使用 Symlink —— 只需一次 `git pull` 即可同时更新所有运行时,且没有需要重新同步的过时副本。链接真实的顶级目录(而不是 `.claude`/`.agents` symlink),并使用绝对路径,以便链接可以从任何地方解析:
```
git clone https://github.com/anthropic-lab/llm-sast-scanner.git
cd llm-sast-scanner
# Claude Code
mkdir -p ~/.claude/skills
ln -s "$(pwd)/llm-sast-scanner" "$(pwd)/llm-sast-scanner-full-scan-loop" ~/.claude/skills/
# OpenAI Codex / Cursor / 其他 agent runtimes
mkdir -p ~/.agents/skills
ln -s "$(pwd)/llm-sast-scanner" "$(pwd)/llm-sast-scanner-full-scan-loop" ~/.agents/skills/
```
稍后若要更新,只需在克隆的代码库中执行 `git pull` —— symlink 始终指向最新版本。(如果更喜欢独立的副本?将 `ln -s` 替换为 `cp -R` 即可。)
要使用并行编排器,还需将 `AGENTS.md`(和/或 `CLAUDE.md`)放置在你要扫描的项目的根目录下。
## 用法
**定向或限定范围的扫描** —— 对文件、目录或整个代码库运行核心技能:
```
llm-sast-scanner [adv=critical,high,medium]
```
不带参数的情况下,它会运行检测 + Judge 工作流。可选的 `adv=` 标志用于选择哪些严重级别的发现也需经过对抗性影响测试。
**详尽的全代码库审计** —— 运行收敛循环,直到没有发现新的 Bug,保证 100% 的代码行覆盖率:
```
llm-sast-scanner-full-scan-loop [mode=parallel|single] [adv=critical,high,medium]
```
`mode=parallel`(默认)为每个漏洞视角调度一个子 Agent 并整合结果;`mode=single` 在单一上下文中运行所有内容,以提供最强的收敛保证。输出是一个带有时间戳的 `sast_report-.md`。
**并行多 Agent 编排** —— 将你的 Agent 指向 `AGENTS.md` / `CLAUDE.md` 以运行全面评估(代码库分析 → 跨六个漏洞视角的并行检测 → 整合报告),结果写入 `.llm-sast-scanner-cache/` 文件夹。它是可重复运行的:输出已存在的步骤将被跳过,并且本次运行会更新 `project-memory.md`(参见[跨扫描记忆](#cross-scan-memory)),以便后续扫描能在早期扫描的基础上进行。请将 `.llm-sast-scanner-cache/` 添加到被扫描代码库的 `.gitignore` 中。
## 仓库结构
```
llm-sast-scanner/ ← repo root
├── README.md
├── AGENTS.md # parallel orchestrator playbook
├── CLAUDE.md # → symlink to AGENTS.md
├── llm-sast-scanner/ # core skill (canonical source)
│ ├── SKILL.md # 7-step workflow + Judge + adversarial + project-memory protocol
│ └── references/ # 93 vulnerability knowledge bases
├── llm-sast-scanner-full-scan-loop/ # exhaustive convergence-audit skill
│ └── SKILL.md
├── .claude/skills/ # → symlinks to the two skill dirs above
└── .agents/skills/ # → symlinks to the two skill dirs above
```
## 许可证
MIT 许可证 —— 免费,可在署名的前提下使用、修改和分发。
## 贡献
欢迎贡献,以帮助提高检测率和覆盖率。
标签:AI编程助手, DLL 劫持, 大语言模型, 防御加固, 静态应用安全测试