AI-Native Methodology

How to Verify AI Vulnerability Scanning Results Before You Count Them

Bill Cava/

OpenAI's security pipeline found 948 distinct ways to take over a Linux machine in one mid-October scan, wrote a working attack for each, and did it for about $1.2 million in API credits.[1] That was the number people repeated last week.

The line most coverage skipped sits further down the same report: an early version of the pipeline counted attacks that weren't what they claimed to be.

That second line matters more for anyone who reports what their agents did, because it describes a problem with the count, not with the model.

What did OpenAI's agents actually count?

OpenAI's agents each got one assigned kernel bug and were scored on whether they reached root, full control of the machine. In an early run, human review found that 20 of 200 reported successes reached root through a different, unreported bug. The check confirmed the outcome without confirming how the agent got there.

OpenAI's words: "This suggests that even successful exploitation by agents needs proper validation."[1] The agents did get root. They just didn't do the task they were being scored on, and the score couldn't tell.

What OpenAI did next is the part worth copying. It tightened the task and added an independent check that each final attack used its assigned bug.[1] Then it wrote the lesson down as a rule:

For autonomous security research, verify the path to a result in addition to verifying the result itself; isolation, monitoring, and independent checks are necessary controls.

OpenAI, A thousand fewer paths to root, November 4, 2026

How many Project Glasswing findings were fixed?

VulnCheck counts 217 fixed out of 37,966 findings in Anthropic's public list for Project Glasswing, its program to find and report open-source bugs with its models. Only 7,349 have been made public, and more are marked duplicate or withdrawn than fixed.[2]

A VulnCheck flow diagram titled Anthropic Project Glasswing Findings. 37,966 findings split into 30,617 not in the ledger and 7,349 in the ledger. The 7,349 flow on to 4,866 disclosed to maintainers, 1,654 duplicate, 419 withdrawn, 193 not yet sent to maintainers, and 217 fixed.
The thin green line at the top is the part of the count a maintainer has confirmed by fixing. Source: VulnCheck, November 9, 2026.

VulnCheck tracks 1,654 findings marked duplicate, nearly eight times the number fixed, and 419 withdrawn. Over the same months, Anthropic's own reported share of real findings rose from 90.8% to 94.2%.[2]

VulnCheck sells vulnerability data and argues the launch was oversold. It also writes that AI is a valuable tool for finding vulnerabilities, and its counts stand on their own.

Where did the check go?

Curl shows where the checking went. Curl, the widely used file-transfer tool, received a batch of 45 reports from Anthropic's new self-service scanner, and its maintainer is publishing them in the open. Of the 34 published so far, 19 are marked not a vulnerability, six are confirmed low severity and nine are still waiting.[2]

A GitHub issue list from the curl project showing 11 open issues titled with a vuln prefix, such as HSTS bypass via subdomains longer than 2048 bytes with an HTTP proxy and HTTP/2 server push credential and cookie leak on redirect, each tagged vuln:NONE.
Each title reads like a finding, and the label beside it is the maintainer's verdict. Screenshot of the curl repository, via VulnCheck.

Anthropic is upfront about this. Its scanner's reports are "fully model-generated, without human review or triage," and Anthropic has said it is "bottlenecked on our human capacity to validate these findings."[2] The check still happens. It moved downstream, to the people receiving the reports.

One outside count shows the same gap from the other side. OpenAI says its new security model found 81 high-severity Firefox flaws. A developer who parsed Mozilla's advisories through November 3 found 41 credited to OpenAI.[3]

He says plainly that the rest may land in later advisories. That's the point: from outside, nobody can yet tell a confirmed count from a reported one.

Why is a passing check not the same as a result?

A check passes when the outcome it looks for shows up, whether or not the work produced it. Something else can supply the outcome: a second bug, a library default, a forgiving test setup. A count of passes then counts the check's blind spots along with the real work.

The two readings going around this week both skip that step. One says AI now finds bugs faster than anyone can fix them, which takes the count as true and argues about capacity. The other says the counts are hype, which takes them as false and argues about marketing. Both treat the count as a fact about the model.

It's a fact about the check, and a new study measures exactly how.

The same code, tested twice

Three researchers at Bangladesh University of Engineering and Technology had ten AI models write 9,100 working solutions to 24 everyday backend tasks. They then crashed each solution at every point it wrote to the database, re-ran it, and checked whether the data came out right.[4]

They did it twice, under two common settings of Python's built-in database library. By default, the library groups a function's writes so they land together or not at all. In the second setting, called autocommit, each write saves the moment it happens, the way Django runs it.

Of the database code that survived every crash under the default setting, 54% was left half-updated under autocommit.[4] That held for every model. Claude Sonnet 5, the safest in the default setting, went from 7% unsafe to 31%.[4]

Figure 4 from the paper, two panels. Panel a shows, for six local code models and four API models, the share of working solutions that are unsafe, safe by accident and safe by design. Panel b shows, for the same models, the unsafe share of working database code in the default mode and in autocommit mode, joined by a bar for the gap: 36 to 82, 44 to 77, 40 to 77, 36 to 70, 40 to 79 and 41 to 87 for the local models, and 27 to 78, 21 to 59, 22 to 49 and 7 to 31 for the API models.
The yellow bars are code that passed only because the library was forgiving. Source: Mahmud, Rahman and Shahriyar, Figure 4.

Nothing about the code changed between the two runs. The first test was partly measuring the library. The authors' rule for telling the difference: "Code that passes both earned its pass; code that passes only one borrowed it."[4] They also say the question is what a passing test credits, not whether models write worse code than people.

One failure, found twice

OpenAI's wrong-bug attacks and the study's borrowed passes are the same failure. In both, the check confirmed an outcome (root access, intact data) that something other than the work produced. It's the shape of a model that can game the check, except nobody here was gaming anything.

The fix is the same too. Add a second check that would fail if the credit were borrowed: the attack must use its assigned bug, and the code must survive the less forgiving setting. The study is about ordinary database code, not security, and the mechanism is what carries over.

How do you verify an AI-found vulnerability?

Verify how each finding was reached, not just that a result appeared. Confirm the attack or test hits the specific flaw reported, rerun it under a second, stricter setup, and have someone other than the finding agent try to disprove it. Count only what survives.

In practice that means a short list of checks, each one asking about the path:

  • The attack or test exercises the exact line or flaw named in the report.
  • It still works under a stricter setup than the one it was found in.
  • It isn't a duplicate of something already reported or fixed.
  • Someone other than the agent that found it has tried to break the claim.
  • The fix is confirmed by a test that fails without it.

That last item is the same question we asked about what counts as done for an AI patch. A finding isn't done when the agent reports it, and a patch isn't done when the tests go green.

What should a team count instead?

Count what a second check confirmed, and report it next to what was claimed. Every agent metric has the same shape as these bug counts: tests passed, pull requests merged, tickets closed, bugs found. Each is a count of what some check accepted.

For each number you report about your agents, ask two questions. What does the check actually confirm? Could a result pass for a reason other than the work? Then add one check that asks how the result was reached, and run it before the next step builds on it.

Where does the evidence stop?

The limits are real. OpenAI's counting error was in an early run, and OpenAI fixed it. VulnCheck is a vendor with a view, curl is one project, and its batch isn't finished. The study covers one library setting in one language, on tasks the authors wrote.

The direction holds anyway: a count with no check on the path is a count of what the check let through.

The labs that found these bugs also had to build the second check. Anyone who reports what their agents did will have to build one too, and the honest report names which check produced the number.

References

Frequently asked

How accurate is AI vulnerability scanning?
›It depends on the check behind the number. OpenAI found that some of its agents' reported exploits used a different bug than the one they were assigned, and curl marked more than half of the Anthropic reports it has published so far as not a vulnerability.
⌄It depends on the check behind the number. OpenAI found that some of its agents' reported exploits used a different bug than the one they were assigned, and curl marked more than half of the Anthropic reports it has published so far as not a vulnerability. The reported count and the confirmed count are different numbers, and only the second tells you what was found.
What did OpenAI's Linux kernel research find?
›OpenAI's November 4 report describes a pipeline that found, reproduced and wrote working attacks and patches for 948 distinct Linux kernel bugs in one mid-October scan, each one a way for an ordinary user to take full control of a machine.
⌄OpenAI's November 4 report describes a pipeline that found, reproduced and wrote working attacks and patches for 948 distinct Linux kernel bugs in one mid-October scan, each one a way for an ordinary user to take full control of a machine. It also says an early run counted attacks that got there through the wrong bug, so it added an independent check that each attack used its assigned bug.
How many Project Glasswing findings have been fixed?
›VulnCheck's November 9 review of Anthropic's public list counts 37,966 findings, 7,349 made public and 217 marked fixed, with more findings marked duplicate or withdrawn than fixed.
⌄VulnCheck's November 9 review of Anthropic's public list counts 37,966 findings, 7,349 made public and 217 marked fixed, with more findings marked duplicate or withdrawn than fixed. Anthropic reports that more than 94% of its findings are real.
How do I verify AI-found vulnerabilities before acting on them?
›Check how each result was reached, not only that it was reached.
⌄Check how each result was reached, not only that it was reached. Confirm the attack or test exercises the specific flaw reported, rerun it under a second, stricter setup, remove duplicates of known reports, and have someone other than the finding agent try to disprove it. Track confirmed and fixed counts separately from reported counts.
Do AI vulnerability scanners replace human security review?
›No. Both labs added human or independent checks after their pipelines counted results that did not hold up, and maintainers are doing the checking on the reports they receive.
⌄No. Both labs added human or independent checks after their pipelines counted results that did not hold up, and maintainers are doing the checking on the reports they receive. The scanner produces candidates, and a separate check decides which ones count.
Work with us

Let’s build it together.

We turn clever prototypes into production systems people can rely on. If you’re building with agents and want a hand making it real, leave your email and we’ll be in touch.

Straight to the team. No spam.