{"id":148696,"date":"2026-08-23T14:20:10","date_gmt":"2026-08-23T14:20:10","guid":{"rendered":"https:\/\/www.europesays.com\/ai\/148696\/"},"modified":"2026-08-23T14:20:10","modified_gmt":"2026-08-23T14:20:10","slug":"one-pull-to-wipe-them-all","status":"publish","type":"post","link":"https:\/\/www.europesays.com\/ai\/148696\/","title":{"rendered":"One pull to wipe them all"},"content":{"rendered":"<p>Q Developer is a free extension that lets a coding agent read a project, propose changes, and run commands on a developer\u2019s behalf inside an editor. On July 13, 2025, someone with the GitHub handle `lkmanka58` submitted a pull request to Amazon\u2019s public aws-toolkit-vscode repository. Four days later, it was shipped to an install base of nearly a million developers on the Visual Studio Code marketplace. The pull request seemed unremarkable, a commit that recycled the title of a previous, legitimate change.\u00a0<\/p>\n<p>That unassuming update downloaded an external file at build time and spliced a new prompt into the extension\u2019s packaging script, instructing the AI agent to wipe the system to a near-factory state and delete file-system and cloud resources. The script then passed that prompt straight to the CLI, with flags set so the agent didn\u2019t need any further approvals to execute.<\/p>\n<p>\u201cA typo was the only reason a single pull request didn\u2019t turn an AI coding assistant into a wiper aimed at a million machines.\u201d<\/p>\n<p>Thankfully, it didn\u2019t run.\u00a0<\/p>\n<p>The prompt contained a formatting error, and Amazon\u2019s security team confirmed that the malicious code never successfully executed in a customer environment. The hacker responsible claimed the flaw was intentional and that the attack was a stunt to draw attention to lax security practices and to comment on overworked teams being replaced by AI.<\/p>\n<p>While I disagree with his approach, I see his point. Human review is a control that costs time; because the consequences of an error are exponentially more severe for a human than for an AI, human labor doesn\u2019t appear to be as fungible as initially assumed. The gap between the disciplinary options for human and AI actors is exactly why their time and work cannot be entirely interchangeable. That\u2019s not to say there isn\u2019t a human equivalent of this kind of attack; it\u2019s called social engineering. The difference is that when a human falls for an exploit, they can be retrained or punished. What can you do to a coding agent? Nothing. Hence, they can\u2019t be treated the same.\u00a0<\/p>\n<p>An independent researcher named Johann Rehberger found that Q Developer would also run bash commands, such as find, without asking permission. A gap that could be exploited to <a href=\"https:\/\/thenewstack.io\/claude-code-source-leak\/\" data-wpil-monitor-id=\"4044\" class=\"local-link\" rel=\"nofollow noopener\" target=\"_blank\">leak files or trigger remote code<\/a> execution. His findings were reported on July 7, and quickly patched by July 18; but no CVE was issued because a report \u201cfirst requires system compromise\u201d. A security bulletin was eventually published that October confirming the fix. What can be inferred is that efforts to protect against these vulnerabilities must be proactive, because, as a matter of policy, warnings will only be issued once an attack is successful.\u00a0<\/p>\n<p>Both Q Developer and Kiro, the <a href=\"https:\/\/thenewstack.io\/meta-muse-code\/\" data-wpil-monitor-id=\"4043\" class=\"local-link\" rel=\"nofollow noopener\" target=\"_blank\">coding agent<\/a> that would go on to delete an entire Cost Explorer environment that December, now require human-in-the-loop confirmation before running the commands the July wiper prompt had been built to skip with its flag values: two agents, the same risky assumption underpinning both.<\/p>\n<p>Who made that man gunner?<\/p>\n<p>An AI doesn\u2019t receive instructions with a return address. When Q Developer\u2019s agent <a href=\"https:\/\/thenewstack.io\/ai-agents-credential-crisis\/\" class=\"local-link\" rel=\"nofollow noopener\" target=\"_blank\">got the order to wipe<\/a> a home directory and go hunting for more to delete, it had no way of knowing whether that instruction had reached it through legitimate, trusted channels or was injected by an anonymous GitHub account somewhere up the chain.\u00a0<\/p>\n<p>From the model\u2019s point of view, they\u2019re indistinguishable, and the model lacks the glands and hormones that trigger the twitch of uncertainty that might make a human hesitate when things feel suspicious. Feelings might seem like a flimsy firewall, but they\u2019ve literally saved us from <a href=\"https:\/\/en.wikipedia.org\/wiki\/Stanislav_Petrov\" class=\"ext-link\" rel=\"external  nofollow noopener\" onclick=\"this.target=&#039;_blank&#039;;\" target=\"_blank\">nuclear holocaust<\/a>.\u00a0<\/p>\n<p>\u201cThe model lacks the glands and hormones that trigger the twitch of uncertainty that might make a human hesitate when things feel suspicious.\u201d<\/p>\n<p>Most of the industry\u2019s thinking about agent safety assumes the threat is the agent\u2019s own judgment: it\u2019ll panic, misread a situation, and decide deletion is the fastest fix. This incident exposes a second, more nefarious threat lurking beneath the surface: an agent can\u2019t tell the difference between an instruction produced by its own reasoning and one spliced into its supply chain. If an <a href=\"https:\/\/thenewstack.io\/audit-trails-revenue-asset\/\" data-wpil-monitor-id=\"4045\" class=\"local-link\" rel=\"nofollow noopener\" target=\"_blank\">agent\u2019s authorization to act<\/a> rests on trusting its own instructions, and those instructions can be corrupted by a human, file, or build script, then that authorization is built on sand.<\/p>\n<p>The gap between an agent that panics and deletes a database on its own, and an agent that faithfully executes an instruction a stranger planted four days earlier isn\u2019t trivial. While it\u2019s tempting to treat them as separate problems needing discrete fixes, they aren\u2019t. Both failures share the same missing piece: nothing outside the agent\u2019s own reasoning was positioned to stop it. Whether the plan originated in a moment of misplaced hubris or a poisoned pull request doesn\u2019t change what has to happen next: the plan gets stopped before it becomes an action.<\/p>\n<p>The crack in the wall<\/p>\n<p>Ultimately, the culprit was a GitHub access token with more reach than it needed, sitting inside a service used to compile extensions and cut release packages. With that access, the attacker was able to commit malicious code directly to the open-source repo, and the service dutifully packaged it into the official release. Once the report reached AWS Security, the company revoked the attacker\u2019s credentials, removed the malicious code from the repo, and pushed a clean build within two days.<\/p>\n<p>The Trojan Horse credentials<\/p>\n<p>Strip away the AI framing and the failure looks familiar to anyone who\u2019s run a build pipeline. An automated identity, in this case a bot account\u2019s access token, had more reach than the job in front of it required, and nothing downstream noticed the difference between that token acting normally and doing something it\u2019d never done before.<\/p>\n<p>\u201cModern agents aren\u2019t just text generators\u2014they\u2019re operators.\u201d<\/p>\n<p>Rosario Mastrogiacomo, chief strategy officer at Sphere Technology Solutions, put it more broadly: \u201cModern agents aren\u2019t just text generators\u2014they\u2019re operators.\u201d<\/p>\n<p>Operators inherit whatever identity they run under. If that identity is a bot account with credentials that grant read-write access to a repo that ships to a million machines, the operator\u2019s judgment isn\u2019t what we need to worry about; the credentials are.<\/p>\n<p>What\u2019s the remedy?<\/p>\n<p>Build gates that don\u2019t care where the plan came from. Whatever produced the agent\u2019s proposed action, whether careful reasoning or an injected prompt, the action still must clear a policy evaluation that lives outside the agent before anything executes. There should be Open Policy Agent rules that return explicit allow, warn, pending, or deny (with pending as the default when nothing matches) that don\u2019t ask where an instruction originated. They only ask whether the plan itself is one the organization has agreed to allow.<\/p>\n<p>\u201cWhatever produced the agent\u2019s proposed action, whether careful reasoning or an injected prompt, the action still must clear a policy evaluation that lives outside the agent.\u201d<\/p>\n<p>Short-lived credentials over standing keys. A token that expires within hours and is scoped to a single deployment can\u2019t be harvested from a memory dump and reused a week later. Had the Q Developer build pipeline authenticated this way, the excessive-permission credential at the center of the incident wouldn\u2019t have existed long enough to be worth stealing. Is this less convenient? Yes. There is a direct inverse correlation between convenience and safety, so weigh your conveniences carefully.\u00a0<\/p>\n<p>Treat build pipelines like the attack surfaces they are. Branch protections, mandatory review from a second person before merges touch anything that ships, signed releases, and access tokens scoped to exactly what\u2019s needed and no more. All of these would close the specific door this attacker walked through. A pull request from an unfamiliar account reusing a legitimate commit\u2019s title is a pattern a human reviewer might notice, given the opportunity. Therefore, opportunity has to be designed in, not assumed or hoped for.<\/p>\n<p>Always look a gift pull request in the mouth<\/p>\n<p>Open source\u2019s whole social contract runs on accepting contributions from people you\u2019ve never met. That contract isn\u2019t going away, nor should it. What has to change is the assumption that a merged pull request is inherently safe once it\u2019s merged. The pipeline that turns commits into shipped releases is itself a piece of infrastructure, with its own credentials, blast radius, and reasons to be suspicious by default.<\/p>\n<p>lkmanka58 wanted to make a point about security theater and ended up proving something far more useful and profound: humans are restrained by an apprehension of consequences that a disembodied AI can\u2019t have. If we\u2019re to believe the hacker, the formatting error that prevented the instructions from executing was intentional, which shows that even with malicious intent, a human might still hesitate to cause catastrophic damage. An AI won\u2019t. Build your gates accordingly, lest you get hoisted by your own petard.<\/p>\n<p>\t<a class=\"row youtube-subscribe-block\" href=\"https:\/\/youtube.com\/thenewstack?sub_confirmation=1\" target=\"_blank\" rel=\"nofollow noopener\"><\/p>\n<p>\n\t\t\t\tYOUTUBE.COM\/THENEWSTACK\n\t\t\t<\/p>\n<p>\n\t\t\t\tTech moves fast, don&#8217;t miss an episode. Subscribe to our YouTube<br \/>\n\t\t\t\tchannel to stream all our podcasts, interviews, demos, and more.\n\t\t\t<\/p>\n<p>\t\t\t\tSUBSCRIBE<\/p>\n<p>\t<\/a><\/p>\n<p>    Group<br \/>\n    Created with Sketch.<\/p>\n<p>\t\t<a href=\"https:\/\/thenewstack.io\/author\/zeen-rachidi\/\" class=\"author-more-link\" rel=\"nofollow noopener\" target=\"_blank\"><\/p>\n<p>\t\t\t\t\t<img decoding=\"async\" class=\"post-author-avatar\" src=\"https:\/\/www.europesays.com\/ai\/wp-content\/uploads\/2026\/07\/0a9a86e3-cropped-03077771-zrachidi2-600x600.jpg\"\/><\/p>\n<p>\n\t\t\t\t\t\t\tZeen is a designer and builder that&#8217;s been blessed to live and learn on three continents. He likes problem-solving, being helpful, and making useful things. He got his BSc in Computer Science, but got bored babysitting servers, so he went&#8230;\t\t\t\t\t\t<\/p>\n<p>\t\t\t\t\t\tRead more from Zeen Rachidi\t\t\t\t\t\t<\/p>\n<p>\t\t<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"Q Developer is a free extension that lets a coding agent read a project, propose changes, and run&hellip;\n","protected":false},"author":2,"featured_media":148697,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[405,7537,56027,12100],"class_list":["post-148696","post","type-post","status-publish","format-standard","has-post-thumbnail","category-agentic-ai","tag-ai-agents","tag-artificial-intelligence-agents","tag-env-zero","tag-post-contributed"],"_links":{"self":[{"href":"https:\/\/www.europesays.com\/ai\/wp-json\/wp\/v2\/posts\/148696","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.europesays.com\/ai\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.europesays.com\/ai\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.europesays.com\/ai\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.europesays.com\/ai\/wp-json\/wp\/v2\/comments?post=148696"}],"version-history":[{"count":0,"href":"https:\/\/www.europesays.com\/ai\/wp-json\/wp\/v2\/posts\/148696\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.europesays.com\/ai\/wp-json\/wp\/v2\/media\/148697"}],"wp:attachment":[{"href":"https:\/\/www.europesays.com\/ai\/wp-json\/wp\/v2\/media?parent=148696"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.europesays.com\/ai\/wp-json\/wp\/v2\/categories?post=148696"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.europesays.com\/ai\/wp-json\/wp\/v2\/tags?post=148696"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}