OWASP A06

Testing for Vulnerable and Outdated Components

Your dependency scanner produces hundreds of advisories. The useful question is not which libraries are outdated, but which vulnerable code paths your application actually reaches.

  • Reachability analysis, not a raw advisory dump
  • Covers frontend bundles and container base images
  • Findings ranked by exploitability in your configuration

What vulnerable and outdated components looks like in a real application

A team receives four hundred dependency advisories, twelve rated critical. After analysis, nine of the twelve are in code paths the application never calls, two require a configuration the application does not use, and one is genuinely exploitable through a file upload feature. The team had been treating all twelve as equally urgent for months, and had not yet reached the one that mattered.

Component risk is not a counting problem. It is a reachability problem, and reachability is the part automated tooling reports least well.

What we examine when testing for vulnerable and outdated components

  • Direct and transitive dependencies, since most exploitable components arrive several levels deep
  • Reachability — whether your code calls the vulnerable function, and whether user input can reach it
  • Frontend bundles, where outdated libraries ship to every visitor and are trivially fingerprinted
  • Container base images and operating system packages, frequently older than the application on top of them
  • Unmaintained components with no advisory at all, which are a larger long-term risk than a patched CVE
  • Version disclosure allowing an attacker to fingerprint your stack and select exploits precisely
  • Build and pipeline dependencies, where compromise affects everything you ship
  • Patch capability — whether you could deploy an urgent upgrade quickly if one were required

How we test for vulnerable and outdated components

We start with inventory, because most teams do not have a complete one, particularly for transitive and frontend dependencies. Then we triage: for each advisory that could matter, determine whether the vulnerable path exists in your build, whether it is reachable from an entry point, and whether your configuration enables the affected behaviour.

Where a component is reachable and exploitable, we demonstrate it rather than citing the advisory. A proven finding gets prioritised by your team; a CVE number in a table competes with three hundred others and loses.

Why the advisory count is the wrong metric

Advisory volume measures how much software you use, not how exposed you are. Teams that respond to volume rather than reachability spend their remediation budget on upgrades that change nothing while the exploitable path stays open. The most valuable output in this category is usually a much shorter list than the one you started with, in a defensible order.

How vulnerable and outdated components gets fixed

  • Generate and keep a software bill of materials so inventory is a fact rather than an investigation
  • Prioritise by reachability and exposure, and record the reasoning so deferrals survive an audit question
  • Automate routine patching so human attention is reserved for the cases that need judgement
  • Rebuild container images on a schedule rather than only when the application changes
  • Track maintenance status, not just versions — an unmaintained dependency needs a replacement plan
  • Practise an emergency upgrade so the first attempt is not during an active incident

Common questions

Do we need to fix every CVE our scanner reports?

No, and attempting it usually delays the fixes that matter. What you need is a defensible process: know what you depend on, determine which vulnerabilities are reachable and exposed in your application, fix those first, and record why the rest were deferred. Auditors accept documented risk-based prioritisation; they do not require a zero count.

How do you decide whether a vulnerability is reachable?

By checking whether the vulnerable function exists in your build, whether your code path calls it, whether user-controlled input can reach that call, and whether your configuration enables the affected feature. Where all four hold we attempt exploitation to confirm. Where source access is available this is faster and more precise.

Is this the same as software composition analysis?

Composition analysis is the inventory and matching step, and we use those tools. The work we add is triage and confirmation: turning a list of advisories into a ranked set of findings you can act on, with the exploitable ones proven.

Do you test our frontend JavaScript dependencies?

Yes, and they deserve specific attention because they ship to every visitor and are trivially fingerprinted from the browser. An outdated frontend library is visible to anyone who looks, which makes it a more attractive target than a backend dependency an attacker has to guess at. We check the bundle as delivered, not just the manifest.

What do we do about a vulnerability with no patch available?

Reduce reachability rather than waiting. Disable the affected feature if you do not use it, add validation in front of the vulnerable path, restrict what the component can reach, or replace it. Document the decision and the compensating control, because an auditor will accept a reasoned mitigation and will not accept an unexplained open item.

Does a software bill of materials help our compliance position?

Materially, yes. It turns dependency inventory from an investigation into a lookup, which is what makes risk-based prioritisation defensible when an auditor asks why a particular advisory was deferred. It also shortens your response time when a widely-exploited vulnerability is announced, because you can answer the question of whether you are affected in minutes.

How often should we scan dependencies?

Continuously in your pipeline, so a new dependency is assessed when it is introduced rather than at the next audit. The scanning is cheap and automatic; the part that needs a cadence is triage. A weekly review of what is newly reachable and exposed is more useful than a monthly attempt to clear an entire advisory backlog.

Let's scope your infrastructure.

Tell us what you have built and what you are testing against. You will speak to a Lead Security Architect, not a sales desk, and you will get a written scope with a fixed price before any work begins.

Request a Technical Scope