Use of Unmaintained Third Party Components
Description
Use of Unmaintained Third Party Components occurs when a product depends on third-party components that are no longer actively maintained or supported. Unmaintained components do not receive security patches, leaving known vulnerabilities unaddressed. As new vulnerabilities are discovered, they remain exploitable indefinitely. This creates an ever-growing attack surface as the component ages. Additionally, unmaintained components may have compatibility issues with newer systems and may lack documentation for proper security configuration.
Risk
Unmaintained components are a significant supply chain security risk. When vulnerabilities are discovered in abandoned libraries, no patches are forthcoming, leaving all dependent applications permanently vulnerable. The Log4j vulnerability (CVE-2021-44228) demonstrated how a single library vulnerability can affect millions of applications. Dependency chains mean that even indirect dependencies on unmaintained components create risk. Attackers actively scan for applications using known-vulnerable versions of popular libraries.
Solution
Maintain an inventory of all third-party components (Software Bill of Materials - SBOM). Monitor components for maintenance status and security advisories. Replace unmaintained components with actively maintained alternatives before they become security liabilities. Use automated dependency scanning tools (Dependabot, Snyk, OWASP Dependency-Check). Implement policies requiring minimum maintenance activity for approved components. Plan for component lifecycle—have migration strategies ready. Consider forking critical abandoned projects if no alternatives exist.
Common Consequences
| Impact | Details |
|---|---|
| Confidentiality | Scope: Data Exposure Unpatched vulnerabilities in components can be exploited to access sensitive data. |
| Integrity | Scope: System Compromise Known vulnerabilities in unmaintained components enable attacks. |
| Availability | Scope: Service Disruption Compatibility issues and exploits can cause system failures. |
Example Code + Solution Code
Vulnerable Code
// VULNERABLE: package.json with unmaintained dependencies
{
"dependencies": {
"event-stream": "3.3.6", // Compromised in 2018, no longer maintained
"left-pad": "1.3.0", // Infamous npm incident, abandoned
"request": "2.88.2", // Deprecated since 2020
"moment": "2.29.1", // In maintenance mode, no new features
"lodash": "3.10.1" // Very old version with known vulnerabilities
}
}
<!-- VULNERABLE: pom.xml with unmaintained Java libraries -->
<dependencies>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts-core</artifactId>
<version>1.3.10</version> <!-- Struts 1 EOL since 2013! -->
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version> <!-- Known deserialization vuln -->
</dependency>
</dependencies>
# VULNERABLE: requirements.txt with unmaintained packages
django==1.11 # EOL since 2020
Pillow==5.0.0 # Very old, many CVEs
requests==2.6.0 # Old version with vulnerabilities
pycrypto==2.6.1 # Unmaintained, replaced by pycryptodome
Fixed Code
// SAFE: package.json with maintained alternatives
{
"dependencies": {
"readable-stream": "^4.0.0", // Maintained alternative to event-stream
"string.prototype.padstart": "^3.1.0", // Native-like alternative
"axios": "^1.6.0", // Active alternative to request
"date-fns": "^3.0.0", // Active alternative to moment
"lodash": "^4.17.21" // Current maintained version
},
"scripts": {
"audit": "npm audit",
"outdated": "npm outdated"
}
}
<!-- SAFE: pom.xml with maintained libraries -->
<dependencies>
<!-- Use Spring MVC or other maintained framework -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>6.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version> <!-- Maintained version -->
</dependency>
</dependencies>
<!-- Add OWASP dependency check plugin -->
<plugin>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-maven</artifactId>
<version>9.0.0</version>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
# SAFE: requirements.txt with maintained packages
django>=4.2,<5.0 # LTS version, actively maintained
Pillow>=10.0.0 # Current maintained version
requests>=2.31.0 # Current version
pycryptodome>=3.19.0 # Maintained fork of pycrypto
# Add to CI/CD pipeline:
# pip install pip-audit
# pip-audit --requirement requirements.txt
# SAFE: GitHub Actions workflow for dependency monitoring
name: Dependency Security
on:
schedule:
- cron: '0 0 * * 1' # Weekly
push:
branches: [main]
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run npm audit
run: npm audit --audit-level=moderate
- name: Check for outdated packages
run: npm outdated || true
- name: Run Snyk security scan
uses: snyk/actions/node@master
env:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
sbom:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Generate SBOM
uses: anchore/sbom-action@v0
with:
format: spdx-json
output-file: sbom.spdx.json
Exploited in the Wild
Log4Shell (Log4j, 2021)
CVE-2021-44228 in Apache Log4j affected millions of applications. While Log4j is maintained and was patched quickly, applications using older versions or those slow to update remained vulnerable for extended periods.
event-stream npm Package Compromise (2018)
The event-stream npm package was transferred to a malicious maintainer who injected cryptocurrency-stealing code, demonstrating risks when package ownership changes.
Apache Struts 1 Vulnerabilities (Ongoing)
Applications still using Struts 1 (EOL since 2013) remain vulnerable to known exploits with no patches available.
Tools to test/exploit
-
OWASP Dependency-Check — identify vulnerable dependencies.
-
Snyk — continuous dependency monitoring.
CVE Examples
-
CVE-2021-44228 — Log4Shell RCE in Log4j.
-
CVE-2017-5638 — Apache Struts RCE (Equifax breach).
-
CVE-2015-7501 — Commons Collections deserialization.
References
-
MITRE. "CWE-1104: Use of Unmaintained Third Party Components." https://cwe.mitre.org/data/definitions/1104.html
-
OWASP. "A06:2021 – Vulnerable and Outdated Components." https://owasp.org/Top10/A06_2021-Vulnerable_and_Outdated_Components/