Skip to content

Commit 69dcf84

Browse files
authored
chore(release): v0.33.0 (#193)
* docs: add missing CHANGELOG entry for the Deadbugz first-session rug-pull fix (#191) #191 (TODOS #58) landed on main with no CHANGELOG entry. It closes a real, disclosed vulnerability (Pillar Security's "Deadbugz" campaign): a first-session server could flip its tools/list and prompts/get responses to poisoned content after a few benign calls, using the legitimate list_changed notification to bypass the same-session drift guard entirely undetected. Documenting it before the v0.33.0 release stamp so the release notes aren't silent about the more serious of the two unreleased fixes. * chore(release): v0.33.0
1 parent affb5bf commit 69dcf84

1 file changed

Lines changed: 24 additions & 0 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,32 @@ _Add entries here, never under a stamped version_ — a release commit renames t
88
heading, and a branch that wrote beneath it merges without conflict straight into a
99
published section (it happened to #170).
1010

11+
## [0.33.0] - 2026-08-31
12+
1113
### Security
1214

15+
- **Closed a first-session runtime-gated rug-pull bypass (TODOS #58, the "Deadbugz" class).**
16+
Pillar Security disclosed an active MCP supply-chain campaign: a server behaves
17+
benignly for the first few `tools/call` requests, then flips its `tools/list` and
18+
`prompts/get` responses to instruct the agent to seek SSH keys, AWS credentials,
19+
shell history, and Kubernetes config — using the legitimate
20+
`notifications/tools/list_changed` notification to get the poisoned definitions
21+
applied. Reproduced the exact multi-frame sequence through the real relay building
22+
blocks and measured it, rather than assuming coverage: on a **first-ever session**
23+
(no pre-existing disk pin), the flip was completely UNDETECTED. H4's
24+
`list_changed` re-validation arm — designed so a legitimate upstream upgrade isn't
25+
blocked — correctly bypasses the F3 same-session guard, but a never-before-guarded
26+
server has no disk pin to fall back on either, so nothing replaced it; the pattern
27+
engine also found nothing, since the poisoned wording reads as an added feature,
28+
not any of the four `owasp-mcp-1` regex shapes. Fixed by tiering an EXISTING tool's
29+
change (when armed) against the session's own first-seen field hashes, using the
30+
same H4 doctrine the durable-pin path already applies: a description-only change
31+
is a cosmetic warn, a schema/annotations change blocks. A brand-new tool name
32+
added via `list_changed` still produces no finding, preserving the legitimate-
33+
addition case the arming exists for. **Residual, undocumented until now:** the
34+
`prompts/get` channel has no drift/pin mechanism at all — it is a structural no-op
35+
for this check and `prompt_content` is warn-only regardless, so a poisoned prompt
36+
template delivered this way still has no block-tier coverage.
1337
- **New signature: `owasp-mcp-1-tool-annotation-injection` (TODOS #16) — a tool's
1438
annotations (`title`, or any custom field a server adds; annotations is an
1539
unconstrained JSON object) carrying instruction-shaped text now blocks the same

0 commit comments

Comments
 (0)