Verlass auf unzureichend vertrauenswürdige Komponente
Beschreibung
Verlass auf unzureichend vertrauenswürdige Komponente tritt auf, wenn ein Produkt aus mehreren separaten Komponenten aufgebaut ist, aber eine Komponente verwendet, die nicht ausreichend vertrauenswürdig ist, um Erwartungen an Sicherheit, Zuverlässigkeit, Aktualisierbarkeit und Wartbarkeit zu erfüllen. Produkte, die mehrere Komponenten kombinieren, riskieren die Einbeziehung nicht vertrauenswürdiger Elemente -- ob Drittanbieter-Hardware, Open-Source-Bibliotheken oder interne Legacy-Komponenten. Solche Komponenten können Schwachstellen beherbergen, die nicht zeitnah gepatcht werden können, versteckte Malware enthalten, sich der Aktualisierung widersetzen oder Spezifikationsanforderungen nicht erfüllen. Vertrauensbewertungen variieren zwischen Stakeholdern und erzeugen Kompromisse zwischen Sicherheit, Zuverlässigkeit, Safety und Kosten.
Risiko
Nicht vertrauenswürdige Komponenten haben schwerwiegende Auswirkungen. Supply-Chain-Kompromittierung. Versteckte Schwachstellen in Abhängigkeiten. Unmöglichkeit, Sicherheitsprobleme zu patchen. Malware in Drittanbieter-Code. Fehlende Sicherheitsupdates. Unbekannte Herkunft. Aufgegebene oder nicht gewartete Bibliotheken. Lizenz-Compliance-Probleme. Kaskadierende Schwachstellen. Hohe Wahrscheinlichkeit, wenn Abhängigkeitsmanagement vernachlässigt wird.
Lösung
Sicherstellen, dass Komponenten-Lieferketten Best Practices anwenden und dass Drittanbieter-Software von seriösen, aktiv gewarteten Anbietern stammt, während der Anforderungs- und Architekturphase. Eine Bill of Materials (BOM) und Software Bill of Materials (SBOM) pflegen -- ein formales, maschinenlesbares Inventar von Softwarekomponenten und Abhängigkeiten, während der Implementierungsphase. Komponentenänderungen kontinuierlich überwachen, insbesondere Schwachstellenankündigungen und End-of-Life-Pläne, während der Betriebs- und Patchingphase.
Häufige Auswirkungen
| Auswirkung | Details |
|---|---|
| Integrität | Bereich: Integrität Kompromittierte Komponentenintegrität, die die Gesamtsystemsicherheit beeinträchtigt. |
| Verfügbarkeit | Bereich: Verfügbarkeit Reduzierte Wartbarkeit und Unmöglichkeit, Schwachstellen zu patchen. |
Beispielcode
Verwundbarer Code
// VERWUNDBAR: package.json mit riskanten Abhängigkeiten
{
"name": "vulnerable-app",
"version": "1.0.0",
"dependencies": {
// VERWUNDBAR: Nicht gewartetes Paket (keine Updates seit 3+ Jahren)
"abandoned-lib": "^1.0.0",
// VERWUNDBAR: Paket mit bekannter kritischer Schwachstelle
"lodash": "4.17.15",
// VERWUNDBAR: Verwendung von Wildcard-Version (unvorhersehbare Updates)
"some-package": "*",
// VERWUNDBAR: Git-Abhängigkeit (keine Versionskontrolle)
"git-dep": "git://github.com/user/repo.git",
// VERWUNDBAR: Unbekannter/nicht vertrauenswürdiger Herausgeber
"shady-npm-pkg": "^2.0.0",
// VERWUNDBAR: Sehr alte Hauptversion
"express": "3.0.0"
}
}
# VERWUNDBAR: Python-Requirements mit riskanten Abhängigkeiten
# requirements.txt
# VERWUNDBAR: Keine Versions-Pinning
requests
django
flask
# VERWUNDBAR: Verwendung eines veralteten/nicht gewarteten Pakets
pycrypto==2.6.1 # Veraltet, pycryptodome verwenden
# VERWUNDBAR: Paket mit bekannten Schwachstellen
PyYAML==5.3 # CVE-2020-14343
# VERWUNDBAR: Installation von beliebiger URL
https://example.com/unknown-package.tar.gz
# VERWUNDBAR: Keine Hash-Verifikation
# pip install --no-verify-hashes
// VERWUNDBAR: Java pom.xml mit Abhängigkeitsproblemen
// pom.xml
/*
<dependencies>
<!-- VERWUNDBAR: Veraltete Version mit bekannten CVEs -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.30</version> <!-- CVE-2017-5638 -->
</dependency>
<!-- VERWUNDBAR: Verwendung von SNAPSHOT (instabil) -->
<dependency>
<groupId>com.example</groupId>
<artifactId>internal-lib</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- VERWUNDBAR: Keine Ausschlusse für transitive Abhängigkeiten -->
<dependency>
<groupId>some.group</groupId>
<artifactId>big-framework</artifactId>
<version>1.0</version>
<!-- Zieht Hunderte von transitiven Abhängigkeiten ein -->
</dependency>
</dependencies>
*/
// VERWUNDBAR: Go mit unverifizierten Abhängigkeiten
// go.mod
// VERWUNDBAR: Verwendung von Pseudo-Version (nicht getaggter Commit)
// require github.com/user/repo v0.0.0-20200101010101-abcdef123456
// VERWUNDBAR: Replace-Direktive zeigt auf lokalen/beliebigen Code
// replace github.com/original/repo => /local/path/to/code
// replace github.com/original/repo => github.com/fork/repo
// Verwundbarer Code, der unverifiziertes Paket verwendet
package main
import (
// VERWUNDBAR: Import aus unbekannter Quelle
"github.com/random-user/untrusted-crypto"
)
func main() {
// Verwendung einer potenziell kompromittierten kryptographischen Bibliothek
key := untrusted_crypto.GenerateKey()
// ...
}
Sichere Lösung
// SICHER: package.json mit sicherem Abhängigkeitsmanagement
{
"name": "secure-app",
"version": "1.0.0",
"dependencies": {
// SICHER: Gepinnte Versionen von seriösen Maintainern
"lodash": "4.17.21",
"express": "4.18.2",
// SICHER: Aktiv gewartete Alternativen
"axios": "1.4.0"
},
"devDependencies": {
// SICHER: Sicherheits-Scanning-Tools
"npm-audit": "^1.0.0",
"snyk": "^1.1000.0"
},
"scripts": {
// SICHER: Sicherheitsprüfungen in CI/CD
"security-check": "npm audit && snyk test",
"preinstall": "npm audit"
},
"engines": {
// SICHER: Unterstützte Node.js-Versionen angeben
"node": ">=18.0.0"
}
}
// package-lock.json bietet:
// - Exakte Versionen für alle Abhängigkeiten
// - Integritäts-Hashes (SHA-512)
// - Reproduzierbare Builds
# SICHER: Python-Requirements mit Sicherheitspraktiken
# requirements.txt mit gepinnten Versionen und Hashes
# SICHER: Gepinnte Versionen mit Hash-Verifikation
requests==2.31.0 \
--hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f
django==4.2.5 \
--hash=sha256:b6b2b5cae821077f137dc4898c6b46a3b4e2d2ae0f0eb9a5e6e0e0d3c8a5d4f1
# SICHER: Verwendung gewarteter kryptographischer Bibliothek
pycryptodome==3.19.0 \
--hash=sha256:abcdef1234567890
# SICHER: Sichere YAML-Bibliothek
PyYAML==6.0.1 \
--hash=sha256:1234567890abcdef
# requirements-dev.txt
# SICHER: Sicherheits-Scanning-Tools
safety==2.3.5
bandit==1.7.5
pip-audit==2.6.1
# SICHER: Python-Abhängigkeitsverifikation
import subprocess
import hashlib
import json
from typing import Dict, List
class DependencyVerifier:
"""SICHER: Abhängigkeiten vor der Verwendung verifizieren."""
def __init__(self, sbom_path: str):
self.sbom = self._load_sbom(sbom_path)
def _load_sbom(self, path: str) -> Dict:
"""SICHER: Software Bill of Materials laden."""
with open(path, 'r') as f:
return json.load(f)
def verify_all_dependencies(self) -> List[str]:
"""SICHER: Alle Abhängigkeiten gegen SBOM prüfen."""
issues = []
for dep in self.sbom.get('dependencies', []):
name = dep['name']
expected_version = dep['version']
expected_hash = dep.get('hash')
# SICHER: Prüfen ob installierte Version mit SBOM übereinstimmt
installed = self._get_installed_version(name)
if installed != expected_version:
issues.append(f"{name}: Versionsabweichung "
f"(erwartet {expected_version}, erhalten {installed})")
# SICHER: Integritäts-Hash verifizieren
if expected_hash:
actual_hash = self._compute_package_hash(name)
if actual_hash != expected_hash:
issues.append(f"{name}: Hash-Abweichung")
# SICHER: Auf bekannte Schwachstellen prüfen
vulns = self._check_vulnerabilities(name, expected_version)
if vulns:
issues.extend(vulns)
return issues
def _check_vulnerabilities(self, name: str, version: str) -> List[str]:
"""SICHER: Gegen Schwachstellendatenbank prüfen."""
# safety/pip-audit/etc. zur Prüfung verwenden
result = subprocess.run(
['pip-audit', '--requirement', '-', '--strict'],
input=f'{name}=={version}\n',
capture_output=True,
text=True
)
if result.returncode != 0:
return [f"{name}: {result.stdout}"]
return []
def generate_sbom(self, output_path: str):
"""SICHER: SBOM im CycloneDX-Format generieren."""
subprocess.run([
'cyclonedx-py',
'--format', 'json',
'--output', output_path
], check=True)
# Verwendung
verifier = DependencyVerifier('sbom.json')
issues = verifier.verify_all_dependencies()
if issues:
print("Abhängigkeitsverifikation fehlgeschlagen:")
for issue in issues:
print(f" - {issue}")
exit(1)
// SICHER: Java pom.xml mit sicherem Abhängigkeitsmanagement
/*
<project>
<properties>
<!-- SICHER: Zentralisiertes Versionsmanagement -->
<spring.version>6.0.11</spring.version>
<jackson.version>2.15.2</jackson.version>
</properties>
<dependencyManagement>
<!-- SICHER: BOM für konsistente Versionen verwenden -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>${spring.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- SICHER: Aktualisierte, gepatchte Version -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>6.3.0</version>
</dependency>
<!-- SICHER: Verwundbare transitive Abhängigkeiten ausschließen -->
<dependency>
<groupId>some.group</groupId>
<artifactId>big-framework</artifactId>
<version>2.0</version>
<exclusions>
<exclusion>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- SICHER: Ausgeschlossene Abhängigkeit durch sichere Version ersetzen -->
<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>8.4.0</version>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
<configuration>
<failBuildOnCVSS>7</failBuildOnCVSS>
</configuration>
</plugin>
<!-- SICHER: Abhängigkeitskonvergenz durchsetzen -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>3.4.1</version>
<executions>
<execution>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<dependencyConvergence/>
<banDuplicatePomDependencyVersions/>
</rules>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
*/
// SICHER: Go mit verifizierten Abhängigkeiten
// go.mod mit ordnungsgemäßer Versionierung
/*
module example.com/secure-app
go 1.21
// SICHER: Getaggte Releases verwenden
require (
github.com/go-chi/chi/v5 v5.0.10
golang.org/x/crypto v0.14.0
)
// SICHER: go.sum bietet automatisch Hash-Verifikation
// Ausführen: go mod verify
*/
// SICHER: Abhängigkeitsverifikation in CI/CD
package main
import (
"fmt"
"os/exec"
)
func verifyDependencies() error {
// SICHER: Modul-Prüfsummen verifizieren
cmd := exec.Command("go", "mod", "verify")
if err := cmd.Run(); err != nil {
return fmt.Errorf("Modul-Verifikation fehlgeschlagen: %w", err)
}
// SICHER: Auf Schwachstellen mit govulncheck prüfen
cmd = exec.Command("govulncheck", "./...")
output, err := cmd.CombinedOutput()
if err != nil {
return fmt.Errorf("Schwachstellenprüfung fehlgeschlagen: %s", output)
}
// SICHER: Prüfen dass keine Replace-Direktiven auf nicht vertrauenswürdige Quellen zeigen
cmd = exec.Command("go", "mod", "graph")
// Parsen und validieren...
return nil
}
// SICHER: SBOM-Generierung
func generateSBOM(outputPath string) error {
// cyclonedx-gomod oder ähnliches verwenden
cmd := exec.Command("cyclonedx-gomod", "mod", "-json", "-output", outputPath)
return cmd.Run()
}
CVE-Beispiele
- CVE-2021-44228: Log4Shell - Kritische Schwachstelle in der weit verbreiteten Apache Log4j-Bibliothek.
- CVE-2020-8203: Prototype Pollution in Lodash, die Millionen von Anwendungen betrifft.
- CVE-2017-5638: Apache Struts-Schwachstelle, die beim Equifax-Datenleck ausgenutzt wurde.
Verwandte CWEs
- CWE-710: Improper Adherence to Coding Standards (übergeordnet)
- CWE-1104: Use of Unmaintained Third Party Components (untergeordnet)
- CWE-1329: Reliance on Component That is Not Updateable (untergeordnet)
Referenzen
- MITRE Corporation. "CWE-1357: Reliance on Insufficiently Trustworthy Component." https://cwe.mitre.org/data/definitions/1357.html
- OWASP. "Software Component Verification Standard (SCVS)"
- NTIA. "Software Bill of Materials (SBOM)"