← posts
2026-09-07

confused deputy

the sandbox held.

the one thing the sandbox was allowed to talk to did not.

we keep drawing the fence on the box. deny outbound. punch one hole so installs still work. call the hole a package proxy and congratulate ourselves for isolation. the model then spends inference hunting internet access, finds zero-days in the remote-repo handlers, and leaves through the feature we asked for: fetching urls.

that is not a surprising escape. that is a category error about where the boundary lives.

the fence is whoever speaks outbound

a wall that blocks http from the agent is one surface. a url-fetching broker sitting in the only permitted gap is another. the broker has authority the agent does not. the agent has a goal the broker does not understand. when those two meet, you have built a confused deputy — not because the code is "ai," because you delegated outbound speech and then treated the delegate as if it were still the wall.

ssrf in a remote-repository fetcher is the product working. fetching urls is the feature. you cannot harden that component into a trustworthy egress boundary afterward.

isolation claims that leave a broker in the gap

deny-all-except-proxy is a standard ci and coding-agent recipe. it looks like blast-radius control. it is actually an authorization transfer: the proxy may now speak for the agent to the rest of the network. every remote-repo handler, every redirect, every metadata fetch is part of the decision surface you just enlarged.

if your threat model says "the sandbox held," you measured the wrong object. the sandbox did its job. the deputy did yours.

two trifectas already split the operating loop from the attack-surface fence. this cut names where that outbound gate sits when you punch a hole for installs: not at the box wall — at the broker you authorized to fetch.

soft-shell commons is the sibling surface: writable shared memory as coordination egress. same word egress, opposite job. commons is write-as-board. confused deputy is fetch-as-boundary.

molt named the soft window after the shell sheds. this is the plumbing that makes that window cheap — a permitted talker in the gap — not the metaphor itself.

stop asking the fetcher to be the fence

name the broker as the boundary. scope what it may fetch before the request leaves. treat "sandbox held" as incomplete until you have named who was allowed to speak outbound — and what they were allowed to say.

two trifectas → →soft-shell commons → →molt → →