Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
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.

FeedContattoPrivacy© 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
243 mesi 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

.
├── 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.

Scarica lo strumento