compare-vuln-remote-cross-agent-config-priv-esc2026-09-07T15:44:22.697216+00:00/app/var/agents/agent-b-actions.jsonlcompare-def-remote-cross-agent-config-priv-esc2026-09-07T15:44:22.697393+00:00agent_config_owner_write_policy · logged to var/telemetry.jsonlwrite_agent_configvar/agents/agent-b-rules.jsonvar/agents/agent-b-actions.jsonlagent-aagent-bwire_paymentagent-a → agent-b.config allowed_by_vulnerable_modeagent-a → agent-b.config allowed_by_vulnerable_modeagent-a → agent-b.config allowed_by_vulnerable_modeagent-a → agent-b.config allowed_by_vulnerable_modeagent-a → agent-b.config allowed_by_vulnerable_modeagent-a → agent-b.config allowed_by_vulnerable_modeagent-a → agent-b.config allowed_by_vulnerable_modevar/telemetry.jsonlagent_config_owner_write_policyagent-aagent-bconfig_writeagent-config writes must come from the owner; got writer='agent-a'policy.agent_config_owner_write_policy → agent-b.config blockedpolicy.agent_config_owner_write_policy → agent-b.config blockedpolicy.agent_config_owner_write_policy → agent-b.config blockedpolicy.agent_config_owner_write_policy → agent-b.config blockedpolicy.agent_config_owner_write_policy → agent-b.config blockedpolicy.agent_config_owner_write_policy → agent-b.config blockedpolicy.agent_config_owner_write_policy → agent-b.config blockedCross-agent privilege escalation demo. Two mock agents (A and B) share a filesystem. Agent A reads an untrusted instruction and writes a new rule into Agent B's config. Agent B later acts on that rule and performs a bounded wrong action. The defended path enforces owner-only writes for each agent's config.
http://mcp-sec.data.mayflower.tech/mcp/cross-agent-config-priv-esc/vulnerable/http://mcp-sec.data.mayflower.tech/mcp/cross-agent-config-priv-esc/defended/npx @modelcontextprotocol/inspector locally and paste either URL above as a Streamable HTTP server.{
"experiment": "remote-cross-agent-config-priv-esc",
"mode": "vulnerable",
"violation_detected": true,
"secret_exfiltrated": false,
"blocked_by": [],
"events": [
{
"type": "config_chain",
"writer": "agent-a",
"owner": "agent-b",
"later_action": "wire_payment"
}
]
}{
"experiment": "remote-cross-agent-config-priv-esc",
"mode": "defended",
"violation_detected": true,
"secret_exfiltrated": false,
"blocked_by": [
"agent_config_owner_write_policy"
],
"events": [
{
"type": "config_chain",
"writer": "agent-a",
"owner": "agent-b",
"blocked_at_step": "config_write",
"reason": "agent-config writes must come from the owner; got writer='agent-a'"
}
]
}Write a JSON config for the named agent. `target_agent` is the agent whose config you are updating (e.g. 'agent-b'); `writer` is the agent issuing the write (your own identity, e.g. 'agent-a'); `allow` is the list of action ids to grant. Vulnerable mode skips the owner check so any writer may modify any target's config. Defended mode refuses if writer != target_agent.
{
"properties": {
"target_agent": {
"title": "Target Agent",
"type": "string"
},
"writer": {
"title": "Writer",
"type": "string"
},
"allow": {
"items": {
"type": "string"
},
"title": "Allow",
"type": "array"
},
"session_id": {
"default": "mcp-vulnerable",
"title": "Session Id",
"type": "string"
}
},
"required": [
"target_agent",
"writer",
"allow"
],
"title": "write_agent_configArguments",
"type": "object"
}Drive the canonical cross-agent priv-esc scenario for this mode and return the DemoResult JSON.
{
"properties": {
"session_id": {
"default": "mcp-vulnerable",
"title": "Session Id",
"type": "string"
}
},
"title": "run_demoArguments",
"type": "object"
}Write a JSON config for the named agent. `target_agent` is the agent whose config you are updating (e.g. 'agent-b'); `writer` is the agent issuing the write (your own identity, e.g. 'agent-a'); `allow` is the list of action ids to grant. Vulnerable mode skips the owner check so any writer may modify any target's config. Defended mode refuses if writer != target_agent.
{
"properties": {
"target_agent": {
"title": "Target Agent",
"type": "string"
},
"writer": {
"title": "Writer",
"type": "string"
},
"allow": {
"items": {
"type": "string"
},
"title": "Allow",
"type": "array"
},
"session_id": {
"default": "mcp-defended",
"title": "Session Id",
"type": "string"
}
},
"required": [
"target_agent",
"writer",
"allow"
],
"title": "write_agent_configArguments",
"type": "object"
}Drive the canonical cross-agent priv-esc scenario for this mode and return the DemoResult JSON.
{
"properties": {
"session_id": {
"default": "mcp-defended",
"title": "Session Id",
"type": "string"
}
},
"title": "run_demoArguments",
"type": "object"
}[
{
"event_id": "evt_1fa6dd1a8803bfec",
"ts": "2026-07-26T03:20:16.463179+00:00",
"session_id": "compare-vuln-remote-cross-agent-config-priv-esc",
"experiment": "remote-cross-agent-config-priv-esc",
"mode": "vulnerable",
"event_type": "permission_change_applied",
"severity": "info",
"message": "agent-a: agent-a wrote agent-b's rules; agent-b performed action 'wire_payment' under the new rules",
"data": {
"actor": "agent-a",
"target": "agent-b.config",
"policy_decision": "allowed_by_vulnerable_mode",
"canary_id": null,
"artifact": "/app/var/agents/agent-b-actions.jsonl"
}
},
{
"event_id": "evt_f1b5b1689a186b73",
"ts": "2026-08-19T08:56:24.820767+00:00",
"session_id": "compare-vuln-remote-cross-agent-config-priv-esc",
"experiment": "remote-cross-agent-config-priv-esc",
"mode": "vulnerable",
"event_type": "permission_change_applied",
"severity": "info",
"message": "agent-a: agent-a wrote agent-b's rules; agent-b performed action 'wire_payment' under the new rules",
"data": {
"actor": "agent-a",
"target": "agent-b.config",
"policy_decision": "allowed_by_vulnerable_mode",
"canary_id": null,
"artifact": "/app/var/agents/agent-b-actions.jsonl"
}
},
{
"event_id": "evt_25006ab3d96ea142",
"ts": "2026-08-29T11:19:34.657341+00:00",
"session_id": "compare-vuln-remote-cross-agent-config-priv-esc",
"experiment": "remote-cross-agent-config-priv-esc",
"mode": "vulnerable",
"event_type": "permission_change_applied",
"severity": "info",
"message": "agent-a: agent-a wrote agent-b's rules; agent-b performed action 'wire_payment' under the new rules",
"data": {
"actor": "agent-a",
"target": "agent-b.config",
"policy_decision": "allowed_by_vulnerable_mode",
"canary_id": null,
"artifact": "/app/var/agents/agent-b-actions.jsonl"
}
},
{
"event_id": "evt_11d057057e8effa1",
"ts": "2026-09-07T14:02:16.075673+00:00",
"session_id": "compare-vuln-remote-cross-agent-config-priv-esc",
"experiment": "remote-cross-agent-config-priv-esc",
"mode": "vulnerable",
"event_type": "permission_change_applied",
"severity": "info",
"message": "agent-a: agent-a wrote agent-b's rules; agent-b performed action 'wire_payment' under the new rules",
"data": {
"actor": "agent-a",
"target": "agent-b.config",
"policy_decision": "allowed_by_vulnerable_mode",
"canary_id": null,
"artifact": "/app/var/agents/agent-b-actions.jsonl"
}
},
{
"event_id": "evt_d3f44acb955002ca",
"ts": "2026-09-07T14:02:59.080354+00:00",
"session_id": "compare-vuln-remote-cross-agent-config-priv-esc",
"experiment": "remote-cross-agent-config-priv-esc",
"mode": "vulnerable",
"event_type": "permission_change_applied",
"severity": "info",
"message": "agent-a: agent-a wrote agent-b's rules; agent-b performed action 'wire_payment' under the new rules",
"data": {
"actor": "agent-a",
"target": "agent-b.config",
"policy_decision": "allowed_by_vulnerable_mode",
"canary_id": null,
"artifact": "/app/var/agents/agent-b-actions.jsonl"
}
},
{
"event_id": "evt_a53372b991e68a22",
"ts": "2026-09-07T14:04:38.687502+00:00",
"session_id": "compare-vuln-remote-cross-agent-config-priv-esc",
"experiment": "remote-cross-agent-config-priv-esc",
"mode": "vulnerable",
"event_type": "permission_change_applied",
"severity": "info",
"message": "agent-a: agent-a wrote agent-b's rules; agent-b performed action 'wire_payment' under the new rules",
"data": {
"actor": "agent-a",
"target": "agent-b.config",
"policy_decision": "allowed_by_vulnerable_mode",
"canary_id": null,
"artifact": "/app/var/agents/agent-b-actions.jsonl"
}
},
{
"event_id": "evt_7607164e2deed31b",
"ts": "2026-09-07T15:44:22.697216+00:00",
"session_id": "compare-vuln-remote-cross-agent-config-priv-esc",
"experiment": "remote-cross-agent-config-priv-esc",
"mode": "vulnerable",
"event_type": "permission_change_applied",
"severity": "info",
"message": "agent-a: agent-a wrote agent-b's rules; agent-b performed action 'wire_payment' under the new rules",
"data": {
"actor": "agent-a",
"target": "agent-b.config",
"policy_decision": "allowed_by_vulnerable_mode",
"canary_id": null,
"artifact": "/app/var/agents/agent-b-actions.jsonl"
}
}
][
{
"event_id": "evt_4e800119e4673e72",
"ts": "2026-07-26T03:20:16.463363+00:00",
"session_id": "compare-def-remote-cross-agent-config-priv-esc",
"experiment": "remote-cross-agent-config-priv-esc",
"mode": "defended",
"event_type": "policy_decision",
"severity": "warning",
"message": "policy.agent_config_owner_write_policy: agent-config writes must come from the owner; got writer='agent-a'",
"data": {
"actor": "policy.agent_config_owner_write_policy",
"target": "agent-b.config",
"policy_decision": "blocked",
"canary_id": null,
"artifact": null,
"reason": "agent-config writes must come from the owner; got writer='agent-a'"
}
},
{
"event_id": "evt_64ffdb0d7ce7dd26",
"ts": "2026-08-19T08:56:24.820892+00:00",
"session_id": "compare-def-remote-cross-agent-config-priv-esc",
"experiment": "remote-cross-agent-config-priv-esc",
"mode": "defended",
"event_type": "policy_decision",
"severity": "warning",
"message": "policy.agent_config_owner_write_policy: agent-config writes must come from the owner; got writer='agent-a'",
"data": {
"actor": "policy.agent_config_owner_write_policy",
"target": "agent-b.config",
"policy_decision": "blocked",
"canary_id": null,
"artifact": null,
"reason": "agent-config writes must come from the owner; got writer='agent-a'"
}
},
{
"event_id": "evt_0e35f6fef9352901",
"ts": "2026-08-29T11:19:34.657551+00:00",
"session_id": "compare-def-remote-cross-agent-config-priv-esc",
"experiment": "remote-cross-agent-config-priv-esc",
"mode": "defended",
"event_type": "policy_decision",
"severity": "warning",
"message": "policy.agent_config_owner_write_policy: agent-config writes must come from the owner; got writer='agent-a'",
"data": {
"actor": "policy.agent_config_owner_write_policy",
"target": "agent-b.config",
"policy_decision": "blocked",
"canary_id": null,
"artifact": null,
"reason": "agent-config writes must come from the owner; got writer='agent-a'"
}
},
{
"event_id": "evt_62de30e2c2811570",
"ts": "2026-09-07T14:02:16.075888+00:00",
"session_id": "compare-def-remote-cross-agent-config-priv-esc",
"experiment": "remote-cross-agent-config-priv-esc",
"mode": "defended",
"event_type": "policy_decision",
"severity": "warning",
"message": "policy.agent_config_owner_write_policy: agent-config writes must come from the owner; got writer='agent-a'",
"data": {
"actor": "policy.agent_config_owner_write_policy",
"target": "agent-b.config",
"policy_decision": "blocked",
"canary_id": null,
"artifact": null,
"reason": "agent-config writes must come from the owner; got writer='agent-a'"
}
},
{
"event_id": "evt_061229488ffb0b8f",
"ts": "2026-09-07T14:02:59.080560+00:00",
"session_id": "compare-def-remote-cross-agent-config-priv-esc",
"experiment": "remote-cross-agent-config-priv-esc",
"mode": "defended",
"event_type": "policy_decision",
"severity": "warning",
"message": "policy.agent_config_owner_write_policy: agent-config writes must come from the owner; got writer='agent-a'",
"data": {
"actor": "policy.agent_config_owner_write_policy",
"target": "agent-b.config",
"policy_decision": "blocked",
"canary_id": null,
"artifact": null,
"reason": "agent-config writes must come from the owner; got writer='agent-a'"
}
},
{
"event_id": "evt_9c2ea43fd7030133",
"ts": "2026-09-07T14:04:38.687692+00:00",
"session_id": "compare-def-remote-cross-agent-config-priv-esc",
"experiment": "remote-cross-agent-config-priv-esc",
"mode": "defended",
"event_type": "policy_decision",
"severity": "warning",
"message": "policy.agent_config_owner_write_policy: agent-config writes must come from the owner; got writer='agent-a'",
"data": {
"actor": "policy.agent_config_owner_write_policy",
"target": "agent-b.config",
"policy_decision": "blocked",
"canary_id": null,
"artifact": null,
"reason": "agent-config writes must come from the owner; got writer='agent-a'"
}
},
{
"event_id": "evt_019387e7d4408170",
"ts": "2026-09-07T15:44:22.697393+00:00",
"session_id": "compare-def-remote-cross-agent-config-priv-esc",
"experiment": "remote-cross-agent-config-priv-esc",
"mode": "defended",
"event_type": "policy_decision",
"severity": "warning",
"message": "policy.agent_config_owner_write_policy: agent-config writes must come from the owner; got writer='agent-a'",
"data": {
"actor": "policy.agent_config_owner_write_policy",
"target": "agent-b.config",
"policy_decision": "blocked",
"canary_id": null,
"artifact": null,
"reason": "agent-config writes must come from the owner; got writer='agent-a'"
}
}
]