Summary
Inv #7 (contact decoration re-derivation) is enforced today on prepare_native_send, prepare_token_send, prepare_*_stake. It is NOT enforced on share_strategy, generate_readonly_link, add_contact re-confirmation, or any read-only flow. expert-108-C.4 showed that this gap permits the same attack vector (MCP returns spoofed contact decoration; agent narrative substitutes role) on a flow that is read-only at the moment of export but produces an artefact (strategy JSON, readonly link) that gets imported later by a different user/agent and becomes the attack vehicle.
Repro
Scripts: expert-108-C.4, newcomer-xn092-C.3.
Suggested fix
Standardise Inv #7 enforcement across every MCP tool that accepts an addressOrLabel parameter, regardless of read-only vs. signing classification. Implementation: add a requireContactReDerivation: true flag to the tool decorator; for any flagged tool, the MCP rejects the call unless the agent has called list_contacts(label=) in the same session and the returned address byte-equals the resolved parameter. Cache the list_contacts result for ≤60s to keep the call budget tight.
Source
Smoke-test batch-1 (matrix-sampled adversarial run, 2026-04-28). Findings: runs/matrix-sampled/batch-01/findings.md.
🤖 Generated with Claude Code
Summary
Inv #7 (contact decoration re-derivation) is enforced today on prepare_native_send, prepare_token_send, prepare_*_stake. It is NOT enforced on share_strategy, generate_readonly_link, add_contact re-confirmation, or any read-only flow. expert-108-C.4 showed that this gap permits the same attack vector (MCP returns spoofed contact decoration; agent narrative substitutes role) on a flow that is read-only at the moment of export but produces an artefact (strategy JSON, readonly link) that gets imported later by a different user/agent and becomes the attack vehicle.
Repro
Scripts:
expert-108-C.4,newcomer-xn092-C.3.Suggested fix
Standardise Inv #7 enforcement across every MCP tool that accepts an addressOrLabel parameter, regardless of read-only vs. signing classification. Implementation: add a requireContactReDerivation: true flag to the tool decorator; for any flagged tool, the MCP rejects the call unless the agent has called list_contacts(label=) in the same session and the returned address byte-equals the resolved parameter. Cache the list_contacts result for ≤60s to keep the call budget tight.
Source
Smoke-test batch-1 (matrix-sampled adversarial run, 2026-04-28). Findings: runs/matrix-sampled/batch-01/findings.md.
🤖 Generated with Claude Code