14 September 2026
·6 min read
Quality Engineeringsecurity testingSASTSecurity Testing Slows Teams Down for the Wrong Reasons: What 17,743 Developer Questions Reveal
A study of nearly 18,000 developer questions shows security testing stalls on tooling and configuration, distinct from the underlying vulnerabilities. Three findings, and what engineering leaders can do about them this week.
Most engineering leaders assume the hard part of security testing is finding the vulnerability. A new empirical study says otherwise. In Investigating Developer-Reported Software Security Testing Challenges, researchers analysed 17,743 Stack Overflow questions and found that the challenges developers actually get stuck on cluster around tooling, configuration, and interpretation — selecting scanners, wiring up test environments, decoding scanner output, and testing authentication workflows. The vulnerability itself is rarely the blocker. The scaffolding around it is.
That matters because it reframes where the cost of security testing lives. If your team is spending its security-testing budget wrestling with tool configuration and false-positive triage, you are paying senior-engineer rates for plumbing, not for risk reduction. And unlike a rewrite, this is a fixable operational problem.
Finding 1: Configuration and environment setup dominate, not exploitation
The study's taxonomy shows the highest-difficulty and highest-prevalence questions are about getting the tools to run at all — configuring scan environments, integrating tools into pipelines, and interpreting what the output means. These questions were also among the most persistent over time, meaning the ecosystem has not made them meaningfully easier. Every new team hits the same wall.
This lines up with what most engineering leaders already suspect but rarely quantify: a SAST or DAST tool that isn't tuned produces noise, and noise produces avoidance. When a scan returns 800 findings and 780 are irrelevant to your deployment context, developers stop reading the report. The tool is technically running, and the security posture is unchanged.
What to do this week: Pull the last 90 days of security-scan output for one service and calculate the signal ratio — how many findings led to a code change versus how many were dismissed or ignored. If the dismissal rate is above ~80%, the problem is configuration, not developer discipline. Tune the ruleset to your actual runtime and dependency context before you ask anyone to act on findings.
Finding 2: Interpreting scanner output is a specialist skill teams don't have on hand
A recurring theme in the data is that developers struggle to translate a scanner's raw finding into a decision: is this exploitable in our context, and what is the minimal fix? This is triage, and triage is where security testing either produces value or evaporates into ticket backlog. A CVE flagged in a transitive dependency that never touches untrusted input carries lower operational priority than an injection path in an authentication flow. Most scanners present both with similar severity labels.
The consequence at the buyer's scale is predictable. On a 50–200-engineer team without a dedicated security function, interpretation defaults to whoever is least busy, which means it is done inconsistently or not at all. The scan runs, the report is generated, and the exposure sits unquantified.
This is where measurement inside delivery changes the picture. In place of a passive scanner pass/fail gate, a senior engineering pod approaches this by measuring whether the tests and checks in the pipeline actually catch injected faults — test-effectiveness measurement — so security findings are ranked against evidence of real exploitability in your codebase, not a generic severity table. The output becomes a short list of things that genuinely need fixing, which is a list a team will act on.
What to do this week: Take your top 20 open security findings and force a three-way classification: exploitable in production, exploitable only under conditions we don't have, and false positive. If you can't make that call quickly for most of them, the gap is interpretation capacity, not tooling budget. Route the ambiguous ones to your most senior engineer and document the reasoning — that document is the start of a triage playbook.
Finding 3: Authentication and authorisation testing is disproportionately hard
The study calls out testing authentication workflows as a specific, high-difficulty cluster. This is unsurprising and deeply consequential: auth is where the highest-impact vulnerabilities live, and it is also the hardest thing to test automatically because it involves state, tokens, session lifecycles, and multi-step flows that resist simple assertion.
Generic scanners are weak here precisely because auth logic is application-specific. A tool can flag a missing security header; it cannot easily tell you that your token refresh path allows privilege escalation under a particular race condition. That requires tests written against your intent, which requires someone who understands both the security model and the codebase.
The adjacent proof point is worth naming. Cloudflare's engineering work on Automatic Key Exchange for origins — probing origins to negotiate the strongest available key agreement across 45 billion daily connections — is instructive as it demonstrates the direction of travel: security behaviour is increasingly negotiated and conditional, not static. Testing conditional, stateful security behaviour is exactly the category the study identifies as hardest, and it is only getting more prevalent.
What to do this week: Audit your test suite for coverage of the auth-adjacent failure modes that matter most — token expiry and refresh, horizontal privilege escalation (can user A access user B's resources), and session invalidation on logout. If these aren't covered by explicit, deterministic tests, they are almost certainly not covered by your scanner either. Write one adversarial test for the highest-value flow and use it as the template.
Why this is an operational problem, not a tooling purchase
The common thread across all three findings is that buying another scanner does not help. The persistent, high-difficulty challenges are about applying tools to your specific context — configuration tuned to your runtime, interpretation grounded in your architecture, and tests written against your auth model. Those are delivery capabilities, not licences.
This is also why security testing tends to regress. A team tunes a scanner during a compliance push, the tuning drifts as the codebase evolves, and eighteen months later the scan is back to producing noise that everyone ignores. Without a mechanism that keeps checks honest against the current code, security testing decays to theatre.
The mechanism that holds up is measuring effectiveness continuously, verifying that checks catch real failures. Fault injection — deliberately introducing the class of defect a check is supposed to catch, and confirming the check catches it — tells you whether your security testing is doing anything, which is a different and more useful question than whether it ran. Building that into how work ships is the difference between quality engineering that is evidenced and quality that is merely claimed.
How Anystack helps teams act on this
Anystack delivers a senior engineering pod into your codebase that treats security testing as part of delivery, not a separate compliance activity. In a typical 90-day engagement, the pod tunes existing scanners to your runtime context so findings carry signal, builds a triage practice that ranks vulnerabilities by real exploitability, separating critical risks from generic alerts, and writes adversarial tests for the auth and authorisation flows that scanners can't reach. The test-effectiveness measurement that underpins the pod's delivery means those security checks are verified against injected faults in your code — so what reaches production is evidenced against your bar, evidenced by observable proof. The result is a smaller, sharper set of security findings your team will actually act on, and a testing practice that doesn't decay the moment the initial push ends.
