Hacktron

Why we test open-weight models

Relying on frontier models is getting risky. Either the model gets export controlled, or it gets nerfed with hidden guardrails. The second one is the more annoying problem for defensive cybersecurity work. When a model like Fable outright blocks anything security-related, that’s at least transparent, because we know upfront it doesn’t work for cybersecurity. The real problem is hidden guardrails, where a frontier model quietly stops working for a use case and we can’t tell why, and sometimes an older version performs better than the new one (more on that later in the blog).

If open-weight models are catching up, we can de-risk that dependency. Right now, there’s a lot of noise about open-weight models, Chinese ones in particular, catching up to frontier models on cybersecurity. Most of the time these sources are unreliable and potentially testing against poisoned datasets.

We wanted a concrete test of whether they’re good enough to put into our own workflows. This is one of those internal runs to understand open-weight model capabilities. The setup is we isolate the Hacktron orchestration and harness that we use in our Hacktron Pentest and Review, swap in eight different models one at a time, and measure how many real vulnerabilities each one finds on the same codebase. Open-weight models still trail the best frontier models, but the gap is narrow and closing fast.

Benchmark and orchestration

This is one of the new datasets we’re using to test model capabilities. It’s built from Fider, an open-source feedback/feature-voting app written in Go and React, the same target we used to compare Hacktron against XBOW and Aikido. Between v0.33.0 and v0.36.1, the Fider maintainers patched a set of vulnerabilities that XBOW and Aikido had reported. Those patches were published after the training cutoff of the models under test, which limits the risk of data poisoning. The benchmark asks whether each model can rediscover the bugs a maintainer already fixed.

A few reasons this dataset is a good quick test of model capability:

  1. Every fix we score against was published after the stated training cutoff of the models we tested, so no model should have seen the patch itself.

  2. Fider is the kind of Go + React web app most security teams review, which makes the results more likely to transfer to real work. It is neither a deliberately broken teaching app like DVWA nor a kernel or browser target that demands a different skill set. It’s still a small app compared to most.

  3. These bugs were surfaced by XBOW and Aikido, two big teams building AI security harnesses. In our earlier writeup the Hacktron harness matched and beat both on cost and speed, so the harness is a known quantity. That lets us hold it fixed and isolate the one variable that changes here, the model driving it.

The orchestration has no internet access, so the agents can’t look up the answer online. They’re given restricted tools that only let them read code and write test scripts.

The 15 patched bugs

These are the real patches we score against. We’re particularly interested in high and critical severity vulnerabilities that allow full compromise of user accounts or access to sensitive data.

  1. High

    Webhook URL SSRF

    Patch f7db8603 (GHSA-g445-xwm7-594r)

  2. Critical

    Mass-assignment of verification key → pre-auth ATO

    Patch 74a26a31

  3. Critical

    No rate-limit on sign-in code → brute-force ATO

    Patch b41d1b83

  4. Critical

    Cross-tenant invite/verification key reuse → tenant takeover

    Patch ce4f44bb

  5. High

    Markdown & Atom feed XSS

    Patch d28a838d (GHSA-wm2w-gfh7-qg69)

  6. Medium

    Server-side JS injection in React SSR

    Patch d5a80ea5

  7. Medium

    HTML escaping in rendered emails (subject entity)

    Patch 2f7aa747

  8. Medium

    DoS via unbounded outbound HTTP response read

    Patch da89c502

  9. Medium

    IDOR / moderation bypass on single comment

    Patch d74a643d

  10. High

    Authenticated arbitrary blob overwrite

    Patch 7b047158 (GHSA-vxp5-mf8m-grg9)

  11. High

    Custom OAuth Token/Profile URL SSRF

    Patch 10cd0c2e

  12. Medium

    OAuth allowed-role stale sessions

    Patch ea5979b1

  13. Medium

    Custom invite copy available to non-pro tenants

    Patch dbb0c69b

  14. Medium

    Missing comment length limit

    Patch 8295d102

  15. Medium

    Post filter edge-case DoS/bypass

    Patch aae615ee

The results

Here’s how the results look. Frontier models are in muted grey, open-weight in green, and the two native-agent baselines (GPT 5.5 in Codex, Opus 4.8 in Claude Code) in amber:

frontieropen-weightnative agentGPT 5.5 (Hacktron)89%Sonnet 4.6 (Hacktron)77%Gemini 3.5 F (Hacktron)77%DeepSeek V4 (Hacktron)69%GLM 5.2 (Hacktron)60%GPT 5.5 (Codex)49%Opus 4.8 (Hacktron)46%Kimi K2.7 (Hacktron)46%Opus 4.8 (Claude Code)43%MiniMax M3 (Hacktron)20% frontieropen-weightnative agentGPT 5.5 (Hacktron)89%Sonnet 4.6 (Hacktron)77%Gemini 3.5 F (Hacktron)77%DeepSeek V4 (Hacktron)69%GLM 5.2 (Hacktron)60%GPT 5.5 (Codex)49%Opus 4.8 (Hacktron)46%Kimi K2.7 (Hacktron)46%Opus 4.8 (Claude Code)43%MiniMax M3 (Hacktron)20%

The numbers we care about most are critical and high severity recall.

frontieropen-weightnative agentcriticalhighGPT 5.5 (Hacktron)7/7 (3/3 C, 4/4 H)Gemini 3.5 F (Hacktron)6/7 (3/3 C, 3/4 H)Sonnet 4.6 (Hacktron)6/7 (2/3 C, 4/4 H)DeepSeek V4 (Hacktron)6/7 (2/3 C, 4/4 H)GLM 5.2 (Hacktron)5/7 (2/3 C, 3/4 H)GPT 5.5 (Codex)4/7 (1/3 C, 3/4 H)Opus 4.8 (Hacktron)4/7 (1/3 C, 3/4 H)Kimi K2.7 (Hacktron)4/7 (1/3 C, 3/4 H)Opus 4.8 (Claude Code)4/7 (1/3 C, 3/4 H)MiniMax M3 (Hacktron)2/7 (0/3 C, 2/4 H) frontieropen-weightnative agentcriticalhighGPT 5.5 (Hacktron)7/7 (3/3 C, 4/4 H)Gemini 3.5 F (Hacktron)6/7 (3/3 C, 3/4 H)Sonnet 4.6 (Hacktron)6/7 (2/3 C, 4/4 H)DeepSeek V4 (Hacktron)6/7 (2/3 C, 4/4 H)GLM 5.2 (Hacktron)5/7 (2/3 C, 3/4 H)GPT 5.5 (Codex)4/7 (1/3 C, 3/4 H)Opus 4.8 (Hacktron)4/7 (1/3 C, 3/4 H)Kimi K2.7 (Hacktron)4/7 (1/3 C, 3/4 H)Opus 4.8 (Claude Code)4/7 (1/3 C, 3/4 H)MiniMax M3 (Hacktron)2/7 (0/3 C, 2/4 H)

And here’s the matrix showing what each model found.

frontieropen-weightnative agentGPT 5.5Sonnet 4.6DeepSeek V4GLM 5.2Opus 4.8Kimi K2.7MiniMax M3Gemini 3.5 FGPT, CodexOpus, ClaudeHWebhook SSRFCMass-assign pre-auth ATOCSign-in code brute forceCCross-tenant key reuseHMarkdown / Atom XSSMReact SSR JS injectionMRendered email HTML escapeMUnbounded response-read DoSMSingle-comment mod bypassHAuthenticated blob overwriteHCustom OAuth SSRFMOAuth stale sessionsMNon-pro invite copy leakMMissing comment length capMPost-filter panicRaw hits111187663975Weighted89776960464620774943 frontieropen-weightnative agentGPT 5.5Sonnet 4.6DeepSeek V4GLM 5.2Opus 4.8Kimi K2.7MiniMax M3Gemini 3.5 FGPT, CodexOpus, ClaudeHWebhook SSRFCMass-assign pre-auth ATOCSign-in code brute forceCCross-tenant key reuseHMarkdown / Atom XSSMReact SSR JS injectionMRendered email HTML escapeMUnbounded response-read DoSMSingle-comment mod bypassHAuthenticated blob overwriteHCustom OAuth SSRFMOAuth stale sessionsMNon-pro invite copy leakMMissing comment length capMPost-filter panicRaw hits111187663975Weighted89776960464620774943

Interpreting the results

Claude Opus 4.8 underperforms open models on this run

We’re not sure why this happens, but on this codebase Opus 4.8 (6/15) landed below two open-weight models, DeepSeek V4 (8/15) and GLM 5.2 (7/15), and below the older Sonnet 4.6, at a fraction of the cost. Our best guesses are that guardrails are getting in Opus’s way, or that the extra reasoning makes it second-guess and drop real findings.

Orchestration and harness matter

“Harness” is a muddled term, so to be clear about what we mean, the harness is the agentic loop wrapper around a model. Claude Code and Codex are harnesses in that sense. Orchestration is the manager on top of it. In our case it does a bunch of deterministic work and drives the harness through different kinds of vulnerability tasks, first to find, then to validate.

A well-designed orchestration on top of the harness beats just launching Claude and asking it to find bugs. In the results, GPT 5.5 with Hacktron orchestration beats GPT 5.5 in Codex, and the same holds for Opus. Concretely, the native harness missed the critical we care about. DeepSeek V4 and GLM 5.2 in Hacktron beat GPT 5.5 in Codex and Opus 4.8.

On this codebase, a cheaper model in a good harness beat a frontier model in a generic one. On top of that, deterministic orchestration gives us confidence we actually covered the whole codebase. When you just ask Codex for vulns, you can never be sure it looked everywhere.

A native agent also gives a false sense of coverage. If you use Claude Code and it hands you a few real bugs, it’s easy to walk away thinking it found everything. It didn’t. It found the bugs its limited coverage reached, which is enough to convince you to trust it, and the bugs it never looked for are still sitting there to bite you later. Finding some bugs is not the same as covering the codebase, and a native agent gives you no way to tell the difference.

Frontier still leads on the critical bugs

GPT 5.5 and Gemini 3.5 Flash found almost every critical and high severity bug that XBOW and Aikido reported and the maintainer patched. Sonnet 4.6 and DeepSeek V4 trail behind them. You can find a pile of bugs, but if you miss the one critical that leaks data or compromises the system, the run doesn’t count for much.

The clearest example is the mass-assignment pre-auth ATO (74a26a31), one of the three criticals. Only GPT 5.5 and Gemini 3.5 Flash caught it. Sonnet 4.6, Opus 4.8, and every open-weight model missed it. It’s a subtle bug that needs a bit of reasoning and some Go-specific knowledge like exported struct fields can look server-owned, but unless binding is explicitly restricted, request JSON can still overwrite them.

Open-weight models are catching up

Older open-weight models were much worse at recall and terrible at precision. Now they’re catching up, and on this evidence they look roughly 3 to 6 months behind the current frontier (e.g. GPT 5.5). If that trend holds, we could eventually move most of our workflow onto open-weight models and reserve frontier models for the critical spots, as advisors and orchestrators.

Capability lower bound (100% detection)Capability upper bound (0% detection)maximum bug complexity for most appsBug complexityBrowserJIT bugoauth2-proxyhealthcheckBasic SQLinjectionGemini 3.1 Flash Lite...Opus 4.6Model cost50%90% (10x cost) Capability lower bound (100% detection)Capability upper bound (0% detection)maximum bugcomplexity formost appsBug complexityBrowserJIT bugoauth2-proxyhealthcheckBasic SQLinjectionGemini 3.1Flash Lite...Opus4.6Model cost50%90% (10x cost)

It’s fairly clear that with good orchestration you can compete with frontier models at much lower cost. But some bugs are beyond a given model, and no harness changes that. A better harness only gets more out of what the model can already do.

Conclusion

Open models are improving, and there’s a good chance the next DeepSeek and GLM models reach the threshold we’re looking for. Once they do, we’d switch them into parts of our workflow to do the bulk of our workloads, keeping a frontier model as the orchestrator and advisor for the hardest calls. The one thing we’d still need is a good enough inference provider to support our workload at speed and reliability.

That said, if frontier models keep getting cheaper and ship guardrails that don’t quietly nerf security work, it makes complete sense to keep using them. We’d pick whichever model sits on the Pareto frontier for our work.