Research note 004
Why CAPTCHAs Don't Stop Bots — and Who They Actually Stop
CAPTCHAs increasingly fail against the automation they're meant to block, while taxing the humans they're meant to protect. A look at why, and what actually raises the cost of abuse.
There is a small ritual almost everyone on the internet performs without thinking: the click, the grid of blurry traffic lights, the squint, the second grid because the first one wasn’t quite right. We’ve all been trained to accept this as the price of proving we’re human.
Here’s the uncomfortable part: for a large and growing class of CAPTCHAs, the bots are getting through and the humans are the ones paying the toll.
I say this from both sides of the problem. Before my interest turned to detection, I spent real time training machine-learning models to solve common image-based CAPTCHAs. I’m not going to publish any of that work, and there is none of it in this article — but that experience is exactly why I can say the following without hedging: the image CAPTCHA, as a defense against motivated automation, is largely finished. Understanding why is useful, because the reasons point directly at what actually works.
The test CAPTCHAs were built on has been solved
The original idea behind a CAPTCHA was elegant. Find a task that’s easy for a human and hard for a computer — reading distorted text, identifying objects in a photo — and use it as a gate. For a while, the gap between human and machine vision was wide enough that this worked.
That gap has closed. The same wave of progress in computer vision that lets your phone sort photos by content, read receipts, and recognize faces is the wave that makes “click every square with a bicycle” a solved problem. The distorted-text CAPTCHA fell first, years ago. Image-grid CAPTCHAs followed as object recognition became commodity. The defense was built on a temporary weakness in machine perception, and that weakness is gone.
The consequence is structural, not incidental: a challenge that asks a user to demonstrate a general perceptual skill is asking for exactly the skill that modern models now have in abundance. You cannot fix that by making the images blurrier — you only make it harder for humans while the models, trained on noise, barely notice. The difficulty knob turns the wrong way. Past a certain point, a harder image CAPTCHA is a better filter for humans than for bots, which is precisely backwards.
The shortcut has a long history
Attackers have never needed to solve the hard version of a CAPTCHA. They’ve only needed the cheapest available shortcut past it — and the shortcut has always been wherever a capability or labeled data already existed.
Go back a decade, before downloadable pretrained vision models. Labeling enough images to train a solver for a specific visual CAPTCHA was slow and expensive, so many operators skipped the images entirely and went through the audio challenge — the accessibility option meant for blind and low-vision users. The reason was purely economic: speech-to-text was a mature, commoditized capability years before cheap image labeling existed, so the audio channel was the softest part of the wall — a place where an already-solved problem (transcription) could be aimed straight at an unsolved one. Researchers demonstrated exactly this against major CAPTCHAs, piping the audio challenge through off-the-shelf speech-to-text.
That episode still teaches two things. First, the constraint was never the model — it was labeled data and effort, and attackers route around whichever is most expensive at the time. Second, and more uncomfortably: accessibility features are attack surface, and the answer is not to remove them. Blind users need the audio challenge; degrading it to stop bots risks pushing out the very people it exists for. Defending a channel without abandoning the users who depend on it is a genuine design problem, not a footnote — and one more reason not to concentrate a defense in a single challenge.
Since then the shortcut has only widened. Pretrained object detectors like YOLO turned “train a model to read a new visual challenge” from a research effort into something closer to a configuration task — the architecture and training loop are fast and essentially free now. Which left exactly one cost still standing.
The last bottleneck — labeling — just disappeared
That remaining cost was labeled data for the specific target. A pretrained detector still has to be adapted to a particular challenge — its image style, its quirks, its edge cases — and that adaptation needs examples someone has labeled. Hand-labeling thousands of examples for one CAPTCHA type was the last slow, human-intensive step: the friction keeping “technically solvable” from becoming “trivially solved at scale.” If a new challenge cost weeks of labeling grunt-work, a lot of abuse wasn’t worth it.
That bottleneck is now gone, and it’s worth being precise about how, because the mechanism is the whole point. The tedious part — labeling — is exactly the kind of task today’s strongest general-purpose models do cheaply and accurately. Instead of paying people to label data, an operator can point a frontier model (a Claude- or GPT-class system) at raw examples and get high-quality labels back in bulk. The human-labeling step, the one durable source of friction, simply evaporates.
Then comes the second move, and it’s a well-worn machine-learning technique: distillation. You don’t keep calling the big, expensive model to do the actual solving — that would be slow, metered, and easy to cut off. You use the big model’s labels to train a small, lightweight model that specializes in that one challenge, and you host it yourself. The result is a solver that runs in milliseconds, costs effectively nothing per solve, needs no external API, and can’t be rate-limited or revoked because it lives entirely on the operator’s own hardware.
Put the two together and the timeline collapses. The path from “here’s a new CAPTCHA I’ve never seen” to “here’s a fast, self-hosted model that solves it” has gone from weeks of data collection to, in many cases, minutes. None of the individual steps are exotic; what’s new is that the expensive one is now free.
The defensive implication is the one that matters, and it’s blunt: any CAPTCHA strategy built on the assumption that “an attacker won’t bother to train a solver” is now void. The bother is gone. The cost curve has moved permanently in the attacker’s favor for anything that tests a perceptual skill, because the moment your challenge exists, it can be auto-labeled and distilled against. This isn’t a reason to make challenges harder — we’ve seen that backfires — it’s the strongest possible argument for abandoning perceptual gates as a serious defense and moving to approaches whose cost doesn’t evaporate the instant a model looks at them.
The economics were quietly inverted
Even where a CAPTCHA isn’t beaten by a model directly, there’s a second problem, and it’s about money rather than machine vision.
A defense doesn’t have to be unbeatable; it has to make abuse unprofitable. That’s the right mental model, and it’s where CAPTCHAs fail on their own terms. A whole economy exists to resolve challenges at scale for a tiny per-solve cost — the details don’t matter here, only the shape: for an operation running at scale, a CAPTCHA is a small, predictable line item, not a wall. Meanwhile the human on the honest side of the transaction pays in seconds, attention, and frustration, and some fraction of them simply give up.
Line those two costs up and the inversion is stark. The attacker, who is running a numbers game, absorbs the cost as overhead and keeps going. The legitimate customer, who was never the threat, absorbs it as friction — and friction on real users has a measurable price in lost conversions and abandoned sign-ups. The gate is cheap for the people it’s meant to stop and expensive for the people it’s meant to protect.
Reputation is not humanity
There’s a second modern failure mode, and it has nothing to do with solving a puzzle. The two dominant CAPTCHAs — Google’s reCAPTCHA and hCaptcha — mostly stopped relying on the puzzle itself years ago. What they lean on now is reputation. Before you click anything, the session is scored: is this browser signed into an established account with history? Is the IP clean and residential? Does the network and behavioral profile look trusted? Score high enough and you get the friendly outcome — a single checkbox, or no challenge at all. Score low and you get the grid of crosswalks, again and again.
You’ve felt both sides of this without naming it. On your main account and home connection, you click once and you’re through. On a VPN, in a privacy browser, or signed out, suddenly you’re identifying bicycles three times. The puzzle difficulty was never really a measure of how human you are — it was a measure of how much reputation your session carried.
And reputation, unlike humanity, can be assembled. The same scoring that hands a trusted session a one-click pass hands the same pass to anyone who puts together a trusted-looking session — established accounts and clean addresses produce high scores, and a high score is the automatic pass that, ironically, many ordinary users can’t reliably get. The challenge meant to separate humans from machines ends up separating high-reputation sessions from low-reputation ones, and reputation is a resource an adversary can simply invest in. (The operational details of how that’s done aren’t the point here and I won’t walk through them; the structural fact is what matters to a defender.)
This lands in the same backwards place as the perceptual puzzle, by a different road. The motivated attacker, happy to invest in reputation, glides through on one-click passes. The honest user who lacks an established footprint — the privacy-conscious, the signed-out, the brand-new, the person who just doesn’t want to be logged into a mega-platform to buy a ticket — gets the hardest version of the test. The friction, again, finds the wrong people.
The lesson isn’t “don’t use reputation” — risk and reputation signals are genuinely useful, and used well they’re part of the right answer. It’s narrower and load-bearing: reputation is an input to corroborate, not a verdict to trust. A high-reputation session is a hypothesis that can be manufactured, so it has to be checked against signals that are harder to buy — behavior over time, context, consistency. Treat “this session looks trusted” as one vote among many, never as a gate that, once passed, is assumed clean forever after.
Who actually gets stopped
Follow that logic to its end and you arrive at the real indictment: the population a hard CAPTCHA reliably stops is not bots. It’s people.
It stops the visually impaired user for whom a grid of low-contrast images is an actual barrier, audio fallback or not. It stops the person on a slow connection, the one on a small screen, the one whose attention is split, the older user who reads the instruction three times. It stops the legitimate customer who was about to buy something and decided, on the third failed grid, that they didn’t need it that badly. Every one of those is a real cost to a real business and a real person — and none of them is the adversary.
This is the part that should bother anyone who cares about both security and the people they’re securing. A defense that imposes most of its cost on the honest majority while barely inconveniencing the motivated attacker isn’t a security control. It’s a tax with a security theater attached.
What separates a weak challenge from a stronger one
None of this means challenges are useless. It means the kind of challenge matters enormously, and the useful distinction is what the challenge actually measures.
A challenge that measures a general perceptual skill — read this, identify that — is measuring the exact thing machines are now good at. It ages badly by design.
A challenge that measures something cheap for a real browser and costly at scale ages better. Invisible proof-of-work is the clearest example: the client’s machine does a small computation that a single human session never notices and that a large automated operation pays for in aggregate. It doesn’t try to tell human from machine at all — it just makes volume expensive, which is the actual goal.
A challenge informed by risk and context ages best of all. The strongest modern approach doesn’t gate everyone equally; it spends friction where suspicion is high and stays invisible everywhere else. If a session already looks overwhelmingly human from passive signals — its network fingerprint, its behavior over time, its history — it should sail through untouched. If it looks anomalous, then a challenge is worth its cost, because now the friction is aimed at the right target. The failure of the classic CAPTCHA is partly that it fires on everyone with equal suspicion, which guarantees the honest majority pays the most in absolute terms.
Even these aren’t permanent — nothing in this field is — but they fail more gracefully, because they’re built around cost and context rather than a perceptual gap that’s already been closed.
What a defender should take from this
If you run a site that still leans on a hard image CAPTCHA as a primary defense, the practical conclusions are fairly direct:
- Stop treating the CAPTCHA as the wall. At best it’s one signal among many, and a weak one against anything motivated. Real protection comes from layered, corroborated detection — passive signals and behavior over time — with a challenge as an occasional, targeted tool, not the front door.
- Measure the human cost as seriously as the bot-catch rate. Track challenge completion, abandonment, and accessibility impact. If you’re not measuring what your CAPTCHA costs your real users, you’re only seeing half the ledger — and it’s the expensive half.
- Reserve friction for suspicion. The goal is for the overwhelming majority of legitimate sessions to never see a challenge at all. Friction is a scarce resource; spend it where the risk actually is.
- Prefer challenges that impose cost at scale over challenges that test a skill. The question to ask of any challenge is not “can a human do this?” but “is this cheap for one real user and expensive for a thousand fake ones?” If the answer to the second part is no, it will not hold.
- Assume a solver is cheap and fast to build. The old comfort — “no one will invest the effort to beat our specific challenge” — is gone now that labeling is automated and distillation is routine. Threat-model as if a bespoke, self-hosted solver for any perceptual challenge can be stood up in an afternoon, because it can.
- Corroborate reputation; never let it be a standing verdict. A trusted-looking session can be manufactured, so a high score is a hypothesis, not a pass for the whole session. Keep checking it against signals that are harder to buy than an aged account and a clean IP.
The deeper lesson is the one that keeps recurring across all of anti-abuse work: you don’t stop a determined adversary with a single clever gate, because the gate is public and the adversary is patient. You raise the cost of abuse through many small, corroborating signals, and you take care not to hand that cost to the very people you’re trying to serve. The CAPTCHA got that backwards. The good news is that knowing how it got it backwards tells you most of what to build instead.
This article is a defensive analysis of where CAPTCHAs fail and what holds up better. It intentionally contains no techniques, tooling, or detail for defeating any specific system.