Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
pasteguard-PoC — PoC — abuso del proxy cross-origin delle chiavi API del provider configurate in PasteGuard (GHSA-q94x-p9rc-q89f, CVE-2026-86998, CVSS 7.6). | Kitploit
Strumenti/GitHubGitHub/squeeze440/pasteguard-poc
Analisi delle VulnerabilitàExploitSicurezza WebPenetration TestingPaper e RicercaSicurezza delle API
GitHubsqueeze440/pasteguard-poc

pasteguard-PoC

PoC — abuso del proxy cross-origin delle chiavi API del provider configurate in PasteGuard (GHSA-q94x-p9rc-q89f, CVE-2026-86998, CVSS 7.6).

Vedi Repository
7 giorni faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

PasteGuard: security advisory

Stato CVE: richiesto, in attesa di assegnazione. Questa segnalazione è pubblicata come GHSA-q94x-p9rc-q89f. All'assegnazione del CVE questo repository viene rinominato CVE-YYYY-NNNNN-pasteguard-PoC e questo banner viene sostituito con il link al CVE.

RicercatoreDostxodjayev Abdullox (@squeeze440)
AdvisoryGHSA-q94x-p9rc-q89f
CVSS 3.17.6 (High)
DebolezzaCWE-352, CWE-942

Sintesi: La mancanza di protezione CORS/CSRF sulle route del proxy LLM in PasteGuard 0.9.1 consente a un attaccante remoto (qualsiasi sito web visitato dal browser dell'operatore, o qualsiasi host sulla rete locale) di attivare richieste autenticate all'API OpenAI/Anthropic configurata dall'operatore utilizzando la chiave API di fallback lato server di PasteGuard, e di leggerne la risposta, tramite una fetch() cross-origin verso /openai/v1/chat/completions (e la gemella /anthropic/v1/messages).

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

Versione testata: commit 100718191499c52934f3b2ccca72ca16373fb765 (2026-07-30), versione package.json 0.9.1

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

  • UI:R — l'operatore deve avere il browser aperto su una pagina (qualsiasi pagina, su qualsiasi sito) mentre PasteGuard è in esecuzione; non è necessaria alcuna altra interazione.
  • C:L / I:L — il JS dell'attaccante legge solo la risposta al proprio prompt scelto dall'attaccante (non le conversazioni passate/dati della dashboard dell'operatore, che sono correttamente esclusi dal CORS), ma questo conferma/usa comunque un account attivo e finanziato e inquina il registro di utilizzo/audit dell'account sotto l'identità dell'operatore.
  • A:H — l'impatto realistico e illimitato: una pagina dell'attaccante può ripetere questa richiesta all'infinito, generando utilizzo realmente fatturato sull'account/quota del provider dell'operatore (drenaggio finanziario, possibile esaurimento del rate-limit o flag di abuso lato provider) senza alcun rate limiting o controllo dell'origine a ostacolarlo.
  • S:U — l'impatto rimane all'interno dello stesso confine di fiducia (viene utilizzata la credenziale configurata del proxy stesso); non viene attraversata alcuna autorità di sicurezza separata.

Dettagli:

Il layer HTTP di PasteGuard applica una policy CORS permissiva con wildcard a ogni route tranne la dashboard:

  • src/index.ts:40-45 — const corsMiddleware = cors(); (il cors() di Hono senza opzioni usa come default Access-Control-Allow-Origin: *) viene applicato tramite app.use("*", ...) a tutto, con un'esclusione esplicita solo per /dashboard e /dashboard/*. Il commento immediatamente sopra (src/index.ts:34-39) mostra che l'autore ha ragionato attentamente sull'esposizione CORS della dashboard ma non ha esteso lo stesso ragionamento alle route del proxy sottostanti.
  • src/config.ts:153 — host: z.string().default("0.0.0.0"), confermato attivo in config.example.yaml:13. Il proxy ascolta su tutte le interfacce per default, non solo su loopback, quindi è raggiungibile anche dalla LAN, non solo dal browser dell'operatore stesso.
  • 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}`;
    }
    
    Se la richiesta in ingresso non porta alcun header Authorization, PasteGuard allega silenziosamente la propria providers.openai.api_key detenuta lato server alla richiesta in uscita. config.example.yaml:22-24 documenta questo come una funzionalità di comodità intenzionale ("Optional fallback if client doesn't send auth header") per il caso d'uso "Apps & APIs".
  • src/providers/anthropic/client.ts:37-61 implementa lo schema di fallback identico per /anthropic/v1/messages (fallback di x-api-key/Authorization a config.api_key) — confermato come istanza gemella della stessa causa radice, non riverificato indipendentemente end-to-end (vedi lo scope del PoC sotto).

Poiché la policy CORS con wildcard si trova davanti a route che detengono questa credenziale di fallback, qualsiasi origine può (1) far inviare al browser la richiesta senza header Authorization, causando l'aggiunta da parte del server della propria chiave API reale, e (2) leggere la risposta JSON, poiché è presente Access-Control-Allow-Origin: *. Nessun controllo Origin/Referer o token CSRF protegge queste route.

Proof of Concept (confermato dinamicamente, non solo tracciato staticamente):

  1. Configurato config.yaml con providers.openai.base_url: http://127.0.0.1:9091 (upstream mock) e providers.openai.api_key: "sk-VICTIM-SECRET-DO-NOT-LEAK-12345", pii_detection.enabled: false (solo detector mockato /health, per evitare di dover avere il servizio completo del modello GLiNER), secrets_detection.enabled: false. Avviato PasteGuard con bun run src/index.ts, confermato /health → 200.
  2. Avviato un upstream mock (mock_upstream.py) su 127.0.0.1:9091 che registra qualsiasi header Authorization riceva.
  3. Servita una vera pagina dell'attaccante da un'origine genuinamente distinta, http://127.0.0.2:8001/attack.html (IP loopback letterale diverso, secondo le regole di site-isolation di Chrome — non un test same-origin su localhost), tramite python3 -m http.server 8001 --bind 127.0.0.2. L'unica azione della pagina al caricamento:
    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. Guidata un'istanza reale di Chrome (Chrome DevTools Protocol) verso http://127.0.0.2:8001/attack.html. Confermato tramite l'ispezione di rete di DevTools:
    • Richiesta: origin: http://127.0.0.2:8001, sec-fetch-site: cross-site, nessun header Authorization inviato dalla pagina dell'attaccante.
    • Risposta: access-control-allow-origin: *, HTTP 200, corpo JSON completamente leggibile dal JS della pagina dell'attaccante.
    • Pagina renderizzata: "CROSS-ORIGIN READ SUCCEEDED. Response body visible to attacker JS: ..." — screenshot: ../evidence/cross_origin_csrf_success.png.
    • Log dell'upstream mock per quella esatta richiesta: RECEIVED AUTH HEADER: Bearer sk-VICTIM-SECRET-DO-NOT-LEAK-12345 — prova che PasteGuard ha allegato lato server la chiave reale configurata dall'operatore, senza che la pagina dell'attaccante la conoscesse o la fornisse mai.

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

La route /anthropic/v1/messages è stata confermata staticamente (file:riga sopra) come condivisione dello schema identico di fallback + CORS con wildcard, ma non è stata rieseguita separatamente attraverso il PoC live nel browser, nell'interesse della linea guida della sessione di profondità-sulla-ampiezza/regola dei 5 minuti, una volta che la causa radice era già confermata su /openai.

Impatto: Qualsiasi sito web visitato dal browser dell'operatore di PasteGuard (annuncio malevolo, sito compromesso, o un attaccante sulla stessa LAN dato il bind di default su 0.0.0.0) può guidare silenziosamente richieste fatturate illimitate attraverso l'account OpenAI/Anthropic dell'operatore stesso tramite la sua istanza locale di PasteGuard, senza alcuna interazione dell'utente oltre ad avere la scheda aperta e senza alcun modo per l'operatore di accorgersene se non guardando la dashboard di fatturazione del proprio provider. Questo è un vettore diretto di abuso finanziario / esaurimento della quota, e secondariamente inquina il registro di utilizzo/audit dell'account del provider dell'operatore con contenuti scelti dall'attaccante.

Debolezze:

  • CWE-352: Cross-Site Request Forgery
  • CWE-942: Permissive Cross-domain Policy with Untrusted Domains
  • CWE-798: Use of Hard-coded Credentials (la chiave di fallback lato server è trasparentemente riutilizzabile da qualsiasi chiamante che ometta la propria autenticazione) — elencata come fattore contribuente, non come debolezza primaria

Remediation (suggerimenti):

  • Non applicare il middleware cors() con wildcard a /openai, /anthropic, /codex (e /api/mask se mai esteso per usare credenziali detenute lato server) quando è configurata una api_key di fallback. Come minimo, rendere le origini consentite per queste route esplicite/configurabili (ad es. solo l'origine nota dell'estensione del browser), con default nessun accesso cross-origin anziché *.
  • Aggiungere un controllo Origin/Referer (o un token locale condiviso leggero che l'estensione legittima del browser allega) specificamente sul percorso di codice della chiave di fallback, rispecchiando il ragionamento già applicato a /dashboard in src/index.ts.
  • Cambiare il default di server.host da 0.0.0.0 a 127.0.0.1 in src/config.ts:153 e config.example.yaml:13, richiedendo un opt-in esplicito per il bind su tutte le interfacce.

Crediti: Dostxodjayev Abdullox

Canale di segnalazione: Non esiste alcun SECURITY.md nel repository (confermato tramite gh api repos/sgasser/pasteguard/contents/SECURITY.md → 404, ricontrollato al momento dell'audit). Nessun advisory di sicurezza pubblicato in precedenza (gh api repos/sgasser/pasteguard/security-advisories → []), quindi questo non sembra essere un duplicato di un problema già divulgato. Canale raccomandato: il flusso predefinito di segnalazione privata delle vulnerabilità di GitHub all'indirizzo https://github.com/sgasser/pasteguard/security/advisories/new.

Scarica lo strumento