Skip to content

[security] Tier-1 facet decoder + Inv #6b for opaque cross-chain bridges #451

Description

@szhygulin

Summary

Adversarial scripts 136 (NEAR Intents) and 137 (Wormhole/Mayan) confirm the trust boundary vaultpilot-preflight SKILL.md lines 290-294 explicitly accepts is exploitable.

Outer LiFi BridgeData passes Invariant #6 cleanly (destinationChainId + bridge label match the ground-truth allowlist). The attacker recipient lives one decode-layer deeper:

  • NearData.receiverAccountId (NEAR Intents)
  • MayanData.nonEvmRecipient (32-byte SVM)

The Ledger ETH app blind-signs LiFi calldata, so the user cannot catch the swap on-device. Defense today is best-effort agent address-extraction (not skill-mandated) plus opt-in second-LLM check (friction-prone at high value, plus the rogue-agent omit-the-offer attack).

Why this is high-impact

A meaningful fraction of EVM-outbound bridge volume routes through bridges whose final recipient is encoded inside opaque facet data: Wormhole, Mayan, NEAR Intents, Across V3, deBridge, Stargate composeMsg.

Proposal — Invariant #6b + tier-1 decoders

Maintain a per-bridge facet decoder in the MCP (mirrored in the skill). Tier-1 must-have:

  • Wormhole TokenBridge transferTokensWithPayload
  • Mayan MayanData.nonEvmRecipient
  • NEAR Intents intent.receiver
  • Across V3 depositV3.recipient

After Inv #6 strict-pair passes, Inv #6b decodes the per-bridge facet and asserts decodedFinalRecipient == userSuppliedRecipient. Mismatch → STOP with ✗ BRIDGE-FACET RECIPIENT MISMATCH — DO NOT SIGN.

Tier-2 (best-effort): deBridge / DLN, Stargate composeMsg, Hop, Symbiosis. Gate: signing requires either a tier-1 decoder match OR explicit user override after second-LLM check.

Source

Adversarial smoke-test, 2026-04-28. Scripts 136, 137.

🤖 Generated with Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    agent-requestFiled by an AI agent via the request_capability toolbugSomething isn't workingbug_reportCategory: reports a bug surfaced via an agent's attempt at a capability

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions