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
drupal-openai-provider-ssrf-cve-2026-13233 — CVE-2026-13233 (Drupal OpenAI Provider, SA-CONTRIB-2026-053): SSRF tramite response-URL / lettura di file locale. Upstream non attendibile, non il prompt. Reproducer sicuro + rilevamenti. Corretto nella 1.1.1/1.2.2. | Kitploit
Strumenti/GitHubGitHub/kuninogu/drupal-openai-provider-ssrf-cve-2026-13233
Analisi delle VulnerabilitàSicurezza WebApprendimento e Formazione
GitHubkuninogu/drupal-openai-provider-ssrf-cve-2026-13233

drupal-openai-provider-ssrf-cve-2026-13233

CVE-2026-13233 (Drupal OpenAI Provider, SA-CONTRIB-2026-053): SSRF tramite response-URL / lettura di file locale. Upstream non attendibile, non il prompt. Reproducer sicuro + rilevamenti. Corretto nella 1.1.1/1.2.2.

Vedi Repository
1 mese 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

Drupal OpenAI Provider — SSRF / lettura locale di file tramite URL di risposta (CVE-2026-13233)

Upstream non affidabile: il provider che ha recuperato l'URL indicato dalla propria risposta. Drupal OpenAI Provider (ai_provider_openai) · SSRF (CWE-918) · CVE-2026-13233 · SA-CONTRIB-2026-053

Stato: Divulgazione coordinata completa (2026-07-10). Segnalato privatamente al Drupal Security Team, corretto e pubblicato come CVE-2026-13233 / advisory SA-CONTRIB-2026-053 (valutato Moderately critical). Autore accreditato come finder & remediation developer.

Uno studio di un classico difetto di autorizzazione / validazione degli input su un "punto di connessione" AI: un provider di generazione immagini AI recuperava l'URL contenuto nella risposta API upstream usando una funzione generica senza allowlist di schemi. Nelle distribuzioni in cui l'upstream configurato non è il default fidato (bring-your-own-endpoint / proxy / gateway self-hosted / relay compromesso), la risposta poteva puntare il server a file:// o a un indirizzo interno.

L'input non affidabile che raggiunge il sink è l'URL della risposta upstream — non il prompt dell'utente.

  • Classe (pubblicata): SSRF (CWE-918). La SSRF includeva una lettura locale di file tramite file://; l'analisi interna dell'autore l'ha mappata anche su CWE-73 / CWE-441.
  • Gravità: Drupal Moderately critical (SA-CONTRIB-2026-053) — una fascia media sulla scala di Drupal ≈ CVSS Medium; non CVSS Critical/High. Autovalutazione pre-divulgazione dell'autore: minimo 3.1 / condizionale 5.3 (Medium); i precedenti 6.5 / 7.4 sono stati ritrattati, e la valutazione media lo ha confermato.
  • Versioni interessate: Drupal OpenAI Provider (ai_provider_openai) < 1.1.1 e 1.2.0–1.2.1 (verificata 1.2.1) su Drupal core 11.2
  • Corretto in: 1.1.1 / 1.2.2 · CVE: CVE-2026-13233 · Advisory: https://www.drupal.org/sa-contrib-2026-053

  • Dimostrato (confermato) vs. non dimostrato (non verificato)

    Tutte le verifiche sono state eseguite in una sandbox di proprietà, isolata dalla rete, contro un upstream mock. La vera API OpenAI non è mai stata chiamata. Gli oracoli di leak erano esclusivamente sintetici.

    Confermato (dimostrato dinamicamente):

    • Trigger non-admin → lettura lato server di un file locale scelto dall'upstream (percorso arbitrario dimostrato con un marcatore unico per esecuzione; il corpo servito è byte-per-byte uguale al marcatore; marcatore presente solo nel container dell'app, assente sul mock — escludendo che "il mock abbia restituito il proprio file").
    • Lettura di settings.php confermata tramite byte-match sha256 (35.182 B) — contenuto mai stampato; le credenziali del DB sono quindi in scope.
    • Recupero della risposta di una SSRF HTTP interna da un servizio senza porta pubblica (corrispondenza raw-byte del token interno).
    • Confine di autorizzazione: lo stesso account riceve 403 sulla route di configurazione admin (contrasto 200-vs-403).
    • Raggiungibilità via HTTP legittimo attraverso un flusso realistico del field-widget "Generate" configurato dall'admin, da parte di un editor senza permessi AI.

    Non verificato (esplicitamente non rivendicato):

    • Furto di credenziali dai metadati cloud (IMDS) — meccanicamente plausibile dallo stesso sink, non tentato.
    • Raggiungibilità dinamica del gemello della classe base — sovrascritta su questo provider (codice morto per questo target); registrata come variante con la stessa causa radice per portare la correzione, non come rivendicazione separata.
    • Attivazione passiva dell'automator "solo salvataggio" — testata, negativa. "Solo salvare" non lo attiva.
    • XSS persistente (confusione di content-type) e race di concorrenza speech-to-text — piste separate, non provate.

    Non interessato: api.openai.com predefinito su TLS. L'impostazione host è controllata da admin / config-sync / deploy — un attaccante non-admin in esecuzione non può modificarla.


    Causa radice e direzione della correzione (riassunto)

    L'URL della risposta veniva passato a un fetch generico che onora ogni stream wrapper PHP registrato (file, php, http, data, phar, …). response_format ha come default url, quindi il ramo vulnerabile è il percorso predefinito. file:// è il filesystem wrapper predefinito di PHP e non è limitato da allow_url_fopen (una precedente affermazione su "richiede allow_url_fopen" era sbagliata ed è stata ritrattata).

    Correggi la primitiva, non solo il punto di chiamata:

    1. Smetti di usare un fetch generico per il recupero remoto; usa il client solo-HTTP iniettato.
    2. Valida che lo schema sia http/https prima della richiesta; disabilita i redirect (un 30x può rimbalzare su file://).
    3. Difesa in profondità: rifiuta gli host risolti privati/link-local/loopback, oppure limita agli host CDN immagini configurati; valida dimensione / content-type / decodifica dell'immagine.
    4. Porta la stessa correzione alla classe base così i provider fratelli la ereditano (altrimenti correzione incompleta).
    5. I test di regressione sono prima i casi di rifiuto: file://…, http://169.254.169.254/… e un redirect 302→file:// devono essere tutti rifiutati.

    Direzione completa: docs/fix-direction.md.


    Struttura della directory

    root@kitploit:~
    .
    ├── README.md                          # this file (English, canonical)
    ├── README_ja.md                       # Japanese mirror
    ├── SECURITY.md                        # reporting policy + responsible-disclosure disclaimer
    ├── .gitignore                         # blocks secrets / primary evidence from being committed
    ├── docs/
    │   └── fix-direction.md               # root-cause fix + variant hunt + minimal-diff sketch (EN)
    ├── reproducer/                        # SAFE reproducer only (sandbox, mock upstream, benign oracle)
    │   ├── README.md                      # how to stand up the network-isolated sandbox
    │   ├── verdict.md                     # what "success" means: raw-byte match + 200-vs-403 + exit codes
    │   ├── mock-openai-server.py          # benign mock; default happy-path PNG, ssrf_demo → file:///etc/hostname only
    │   └── docker-compose.yml             # TEMPLATE: isolated Drupal sandbox + mock (you add the vulnerable target)
    ├── detections/
    │   ├── README.md
    │   ├── sigma/web-egress-to-internal-after-imagegen.yml
    │   ├── sigma/php-sensitive-file-open.yml
    │   ├── sentinel/imagegen-egress-correlation.kql
    │   └── splunk/imagegen-content-type-mismatch.spl
    └── timeline.md                        # disclosure timeline (single source of truth)
    

    La documentazione è attualmente in giapponese (.ja.md); le traduzioni canoniche in inglese sono un TODO. Non inclusi in questo repo: payload armati e qualsiasi PoC pronto all'uso di lettura file. Il reproducer/ pubblico dimostra il meccanismo del difetto contro un mock usando un singolo oracolo benigno (/etc/hostname) — nessuna lettura a percorso arbitrario, nessun recupero di settings.php, nessun IMDS. Non è un'arma contro i siti live. Aggiorna a 1.1.1 / 1.2.2.


    Reproducer sicuro

    Obiettivo: consentire a un ricercatore di confermare la classe del difetto senza fornire un exploit per target live o esporre segreti. Tutto viene eseguito offline.

    • Isolamento: docker compose con l'app e un upstream mock su una rete isolata (--network none per i controlli delle primitive del linguaggio). Nessuna credenziale montata. Il mock non parla mai con la vera API.
    • Modello fedele di upstream non affidabile: il mock interpreta "un host che punta a un proxy / gateway self-hosted non affidabile." Viene predisposto out-of-band (non tramite il prompt) per restituire un URL target sintetico — questo codifica il modello di attaccante corretto (l'upstream sceglie l'URL, l'utente si limita a triggerare).
    • Solo oracoli benigni:
      • file:///etc/hostname e un marcatore unico per esecuzione scritto solo all'interno del container dell'app → dimostra che l'app ha letto un percorso scelto dall'upstream (marcatore assente sul mock).
      • settings.php verificato tramite byte-match sha256, contenuto mai emesso → dimostra "credenziali DB in scope" senza divulgarle.
      • Un servizio HTTP interno senza porta pubblica → dimostra il recupero di una risposta SSRF interna con un token sintetico.
    • Il verdetto è sui byte grezzi, non sull'HTTP 200: successo = corpo servito byte-per-byte uguale al valore sintetico atteso, più un contrasto di autorizzazione 200-vs-403. I codici di uscita sono rigorosi (0 sfruttabile / 1 precondizione / 2 non riprodotto / 3 pulizia fallita / 99 errore). Vedi reproducer/verdict.md.
    • Nota di trasparenza: qualsiasi normalizzazione dell'ambiente (es. correzione del proprietario della directory files della sandbox che una precedente esecuzione da root ha lasciato non scrivibile) è documentata e riguarda solo la parte save/serve, non il sink di lettura file stesso. Questo viene dichiarato affinché i revisori non lo leggano come una precondizione truccata.

    Vedi reproducer/README.md.


    Cronologia della divulgazione

    Vedi timeline.md. Riepilogo:

    DataEvento
    2026-06-10La revisione statica individua il sink; lettura file:// a percorso fisso confermata dinamicamente
    2026-06-11Lettura a percorso arbitrario + match sha256 di settings.php + SSRF HTTP interna confermati
    2026-06-11Raggiungibilità dei consumer in produzione (automator percorso-interno; esfiltrazione FWA via HTTP legittimo)
    2026-06-11Una peer review indipendente corregge affermazioni eccessive (modello di attaccante, CVSS, allow_url_fopen); invio messo in HOLD
    2026-06/07Elementi HOLD risolti; segnalato privatamente al Drupal Security Team; gemello della classe base segnalato a drupal/ai
    2026-07-10Rilasci corretti 1.1.1 / 1.2.2; advisory SA-CONTRIB-2026-053 e CVE-2026-13233 pubblicati; autore accreditato come finder & remediation developer

    Guida alla rilevazione

    Le rilevazioni per i practitioner sono in detections/; la logica in docs/detection-engineering.md. In breve:

    • Correla chi ha attivato la generazione di immagini (audit dell'app) con egress anomalo (proxy / EDR) verso 169.254.169.254 / loopback / RFC1918 in una finestra temporale ristretta dopo la chiamata API. Non fare alert sul solo egress.
    • Le letture file:// non toccano mai la rete — rileva aperture di file sensibili da parte dei processi web tramite auditing dell'host (auditd/EDR), con baseline così che scattino solo letture fuori pattern all'interno di una richiesta di generazione immagini.
    • Caccia retrospettiva ai byte dichiarati image/* i cui magic bytes non sono un'immagine.
    • La maggior parte delle integrazioni AI non registra quale utente ha recuperato quale URL — aggiungi un record di audit del fetch {request_id, actor, target_url, scheme, resolved_ip, content_type}. I log standard da soli non lo catturano.

    Riferimenti

    • OWASP Top 10 A10:2021 — Server-Side Request Forgery
    • CWE-918 SSRF · CWE-73 controllo esterno del nome/percorso del file · CWE-441 proxy/relay non intenzionale · CWE-610 riferimento controllato esternamente
    • Stream wrapper PHP (file:// è il filesystem wrapper predefinito; non limitato da allow_url_fopen)
    • Drupal Security Team — divulgazione coordinata tramite "Report a security vulnerability" del progetto
    • Advisory: Drupal SA-CONTRIB-2026-053 — https://www.drupal.org/sa-contrib-2026-053
    • CVE: CVE-2026-13233 (CNA: Drupal.org)

    Avviso di sicurezza

    • La divulgazione è completa (CVE-2026-13233 / SA-CONTRIB-2026-053), quindi i dettagli di prodotto/versione/codice sono pubblici. Aggiorna prima a 1.1.1 / 1.2.2 — i siti non patchati sono ancora in circolazione.
    • Il reproducer/ è solo sandbox e usa oracoli sintetici. Non è un exploit per target live e non contiene segreti. Non eseguirlo contro sistemi che non possiedi e che non sei autorizzato a testare.
    • Nessun PoC funzionante di lettura file e nessuna evidenza primaria contenente segreti è inclusa qui — deliberatamente, anche post-fix, finché esistono distribuzioni non patchate.

    Disclaimer sulla divulgazione responsabile

    Tutta la ricerca è stata eseguita dall'autore in una sandbox di propria proprietà, isolata dalla rete, contro un upstream mock — la vera API del vendor non è mai stata contattata e nessun sistema di terze parti è mai stato testato. Il finding è stato segnalato privatamente al Drupal Security Team e pubblicato solo in sincronia con la correzione e l'advisory (SA-CONTRIB-2026-053, CVE-2026-13233); la valutazione del vendor è Moderately critical. I valori CVSS dell'autore sono una autovalutazione provvisoria, non un punteggio ufficiale, e sono stati deliberatamente mantenuti conservativi (nessun CVSS Critical/High) — coerenti con la valutazione media del vendor. Questo materiale ha scopi difensivi ed educativi. Vedi SECURITY.md.

    Scarica lo strumento