
PER FLOW SILENCE
+26.2%
SILENCING REWRITES
+74%
TAINT ANALYZER
+53%
FLOWS ROUGHLY
$0.51
Imagine you have a smoke detector that reliably catches fires in your kitchen. Now imagine that rearranging the furniture — moving the toaster to a different counter, swapping shelves — makes the detector stop going off, even though the fire hazard is identical. You'd never trust a "no alarm" signal again. That is the core mechanism this paper exposes in CodeQL, the most widely deployed static analysis tool in JavaScript security. The committed claim: an LLM with zero knowledge of CodeQL's internals can rewrite vulnerable code so that the real vulnerability survives but CodeQL's taint-tracking alert vanishes — 26.2% of the time across 172 real npm vulnerability flows, at roughly $0.51 per silenced alert. The critical control: when the same LLM is asked to refactor the same functions without being told about the alert, it silences none of them. This is not random drift. The rewrites are targeted enough to hit blind spots but natural enough to pass code review. Every silencing rewrite traces to one of seven specific gaps at what the authors call the "library-modeling boundary" — the seam where CodeQL's hand-written models of library behavior meet actual API surface. The largest single gap is the WHATWG URL constructor: CodeQL tracks taint flowing into a URL's query parameters but loses it when taint flows through the pathname. 64 of 70 silencing rewrites cross a gap inside an API that CodeQL already partially models. These aren't unknown APIs — they're known APIs with incomplete coverage. The validation regime is unusually honest for a security paper. The authors manually audit every rewrite to confirm the vulnerability survives. They test not just CodeQL but an independently built taint analyzer and a combination of three analyzers. The cross-tool results are damning: 74% of CodeQL-silencing rewrites also silence the independent analyzer, and 53% escape all three tools combined. This means the gaps are structural to how taint analyzers model libraries, not quirks of one implementation. The architecture here is adversarial LLM prompting constrained to vulnerability-preserving transformations, evaluated against dataflow-based static taint analysis. The LLM serves as a black-box fuzzer for analyzer robustness — it doesn't need to understand the analyzer's implementation, only the alert location. This is a lightweight, scalable approach: three rewrites per flow, commodity LLM pricing, no specialized training. The practical threat model flips the usual SAST story. We normally ask "does the tool find the bug?" This paper asks "once the tool found the bug, can ordinary-looking code changes make it lose the bug while keeping the vulnerability alive?" In CI/CD pipelines where a disappearing alert is treated as evidence of a fix, this is a concrete attack surface. The seven named gaps give SAST developers a finite, actionable repair list — this is not "everything is broken" nihilism but a specific engineering punch list. The paper's limitation is scope: JavaScript taint tracking only, CodeQL plus two other unnamed analyzers, 172 flows from npm vulnerabilities. The authors do not test compiled languages, interprocedural analysis depth, or whether the gaps persist after CodeQL model updates. The honest next experiment — running the same methodology against CodeQL's Java and C++ taint trackers — would reveal whether library-modeling boundary gaps are a JavaScript-ecosystem problem or a fundamental architectural weakness of dataflow SAST.
The analogy
A smoke detector that reliably catches kitchen fires — until you rearrange the furniture. The fire hazard is identical, but the detector goes silent. This paper systematically rearranges the furniture and catalogs which rearrangements fool the detector.
Smoke detector
Detects fire reliably in one furniture arrangement but goes silent after rearrangement — same hazard, no alarm
CodeQL taint tracking
Detects vulnerability in one code arrangement but goes silent after LLM rewrite — same flaw, no alert
Honest assessment
A sharp, well-controlled first demonstration that SAST taint-tracking robustness is a real and measurable problem. The 26.2% silencing rate with a concrete 7-gap taxonomy gives tool vendors an actionable repair list, not just a complaint. Scope is narrow — JavaScript only, 172 flows, one primary tool — but the cross-tool transfer results (74%) suggest the findings generalize. Security engineers running CI/CD gates should care today; SAST tool developers have a concrete engineering backlog.
What Is CLAIMS?
77
/ 100
BedrockNews applies a structured analytical framework called CLAIMS to academic papers and technical research releases.
How CLAIMS worksClaim
4/5
Ladder
4/5
Architecture
4/5
Integrity
4/5
Milestone
3/5
Successor
4/5
What is this paper actually committing to?
Genuine first: nobody has systematically tested SAST taint-tracking robustness against LLM-generated vulnerability-preserving rewrites. The 26.2% silencing rate with a named taxonomy of 7 gaps is a concrete, committed result.
The field fight
Should SAST tools be evaluated only on detection rate, or also on robustness to semantics-preserving code changes?
Side A
Detection rate on known vulnerability benchmarks is the right metric; robustness is a secondary concern
Held by: Traditional SAST evaluation (OWASP Benchmark, NIST SAMATE)
Side B
Robustness to natural rewrites is as important as detection rate; a tool that loses alerts after benign changes creates false security
Held by: This paper, adversarial ML testing community
Milestone tracker
Unlocks: Formal argument that disappearing SAST alerts are unreliable as fix-confirmation signals in CI/CD
Current
26.2
% silenced at 3 rewrites
this paper
Next
50
% silenced
coin-flip threshold
~1-2 years with more rewrites per flow and expanded prompt strategies
Verified Facts (6)
On 172 flows that CodeQL detects in real npm vulnerabilities, three rewrites per flow silence 26.2% of them, at about USD 0.51 per silenced flow
The same generator, asked only to refactor the same functions with no knowledge of the alert, silences none of them
Every silencing rewrite traces to one of seven gaps at the library-modeling boundary
64 of the 70 rewrites cross a gap inside an API CodeQL already models
The largest is the WHATWG URL constructor, which propagates taint to a URL's query components but not to its pathname
74% of the silencing rewrites also silence an independently built taint analyzer, and 53% escape three analyzers combined
Practical Implications (4)
A disappearing CodeQL alert after a code change is weak evidence that the underlying vulnerability was fixed — teams should not treat alert absence as fix confirmation without independent verification
The seven named library-modeling gaps (especially WHATWG URL pathname) give CodeQL and other SAST developers a finite, prioritized repair list
Security review processes should flag function-level rewrites near known vulnerability flows for extra scrutiny, even when the diff looks like routine refactoring
The LLM-as-fuzzer methodology can be adopted by SAST vendors as an automated robustness regression test for their taint-tracking models
More latest news
Read all