Abhängigkeit von verwundbaren Drittanbieter-Komponenten
Beschreibung
Abhängigkeit von verwundbaren Drittanbieter-Komponenten tritt auf, wenn ein Produkt eine Abhängigkeit von einer Drittanbieter-Komponente hat, die eine oder mehrere bekannte Schwachstellen enthält. Produkte verlassen sich häufig auf Bibliotheken, Module oder Komponenten von Drittanbietern, die von externen Parteien entwickelt wurden. Diese Abhängigkeiten - ob in offener oder geschlossener Quellform - können öffentlich bekannte Schwachstellen enthalten, die Angreifer ausnutzen könnten, um das Produkt zu kompromittieren. Die Auswirkung variiert je nach den spezifischen vorhandenen Schwachstellen, wie Angreifer darauf zugreifen können und der Kritikalitat der Funktionen, die auf dieser Komponente basieren.
Risiko
Verwundbare Abhängigkeiten haben schwerwiegende Auswirkungen. Vererbte Schwachstellen aus Drittanbieter-Code. Supply-Chain-Angriffe. Zero-Day-Ausnutzung über transitive Abhängigkeiten. Ausnutzung öffentlich bekannter CVEs. Remote Code Execution über Bibliotheksschwachstellen. Datenlecks. Dienstunterbrechung. Kaskadierende Ausfalle über abhängige Produkte. Hohe Wahrscheinlichkeit, da Dependency-Scanning-Tools verwundbare Komponenten leicht identifizieren.
Lösung
Organisatorische Rollen und Verantwortlichkeiten für die Anwendung von Patches klaren. Eine Software Bill of Materials (SBOM) erfordern, die alle Komponenten dokumentiert. Herstellerankündigungen aktiv auf Schwachstellen-Patches überwachen. Änderungen an Produktkomponenten kontinuierlich verfolgen, insbesondere Schwachstellenbekanntmachungen und End-of-Life-Mitteilungen. Schnelle Patching-Verfahren für Drittanbieter-Schwachstellen implementieren.
Häufige Auswirkungen
| Auswirkung | Details |
|---|---|
| Vertraulichkeit | Bereich: Vertraulichkeit Datenexposition durch Ausnutzung von Schwachstellen in Drittanbieter-Komponenten. |
| Integritat | Bereich: Integritat Systemkompromittierung durch Remote Code Execution in verwundbaren Abhängigkeiten. |
| Verfügbarkeit | Bereich: Verfügbarkeit Dienstunterbrechung durch Denial-of-Service-Schwachstellen in Abhängigkeiten. |
Beispielcode
Verwundbarer Code
// VERWUNDBAR: package.json mit bekannten verwundbaren Abhängigkeiten
{
"name": "vulnerable-app",
"version": "1.0.0",
"dependencies": {
// VERWUNDBAR: Log4j mit Log4Shell (CVE-2021-44228)
"log4j-core": "2.14.1",
// VERWUNDBAR: Lodash Prototype Pollution (CVE-2020-8203)
"lodash": "4.17.15",
// VERWUNDBAR: Express mit ReDoS (verschiedene CVEs)
"express": "4.16.0",
// VERWUNDBAR: Axios SSRF (CVE-2020-28168)
"axios": "0.19.0",
// VERWUNDBAR: Moment.js ReDoS und veraltet
"moment": "2.24.0",
// VERWUNDBAR: serialize-javascript XSS (CVE-2020-7660)
"serialize-javascript": "2.1.0",
// VERWUNDBAR: minimist Prototype Pollution (CVE-2020-7598)
"minimist": "1.2.0",
// VERWUNDBAR: node-fetch Open Redirect
"node-fetch": "2.6.0",
// VERWUNDBAR: Transitive Abhängigkeit durch altes Paket
"some-old-package": "1.0.0"
}
}
<!-- VERWUNDBAR: pom.xml mit bekannten verwundbaren Abhängigkeiten -->
<project>
<dependencies>
<!-- VERWUNDBAR: Log4j 2.x vor 2.17.0 (Log4Shell) -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.1</version>
</dependency>
<!-- VERWUNDBAR: Spring Framework RCE (Spring4Shell) -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.17</version>
</dependency>
<!-- VERWUNDBAR: Apache Struts RCE (CVE-2017-5638) -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.30</version>
</dependency>
<!-- VERWUNDBAR: Jackson Deserialisierung (viele CVEs) -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
<!-- VERWUNDBAR: Apache Commons Collections Gadget Chain -->
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<!-- VERWUNDBAR: Hibernate ORM SQL Injection -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.3.0.Final</version>
</dependency>
</dependencies>
</project>
# VERWUNDBAR: requirements.txt mit verwundbaren Paketen
# VERWUNDBAR: PyYAML beliebige Codeausführung (CVE-2020-14343)
PyYAML==5.3
# VERWUNDBAR: Pillow Buffer Overflow (mehrere CVEs)
Pillow==6.2.0
# VERWUNDBAR: Django SQL Injection, XSS
Django==2.2.0
# VERWUNDBAR: Flask Debug-Modus-Schwachstelle
Flask==0.12.0
# VERWUNDBAR: Requests CRLF Injection
requests==2.20.0
# VERWUNDBAR: Jinja2 Sandbox Escape
Jinja2==2.10
# VERWUNDBAR: Paramiko Auth Bypass
paramiko==2.4.0
# VERWUNDBAR: NumPy Buffer Overflow
numpy==1.16.0
# VERWUNDBAR: cryptography-Bibliothek-Schwachstelle
cryptography==2.3
# VERWUNDBAR: urllib3 CRLF Injection
urllib3==1.24.0
Sichere Lösung
// SICHER: package.json mit sicherer Abhängigkeitsverwaltung
{
"name": "secure-app",
"version": "1.0.0",
"dependencies": {
// SICHER: Auf gepatchte Versionen aktualisiert
"express": "4.18.2",
"axios": "1.6.0",
"lodash": "4.17.21",
"node-fetch": "3.3.2"
},
"devDependencies": {
// SICHER: Sicherheits-Scanning-Tools
"npm-audit-fix": "^1.0.0",
"snyk": "^1.1000.0",
"audit-ci": "^6.0.0"
},
"scripts": {
// SICHER: Sicherheitsprüfungen in CI/CD
"security": "npm audit --audit-level=high && snyk test",
"preinstall": "npm audit",
"postinstall": "npm audit"
},
"overrides": {
// SICHER: Gepatchte Versionen transitiver Abhängigkeiten erzwingen
"minimist": "1.2.8",
"glob-parent": "5.1.2"
}
}
# SICHER: Umfassendes Sicherheitsmanagement für Abhängigkeiten
import subprocess
import json
import sys
from typing import List, Dict, Optional
from datetime import datetime
class DependencySecurityManager:
"""SICHER: Abhängigkeiten auf Schwachstellen verwalten und prüfen."""
def __init__(self, requirements_file: str = 'requirements.txt'):
self.requirements_file = requirements_file
self.sbom = None
def audit_dependencies(self) -> List[Dict]:
"""SICHER: Abhängigkeiten auf bekannte Schwachstellen scannen."""
vulnerabilities = []
# SICHER: Safety für Python-Schwachstellen-Scanning verwenden
result = subprocess.run(
['safety', 'check', '-r', self.requirements_file, '--json'],
capture_output=True,
text=True
)
if result.returncode != 0:
vulns = json.loads(result.stdout)
for vuln in vulns.get('vulnerabilities', []):
vulnerabilities.append({
'package': vuln['package_name'],
'installed': vuln['analyzed_version'],
'vulnerable_versions': vuln['vulnerable_versions'],
'cve': vuln.get('CVE'),
'severity': vuln.get('severity', 'unknown'),
'advisory': vuln.get('advisory')
})
# SICHER: Auch pip-audit verwenden
result = subprocess.run(
['pip-audit', '-r', self.requirements_file, '-f', 'json'],
capture_output=True,
text=True
)
if result.stdout:
audit_results = json.loads(result.stdout)
for pkg in audit_results.get('dependencies', []):
for vuln in pkg.get('vulns', []):
vulnerabilities.append({
'package': pkg['name'],
'installed': pkg['version'],
'cve': vuln.get('id'),
'fix_versions': vuln.get('fix_versions', [])
})
return vulnerabilities
def generate_sbom(self, output_file: str = 'sbom.json'):
"""SICHER: Software Bill of Materials generieren."""
subprocess.run([
'cyclonedx-py', 'requirements',
'-i', self.requirements_file,
'-o', output_file,
'--format', 'json'
], check=True)
with open(output_file) as f:
self.sbom = json.load(f)
return self.sbom
def check_for_updates(self) -> List[Dict]:
"""SICHER: Auf verfügbare Sicherheitsupdates prüfen."""
updates = []
result = subprocess.run(
['pip', 'list', '--outdated', '--format=json'],
capture_output=True,
text=True
)
if result.stdout:
outdated = json.loads(result.stdout)
for pkg in outdated:
updates.append({
'package': pkg['name'],
'current': pkg['version'],
'latest': pkg['latest_version']
})
return updates
def enforce_security_policy(self) -> bool:
"""SICHER: Sicherheitsrichtlinie durchsetzen - bei hohen/kritischen Schwachstellen fehlschlagen."""
vulns = self.audit_dependencies()
critical_vulns = [v for v in vulns
if v.get('severity', '').lower() in ['critical', 'high']]
if critical_vulns:
print("SICHERHEITSRICHTLINIEN-VERSTOß: Kritische Schwachstellen gefunden")
for v in critical_vulns:
print(f" - {v['package']}: {v.get('cve', 'Unbekannte CVE')}")
return False
return True
# SICHER: CI/CD-Integration
def security_check():
"""SICHER: Sicherheitsprüfungen in CI/CD-Pipeline ausführen."""
manager = DependencySecurityManager()
# SBOM generieren
print("SBOM wird generiert...")
manager.generate_sbom()
# Auf Schwachstellen prüfen
print("Schwachstellen werden gescannt...")
if not manager.enforce_security_policy():
sys.exit(1)
print("Sicherheitsprüfung bestanden!")
if __name__ == '__main__':
security_check()
// SICHER: Java mit umfassender Abhängigkeitssicherheit
/*
* SICHER: pom.xml mit Sicherheits-Scanning und gepatchten Abhängigkeiten
*/
/*
<project>
<properties>
<!-- SICHER: Zentralisierte Versionsverwaltung -->
<log4j.version>2.21.1</log4j.version>
<spring.version>6.1.1</spring.version>
<jackson.version>2.16.0</jackson.version>
</properties>
<dependencies>
<!-- SICHER: Log4j auf gepatchte Version aktualisiert -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- SICHER: Spring auf gepatchte Version aktualisiert -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- SICHER: Jackson aktualisiert -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<!-- SICHER: Sichere Commons Collections 4 verwenden -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- SICHER: OWASP Dependency Check -->
<plugin>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-maven</artifactId>
<version>9.0.0</version>
<configuration>
<failBuildOnCVSS>7</failBuildOnCVSS>
<suppressionFile>dependency-check-suppressions.xml</suppressionFile>
</configuration>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- SICHER: CycloneDX SBOM-Generierung -->
<plugin>
<groupId>org.cyclonedx</groupId>
<artifactId>cyclonedx-maven-plugin</artifactId>
<version>2.7.10</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>makeAggregateBom</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- SICHER: Abhängigkeitskonvergenz durchsetzen -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>3.4.1</version>
<executions>
<execution>
<id>enforce</id>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<banDuplicatePomDependencyVersions/>
<dependencyConvergence/>
<banVulnerable>
<searchTransitive>true</searchTransitive>
</banVulnerable>
</rules>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
*/
# SICHER: GitHub Actions Workflow für Abhängigkeitssicherheit
# .github/workflows/security.yml
name: Abhängigkeits-Sicherheitsprüfung
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
schedule:
# SICHER: Tägliche Schwachstellen-Scans
- cron: '0 6 * * *'
jobs:
security-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# SICHER: Snyk Schwachstellen-Scanning
- name: Run Snyk Security Scan
uses: snyk/actions/node@master
env:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
with:
args: --severity-threshold=high
# SICHER: npm audit
- name: npm audit
run: npm audit --audit-level=high
# SICHER: SBOM generieren
- name: Generate SBOM
run: npx @cyclonedx/cdxgen -o sbom.json
# SICHER: SBOM als Artefakt hochladen
- name: Upload SBOM
uses: actions/upload-artifact@v3
with:
name: sbom
path: sbom.json
# SICHER: Abhängigkeitsprüfung für PRs
- name: Dependency Review
if: github.event_name == 'pull_request'
uses: actions/dependency-review-action@v3
with:
fail-on-severity: high
deny-licenses: GPL-3.0, AGPL-3.0
python-security:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
# SICHER: Safety-Prüfung
- name: Safety Check
run: |
pip install safety
safety check -r requirements.txt
# SICHER: pip-audit
- name: pip-audit
run: |
pip install pip-audit
pip-audit -r requirements.txt
java-security:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up JDK
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
# SICHER: OWASP Dependency Check
- name: OWASP Dependency Check
run: mvn dependency-check:check
CVE-Beispiele
- CVE-2021-44228: Log4Shell - Kritische RCE in Apache Log4j, die Milliarden von Geraten betrifft.
- CVE-2017-5638: Apache Struts RCE, ausgenutzt beim Equifax-Datenleck.
- CVE-2020-8203: Lodash Prototype Pollution, die Millionen von Anwendungen betrifft.
- CVE-2022-22965: Spring4Shell - RCE im Spring Framework.
Verwandte CWEs
- CWE-657: Violation of Secure Design Principles (Eltern)
- CWE-1357: Reliance on Insufficiently Trustworthy Component (verwandt)
- CWE-1104: Use of Unmaintained Third Party Components (verwandt)
Referenzen
- MITRE Corporation. "CWE-1395: Dependency on Vulnerable Third-Party Component." https://cwe.mitre.org/data/definitions/1395.html
- OWASP. "A06:2021-Vulnerable and Outdated Components"
- NTIA. "Software Bill of Materials (SBOM)"