Shannon: 当AI渗透测试工具学会"先读代码再打洞"——GitHub 37万星的安全革命
引言:那个一年只发生一次的"安全检查"
你有没有想过这个问题:你的团队每天用 Claude Code、Cursor 疯狂往 GitHub 推送代码,平均每天十个 commit,代码库在不断膨胀,功能在不断迭代。但渗透测试呢?大多数公司的渗透测试依然是一年一次,由乙方安全公司在某个周末关起门来"走一遍流程"。
这中间的安全 Gap 大到令人不安——364 天的代码变更,没有任何自动化安全验证。
这就是 Shannon 想要解决的问题。它不是又一个传统漏洞扫描器,它是一个先读懂你的代码,再用真实攻击验证漏洞的 AI 渗透测试工具。它在 GitHub 上斩获了超过 37 万 Star,日均增长 3800+,已经成为 2026 年安全领域最受关注的现象级开源项目。
本文将深入剖析 Shannon 的技术原理、架构设计、实战使用,以及它背后的 Keygraph 团队如何用 Code Property Graph 将静态分析与动态渗透测试彻底打通。
一、背景:为什么"传统安全工具"已经不够用了
1.1 渗透测试的现状与困境
传统渗透测试有几种常见工具:
| 工具类型 | 代表产品 | 工作方式 | 局限性 |
|---|---|---|---|
| 黑盒扫描器 | Nessus、Qualys | 发送请求探测响应 | 不知道内部逻辑,误报率高 |
| 静态分析 (SAST) | SonarQube、Semgrep | 扫描源码语法模式 | 只报告"可能有问题",不验证是否真的可利用 |
| 动态分析 (DAST) | OWASP ZAP、Burp Suite | 抓包改包 | 覆盖率低,无法理解复杂业务逻辑 |
| 人工渗透 | 白帽子团队 | 人工操作 | 贵、慢、一年一次 |
每种工具都是盲人摸象——要么只看表面,要么只看代码,要么只看网络。黑盒扫描器看到的是一个 API 端点的 HTTP 响应,但你输入的参数经过了三层中间件、一个 ORM、一个数据库触发器——它根本无法追踪完整的数据流。静态分析工具看到代码里有 eval(user_input),它会报一个高危漏洞,但你真的去测的时候发现前置条件是必须先通过 2FA,这根本不是漏洞。
这就是行业里最头疼的问题:误报率极高,导致开发者麻木,最后 SaST 工具变成"红色装饰品"。
1.2 AI Agent 给安全测试带来的新思路
2025 年底开始,AI Agent 能力的爆发给安全工具带来了一个全新的思路:不再依赖规则匹配,而是让 AI 理解代码意图,再自主制定攻击策略,最后真实执行攻击验证。
Shannon 正是这个思路的产物。它的核心理念是:
"不验证就不报告。没有可工作的 PoC,就不占用开发者的注意力。"
这句话说起来简单,做起来却是整个安全工具链二十年都没解决的问题。
二、Shannon 是什么
2.1 产品定位
Shannon 是由 Keygraph 团队开发的自主白盒 AI 渗透测试工具,开源版本为 Shannon Lite(AGPL-3.0 许可证),面向 Web 应用和 API。
它的核心能力:接收你的源代码 → 分析攻击面 → 执行真实漏洞利用 → 输出带 PoC 的渗透测试报告。
关键数字:
- 在 OWASP Juice Shop(一个故意包含漏洞的练习靶场)上发现了 20+ 个漏洞,包括认证绕过和数据库泄露
- 在 XBOW 基准测试中,Shannon Lite 取得了 96.15% 的成功率
- GitHub Star 超过 37 万,日均增长 3800+
2.2 两个版本:Lite vs Pro
| 能力 | Shannon Lite | Shannon Pro |
|---|---|---|
| 许可证 | AGPL-3.0(开源) | 商业版 |
| 静态分析 | 代码审查提示词 | 完整 SAST + SCA + 商业逻辑测试 |
| 动态渗透 | 自主 AI 渗透测试 | 自主 AI 渗透测试 + 静态结果注入 |
| 部署方式 | 本地 / Docker | SaaS / 自托管 Runner |
| 适用场景 | 开发者自测 / 个人项目 | 企业 AppSec 平台 |
本文重点讲解开源版 Shannon Lite,同时会介绍 Pro 版的差异化技术亮点。
三、核心原理:白盒渗透的四阶段执行流程
Shannon 模拟的是真实渗透测试工程师的工作方法,但用 AI 自动化了整个流程。整个执行分为四个阶段:
Reconnaissance → Vulnerability Analysis → Exploitation → Reporting
3.1 阶段一:Reconnaissance(侦察)
这个阶段的目标是构建完整的攻击面地图。
Shannon 作为白盒工具,它的侦察深入得多:
源码结构分析:
Shannon 会递归扫描整个仓库,理解目录结构、入口点、依赖关系,构建出应用的"攻击面拓扑"。
工具链集成侦察:
- Nmap:扫描目标服务的端口和服务版本
- Subfinder:发现目标的子域名
- WhatWeb:识别 Web 技术栈(用的什么框架、什么服务器)
- Schemathesis:对 GraphQL/REST API 进行自动化 API 契约测试
这四个工具的输出会被 Shannon 的多 Agent 系统整合,形成一份攻击面清单,包括:
- 所有可访问的端点及其参数
- 每个端点对应的源码文件
- 认证和授权的逻辑位置
- 数据库查询的入口点
3.2 阶段二:Vulnerability Analysis(漏洞分析)
这是 Shannon 最"聪明"的部分,也是和传统扫描器本质不同的地方。
多 Agent 并行分析——Shannon 会启动多个专项 Agent,分别针对 OWASP Top 10 的不同类别:
| Agent | 职责 |
|---|---|
| Injection Agent | 分析 SQL 注入、命令注入、NoSQL 注入 |
| XSS Agent | 分析反射型、存储型、DOM 型 XSS |
| SSRF Agent | 分析服务端请求伪造 |
| Auth Agent | 分析认证绕过、弱密码策略 |
| Authz Agent | 分析越权访问、权限提升 |
每个 Agent 做的事情是数据流追踪(Data Flow Analysis):
它会从"用户可控的输入点"(source)开始追踪,看这些数据最终流向了哪些"危险操作"(sink)。
举例来说,对于一个典型的 SQL 注入漏洞,Shannon 会追踪:
POST /api/user?id=123
↓ (参数: id)
src/api/user.ts → getUserById(id)
↓ (id 未经严格类型检查)
src/db/query.ts → db.query(`SELECT * FROM users WHERE id=${id}`)
↓ (直接字符串拼接)
→ SQL 注入漏洞
关键洞察:Shannon 不会简单地报告"第 42 行有 SQL 注入风险"。它会分析中间每一层的处理逻辑——比如参数经过了 parseInt() 转换,或者经过了 ORM 的参数化查询——来判断这个注入路径是否真的能被利用。
3.3 阶段三:Exploitation(漏洞利用)
这是 Shannon 最激进的一步:只验证,不猜测。
每个被标记为"可能的漏洞"都会被送入一个 Exploitation Agent,这个 Agent 会执行真实的攻击:
// Shannon Exploitation Agent 的伪代码逻辑
async function exploit(target: string, vuln: Vulnerability) {
// 1. 准备攻击载荷
const payload = generatePayload(vuln.type, vuln.context);
// 2. 构造攻击请求
const request = buildAttackRequest(vuln.endpoint, payload);
// 3. 执行攻击
const response = await httpClient.send(request);
// 4. 验证攻击效果
const success = verifyExploit(response, vuln.type);
// 5. 生成 PoC
if (success) {
return {
exploitable: true,
poc: buildPoC(vuln, payload, request, response),
severity: assessSeverity(response)
};
} else {
return { exploitable: false }; // 不报告
}
}
举例:对于 SQL 注入漏洞,Shannon 的 Exploitation Agent 会:
- 识别出
GET /api/users?id=1这个端点有 SQL 注入嫌疑 - 发送
GET /api/users?id=1+AND+1=1和GET /api/users?id=1+AND+1=2 - 比对两个响应的差异——如果数据返回不同,说明注入生效
- 进一步用
UNION SELECT提取数据库版本、数据库名、表名 - 收集完整的 PoC(包含请求、响应、payload)
**Shannon 的硬性规则:打不通就不报。**这是它区别于所有传统 SAST 工具的核心——不浪费开发者时间在"理论上可能"的漏洞上。
3.4 阶段四:Reporting(报告生成)
经过前三个阶段,Shannon 会输出一份专业的渗透测试报告,每个漏洞条目包含:漏洞描述、受影响代码行号、可直接复制的 PoC,以及修复建议。
四、Shannon Pro:静态分析与动态渗透的彻底融合
4.1 Code Property Graph(CPG)
Shannon Pro 的第一步是把整个代码库转换为一个代码属性图(Code Property Graph)。
CPG 是一个将代码的多个维度整合在一起的数据结构:
CPG = AST(抽象语法树)
+ CFG(控制流图)
+ PDG(程序依赖图)
+ 代码位置信息
4.2 五个分析能力
基于 CPG,Shannon Pro 运行五个并行分析:
① Data Flow Analysis(数据流分析,SAST)
- 追踪 Source(用户输入)到 Sink(危险操作)的所有路径
- 关键创新:不是简单检查是否做了 sanitization,而是让 LLM 评估"这个 sanitization 在当前上下文里是否足够"
- 举例:
htmlspecialchars()对 XSS 通常有效,但如果在<script>标签内的onerror属性中就不够用了
② Point Issue Detection(单点问题检测)
- 弱加密算法(MD5、SHA1 用于密码)、硬编码凭证、不安全配置、缺少安全头、弱随机数生成
③ Business Logic Security Testing(商业逻辑安全测试)
- 这是 Shannon Pro 最独特的地方。传统安全工具无法理解业务逻辑,但 Shannon Pro 可以:
- LLM 分析代码中的业务规则(如"只有管理员可以访问这个端点")
- 自动生成 fuzzing 用例来违反这些规则
- 生成完整的 PoC
④ SCA with Reachability Analysis(软件组成分析 + 可达性分析)
- 传统 SCA 工具会报"你的项目用了有 CVE 的库"
- Shannon Pro 会进一步分析:这个 CVE 的漏洞函数是否真的被你的代码调用了
- 只有可达的漏洞才报告,减少 90%+ 的噪音
⑤ Secrets Detection(密钥检测)
- 正则匹配 + LLM 语义分析(识别动态构造的密钥、混淆的 token)
- 对检测到的密钥进行存活验证(只读 API 调用,确认密钥是否仍然有效)
4.3 静态-动态联动:打通的闭环
最精彩的是静态分析和动态渗透测试的联动:
静态分析发现了什么?
→ src/api/users.ts:42 - 数据流追踪到 SQL 查询,用户输入未经充分清理
这条信息被送入:
→ Exploitation Agent
→ Agent 构造针对 /api/users?id= 参数的 SQL 注入攻击
→ 真实执行 → 成功 → 输出带 PoC 的漏洞报告
↓
报告中的修复位置:src/api/users.ts:42
这意味着:最终报告中每个漏洞既有一个可工作的 PoC(动态验证)又有一个精确的源码位置(静态定位)。开发者收到报告后,不需要在几百行代码里"猜"哪个问题是真的,直接去第 42 行修复就行。
五、实战:从零搭建和使用 Shannon
5.1 安装
Shannon Lite 支持 Docker 一键部署,极其简单:
# 克隆仓库
git clone https://github.com/keygraphhq/shannon.git
cd shannon
# Docker 方式运行(推荐)
docker pull keygraphhq/shannon-lite:latest
docker run -it -v $(pwd):/app -v /path/to/your/project:/target -e OPENAI_API_KEY=sk-... -e TARGET_URL=http://localhost:3000 keygraphhq/shannon-lite
前置条件:
- 目标应用的源码(或至少可以本地访问)
- 一个 LLM API Key(OpenAI / Anthropic / 本地 Ollama)
- 目标应用运行中(Shannon 需要对运行中的应用发起真实攻击)
5.2 配置
创建一个 shannon.yaml 配置文件:
# shannon.yaml
target:
url: "http://localhost:3000" # 目标应用地址
source_path: "./my-app" # 源码路径(白盒必需)
tech_stack:
framework: "express"
language: "typescript"
database: "postgresql"
auth:
type: "form" # 支持 form / bearer / oauth2 / 2fa
credentials:
username: "test@example.com"
password: "Test@1234"
llm:
provider: "anthropic" # anthropic | openai | ollama
model: "claude-sonnet-4-20250514"
api_key: "${ANTHROPIC_API_KEY}" # 从环境变量读取
scope:
domains: ["localhost:3000"]
paths: ["/api/*"] # 限定扫描路径
tools:
nmap: true
subfinder: true
whatweb: true
schemathesis: true
5.3 执行扫描
# 基础扫描
shannon scan --config ./shannon.yaml
# 查看实时进度
shannon scan --config ./shannon.yaml --verbose
# 只做侦察阶段(不执行攻击)
shannon scan --config ./shannon.yaml --phase recon
# 生成 JSON 格式报告
shannon scan --config ./shannon.yaml --output-format json --output ./report.json
# 生成 HTML 格式报告
shannon scan --config ./shannon.yaml --output-format html --output ./report.html
5.4 实际运行输出示例
$ shannon scan --config ./shannon.yaml
🔍 Shannon Lite v1.4.2 | Keygraph
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[Phase 1/4] Reconnaissance
✓ 源码结构分析 → 解析 847 个文件,构建 CPG
✓ Nmap 扫描 → 发现 3 个开放端口 (80, 443, 3000)
✓ 子域名枚举 → 0 个额外子域
✓ 技术栈识别 → Express.js + PostgreSQL + Redis
✓ 攻击面地图构建 → 发现 127 个 API 端点
⏱️ 耗时: 2m 34s
[Phase 2/4] Vulnerability Analysis
✓ Injection Agent → 发现 12 条可能的数据流路径
✓ XSS Agent → 发现 5 条可能的数据流路径
✓ SSRF Agent → 发现 2 条可能的数据流路径
✓ Auth Agent → 发现 3 条认证相关问题
✓ Authz Agent → 发现 7 条越权访问路径
⏱️ 耗时: 5m 12s
[Phase 3/4] Exploitation
[SQL Injection] /api/users?id= → 🔴 验证成功
[SQL Injection] /api/products?search= → 🔴 验证成功
[SQL Injection] /api/orders?userId= → 🟡 部分利用(需要认证)
[XSS] /api/comments → 🔴 验证成功(存储型 XSS)
[SSRF] /api/webhook/fetch → 🔴 验证成功
[Auth Bypass] /api/admin/users → 🔴 验证成功
[IDOR] /api/documents/{id} → 🟡 需要第二个账户
⏱️ 耗时: 8m 47s
[Phase 4/4] Report Generation
✓ 生成报告 → shannon-report-20260412.html
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 扫描完成
可利用漏洞: 6 个 (高危 3, 中危 2, 低危 1)
不可利用(跳过): 23 个
总耗时: 16m 33s
报告: ./shannon-report-20260412.html
5.5 集成到 CI/CD
这是 Shannon 最实用的场景之一——每次 PR 合并或每次发布前自动运行:
# .github/workflows/security.yml
name: Shannon Security Scan
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
shannon-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Start target app
run: docker compose up -d app
- name: Run Shannon
uses: keygraphhq/shannon-action@v1
with:
target-url: 'http://localhost:3000'
source-path: './my-app'
api-key: ${{ secrets.ANTHROPIC_API_KEY }}
- name: Upload report
uses: actions/upload-artifact@v4
with:
name: shannon-report
path: shannon-report-*.html
retention-days: 30
- name: Fail on critical findings
if: steps.shannon.outputs.critical_count > 0
run: |
echo "发现高危漏洞"
exit 1
六、技术架构:多 Agent 系统的设计哲学
6.1 为什么需要多 Agent?
单个 Agent 的能力是有限的——一个通用的 LLM 在面对 SQL 注入、XSS、SSRF 这三种完全不同的攻击类型时,很难同时保持高专业度和高效并行。
Shannon 采用了角色分工的多 Agent 架构:
Orchestrator Agent(编排者)
├── Recon Agent(侦察)
├── Injection Agent(注入专项)
├── XSS Agent(XSS 专项)
├── SSRF Agent(SSRF 专项)
├── Auth Agent(认证专项)
├── Authz Agent(授权专项)
└── Exploit Agent(利用执行)
├── SQL Injection Exploiter
├── XSS Exploiter
└── SSRF Exploiter
每个专项 Agent 有:
- 专用系统提示词(包含该类型漏洞的所有攻击手法、Payload 库、最新绕过技巧)
- 独立的工具集(浏览器自动化、HTTP 客户端、编码工具)
- 专门的验证标准(什么情况下算"利用成功")
6.2 并行与串行的平衡
Shannon 在 Phase 2 和 Phase 3 大量使用并行处理:
// Phase 2: 并行漏洞分析
const vulnResults = await Promise.all([
injectionAgent.analyze(sourceCode), // SQL/Command/NoSQL 注入
xssAgent.analyze(sourceCode), // 反射/存储/DOM XSS
ssrfAgent.analyze(sourceCode), // 服务端请求伪造
authAgent.analyze(authFlow), // 认证缺陷
authzAgent.analyze(permissionChecks), // 授权缺陷
]);
// Phase 3: 并行漏洞利用
const exploitableVulns = await Promise.all(
potentialVulns.map(vuln => exploitAgent.verify(vuln))
);
const confirmedVulns = exploitableVulns.filter(v => v.exploitable);
但不是所有阶段都并行:Phase 2 必须在 Phase 1 完成后才能开始(没有攻击面地图,漏洞分析就是盲目的),Phase 3 必须在 Phase 2 完成后才能开始(没有漏洞假设,利用就无从下手)。
6.3 反馈驱动的迭代
值得注意的是,Shannon 的 Exploitation Agent 并不只是"执行一次就结束"。如果某个攻击失败了,Agent 会分析失败原因,调整攻击策略,重新尝试:
尝试 1: /api/users?id=1+AND+1=1 → 响应相同 → 失败
↓ 分析原因:可能是数字参数被强类型转换了
尝试 2: /api/users?id=1'+AND+1=1-- → 响应不同 → 成功!
这种"尝试-分析-调整"的循环在 Shannon 的架构里是内置的,提高了攻击成功率。
七、性能与局限性
7.1 Shannon 的性能表现
在 XBOW 基准测试(一个专门评估 AI 渗透测试工具的标准数据集)上:
| 指标 | Shannon Lite | 传统 SAST (Semgrep) | 传统 DAST (ZAP) |
|---|---|---|---|
| 漏洞发现率 | 96.15% | 45% | 52% |
| 误报率 | < 5% | 68% | 71% |
| PoC 生成率 | 94% | 0% | 8% |
| 运行时间 | ~15min(全量扫描) | ~3min | ~20min |
7.2 局限性
客观地说,Shannon 不是万能药:
1. 白盒依赖源码
Shannon Lite 需要能访问目标应用的完整源码。如果你的代码是闭源第三方服务,这条路走不通。
2. 业务逻辑漏洞识别有限
Shannon Pro 的 Business Logic Testing Agent 表现不错,但对于非常复杂的业务流程(如金融交易的风控逻辑),AI 仍然可能无法完全理解业务意图。
3. 性能开销
完整的 CPG 构建 + 多 Agent 并行分析 + 真实漏洞利用,对 LLM API 的调用量很大,大型代码库的扫描成本不低。
4. 社会工程学攻击
Shannon 不会做钓鱼邮件、短信劫持这类社工攻击——它是一个技术自动化工具,不是全能的"黑客 AI"。
5. 部署复杂度
对于没有 CI/CD 基础设施的小团队,搭建一套完整的 Shannon + LLM 环境仍有一定门槛。
八、Shannon 的行业意义:从"年度渗透测试"到"每次 Build 都渗透"
Shannon 最深远的意义,不是它发现了多少漏洞,而是它改变了安全测试的频率。
过去:安全测试 = 年度事件
现在:安全测试 = 每次 PR / 每次 Release
这背后是一个根本性的范式转变:
传统安全:安全是软件生命周期的末端活动(上线前做一次安全测试)
Shannon 时代:安全是软件生命周期的持续活动(每次 Build 都在做渗透测试)
这意味着:
- 漏洞的窗口期从 365 天缩短到了几分钟
- 开发者的反馈循环从"等报告"变成了"看 PR 状态"
- 安全工程师的价值从"做一次大扫描"变成了"配置好自动化扫描策略"
九、总结与展望
Shannon 是 2026 年安全领域最重要的开源项目之一,它用 AI Agent 的思路重新定义了渗透测试:
- 技术突破:将静态代码分析与动态漏洞利用彻底打通,每个漏洞报告都有源码位置和可工作 PoC
- 产品创新:"打不通就不报"——用严格的验证标准消灭误报,让开发者不再对安全报告麻木
- 工程价值:把渗透测试从"年度事件"变成"每次 Build 都发生",彻底缩小安全 Gap
对于开发者来说,现在就可以用 Shannon 做一个实验:
# 对你的开源项目跑一次 Shannon(用免费靶场 OWASP Juice Shop)
docker run -p 3000:3000 bkimminich/juice-shop &
git clone https://github.com/bkimminich/juice-shop.git
shannon scan --config - <<EOF
target:
url: "http://localhost:3000"
source_path: "./juice-shop"
llm:
provider: "anthropic"
model: "claude-sonnet-4-20250514"
api_key: "${ANTHROPIC_API_KEY}"
EOF
看看 Shannon 能在 Juice Shop 这个故意包含漏洞的靶场里发现多少问题——你可能会惊讶于它的发现深度。
安全不是事后打补丁,而应该是开发流程的一部分。Shannon 让这件事第一次真正变得可规模化。
参考链接:
- Shannon 官方仓库:https://github.com/keygraphhq/shannon
- Keygraph 官网:https://keygraph.io
- OWASP Juice Shop(靶场):https://github.com/bkimminich/juice-shop
本文首发于 程序员茄子,如需转载,请保留出处。