452 scanner findings and six criticals: which ones can actually hurt you?

SaaS security: a scanner gave 452 findings and six criticals. Reading the code ruled out two and made 11 tickets, and found a committed token.
Case study

452 scanner findings and six criticals: which ones can actually hurt you?

For CTOs and security leads who receive scanner reports and have to decide what to fix first.

A source-only scan of a group of JavaScript and TypeScript applications produced 452 findings. We checked, critical by critical, whether the vulnerable code was actually used.

  • SaaS
  • JavaScript and TypeScript web applications
  • Money
  • Compliance
  • Reputation
  • Clients
A BetterQA engineer in glasses working at her desk beside a monitor full of code in the Cluj-Napoca office
At stake

What was at risk

Money

Engineering weeks spent on the label

One ticket per advisory would have been 166 tickets, closed by about a dozen version bumps. Time goes to the scanner's severity, not to the risk.

Compliance

A list you cannot defend

Context: customer security questionnaires and ISO 27001 or SOC 2 audits ask how vulnerabilities are triaged. A flat list of 452 cannot answer that. A reachability decision per critical can.

Reputation

A credential in the history

A personal access token was committed in a tracked configuration file and sat in six commits of history. It needed rotating.

Clients

A fix that did not reach the build

Two lockfiles disagreed, and the one CI installs from was the vulnerable one. The upgrade on paper was not the upgrade in the build.

The numbers
452raw findings, six of them labelled critical
4distinct advisories behind the six criticals, two of them ruled out
166distinct advisories behind 373 dependency findings
11tickets to act on, grouped by the package to upgrade
Rules

Standards and rules in play

  • Triage rule: is the vulnerable code used?Severity on a scanner list describes the advisory in general. Each critical was checked against the client's source: is the vulnerable feature in use?
  • Evidence labelsWhat could not be verified is said so: the build-time shell-quoting library was downgraded from critical to medium and labelled unverified.

Context: ISO 27001 and SOC 2 both expect a vulnerability-management process.

Method

How we tested it

Test level
Static review of the source code and dependency manifests of a group of repositories.
Test types
Security testing, white-box.
Test basis
The output of four scanners (dependency, secrets over full history, static analysis and a fourth) and the client's own source.
  • How we workedStatic analysisWhere it showed upFour scanners produced 452 findings: 6 critical, 183 high, 191 medium, 27 low and 41 with no rating.
  • How we workedCode reviewWhere it showed upReachability: for each critical we searched the source for the vulnerable feature: zero occurrences of a route-matching helper across 1,516 TypeScript files, OAuth plugins not enabled, raw-SQL helpers absent from all three repositories. Each negative came with a search that passed a negative control.

Terms as in the ISTQB CTFL 4.0.1 syllabus and glossary.

Findings

What we found, and what it costs

  • FindingRuled outTwo of the four distinct critical advisories are not reachable in the client's codeWhat it costs youNo work spent on code that cannot be attacked, and the reason is written down.
  • FindingOpenA request-validation framework flaw, counted three times, could not be ruled outWhat it costs youIt is a direct dependency with validation always on, so it became a ticket to upgrade, not an assumption.
  • FindingFoundA committed access token in six commits of history, liveness not testedWhat it costs youA credential in history needs rotating whether or not it still works.
  • FindingFoundThe lockfile CI installs from is the vulnerable oneWhat it costs youA fix applied to the wrong lockfile fixes nothing in the build.

Of 32 secrets hits, 29 were false positives, each disproved individually.

Outcome

What changed

452 findings became 11 tickets, ordered by reachability and grouped by the package to upgrade. 373 dependency findings collapsed to 166 advisories across 38 packages.

What this means for you: When a scanner hands you a long list, ask for the short one: which findings can be reached in your code, and what could not be ruled out.

Want a scan turned into a list you can act on?

We check reachability, say what we could not rule out and group findings by the work they need. The first month is a trial.

Talk to our team
Share the Post: