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

AuswirkungDetails
VertraulichkeitBereich: Vertraulichkeit

Datenexposition durch Ausnutzung von Schwachstellen in Drittanbieter-Komponenten.
IntegritatBereich: Integritat

Systemkompromittierung durch Remote Code Execution in verwundbaren Abhängigkeiten.
VerfügbarkeitBereich: 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

  1. MITRE Corporation. "CWE-1395: Dependency on Vulnerable Third-Party Component." https://cwe.mitre.org/data/definitions/1395.html
  2. OWASP. "A06:2021-Vulnerable and Outdated Components"
  3. NTIA. "Software Bill of Materials (SBOM)"