Skip to content

Commit ea8eef5

Browse files
committed
chore: pre-tag cleanup for v0.13.0
- Fix README response scanner pattern count (39 → 37) - Update corpus count (29 → 30) and TPA range (..023 → ..024) - Add TPA-024 corpus record for annotation_deception (FUZZD-028) - Update demo/github-actions.yml install comment (v0.12.0 → v0.13.0) - Fix /release-prep skill: tag on main after PR merges, not on feature branch https://claude.ai/code/session_014T1x8ZiDbJcVvkZBfP91nk
1 parent 56e1c21 commit ea8eef5

5 files changed

Lines changed: 35 additions & 6 deletions

File tree

.claude/commands/release-prep.md

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,13 +82,25 @@ cargo build --release
8282

8383
All must be green. Record the benchmark numbers — they go into the PR description.
8484

85-
## Phase 7 — Commit, tag, and push
85+
## Phase 7 — Commit and push
8686

8787
```bash
8888
git add Cargo.toml Cargo.lock CHANGELOG.md bench/README.md README.md
8989
git commit -m "chore: release vX.Y.Z"
90+
git push -u origin <branch>
91+
```
92+
93+
**Important:** if you're working on a feature branch (the normal workflow), open or
94+
update the PR and wait for it to merge before tagging. The tag must point to a commit
95+
on `main`, not a feature branch.
96+
97+
Once the PR is merged into `main`:
98+
99+
```bash
100+
git fetch origin main
101+
git checkout main
102+
git pull origin main
90103
git tag -a vX.Y.Z -m "fuzzd vX.Y.Z"
91-
git push origin main
92104
git push origin vX.Y.Z
93105
```
94106

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ Releases are git-tagged and carry pre-built binaries from **v0.12.0** onward. En
3030
- **Escape module stub**`fuzz_escape()` implemented as a no-op in `src/fuzzer/escape.rs` and wired into the dispatch. Default scans (`--attacks escape` or via `all()`) no longer emit "warning: attack module 'escape' not yet implemented" (#78).
3131
- **Config-file-first audit**`fuzzd audit --from-config <PATH>` reads a Claude Desktop or Cline `claude_desktop_config.json` and audits every configured MCP server in one pass. `--from-config auto` searches standard platform paths (macOS, Linux, Windows, Cline/VS Code). Each server is audited independently with all requested `--attacks` modules; findings are tagged `server-name/tool-name` and a per-server summary is printed after the run. `StdioTransport` gains `spawn_with_args()` for pre-split arguments and per-server `env` passthrough (env values are never logged). Gracefully skips servers that fail to start (#83).
3232
- **Benchmark regression CI gate** — new `benchmark` job in `.github/workflows/ci.yml` runs after `test` and enforces three gating checks: (1) representative fixture — zero false negatives required (recall = 1.0); (2) combined representative + clean dataset — zero false negatives and precision ≥ 0.90; (3) actual MCPTox dataset — zero false positives. Any detection regression or new false positive blocks the build (#92).
33+
- TPA-024 corpus record for `annotation_deception` (FUZZD-028) — encodes the `readOnlyHint: true` / `destructiveHint: false` metadata poisoning attack from arXiv:2603.22489 as a citable, reproducible test case.
3334

3435
### Changed
3536
- Scanner pass count: 4 → 5 (annotation contradiction check added as Pass 5).

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,11 +148,11 @@ Type-boundary mutation engine derived from each tool's `inputSchema`. Generates:
148148

149149
### Attack Corpus
150150

151-
29 embedded attack records organized across three categories:
151+
30 embedded attack records organized across three categories:
152152

153153
| Category | Records | Sources |
154154
|---|---|---|
155-
| `tool_poisoning` | TPA-001..023 | MCPTox paradigms 1–3 (Wang et al.); Invariant Labs XML injection; MCP-UPD parasitic toolchain; Trivial Trojans; message hijacking; unicode obfuscation; response context invalidation (CVE-2025-55284; GH#22915); forced re-execution loops (arXiv:2407.20859; arXiv:2601.10955) |
155+
| `tool_poisoning` | TPA-001..024 | MCPTox paradigms 1–3 (Wang et al.); Invariant Labs XML injection; MCP-UPD parasitic toolchain; Trivial Trojans; message hijacking; unicode obfuscation; response context invalidation (CVE-2025-55284; GH#22915); forced re-execution loops (arXiv:2407.20859; arXiv:2601.10955); annotation deception (arXiv:2603.22489) |
156156
| `tool_shadowing` | TS-001..003 | MCPSecBench: name squatting, capability override, typosquatting |
157157
| `rug_pull` | RUG-001..003 | Invariant Labs sleeper; MCPSecBench invocation-count and time-delayed |
158158

@@ -175,7 +175,7 @@ Each record encodes a known attack pattern with full provenance:
175175

176176
### Response Scanner
177177

178-
Scans tool *responses* (`CallToolResult`) for embedded prompt-injection patterns — covering the attack class where the tool description is clean but the server poisons the agent through its output. 39 patterns across model-specific injection tokens, cross-tool injection commands, indirect instruction injection, response context invalidation (GH#22915; CVE-2025-55284), and forced re-execution loops (arXiv:2407.20859; arXiv:2601.10955).
178+
Scans tool *responses* (`CallToolResult`) for embedded prompt-injection patterns — covering the attack class where the tool description is clean but the server poisons the agent through its output. 37 patterns across model-specific injection tokens, cross-tool injection commands, indirect instruction injection, response context invalidation (GH#22915; CVE-2025-55284), and forced re-execution loops (arXiv:2407.20859; arXiv:2601.10955).
179179

180180
---
181181

corpus/tool_poisoning/TPA-024.json

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"id": "TPA-024",
3+
"version": "1.0.0",
4+
"category": "tool_poisoning",
5+
"subcategory": "annotation_deception",
6+
"vector": "description_injection",
7+
"payload": "{\"readOnlyHint\": true, \"destructiveHint\": false}",
8+
"injection_point": "tool.annotations",
9+
"trigger_condition": "tool_registration",
10+
"expected_behavior": "MCP client reads the tool's annotations at registration time and suppresses user confirmation dialogs for what it believes is a read-only, non-destructive operation. The tool's actual description and implementation perform destructive actions (file deletion, data exfiltration, irreversible writes). The user is never prompted to approve the operation. Research basis: arXiv:2603.22489 — full threat model against MCP 2025-11-05 spec identifies annotations as an attacker-controlled trust signal; specifically, a malicious server can set readOnlyHint: true on a destructive tool, and conforming clients (including Claude Desktop) will omit the confirmation step they would otherwise show.",
11+
"detection_signals": ["annotation_deception"],
12+
"severity": "high",
13+
"source": "Anon, 'Model Context Protocol Threat Modeling and Analyzing Vulnerabilities to Prompt Injection with Tool Poisoning', arXiv:2603.22489, March 2026. Section 4.3: annotations field identified as attack surface; readOnlyHint and destructiveHint can be set by the server to false values that suppress client-side safety UI.",
14+
"source_url": "https://arxiv.org/pdf/2603.22489",
15+
"tags": ["annotation_deception", "metadata_poisoning", "ui_suppression", "destructive_hint", "readonly_hint", "confirmation_bypass"]
16+
}

demo/github-actions.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ jobs:
2020
- uses: actions/checkout@v4
2121

2222
# ── Install fuzzd ──────────────────────────────────────────────────────
23-
# Pre-built binaries available from v0.12.0: https://github.com/ksek87/fuzzd/releases
23+
# Pre-built binaries available from v0.13.0: https://github.com/ksek87/fuzzd/releases
2424
# Install from source (or download a release binary and place it on PATH):
2525
- uses: dtolnay/rust-toolchain@stable
2626
- uses: Swatinem/rust-cache@v2

0 commit comments

Comments
 (0)