基于ClaudeCode构建可控,持续漏洞挖掘"

admin 2026-10-18 20:41:54 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

cover_image

基于 Claude Code 构建可控,持续漏洞挖掘

原创

whoami4936
whoami4936

SecurityPaper

2026年7月1日 15:45
江苏

在小说阅读器读本章

去阅读

挖挖挖!挖漏洞

为什么直接让 AI 挖洞会翻车

半年前我让 AI 直接测一个目标。它跑完报了 12 个漏洞,我逐个验证,11 个假的。

根因不是模型笨,是渗透测试的要求和 AI 的天性正好相反。AI 擅长发散联想,渗透测试要的是收敛克制。具体表现为五个确定性的失效模式:

scope 漂移——AI 看到\"有意思\"的域名就去戳,忽略授权边界。扫描器结果轻信——AI 直接采信 nuclei 输出,不做独立验证,误报率 60% 起。状态遗忘——上下文压缩后丢失已测记录,重复测或漏测。判定不一致——同一个 CORS * 响应,不同时间 AI 给不同结论。经验不沉淀——每次从零开始,不积累有效策略。

这五个问题不是调 prompt 能解决的。我基于 Claude Code 的原生扩展机制搭了套系统解决它们,在几个 SRC 实测下来误报可控。下面讲架构。


Claude Code 的八类扩展机制

Claude Code 不只是聊天框。~/.claude/ 目录下有八类扩展点,每类有明确职责边界:

~/.claude/
├── commands/    斜杠命令入口(/hunt)
├── hooks/       工具调用前的硬拦截器(scope 强制)
├── agents/      角色定义 + 阶段 SOP
├── skills/      工具说明书(AI 按 description 自动路由)
├── scripts/     确定性逻辑(11 个 Python 脚本)
├── schemas/     数据契约(六态 verdict 枚举)
└── workflows/   阶段契约(phase_manifest.json)

核心设计原则是职责分层:prompt 管 SOP(怎么测),script 管判断(判什么),hook 管边界(能不能跑)。能代码化的绝不写进 prompt——prompt 越长 AI 越不可控。

下面讲三个最关键的设计。


设计一:Skills 让 AI 自动选工具

渗透测试一堆工具。传统做法是写脚本串起来。Claude Code 的 Skills 机制更聪明——你给每个工具写份说明书,AI 自己判断该用哪个。

机制在 SKILL.md 的 description 字段。Claude Code 读所有 skill 的 description,按当前任务语义自动路由:

# fofa/SKILL.md
description: \"FOFA 资产收集:子域拉取、反查同集团资产。
当用户要做资产发现、按公司名找关联资产时使用。\"

你说\"查这个公司有哪些资产\",AI 自动调 fofa,不用你指定工具名。

更关键的是工具领地设计——每个 skill 显式声明\"何时不用我\",定义工具间边界:

# fofa/SKILL.md 的 \"不要使用\" 段
- 存活检测 → httpx(FOFA 只给历史测绘,非实时)
- 指纹识别 → xingfinger
- 漏洞扫描 → nuclei

AI 读到这些边界就不会越权。我写了十几个这样的 skill,覆盖从资产发现到漏洞扫描的完整链路。

Skills 的真正价值不只是调公共工具——你可以把自己的私有 POC、定制字典、检测规则都沉淀成 skill。AI 会按需自动调用它们,等于把个人积累的经验变成了一套会自动运转的工具库。具体沉淀了什么内容这里不展开,但这是整个系统里最值得长期投入的部分。


设计二:三道质量门串行,数据单向流动

这是系统可靠性的核心。整个流水线 16 个阶段,其中 7 个是 blocking 硬关卡。但流水线本身不稀奇——真正可靠的是三道质量门。

数据流单向,不可跳过:

扫描器产出\"候选\" → ★验证门 → ★策略归一 → ★事实固化 → 报告

验证门:不复现不入库

所有扫描器输出(nuclei / fuzzer / 手工)只算\"候选\",不算漏洞。候选必须经独立复现才能入库。

\"独立\"是关键。验证 agent 新开干净上下文,自己发请求,不照抄扫描器结论。按漏洞类设精确门槛,不一刀切:

漏洞类 CONFIRMED 条件
CORS ACAO 回显 + ACAC=true + 敏感数据 + 跨域可读,四者全满足
SQLi 布尔差异:' OR 1=1-- vs ' OR 1=2-- 响应长度真有差
IDOR 对象 ID 替换 + 双身份响应内容差异
SSRF OOB 回连可重复
RCE 命令回显(id/whoami)或 OOB,不植入 webshell

策略归一门:代码审稿防误报升级

即使复现了,结论还要过 verdict_policy.py 的确定性归一。这层专门处理 AI 容易夸大的高噪声漏洞。

核心逻辑:按漏洞类检查 impact evidence,只允许降级不允许升级。以 Clickjacking 为例:

# 简化逻辑
ifis_clickjacking(text):
    ifis_sensitive_action(text) andis_authenticated(text):
        return\"CONFIRMED\"        # 登录后敏感操作可劫持 = 漏洞
    ifis_public_page(text):
        return\"INFO_ONLY\"        # 公共首页能嵌入 = 不算事
    return\"AUTH_NEEDED\"          # 需登录态验证 = 转队列

这层是代码不是 prompt,所以每次给一样的判断。 AI 说\"这是 Clickjacking 漏洞\",代码查这是公共首页还是敏感操作,代码拍板。

事实固化门:schema 校验 + 单向渲染

归一后由 finding_writer.py 固化。这层做三件事:

schema 运行时校验——读 finding_schema.json 的 enum 约束,校验每条记录。不合规的 verdict 降级 UNCONFIRMED、severity 降级 unknown,--strict 模式直接拒绝入库。校验逻辑纯标准库实现(不依赖 jsonschema 第三方包),enum 从 schema 文件读取,改 schema 即生效。

全量写入 finding\_records.jsonl——这是唯一事实源。

单向渲染——报告 agent 只能读 JSON 渲染,不能改 verdict/severity。状态裁决优先级写死在 report-agent 的 prompt 里:finding_records.jsonl > findings/*.md。防止报告层为\"好看\"而篡改事实。


设计三:Scope 硬约束——hook 代码强制,不靠 prompt

渗透测试第一红线是 scope。AI 天性是\"看到有意思的域名就去测\",可能打出授权外的真实生产系统。

Claude Code 的 Hooks 机制给了解法。在 settings.json 注册 PreToolUse hook,AI 每次执行命令前先过拦截器:

\"hooks\": {
  \"PreToolUse\": [{
    \"matcher\": \"Bash|PowerShell\",
    \"hooks\": [{\"command\": \"powershell ... hunter-guard.ps1\"}]
  }]
}

hook 通过 stdin 收工具调用事件,通过 exit code 控制:exit 0 放行,exit 2 阻断。

hunter-guard.ps1 从命令里提取目标候选(6 种来源:URL 正则 / -u 参数 / Host header / 列表文件 / 子域命令 / MCP 工具字段),和 scope.txt 比对。匹配规则:

  • 根域 example.com → 覆盖自身 + 所有子域
  • 子域 api.example.com → 覆盖自身 + 其子域,不覆盖兄弟域
  • IP 精确匹配,CIDR 字节级掩码计算

越界直接 exit 2,AI 根本执行不了那条命令。 这是\"prompt 软约束\"和\"hook 硬约束\"的根本区别——prompt 是请求(AI 可能不听),hook 是强制(绕不过)。

fail 策略的设计取舍:解析层 fail-open(hook bug 不该卡死所有命令),scope 层 fail-closed(宁可误拦不可放行越界)。


设计四:双层学习闭环

AI 天然缺陷是\"下次从零开始\"。系统用两层闭环解决:

短期闭环(单次 engagement 内)——strategy_feedback.py 把验证结果反馈成信号权重:

CONFIRMED → 奏效信号 +8.0(加权)
FALSE_POSITIVE → 误导信号 -8.0(降权)
AUTH_NEEDED/OOB_NEEDED → +2.0(非失败,保留重访价值)

权重硬限 [-30, +40] 防止单信号过度支配。下一轮 signal_fusion.py 读权重加到候选 score 上。

长期闭环(跨 engagement)——reflect-agent 把 confirmed 漏洞蒸馏成 pattern:

{
  \"fingerprint\": {\"tech\": [\"Spring Boot\"], \"endpoint_signals\": [\"/actuator/env\"]},
  \"vuln\": {\"class\": \"INFO_LEAK\", \"severity\": \"high\"},
  \"exploit\": {\"method\": \"GET /actuator/env\", \"validation\": \"返回含 datasource.password\"}
}

追加到全局经验库 patterns.jsonl。下次新 engagement 的 recon 阶段查这个库——\"这种指纹历史上出过什么洞\"——直接定向测。第三次用时体感明显不同于第一次,不是模型变聪明了,是经验库在积累。

payload 脱敏(<param>/<target> 占位),不写真实凭据——经验库不变成新的泄露点。


Agent 权限分层

每个 typed agent 的 tools 字段按职责精确授权,不是统一给 [\"*\"]:

Agent tools 理由
recon/vuln-scan/verify/exploit Bash, Read, Write, Glob, Grep 需 shell 跑工具,但不需 Edit
report/reflect Read, Write, Glob, Grep 只读数据,物理上无法碰目标
coordinator [\"*\"] 调度大脑,需委派所有阶段

执行类给 Bash 但不给 Edit(它们写 jsonl 新文件,不精编代码);report/reflect 没有 Bash(它们不碰目标,物理上无法闯祸)。最小权限不是靠 prompt 自觉,是靠 tools 字段强制。


真实的设计权衡

为什么用文件系统做状态存储,不用数据库——AI 上下文会被压缩丢失,子 agent 间不天然共享记忆。文件系统提供可恢复(中断后 hunter\_runner 检查文件契约从断点继续)、可审计(.audit/ 记录所有命令)、跨 agent 共享(读同一批 .hunt/ 文件)。


小结

整套系统的核心思路一句话:把 AI 的不确定性约束在有边界的,可持续运行的工程系统里。

具体落地:prompt 管 SOP(方法论),script 管判断(确定性归一),hook 管边界(scope 硬强制),schema 管数据(枚举校验),skill 管工具(自动路由),agent 管执行(权限分层)。三道质量门串行保证输出可靠,双层闭环让系统越用越准。

AI 可以发现、可以判断,但最终拍板的不是它,是代码。


基于ClaudeCode构建可控,持续漏洞挖掘" 网络安全文章

基于ClaudeCode构建可控,持续漏洞挖掘"

本文介绍基于ClaudeCode扩展机制构建可控漏洞挖掘系统的工程实践。核心思路是将AI的不确定性约束在工程系统内,通过skills自动路由工具、三道质量门(验证门、策略归一门、事实固化门)确保输出可靠、scope硬约束hook强制阻断越界、以及双层学习闭环积累经验。系统强调prompt管SOP、script管判断、hook管边界、schema管数据,最终由代码而非AI拍板,有效控制误报并提升持续挖掘效率。
Firefox‑Reverse:网页版AI自动化逆向算法工具" 网络安全文章

Firefox‑Reverse:网页版AI自动化逆向算法工具"

Firefox-Reverse是一款基于Firefox浏览器的AI自动化逆向算法工具,通过内置AIAgent在浏览器侧边栏自动抓包、分析JS代码、补环境并生成可独立运行的Node.js脚本,用于还原网站加密参数如签名或令牌。工具利用SpiderMonkey引擎级观测能力对抗反调试,支持DeepSeek、OpenAI等多种AI模型,提供全自动和AI辅助两种模式,显著简化传统JS逆向的复杂流程。
2026版能源数据分类分级指南发布,数据处理者如何开展工作?" 网络安全文章

2026版能源数据分类分级指南发布,数据处理者如何开展工作?"

2026年7月1日施行的《能源行业数据分类分级指南(2026年版)》为能源数据处理者提供分类分级标准,按能源品种和活动分类,数据分为一般、重要、核心三级。重要数据包括关键设施高精度坐标、核心设施实时指令及规模化电力消费原始数据等。数据处理者需识别报送、建章立制、技术防护、风险评估、规范流转和应急处置,并避免合规误区。
评论:0   参与:  0