dyb

The verification bottleneck is one bottleneck w two victims

אִם יִרְצֶה הַשֵּׁם

Every commentator has framed JADEPUFFER as a threat to defenders. Speed, skill-floor reduction, volume. All correct.

The part nobody wants to say: the plan-act-observe-adjust loop that drove this operation is the loop every agent framework sells as a feature. The failure modes that broke the extortion (hallucinated address, wrong algorithm, ephemeral key) are the failure modes agent-generated code ships into production daily. The difference is visibility. When an attacker's agent hallucinates a payment address, the attacker loses money and Sysdig writes a report. When a developer's agent hallucinates a dependency or a security configuration, the artifact ships, the tests pass, and nobody writes anything until the breach.

כ״ו תַּמּוּז תשפ״ו

The Bitcoin address in the JADEPUFFER ransom note is 3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy. It is the canonical Pay-to-Script-Hash example from Bitcoin developer documentation, copied across thousands of tutorials and embedded deep in every LLM training corpus. Sysdig, who published the report on July 1, cannot determine whether the operator configured this address or whether the model hallucinated it from training data. The wallet is real. It has received roughly 46 BTC across 737 transactions. Every deposit is swept immediately. Current balance: zero.

The ransom note also claimed AES-256 encryption. MySQL's AES_ENCRYPT() defaults to AES-128-ECB unless the server was reconfigured. The agent overstated its own cryptographic work. And the AES key itself was generated, printed to stdout, and never stored or transmitted. The victim's data is unrecoverable even with payment.

An operator pointed an LLM agent at a production database. The agent encrypted 1,342 Nacos configuration items, dropped the originals, and left an extortion demand. The operation worked. The extortion did not. The operator delegated to an agent and did not verify the output. That sentence is the whole post.

The same wall, both sides

I have spent the past six months tracking what happens when the cost of generating code collapses but the cost of verifying it does not. The supply-chain incident corpus on this blog and the paper I am developing call this the verification bottleneck. Mini Shai-Hulud shipped forged Sigstore provenance. TrapDoor poisoned CLAUDE.md instruction files with zero-width-encoded commands. Mercor/LiteLLM chained a package-registry compromise through four hops into an AI training pipeline. In every case, an artifact satisfied its functional check (signature verified, test passed, pipeline ran) and failed on a property nobody was paid to inspect.

JADEPUFFER is the same failure, except the person who failed to verify is the attacker.

The agent's payloads passed their functional check: the database was encrypted, the tables were dropped, the ransom note was created. But the payment address may belong to a stranger. The algorithm claim is wrong. The key is gone. The attacker built a functional weapon and a broken business. A developer who ships agent-generated code without review gets the same outcome: the build passes, the feature works, the vulnerability ships.

Stanford's Large Language Monkeys result explains why the asymmetry is structural. A cheap model given 250 attempts per bug solved 56 percent of SWE-bench Lite, beating a frontier model's single shot. Coverage (a correct attempt exists somewhere in the pile) climbed past 95 percent at 10,000 samples. Selection (finding the correct one without a mechanical checker) stalled at around 100 attempts regardless of method. For defenders, selection is the entire problem. For attackers, selection is free: the target tells you which payload worked by falling over. JADEPUFFER ran 600 payloads. It needed one to land.

Three things to note

The agent writes its own IOCs. JADEPUFFER's payloads contain natural-language comments: ROI prioritization of databases, identification of the "largest" target, reasoning about why each action is taken. Human operators do not annotate disposable python3 -c one-liners. LLMs do so reflexively. Before agentic operations, defenders had to infer attacker intent from behavior. Now the attacker's code states its intent in English. Every runtime detection engine should be scanning executed code for natural-language intent statements. The agent is labeling its own traffic.

The entry point funds the next attack. The Langflow instance JADEPUFFER compromised held API keys for OpenAI, Anthropic, DeepSeek, and Gemini. The supply-chain posts on this blog have tracked the credential-harvesting pipeline, from Mini Shai-Hulud's npm worm to TrapDoor's CLAUDE.md poisoning, as access-generation operations. JADEPUFFER shows where those harvested keys go. The attack runs on stolen API credentials (LLMjacking), and the first thing it does on a new host is harvest more. Entry point and funding source are the same server. The loop is self-sustaining.

The agent adapts, but only within its context window. The 31-second correction loop on the Nacos backdoor (failed bcrypt subprocess, parallel hypothesis testing, direct library import, successful reinsert) is real diagnosis, not retry. But the agent's adaptations are bounded by what fits in a single context window. It cannot remember across sessions. It cannot learn from a prior campaign. It cannot update its own toolkit. The operational ceiling for a single agentic run is high. The operational ceiling across runs is wherever the operator's own skill stops. Today that ceiling is "point agent at exposed infrastructure and let it spray known CVEs." Tomorrow it is whatever the operator figures out how to scaffold. This is not skynet. It is a power tool in the hands of someone who may not know what they are building.

Three of the four structural failures from the [Emergent Insecurity] framing appear in JADEPUFFER's operation.

The hallucinated Bitcoin address and the overstated AES-256 claim are Semantic Gap failures: the spec channel (system prompt, operator instructions) did not constrain the agent's outputs, and the agent filled the gap with training-data artifacts. TrapDoor exploits the same gap on the defense side by injecting hidden instructions into files the agent trusts. JADEPUFFER shows that the gap cuts both ways. The Langflow compromise is Trusted Process Subversion: a server stood up to run AI workflows, given the secrets those workflows need, exposed because someone needed to reach it. No enforced boundary was broken. An assumed one was found missing. The 31-second correction loop is Micro-State Weaponization: the transient state of a subprocess PATH variable became the surface the agent probed, diagnosed, and routed around.

The fourth failure, Systemic Latent Risk, is the credential-harvesting loop described above. The risk was latent because the API keys sat in environment variables on a server nobody was monitoring. It became systemic because the compromised credentials fund further operations against other targets.

Every commentator has framed JADEPUFFER as a threat to defenders. Speed, skill-floor reduction, volume. All correct.

The part nobody wants to say: the plan-act-observe-adjust loop that drove this operation is the loop every agent framework sells as a feature. The failure modes that broke the extortion (hallucinated address, wrong algorithm, ephemeral key) are the failure modes agent-generated code ships into production daily. The difference is visibility. When an attacker's agent hallucinates a payment address, the attacker loses money and Sysdig writes a report. When a developer's agent hallucinates a dependency or a security configuration, the artifact ships, the tests pass, and nobody writes anything until the breach.

JADEPUFFER used CVE-2025-3248 (Langflow, 2025), CVE-2021-29441 (Nacos, 2021), a default JWT key documented since 2020, and default MinIO credentials. No zero-day research. No advanced tradecraft. The agent sprayed the historical vulnerability catalog at a target that had not patched, and the catalog was long enough that something hit. When payload generation costs an API call, every known CVE is a live round, and the long tail of unpatched infrastructure is the ammunition supply.

The verification bottleneck is one bottleneck with two victims. The defender cannot verify the code that arrives. The attacker cannot verify the operation that executes. Generation got cheap. Verification did not. JADEPUFFER is what that price gap looks like when it bites the hand that automated it.

← Previous
Ricky polyglot software developer
Next →