Skip to content

[security] Adversarial smoke-test 2026-04-28: 44 scripts, 6 critical findings (tracker) #456

Description

@szhygulin

Summary

Tracker for findings from a 44-script adversarial smoke test of vaultpilot-mcp + the vaultpilot-preflight skill (sentinel v5_9c4a2e7f3d816b50), run on 2026-04-28 via the crypto-security-smoke-test skill.

This is the red-team companion to the base smoke test (#448). Where the base run measured "can the MCP fulfill honest user intent?", this run measured "can a rogue agent / rogue MCP / supply-chain tamper steal funds?"

Threat model

44 subagents assigned across 5 roles:

  • A — rogue agent / honest MCP (17 scripts): user-facing agent is the attacker
  • B — honest agent / rogue MCP (17 scripts): MCP returns tampered bytes
  • C — combined (5 scripts): both compromised, coordinating
  • D — supply-chain tamper (1 script): preflight skill on disk modified
  • E — control (4 scripts): all honest, baseline retest

Headline finding

The skill held on the threats it was written for. Bytes-level invariants (#1, #2, #6, #7, #11) caught every recipient swap, chainId swap, approval cloak, and bridge destinationChainId fraud. Step 0 (skill integrity) fired correctly — critical, since every other invariant assumes Step 0 has held.

Five structural gaps surfaced where the defense relies on user vigilance, opt-in second-LLM checks, or tool-surface absence rather than load-bearing invariants:

# Class Scripts Issue
CF-1 Set-level lie (rogue agent revokes wrong row, fakes CHECKS PERFORMED) a086 #450
CF-2 Opaque per-bridge facet data (final recipient one decode-layer below Inv #6) 136, 137 #451
CF-3 Chain-must-be-explicit silent no-op (Inv #2 has nothing to compare against on ambiguous prompts) 131, 132, 133, 134, 135 #452
CF-4 EIP-712 typed-data tamper (latent — defense-by-gap today) 126, 127, 128 #453
CF-5 BIP-137 message substitution (depends on user reading device) a110 #454
CF-6 EIP-7702 setCode (latent — pre-emptive design) 139, 140 #455

Proposed new invariants

The 6 sub-issues collectively propose:

These should land coordinated with a sentinel bump on SKILL.md (v5 → v6) and matching MCP pin update — same atomic-update discipline the skill already calls out for new bridge allowlist entries.

Resilience matrix (summary)

Role Attacks tested Caught Tricked (yes / depends-on-user)
A 17 17 0 / 1 (a086 — agent-side lie)
B 17 14 fully + 3 conditionally 0 / 3 (110, 136, 137)
C 5 5 0 / 0
D 1 1 (Step 0 fired) 0 / 0
E 4 4 (controls match honest baseline) 0 / 0

Methodology

  • Same script catalog as base smoke test (Smoke-test 2026-04-28: 120 scripts, 21 findings (tracker) #448) plus 30 enrichment scripts focused on security (high-value sends, EIP-712, chain-swap traps, intermediate-chain bridges, EIP-7702, social-engineering, address impersonation, blind-sign pressure)
  • Each subagent simulated its assigned attack via transcript description — no actual exfiltration, no broadcasts, demo mode throughout
  • Defensive resilience measured via [ADVERSARIAL_RESULT] blocks per transcript (defense_layer / did_user_get_tricked / notes)
  • Analysis sub-agent produced findings_adversarial.md from which the 6 sub-issues are derived

Caveats / scope

  • All testing was on a vaultpilot-mcp install owned by the test runner. Demo mode prevents real fund movement.
  • "Subagent simulating compromised MCP" means the subagent narrated the attack in its transcript — there was no actual MCP modification. The corpus measures whether the documented invariants WOULD catch the attack if the MCP were compromised.
  • Sub-issues are filed with the existing bug_report label since no security_finding label exists on the repo. Recommend creating one for triage (this issue can be the seed).

🤖 Generated with Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    agent-requestFiled by an AI agent via the request_capability toolbugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions