Build1 distinct publisher3 min readPublished
A dev.to walkthrough on sandboxing LLM tool calls names old web-app failure modes and old web-app controls. The delta is when you apply them: at registration, not after the first exfiltration.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
Two of the controls in that walkthrough look redundant and are not. The tool registry rejects unknown tool names and validates parameters against a JSON Schema before anything runs, and the file-read handler then resolves the path again and refuses anything outside its data directory [9]. Read the schema and the reason for both becomes clear: the path pattern permits word characters, hyphens, slashes and dots [10], so `../../etc/passwd` matches it cleanly [2]. Schema validation constrains shape. The handler is the only layer constraining meaning.
The handler has its own soft spot. It compares resolved paths with a string prefix test rather than a path-component test, so `/var/app/data-old/secrets` satisfies the guard while sitting outside the directory the guard exists to protect, and a parameter of `../data-old/secrets` gets there through a regex that already allows dots and slashes [3].
The code sandbox has the same shape of near-miss, and it is arithmetic rather than judgement. The child process gets 50 MB of address space, 10 seconds of CPU and 10 file descriptors [13], under a default wall-clock timeout of five seconds [12]. At that default the CPU limit never binds, because the wall clock fires at half the allowance; the rlimit only becomes the operative control if a caller passes a timeout above ten seconds [1]. Three of those ten descriptors are the standard streams, leaving seven for the program's own opens [4]. And the comment attributing "no network sockets" to the descriptor cap is doing work the post assigns elsewhere: socket-level restriction is the seccomp filter it recommends as a separate, higher layer [5].
The layering is the argument. An allowlist of predefined, validated tool schemas is a declaration of everything the agent may ever do, enforced before a handler is reached [8]. A container with all capabilities dropped, no-new-privileges, a read-only root and a tmpfs is the assumption that the first layer will be wrong at some point [15]. gVisor or Firecracker is what you reach for when the code is user-supplied or the tenancy is shared [16]. None of that is novel security engineering; the post is explicit that these are the attack classes that have been hitting web applications for decades [7], now sitting behind a component whose output is executed rather than displayed [3].
What changes is where the review happens. In a text-only integration the worst outcome is a bad paragraph [2]. Once the model chooses tool calls, an injected document is an instruction set [4], an unconstrained shell tool is a remote command interface [5], and an HTTP tool without a domain restriction is an SSRF probe pointed at your own network [6]. Every one of those is decided at registration time by whoever wrote the schema, which is the only moment a human is reliably in the loop. The complaint the post opens with, that most tutorials stop before exploitation [17], is a documentation habit with a production tail: teams ship the loop and leave the parameter validation for later, and later is set by the first attacker who can get text into the agent's context.
Ranked by verification strength, evidence, and original report placement.
Giving a language model the ability to call tools (run code, query databases, browse the web) creates an autonomous execution surface.
A standard LLM integration is relatively contained: input goes in, text comes out, and the worst case is the model generating harmful content.
The agent loop runs user prompt to LLM to tool call decision to tool execution to result and back to the LLM; at the tool execution step the model's output directly drives system behaviour.
A prompt injection in a document the agent reads can redirect the agent to exfiltrate data.
An HTTP tool without domain restrictions can trigger SSRF against an internal network.
Follow any of these and your For You feed starts watching them — no settings page required.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Code fully quoted, effectiveness untested
Every mechanical claim in this cluster is checkable directly against source code reproduced in the post, which makes the descriptive layer strongly evidenced and even permits falsifying inspection of the guards. But there is exactly one source, self-published, with no tests, exploit reproductions, incident data or comparative evaluation behind its prescriptive claims, and the body is truncated mid-logging-section, so the assurance claims themselves rest on author assertion.
No adoption signal in supplied material
The cluster contains no release, deployment, benchmark, incident, pricing, licensing or usage disclosure. gVisor, Firecracker and Docker seccomp appear only as author recommendations, and the post reports no production use, user counts or third-party uptake of the patterns it presents.
Mildly overstated: labels exceed what the code enforces
The framing is modest overall — it explicitly calls the subprocess pattern 'a floor, not a ceiling' and points higher-assurance workloads at gVisor or Firecracker, which pulls the gap toward zero. It is pushed positive by three specific overstatements visible in the post's own listings: 'two independent layers' where the schema layer does not constrain traversal at all, a 'Path traversal blocked' guard that admits sibling directories sharing the prefix, and a descriptor cap annotated as '(no network sockets)' when the seccomp filter is the control that actually restricts socket syscalls. The unbacked superlative about the allowlist adds to the gap without dominating it.
Consultant-authored developer post, no product pitch in text
The item is published on a developer community platform under a consultancy byline in the URL path (dev.to/ayinedjimi-consultants), which gives a visible reputational and lead-generation incentive to present agent security expertise. Against that, the supplied text sells no product, service, pricing or proprietary tool — the technologies named are third-party and open (gVisor, Firecracker, Docker seccomp, jsonschema) — so the commercial pull on the content itself is limited and no stronger incentive is evidenced.
High confidence on mechanics, low on efficacy
Confidence is high that the described code and recommendations are as reported, since they are quoted in full, and high that the derived defects follow from that code. It is low on anything about real-world effectiveness or reach: one publisher, no adoption evidence, no testing, a truncated body, and prescriptive superlatives that cannot be checked against the supplied material.
security
Google's reference agent approved a $10,000 refund on a $149 order, on purpose1 distinct publisher
build
Before you spend quota on an agent skill, make it pass an eval harness1 distinct publisher
build
isinstance(amount, (int, float)) is not a number check: NaN walks through a withdrawal guard1 distinct publisher
build
Your REPL Is Not A Container: Put Free-Variable Checks In CI Before Generated Code Ships1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 26, 2026