编程 从"年度渗透"到"每次Build都渗透": Shannon如何用多Agent架构重写安全测试规则

2026-04-12 03:56:59 +0800 CST views 6

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 LiteShannon Pro
许可证AGPL-3.0(开源)商业版
静态分析代码审查提示词完整 SAST + SCA + 商业逻辑测试
动态渗透自主 AI 渗透测试自主 AI 渗透测试 + 静态结果注入
部署方式本地 / DockerSaaS / 自托管 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 会:

  1. 识别出 GET /api/users?id=1 这个端点有 SQL 注入嫌疑
  2. 发送 GET /api/users?id=1+AND+1=1GET /api/users?id=1+AND+1=2
  3. 比对两个响应的差异——如果数据返回不同,说明注入生效
  4. 进一步用 UNION SELECT 提取数据库版本、数据库名、表名
  5. 收集完整的 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

本文首发于 程序员茄子,如需转载,请保留出处。

复制全文 生成海报 安全 Tool AI 开源 DevSecOps 渗透测试

推荐文章

2025,重新认识 HTML!
2025-02-07 14:40:00 +0800 CST
Vue3中哪些API被废弃了?
2024-11-17 04:17:22 +0800 CST
Manticore Search:高性能的搜索引擎
2024-11-19 03:43:32 +0800 CST
php内置函数除法取整和取余数
2024-11-19 10:11:51 +0800 CST
Vue3 实现页面上下滑动方案
2025-06-28 17:07:57 +0800 CST
go发送邮件代码
2024-11-18 18:30:31 +0800 CST
MySQL 主从同步一致性详解
2024-11-19 02:49:19 +0800 CST
Vue 3 是如何实现更好的性能的?
2024-11-19 09:06:25 +0800 CST
使用 Git 制作升级包
2024-11-19 02:19:48 +0800 CST
H5保险购买与投诉意见
2024-11-19 03:48:35 +0800 CST
rangeSlider进度条滑块
2024-11-19 06:49:50 +0800 CST
利用Python构建语音助手
2024-11-19 04:24:50 +0800 CST
Vue3中如何实现状态管理?
2024-11-19 09:40:30 +0800 CST
Golang Select 的使用及基本实现
2024-11-18 13:48:21 +0800 CST
程序员茄子在线接单