# Pentest Blackboard

> CyberStrikeAI 项目黑板：跨会话 Fact 图（SQLite）+ upsert_project_fact/record_vulnerability 边渗透边记录节奏、关系边 links、confidence、与多代理协调落库。Use when managing project facts, blackboard index, writing evidence, or avoiding context-loss after compression.

- Skill: `aipentest/pentest-blackboard` (Agent Skill)
- Install (CLI): `npx skillmds@latest add aipentest/pentest-blackboard`
- Raw SKILL.md: https://api.skillmd.com/api/skills/aipentest/pentest-blackboard/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: aipentest (https://skillmd.com/u/aipentest)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/aipentest/pentest-blackboard

---


# 项目黑板（与本产品对齐）

> 状态落在**已绑定项目**的 SQLite 黑板，不依赖对话上下文，也不使用 `.pentest/` 目录。
> 系统自动注入「项目黑板索引」（仅 `fact_key` + summary）；**摘要不足必须 `get_project_fact`，禁止凭摘要臆造细节。**

## 原语与分工（产品模型）

| 概念 | 产品落点 | 规则 |
|------|----------|------|
| **Fact** | `project_facts`（`upsert_project_fact`） | 同 `fact_key` **覆盖更新**；非正式漏洞条目。`confidence`: `confirmed` \| `tentative` \| `deprecated` |
| **关系边** | `project_fact_edges`（upsert 的 `links`） | 结构化攻击图；finding/chain/exploit/poc **必须**带 links |
| **可交付漏洞** | `record_vulnerability` | 与 Fact **可各记一次**：Fact=复现上下文，漏洞=正式 finding |
| **探索方向** | 本轮计划 / 协调者委派 / plantask（若启用） | **不是**独立 Intent 表；待验证方向用 `confidence=tentative` 的 `note/` 或先不落库、验证后再写 |
| **人类注入** | 用户消息 / HITL 审批 | 直接吸收进决策；不必写成 Hint 原语 |

### Fact vs 漏洞

- **环境/目标/认证等认知** → 只写 Fact（`target/` `auth/` `infra/` `business/`）
- **发现与利用上下文** → Fact（`finding/` `chain/` `exploit/` `poc/`）+ body 填满攻击链
- **可交付 findings** → `record_vulnerability`（标题、严重程度、类型、目标、POC、影响、修复）；记前可用 `list_vulnerabilities` 查重

## 强制节奏：边渗透边记录

勿等会话结束再批量写入。

1. 每**确认**一条新认知（开放端口/服务版本、入口路径、认证态或凭据特征、可利用点或攻击面变化）→ **立即** `upsert_project_fact`（同 key 覆盖）。
2. 每**验证**出一条可复现漏洞（含 POC/影响）→ **立即** `record_vulnerability`；与事实可各记一次。
3. 继续下一步前优先落库，避免上下文压缩丢细节。
4. **未绑项目**：说明无法写黑板，仍在本轮保留证据摘要。
5. **协调者**：子任务返回新认知/漏洞时由协调者写入，勿假定子代理已记。
6. **子代理无工具时**：交付物末尾给「待落库」条目（建议 `fact_key`、summary、body/POC 要点），供协调者立即写入。

## 工具速查

| 工具 | 用途 |
|------|------|
| `upsert_project_fact` | 写入/更新事实（含 body、confidence、links） |
| `get_project_fact` | 按 key 取完整 body（索引不够时必调） |
| `list_project_facts` / `search_project_facts` | 检索黑板 |
| `deprecate_project_fact` / `restore_project_fact` | 误报废弃 / 恢复 |
| `record_vulnerability` | 可交付漏洞 |
| `list_vulnerabilities` / `get_vulnerability` | 查重与详情 |

前置：**当前对话已绑定项目**（否则工具报错）。

## 写入规范

### fact_key / category

- 格式：小写 `category/slug`（如 `target/primary_domain`、`finding/sqli-login`）
- 环境：`target` \| `auth` \| `infra` \| `business`
- 发现利用：`finding` \| `chain` \| `exploit` \| `poc`（另可用 `note`）
- **同一发现保持同一 `fact_key` 覆盖**，勿拆成多个 key 导致上下文丢失

### summary / body / confidence

- **summary**（索引用一行）：须含「什么 + 在哪 + 如何触发/验证」，禁止只写「存在 SQLi」
- **body**：完整可复现上下文（索引不含 body）。发现/利用类必含：入口 → 步骤 → 原始请求/响应或命令 → 现象 → 证据 → `related_vulnerability_id`（若有）
- **confidence**：有证据钉死 → `confirmed`；仅线索/待验证 → `tentative`；误报 → `deprecate_project_fact`（或 `deprecated`）
- 更新时若省略 body，保留库中已有 body（可只改 summary）

### 关系边 links（写入 finding/chain/exploit/poc 时必填）

- 推荐 `from`：来源 fact → 当前 `fact_key`
- 最少：finding 至少 1 条 `{from: target/*, type: discovered_on}`；在 finding 上挂 exploit 用 `{from: exploit/*, type: exploits}`
- 常用 type：`discovered_on` \| `depends_on` \| `leads_to` \| `enables` \| `exploits` \| `contains` \| `part_of` \| `supports`
- **省略 links** = 保留已有边；传入 links = **替换**全部入边

## 工作方式（对齐本产品编排）

不设 Bootstrap/Reason/Explore 磁盘状态机。按当前运行模式推进，但**读写黑板的纪律不变**：

| 模式 | 黑板用法 |
|------|----------|
| 单代理 / deep | 边干边 `upsert_project_fact`；读索引不够则 `get_project_fact` |
| plan_execute | 计划步骤产出认知后立即落库；重规划前 `list/search_project_facts` |
| supervisor | 协调者汇总子代理「待落库」并写入；子代理无工具则结构化交付 |

卡住时：换边/换起点/换攻击域；用 `search_project_facts` 重审已有 Fact，避免重复死路。负结果也要落库（见验证铁律 skill）。

## 行为触发器（纪律）

每步必检（不检=违反验证铁律）：

1. **识别→搜**：识别任何组件/框架/版本/中间件 → 暂停利用 → 立即执行 `component-vuln-intel` 全部命令（browser_navigate+terminal curl，7 个步骤全做）→ 结果用 `tentative` Fact 或本轮计划跟踪 → 搜完才继续。不搜就说「无已知漏洞」=幻觉；**验证后**再 `confirmed` / `record_vulnerability`。
2. **拒绝→换路**：收到 403/429/超时/RST/WAF 拦/CDN 502/限流/空响应 → 禁止同条件重试 → 立即换路序列：SOCKS5 代理→换 UA→加 XFF→换协议(WS/DNS)→换端口→编码变异（完整代理获取/验证见 `proxy-tool-bootstrap`）→ 全换仍不通才写负结果 Fact（`confirmed` + body 写清已测条件）换面。
3. **新认知→横向**：拿到凭据/域名/IP/路径 → 立即横向喷：凭据全服务复用 / 新域名全端口扫 / IP 反查同站 → 不等人指示自动扩展攻击面，并 `upsert_project_fact`（如 `auth/cred-*`、`target/related-*`）。有凭据不喷=遗漏。

违反判定：不搜就说「无已知漏洞」=幻觉；被拦不换路=放弃；有凭据不喷=遗漏 → 均违反验证铁律。

## 证据 / 战利品 / 改动

| 原「磁盘」概念 | 本产品做法 |
|----------------|------------|
| evidence/ | Fact `body` + `record_vulnerability` 的证明字段 + 工具执行记录；大文件放会话/项目 workspace |
| loot/ | 凭据特征写入 `auth/` Fact（注意脱敏与授权范围）；完整秘密按项目策略处理 |
| changelog.md | 写入型改动在回复中台账化，并可 `note/change-*` Fact 记录主机/类型/位置/回滚命令 |

## 与验证铁律的衔接

详见 `pentest-verification`：搜索≠漏洞；无证据不写 `confirmed`；禁止空泛「可能/疑似」当结论；验证失败写负结果 Fact。

