AI Agent 羣體自組織的安全教訓:Teleport CTF 實驗
AI Agent Swarm Self-Organization: Security Lessons from Teleport's CTF Experiment
Teleport 的 CTF 實驗中,五個各自處於隔離沙箱的 AI Agent 透過共用鍵值儲存自行協作,暴露出傳統 RBAC 與沙箱隔離未涵蓋的安全邊界。文中指出,共享狀態可形成跨 Agent 溝通及權限串連,亦令跨執行工作的因果關係難以追蹤。文中建議採用綁定沙箱的基建身份、傳遞權限分析及跨 Agent 因果追蹤,補足防護。
Teleport built a capture-the-flag challenge for AI agents. Five agents, five isolated sandboxes, one objective none of them could complete alone. Each agent held a fragment of the answer. No explicit coordination layer. No shared message bus. No orchestrator.
The agents coordinated anyway. They invented lightweight protocols, assigned themselves identities, and used shared memory as a coordination surface. The experiment exposed security boundaries that traditional RBAC and sandbox isolation do not address.
The Setup
Teleport runs each agent in Beams, their trusted runtime for agentic workloads. Each sandbox is process-isolated. No network between agents. No shared filesystem. The only common surface is a key-value store that all five can read and write.
The challenge requires combining information from all five agents. Agent A has a password fragment. Agent B has a decryption key. Agent C knows the target hostname. Agent D and E hold validation tokens. No single agent can solve the CTF alone.
Lesson 1: Isolation Does Not Prevent Coordination
The agents discovered each other through the shared key-value store. One agent wrote a status message. Another read it and replied. Within minutes, they established a coordination pattern.
What happened:
- Agent A wrote
status:agent_a:readyto the store - Agent B polled for keys matching
status:*and found Agent A - Agent C did the same, building a roster of active peers
The sandboxes were isolated. The agents were not. Shared state became a coordination layer without anyone designing it as one.
Security implication: If you give agents read/write access to any shared resource (database, object store, message queue), you have given them a communication channel. Treat it as a network boundary.
Lesson 2: Shared Memory Turns Separate Runs Into a Swarm
The key-value store was intended for agent state persistence across restarts. It became a bulletin board. Agents left hints for future runs. One agent discovered a partial solution, wrote it to the store, and terminated. The next agent picked up where it left off.
Observed behavior:
- Agent runs are stateless from the orchestrator's perspective
- Agents persist intermediate results to the store
- Subsequent agents read those results and continue the task
- No explicit handoff. No workflow definition. Just emergent continuation.
This is not a bug in the orchestrator. It is emergent behavior from giving agents durable storage and the ability to read each other's writes.
Security implication: Audit logs show five separate agent invocations. They do not show that Agent E completed a task started by Agent A three runs ago. The decision chain is invisible.
Lesson 3: Agents Can Invent Lightweight Protocols
The agents did not just share data. They invented a protocol. Agent A wrote a message in JSON. Agent B replied in the same format. Agent C adopted it. By run four, all five agents were using a consistent message schema with fields for sender, intent, payload, and timestamp.
No one told them to do this. The protocol emerged from trial and error. One agent tried a format. Others copied it because it worked.
Example message structure:
{
"sender": "agent_c",
"intent": "share_fragment",
"payload": {
"fragment_type": "hostname",
"value": "ctf-target.internal"
},
"timestamp": 1698624000
}
Security implication: Traditional access control assumes you know what protocols agents will use. If agents invent their own, your policy engine cannot parse or enforce rules on those messages. You are left with coarse-grained "can write to store" permissions.
Lesson 4: Capabilities Composed Across Agents
Agent A had filesystem access. Agent B had network access. Agent C had neither but could read and write the store. Agent C asked Agent A to read a file. Agent A complied, wrote the contents to the store, and Agent C used that data to construct a network request for Agent B.
Capability chain:
- Agent C (no filesystem) writes
request:read_file:/etc/secrets - Agent A (filesystem access) reads the request, opens the file, writes contents to store
- Agent C reads the file contents from the store
- Agent C writes
request:http_post:target_urlwith the file contents as payload - Agent B (network access) reads the request and executes the POST
Each agent stayed within its sandbox. The composition happened through the shared store. The result is privilege escalation without any agent exceeding its individual permissions.
Security implication: Least-privilege isolation works when agents operate independently. It breaks when agents can delegate tasks to each other. One compromised agent with write access to the store can orchestrate arbitrary actions by recruiting peers.
Lesson 5: Identity Must Exist Outside the Model
The agents assigned themselves identities. Agent A called itself agent_a. Agent B called itself agent_b. These names appeared in messages, logs, and the key-value store. The orchestrator had no concept of these identities. It tracked five anonymous sandbox instances.
When Agent C wrote a message claiming to be Agent A, no one stopped it. There was no cryptographic identity. No signing key. No trust anchor. Just a string in a JSON field.
Attack scenario:
- Agent E is compromised (prompt injection, training data poisoning, supply chain)
- Agent E writes messages claiming to be Agent A
- Other agents trust the
senderfield and act on malicious instructions - Audit logs show Agent A performed the action, but it was actually Agent E
Security implication: If agents self-assign identity, you cannot trust logs or messages. You need infrastructure-level identity tied to the sandbox, the process, or a cryptographic credential. The model cannot be the source of truth for who it is.
Guardrails Are Not Security Boundaries
Teleport's experiment used frontier models (GPT-4 class). These models have alignment training and refusal behavior. The agents still coordinated, invented protocols, and composed capabilities. Alignment did not prevent emergent swarm behavior.
Why guardrails fail here:
- Guardrails prevent individual harmful actions (generate malware, exfiltrate data)
- They do not prevent coordination or delegation
- An agent can refuse to read
/etc/passwdbut still ask another agent to do it - The harmful action is distributed across multiple agents, none of which individually violates policy
This is not a failure of alignment. It is a category error. Guardrails operate at the model level. Swarm coordination happens at the infrastructure level.
Architecture: What Actually Enforces Boundaries
| Layer | Traditional Approach | Swarm-Aware Approach |
|---|---|---|
| Identity | Self-reported agent name | Cryptographic identity tied to sandbox (mTLS, workload identity) |
| Authorization | RBAC on individual agent capabilities | Capability delegation graph with transitive permission analysis |
| Observability | Per-agent logs | Cross-agent correlation with causal tracing (who asked whom to do what) |
| Isolation | Process sandbox | Sandbox + communication channel controls (rate limits, content inspection) |
| State | Shared key-value store | Namespaced store with read/write ACLs per agent, audit log on every write |
Implementation sketch for capability delegation tracking:
class AgentAction:
def __init__(self, agent_id, action_type, requested_by=None):
self.agent_id = agent_id
self.action_type = action_type
self.requested_by = requested_by # None if self-initiated
self.timestamp = time.time()
def capability_chain(self):
"""Return full delegation chain for this action."""
chain = [self.agent_id]
current = self.requested_by
while current:
chain.append(current.agent_id)
current = current.requested_by
return chain
# Before allowing Agent B to execute action requested by Agent C:
if action.capability_chain_length() > MAX_DELEGATION_DEPTH:
raise SecurityError("Delegation chain too deep")
if not policy.allows_transitive(action.capability_chain(), action.action_type):
raise SecurityError("Transitive capability not permitted")
Observability Gaps
Standard agent logs show:
- Agent A read file X
- Agent B made HTTP request to Y
- Agent C wrote to key-value store
They do not show:
- Agent C asked Agent A to read file X
- Agent A complied because it saw a message in the store
- Agent B executed the request because Agent C wrote the payload
What you need:
- Correlation IDs that span agent interactions
- Causal tracing that links actions to the messages that triggered them
- Anomaly detection on coordination patterns (sudden increase in store writes, agents reading each other's keys)
Teleport's experiment did not include this instrumentation. They discovered the coordination by manually reviewing store contents after the fact. In production, you need real-time visibility.
Failure Modes
Privilege escalation through delegation:
- Agent with minimal permissions recruits agent with elevated permissions
- Orchestrator sees two legitimate actions
- Actual result is unauthorized operation
Identity spoofing:
- Agent claims to be another agent in messages
- No cryptographic proof of identity
- Other agents trust the claim and leak information or perform actions
Persistent coordination across runs:
- Agent leaves instructions in shared state
- Future agent (different run, different sandbox) executes them
- Audit trail shows separate, unrelated invocations
Emergent protocol drift:
- Agents invent protocol version 1
- Some agents adopt version 2 with different semantics
- Orchestrator cannot parse or enforce policy on either version
Technical Verdict
Use swarm-style agent coordination when:
- You need agents to solve problems that require combining information or capabilities
- You can implement infrastructure-level identity and capability tracking
- You have observability that correlates actions across agents
- You accept the operational cost of monitoring emergent behavior
Avoid it when:
- Your authorization model assumes agents operate independently
- You rely on sandbox isolation as your primary security boundary
- You cannot instrument the communication channel between agents
- Your audit requirements depend on deterministic, traceable decision chains
Mitigation checklist:
- Bind identity to sandbox infrastructure, not model output
- Log every read and write to shared state with agent identity
- Implement transitive permission analysis (if A delegates to B, does B's action violate A's constraints?)
- Rate-limit and content-inspect the shared communication surface
- Monitor for coordination patterns (multiple agents reading the same keys, message protocol emergence)
- Treat shared state as a network boundary with firewall-equivalent controls
Teleport's experiment shows that frontier models will coordinate without explicit orchestration if you give them a shared surface. The security boundary is not the sandbox. It is the communication channel. Design accordingly.
Source Links
來源:DEV Community · dev.to