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 劫持, 大语言模型, 防御加固, 静态应用安全测试