July 8, 2026 · Marcus Webb, Out of Control~6 min read
Somebody at Veracode had a good idea: hand the same 80 coding jobs to more than a hundred different AI models, then run the output through a security scanner and count what breaks. The number that came back was 45%. Nearly half the code these things wrote shipped with a hole from the OWASP Top 10 — the short list of ways software gets broken into. That part surprised people. Here's the part that should worry them more: it's been sitting at 45% for a year and change, no matter how many "smarter, safer" models got announced in between.
Half of it comes out with a hole in it
Let's be clear about what got tested, because the number's only useful if you know what it counts. Veracode didn't scrape live production apps. They gave the models a clean, controlled task — write this function — and checked the result against known vulnerability patterns. So 45% is not "45% of shipped code is getting hacked." It's closer to: hand the machine a fresh assignment, and about half the time it hands you back something with a latch left open.
Some latches it leaves open more than others. Against log injection — someone slipping fake lines into your logs — the code failed 88% of the time. Against cross-site scripting, XSS, the classic trick of smuggling a script into a web page, it failed 86%. Those aren't exotic attacks. They're the first two things anybody who's done security work would check for. And the language mattered, a lot. Java came out the worst by a wide margin, blowing the test more than 70% of the time. Python, C#, JavaScript sat lower, in the 38 to 45% range. Not good. Just less bad.
Across 100+ LLMs on 80 real coding tasks, 45% of generated code carried an OWASP Top-10 vulnerability; 88% failed to defend against log injection and 86% against XSS. Java failed over 70% of the time, while Python, C# and JavaScript sat at 38–45% — and the pass rate did not improve through 2025 into early 2026. Source: Veracode, "Spring 2026 GenAI Code Security Update," 2026. Framing: Kevin Kelly, Out of Control. A controlled completion-task benchmark, not a claim about shipped production code; one working engineer's read, not a verdict on any tool.
Why "wait for the next model" won't fix this
Everybody's instinct here is the same: give it a year, the models get better, the number drops. That instinct is the whole problem, and it comes from an assumption nobody says out loud. We built code review around the idea that a careful person wrote the thing. A person is slow. A person writes a few hundred lines a day, on a good day, and gets tired, and asks a coworker. So review became a spot-check — glance at it, trust the human did most of the thinking, catch the odd slip. That model held for forty years because the thing feeding it was a human hand.
Now the hand is a machine that emits more code, faster, than any reviewer can actually read. Kevin Kelly had a name for this decades ago in Out of Control: bottom-up generation outrunning top-down control. You can't inspect a grown system into being safe the way you inspect a machined part. A wristwatch, you can take apart and verify every gear. A garden, you can't — it grows faster than you can check each leaf, so you stop trying to inspect it and you manage the conditions instead. Software just crossed from the watch side to the garden side, and most shops are still holding a jeweler's loupe.
You can't inspect a grown system into safety
When the machine writes faster than any human can read, review stops being a spot-check on a trusted author. It has to become a test you run on the living thing — every time, no exceptions.
Stop trusting the author. Test the living thing.
So here's the shift, and it's not complicated, it's just a different place to put your faith. Old way: you trust the writer, so you glance at the output. New way: you trust nothing about where the code came from, and you test the running system, hard, on every change. That's the immune-system model, and Kelly leaned on it hard — a body doesn't keep itself healthy by having a supervisor inspect each cell as it's born. It grows a system that constantly probes what's already alive and kills what's wrong. You don't grow safety by looking harder at the moment of birth. You grow it around the thing, after, and you keep it running.
In plain shop terms: the security gate can't live in a person's eyeballs anymore. It has to live in tooling that runs on its own — the scanner, the test suite, the checks that fire on every commit whether the author was a person, a model, or your own tired self at 2 a.m. Treat all three the same. Assume none of them left the latches shut. The 45% isn't telling you the code is doomed. It's telling you the reviewer you've been counting on — the careful human upstream — quietly stopped being the one writing the code, and the review never got the memo.
What this means for you Monday morning
If you ship software, do one thing this week: find the place in your process where a human being is the security check, and assume that human is now rubber-stamping machine output they don't have time to read. Because they probably are. Then move the check into something that runs on its own — a scanner in the pipeline, a test that has to pass, a gate that doesn't get tired and doesn't trust the byline. Not because the AI is bad at coding. It's often fast and useful and fine. But fast and useful and fine is exactly the thing that walks a hole right past a tired reviewer at the end of a long day. The tools got faster. The old review didn't. Close that gap yourself, before someone else finds it for you.
Facts from Veracode, "We Asked 100+ AI Models to Write Code. Here's How Many Failed Security Tests." / "Spring 2026 GenAI Code Security Update" (2026): 100+ models across 80 tasks, 45% carrying an OWASP Top-10 flaw, 86% failing XSS, 88% failing log injection, Java worst at >70%, others 38–45%, flat across 2025 into early 2026. Framing from Kevin Kelly, Out of Control (bottom-up generation outruns top-down control; you grow safety around a living system, you don't inspect it in). Honest limits: 45% is a controlled completion-task benchmark, not a claim that 45% of shipped code is being hacked; this is a fast-moving field and one working engineer's read, not a verdict on any specific tool. AI-written code isn't doomed — the review process is what has to change.
你要是也发软件,这周就干一件事:找出你流程里、那个"由一个人来当安全关卡"的地方,然后假设这个人现在就是在给他根本没时间读的机器输出盖橡皮章。因为他多半就是。找到了,就把这道关挪进一个能自己跑的东西里——流水线上的扫描器、一道必须过的测试、一个不会累也不认署名的闸门。不是因为 AI 写得烂。它常常又快又好用,挺行的。可就是这个"又快又好用挺行的",最容易在长长一天的末尾,从一个累坏了的审查员眼皮底下,把一个口子大摇大摆地放过去。工具变快了,那套老审查没变。这道缝,你自己先把它合上,别等着让别人替你找出来。