OPEN BETA
OPEN BETA
DEPENDENCY INTEGRITY AUDIT

📦 Supply Chain Intelligence

Kontinuierliche Überwachung aller Third-Party-JavaScript-Abhängigkeiten, CDN-gehosteter Ressourcen und externer Skripte auf Integrity-Verletzungen, unerwartete Mutationen, Skimmer-Payload-Injektionen und fehlende SRI-Policies.

SRIHash-Validierung
Δ diffChange-Detection
CDNProvider-Tracking
SkimmingPattern-Erkennung

// Die Supply-Chain-Angriffsfläche

Eine durchschnittliche Enterprise-Webanwendung lädt 20–80 Third-Party-JavaScript-Dateien von externen CDNs, Analytics-Providern, Zahlungsdienstleistern und Marketing-Plattformen. Jede dieser Quellen ist ein potentieller Supply-Chain-Angriffsvektor — ein kompromittiertes npm-Paket, ein gekaperter CDN-Account oder eine typosquattete Bibliothek kann unbemerkt Skimmer-Code, Cryptominer oder Datenexfiltrations-Payloads in jede betroffene Seite injizieren.

Reale Angriffe

  • Magecart (2015–heute) — Kreditkarten-Skimmer via kompromittierte Drittanbieter-Skripte; British Airways (500k Karten), Ticketmaster, Newegg
  • Polyfill.io (2024) — Domain an chinesisches Unternehmen verkauft; 100k+ Sites von Schadcode betroffen
  • xz Utils (2024) — Backdoor via Social Engineering des Maintainers; Beinahe-Kompromiss von SSH-Servern
  • Event-Stream (2018) — Böswilliger Maintainer ergänzte Kryptowallet-Stealer in npm-Paket mit 2M Weekly Downloads

Überwachte Angriffsvektoren

  • CDN-Account-Kompromiss → Script-Mutation
  • npm-Package-Hijacking (Dependency Confusion)
  • Typosquatting populärer Pakete
  • Subdomain-Takeover des Script-Hosting-Hosts
  • Man-in-the-Middle auf unverschlüsselter CDN-Delivery
  • Böswillige Cache-Poisoning am CDN-Edge
  • Domain-Expiry → Neuregistrierung durch Angreifer

// Scanner-Architektur

Der YADS Supply-Chain-Scanner (javascript_supply_chain Add-On) nutzt Playwright, um die Zielseite vollständig zu rendern — inklusive aller dynamisch geladenen Skripte. Anschließend werden alle externen Ressourcen-URLs extrahiert, jede Ressource abgerufen, SHA-256/SHA-384-Hashes berechnet und gegen Baseline sowie bekannte SRI-Datenbanken abgeglichen.

async def scan_supply_chain(domain: str, playwright_page) -> SupplyChainResult: resources = [] # Alle Netzwerk-Requests während des Seitenladens abfangen async def on_request(request): if request.resource_type in ("script", "stylesheet", "fetch"): resources.append(request.url) playwright_page.on("request", on_request) await playwright_page.goto(f"https://{domain}", wait_until="networkidle") results = [] for url in resources: if not _is_same_origin(url, domain): # Nur externe Ressourcen content = await _fetch_resource(url) sha384 = hashlib.sha384(content).digest() sri_hash = f"sha384-{base64.b64encode(sha384).decode()}" result = ExternalResource( url=url, cdn_provider=_detect_cdn(url), sri_hash=sri_hash, sri_in_html=_check_sri_attribute(url, playwright_page), known_malicious=_check_threat_db(sha384), skimmer_patterns=_check_skimmer_patterns(content), baseline_delta=_compare_to_baseline(url, sha384), ) results.append(result) return SupplyChainResult(domain=domain, resources=results)
PrüfungMethodeSchweregrad
SRI-Hash fehltKein integrity=-Attribut an <script>- oder <link>-Tags für externe RessourcenMedium
SRI-Hash-MismatchBerechneter SHA-384 weicht vom deklarierten integrity=-Wert abCritical
Bekannter Schadcode-HashSHA-256 trifft auf Threat-Intelligence-Datenbank bekannter Schadskript-HashesCritical
Skimmer-Pattern-TrefferSkriptinhalt matched Magecart/Kreditkarten-Skimmer-Regex (Base64-Datenexfil, Form-Hijack, Iframe-Injektion)Critical
Baseline-Hash-ÄnderungSHA-384 weicht vom zuletzt gesehenen Hash für diese URL ab (unerwartete Mutation)High
HTTP (kein TLS) DeliveryExternes Skript über http:// geladen — anfällig für MITM-InjektionHigh
Ablaufende Hosting-DomainCDN-Domain hat WHOIS-Expiry < 30 Tage — Angreifer-Neuregistrierungs-RisikoHigh
Typosquatted Package-NameSkript-URL-Pfad matched bekanntes Typosquat-Pattern gegen legitimes PaketHigh

// Skimmer-Pattern-Erkennung

YADS pflegt eine kuratierte Pattern-Bibliothek bekannter Magecart- und Kreditkarten-Skimmer-Indikatoren. Muster werden nach Möglichkeit auf deobfuskierten Skriptinhalt angewendet. Ein einzelner Treffer löst sofort einen Critical-Befund mit dem gematchten Pattern und der Skript-URL aus.

SKIMMER_PATTERNS = [ # Exfiltration via Image-Beacon mit Base64-kodiertem Payload re.compile(r'new Image\(\)\.src\s*=.*btoa', re.IGNORECASE), # Form-Submission-Hijacking re.compile(r'addEventListener\(["\']submit["\'].*XMLHttpRequest', re.IGNORECASE | re.DOTALL), # Klassischer Magecart XOR-kodierter Payload re.compile(r'String\.fromCharCode\(\s*\d+\s*\^\s*\d+', re.IGNORECASE), # Datenexfiltration zu Nicht-First-Party-Domain via fetch re.compile(r'fetch\s*\(\s*["\']https?://(?!SITE_DOMAIN).*["\'].*card|cvv|pan', re.IGNORECASE), # Verschleierter document.cookie-Stealer re.compile(r'atob\s*\(.*document\.cookie', re.IGNORECASE), # Iframe-Overlay für Credential-Phishing re.compile(r'createElement\s*\(\s*["\']iframe["\'].*position:\s*(?:fixed|absolute).*z-index:\s*9{3,}'), ]

// Change-Baseline & kontinuierliche Überwachung

Beim ersten Scan werden alle externen Ressourcen-Hashes als vertrauenswürdige Baseline gespeichert. Folge-Scans vergleichen gegen diese Baseline — jede Hash-Änderung bei einer nicht-versionierten URL (kein Versions-String im Pfad) löst einen High-Befund aus, der eine Operator-Prüfung erfordert, bevor der neue Hash als Baseline akzeptiert wird.

EigenschaftWert
Modul-Namejavascript_supply_chain (Add-On, Enterprise)
Baseline-SpeicherungScanResult.data.supply_chain_baseline — Dict von URL → SHA-384
Scan-FrequenzJeder Group-B-Scan-Zyklus (konfigurierbar, Standard: täglich)
Max. überwachte Ressourcen200 pro Domain (konfigurierbar)
Playwright-AnforderungChromium Headless — für dynamisches Script-Loading erforderlich
Timeout30s Seitenlade + 60s Ressourcen-Fetch-Budget
DeduplizierungGleiche URL mit Versions-String-Änderung (Semver-Bump) — automatisch akzeptiert, als Info geloggt