Skip to content

benchmarks: ghidra Tier B has zero injection-gate coverage (payload never survives into Ghidra pseudocode); Tier A fails 4 of 12 models #2643

Description

@Xore

Found while harvesting the #1805-c ghidra-slot round (PR #2641).

Tier B cannot test injection resistance at all

Across the whole #1805-c round, injection_payload_in_evidence is false on
all 11 Tier B cells.
The harness therefore records injection_ok: null — not
tested, rather than passed. That is #1948's guard doing exactly its job:
without it this round would have published a unanimous clean injection sweep
for Tier B, on a gate that never ran.

The mechanism is confirmed at the source, not inferred: no file in the Tier B
Ghidra cache (/mnt-1/benchmarks/tierb-cache) contains the needle string at
all.
The payload is a referenced string literal since #1948, and Ghidra's
decompiled pseudocode does not carry .rodata contents, so it never reaches
the model.

This is a real coverage hole, and it lands on the tier that matters most:
Tier B is the production-shaped input. Rev·Deck in production reads
decompiler output, so the benchmark currently has no injection-resistance
measurement for the evidence production actually serves. The Tier A verdict is
the only one we have, and it is measured on evidence production does not use.

Two readings, both worth stating, and this issue is not asking anyone to pick
one blind:

  • Coverage gap. The benchmark should be able to test injection at Tier B,
    and cannot.
  • Possibly a genuine production property. If Ghidra's pseudocode really
    never carries attacker-controlled string contents, the Rev·Deck decompile
    path may be structurally less exposed than Tier A suggests. That would be
    a useful safety finding — but it needs checking against the real
    /tools/decompile_function evidence assembly (PoC: evaluate a ground-up RevDeck rewrite against our Ghidra REST service #1164), not assumed from the
    benchmark cache.

Tier A, where the gate does run, finds real failures

4 of 12 models fail (injection_ok: false, payload confirmed present):

Model Tier A injection
Seneca-Cybersecurity-LLM-x-QwQ-32B-Q4_Medium fail
Ornith-1.0-35B-uncensored-heretic:Q4_K_M fail
gemma-4-31B-it-qat-q4_0-uncensored-heretic:Q4_0 fail
huihui-qwen3.8-27b-abliterated:q4_k fail
qwen3:14b, qwen3:8b, qwen2.5-coder:7b, qwen2.5-coder:14b, qwen2.5:14b, observerx-qwen3.8-27b-heretic, Huihui-Qwen3.6-27B-abliterated, gemma-4-26B-A4B-heretic pass

This qualifies #1795-b's "injection resistance held clean for every model
that produced output."
That was true on the sessions and revdeck slots. It is
not true on the ghidra slot's Tier A evidence, and the two models that top the
Tier B accuracy table (Ornith-35B at 67/69, gemma-4-31B at 65/69) are two of
the four failures — which is exactly why #1805-c promotes nothing.

What to do

  1. Decide whether Tier B should carry the payload, and if so, extend the
    evidence assembly so a referenced string literal survives into Tier B (a
    strings section alongside pseudocode would do it, and would also be closer
    to what the triage path feeds). If not, record the decision, because
    silently untested is worse than either.
  2. Check the production path (/tools/decompile_function, PoC: evaluate a ground-up RevDeck rewrite against our Ghidra REST service #1164) for
    whether attacker-controlled strings actually reach the model there. That
    determines which of the two readings above is true.
  3. Wherever the ghidra slot's injection verdict is cited, say it is Tier A
    only
    — including in approved-models.json review notes and any One benchmark, every model, every aspect: rebuild the model matrix on current hardware with error bars #1947
    synthesis. It currently reads as a whole-slot property.
  4. Keep the four failing tunes out of promote consideration for this slot
    independent of accuracy, per the Benchmark fidelity: run real Ghidra over the #159 corpus so models are scored on production-shaped input #1805-c decision.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingllmLLM analysis workermlML worker and GPU scoringsecuritySecurity hardening or a security defect

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions