Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
pasteguard-PoC — PoC — Cross-Origin-Proxy-Missbrauch konfigurierter Provider-API-Schlüssel in PasteGuard (GHSA-q94x-p9rc-q89f, CVE-2026-86998, CVSS 7.6). | Kitploit
Tools/GitHubGitHub/squeeze440/pasteguard-poc
SchwachstellenanalyseExploitationWebsicherheitPenetrationstestsPapers & ForschungAPI-Sicherheit
GitHubsqueeze440/pasteguard-poc

pasteguard-PoC

PoC — Cross-Origin-Proxy-Missbrauch konfigurierter Provider-API-Schlüssel in PasteGuard (GHSA-q94x-p9rc-q89f, CVE-2026-86998, CVSS 7.6).

Repository anzeigen
vor 7 TagenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

PasteGuard: Sicherheitshinweis

CVE-Status: beantragt, Zuweisung ausstehend. Dieser Fund wird als GHSA-q94x-p9rc-q89f veröffentlicht. Bei der CVE-Zuweisung wird dieses Repository in CVE-YYYY-NNNNN-pasteguard-PoC umbenannt und dieser Banner durch den CVE-Link ersetzt.

ForscherDostxodjayev Abdullox (@squeeze440)
AdvisoryGHSA-q94x-p9rc-q89f
CVSS 3.17.6 (Hoch)
SchwachstelleCWE-352, CWE-942

Zusammenfassung: Fehlender CORS/CSRF-Schutz auf den LLM-Proxy-Routen in PasteGuard 0.9.1 ermöglicht einem entfernten Angreifer (jeder Website, die der Browser des Betreibers besucht, oder jedem Host im lokalen Netzwerk), authentifizierte Anfragen an die konfigurierte OpenAI/Anthropic-API des Betreibers unter Verwendung des serverseitigen Fallback-API-Schlüssels von PasteGuard auszulösen und die Antwort zu lesen, über einen Cross-Origin-fetch() an /openai/v1/chat/completions (und die Schwesterroute /anthropic/v1/messages).

Produkt: PasteGuard (github.com/sgasser/pasteguard)

Getestete Version: Commit 100718191499c52934f3b2ccca72ca16373fb765 (2026-07-30), package.json-Version 0.9.1

Geschätzte CVSS v3.1: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:L/A:H — 7.6 (Hoch)

  • UI:R — der Betreiber muss mit seinem Browser eine Seite öffnen (irgendeine Seite, auf irgendeiner Website), während PasteGuard läuft; keine weitere Interaktion ist erforderlich.
  • C:L / I:L — das JS des Angreifers liest nur die Antwort auf seinen eigenen, vom Angreifer gewählten Prompt (nicht die vergangenen Gespräche/Dashboard-Daten des Betreibers, die korrekt von CORS ausgeschlossen sind), aber dies bestätigt/verwendet dennoch ein aktives, finanziertes Konto und verfälscht die Nutzungs-/Audit-Spur des Kontos unter der Identität des Betreibers.
  • A:H — die realistische, unbegrenzte Auswirkung: eine Angreifer-Seite kann diese Anfrage unbegrenzt wiederholen und dadurch echte, abgerechnete Nutzung gegen das Provider-Konto/Kontingent des Betreibers erzeugen (finanzieller Abfluss, mögliche Erschöpfung des Rate-Limits oder Abuse-Flags seitens des Providers), ohne dass eine Ratenbegrenzung oder Origin-Prüfung im Weg steht.
  • S:U — die Auswirkung bleibt innerhalb derselben Vertrauensgrenze (das eigene konfigurierte Credential des Proxys wird verwendet); es wird keine separate Sicherheitsinstanz überschritten.

Details:

Die HTTP-Schicht von PasteGuard wendet eine permissive Wildcard-CORS-Richtlinie auf jede Route außer dem Dashboard an:

  • src/index.ts:40-45 — const corsMiddleware = cors(); (Honos cors() ohne Optionen verwendet standardmäßig Access-Control-Allow-Origin: *) wird über app.use("*", ...) auf alles angewendet, mit einer expliziten Ausnahme nur für /dashboard und /dashboard/*. Der Kommentar direkt darüber (src/index.ts:34-39) zeigt, dass der Autor sorgfältig über die CORS-Exposition des Dashboards nachgedacht hat, diese Überlegung aber nicht auf die darunter liegenden Proxy-Routen ausgeweitet hat.
  • src/config.ts:153 — host: z.string().default("0.0.0.0"), bestätigt live in config.example.yaml:13. Der Proxy lauscht standardmäßig auf allen Interfaces, nicht nur auf Loopback, sodass er auch aus dem LAN erreichbar ist, nicht nur vom Browser des Betreibers selbst.
  • src/providers/openai/client.ts:48-53:
    root@kitploit:~
    // Use client's auth header if provided, otherwise fall back to config
    if (authHeader) {
      headers.Authorization = authHeader;
    } else if (config.api_key) {
      headers.Authorization = `Bearer ${config.api_key}`;
    }
    
    Wenn die eingehende Anfrage keinen Authorization-Header enthält, hängt PasteGuard stillschweigend seinen eigenen serverseitig gehaltenen providers.openai.api_key an die ausgehende Anfrage an. config.example.yaml:22-24 dokumentiert dies als absichtliche Komfortfunktion ("Optional fallback if client doesn't send auth header") für den Anwendungsfall "Apps & APIs".
  • src/providers/anthropic/client.ts:37-61 implementiert das identische Fallback-Muster für /anthropic/v1/messages (x-api-key/Authorization-Fallback auf config.api_key) — bestätigt als Schwesterinstanz derselben Grundursache, nicht unabhängig end-to-end erneut verifiziert (siehe PoC-Umfang unten).

Da die Wildcard-CORS-Richtlinie vor Routen liegt, die dieses Fallback-Credential halten, kann jede Origin (1) den Browser dazu bringen, die Anfrage ohne Authorization-Header zu senden, wodurch der Server seinen eigenen echten API-Schlüssel anhängt, und (2) die JSON-Antwort lesen, da Access-Control-Allow-Origin: * vorhanden ist. Keine Origin/Referer-Prüfung oder CSRF-Token schützt diese Routen.

Proof of Concept (dynamisch bestätigt, nicht nur statisch nachverfolgt):

  1. config.yaml konfiguriert mit providers.openai.base_url: http://127.0.0.1:9091 (Mock-Upstream) und providers.openai.api_key: "sk-VICTIM-SECRET-DO-NOT-LEAK-12345", pii_detection.enabled: false (nur gemockter Detektor /health, um den vollständigen GLiNER-Modelldienst zu vermeiden), secrets_detection.enabled: false. PasteGuard mit bun run src/index.ts gestartet, /health → 200 bestätigt.
  2. Einen Mock-Upstream (mock_upstream.py) auf 127.0.0.1:9091 gestartet, der jeden empfangenen Authorization-Header protokolliert.
  3. Eine echte Angreifer-Seite von einer wirklich unterschiedlichen Origin ausgeliefert, http://127.0.0.2:8001/attack.html (andere literale Loopback-IP, gemäß Chromes Site-Isolation-Regeln — kein Same-Origin-localhost-Test), über python3 -m http.server 8001 --bind 127.0.0.2. Die einzige Aktion der Seite beim Laden:
    root@kitploit:~
    fetch("http://127.0.0.1:3000/openai/v1/chat/completions", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ model: "gpt-4o-mini", messages: [{ role: "user", content: "cross-origin drive-by call, attacker supplied NO api key" }] })
    }).then(r => r.json()).then(data => { /* render on page */ });
    
  4. Eine echte Chrome-Instanz (Chrome DevTools Protocol) zu http://127.0.0.2:8001/attack.html gesteuert. Über DevTools-Netzwerkinspektion bestätigt:
    • Anfrage: origin: http://127.0.0.2:8001, sec-fetch-site: cross-site, kein von der Angreifer-Seite gesendeter Authorization-Header.
    • Antwort: access-control-allow-origin: *, HTTP 200, JSON-Body vollständig lesbar durch das JS der Angreifer-Seite.
    • Seite gerendert: "CROSS-ORIGIN READ SUCCEEDED. Response body visible to attacker JS: ..." — Screenshot: ../evidence/cross_origin_csrf_success.png.
    • Mock-Upstream-Log für genau diese Anfrage: RECEIVED AUTH HEADER: Bearer sk-VICTIM-SECRET-DO-NOT-LEAK-12345 — beweist, dass PasteGuard den echten konfigurierten Schlüssel des Betreibers serverseitig angehängt hat, ohne dass die Angreifer-Seite ihn jemals kannte oder lieferte.

Rohbelege: ~/engagements/pasteguard/evidence/cross_origin_csrf_success.png, ~/engagements/pasteguard/evidence/mock_upstream_log.txt.

Die Route /anthropic/v1/messages wurde statisch bestätigt (Datei:Zeile oben), dass sie das identische Fallback- + Wildcard-CORS-Muster teilt, wurde aber nicht separat durch den Live-Browser-PoC erneut ausgeführt, im Interesse der Tiefe-statt-Breite/5-Minuten-Regel-Leitlinie der Session, nachdem die Grundursache bereits auf /openai bestätigt war.

Auswirkung: Jede Website, die der Browser des PasteGuard-Betreibers besucht (bösartige Werbung, kompromittierte Website oder ein Angreifer im selben LAN angesichts des Standard-Binds auf 0.0.0.0), kann stillschweigend unbegrenzte abgerechnete Anfragen über das eigene OpenAI/Anthropic-Konto des Betreibers durch ihre lokale PasteGuard-Instanz treiben, ohne dass eine Benutzerinteraktion über das Offenhalten des Tabs hinaus erforderlich ist und ohne dass der Betreiber dies bemerken kann, außer er beobachtet sein Provider-Abrechnungs-Dashboard. Dies ist ein direkter Vektor für finanziellen Missbrauch / Kontingenterschöpfung und verfälscht sekundär die Nutzungs-/Audit-Spur des Provider-Kontos des Betreibers mit vom Angreifer gewähltem Inhalt.

Schwachstellen:

  • CWE-352: Cross-Site Request Forgery
  • CWE-942: Permissive Cross-domain Policy with Untrusted Domains
  • CWE-798: Use of Hard-coded Credentials (der serverseitige Fallback-Schlüssel ist transparent wiederverwendbar durch jeden Aufrufer, der seine eigene Authentifizierung weglässt) — als beitragender Faktor aufgeführt, nicht als primäre Schwachstelle

Behebung (Vorschläge):

  • Die Wildcard-cors()-Middleware nicht auf /openai, /anthropic, /codex (und /api/mask, falls es jemals erweitert wird, um serverseitig gehaltene Credentials zu verwenden) anwenden, wenn ein Fallback-api_key konfiguriert ist. Mindestens die erlaubten Origins für diese Routen explizit/konfigurierbar machen (z. B. nur die bekannte Origin der Browser-Erweiterung), mit Standard auf keinen Cross-Origin-Zugriff statt *.
  • Eine Origin/Referer-Prüfung (oder ein leichtgewichtiges gemeinsames lokales Token, das die legitime Browser-Erweiterung anhängt) speziell auf dem Fallback-Schlüssel-Codepfad hinzufügen, analog zur bereits auf /dashboard in src/index.ts angewandten Überlegung.
  • Den Standard von server.host von 0.0.0.0 auf 127.0.0.1 in src/config.ts:153 und config.example.yaml:13 ändern, sodass ein explizites Opt-in erforderlich ist, um auf allen Interfaces zu binden.

Danksagung: Dostxodjayev Abdullox

Meldekanal: Es existiert keine SECURITY.md im Repository (bestätigt über gh api repos/sgasser/pasteguard/contents/SECURITY.md → 404, zum Audit-Zeitpunkt erneut geprüft). Auch keine zuvor veröffentlichten Sicherheitshinweise (gh api repos/sgasser/pasteguard/security-advisories → []), sodass dies kein Duplikat eines bereits offengelegten Problems zu sein scheint. Empfohlener Kanal: GitHubs standardmäßiger privater Schwachstellenmeldeablauf unter https://github.com/sgasser/pasteguard/security/advisories/new.

Tool herunterladen