CVE-2026-17566
pgAdmin 4: RCE tramite disallineamento di escape con backslash nella protezione delle query di Import/Export Data (difesa incompleta, gap gemello rispetto a CVE-2025-13780)
- Pubblicato
- 31 lug 2026
- Aggiornato
- 1 ago 2026
- Assegnazione CNA
- PostgreSQL
- Evidenza osservata
- 4 ago 2026
CVSS primario
nvd · CVSS 4.0
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:XBasso · prossimi 30 giorni
- Percentile
- 45,0%
- Data del modello
- 21 set 2026
L'EPSS è una stima statistica, non una certezza o una misura di impatto. Combinalo con CVSS, stato KEV, esposizione e ambiente.
Riepilogo
Lo strumento Import/Export Data di pgAdmin 4 costruisce una riga di comando `psql \copy (...)` interpolando una query SQL fornita dall'utente in un template Jinja e passando la riga renderizzata a psql tramite `--command`. Per impedire a un attaccante di uscire dal wrapper `(...)`, `create_import_export_job()` (rotta `POST /import_export/job/<sid>`, protetta solo dalla comune e ampiamente concessa autorizzazione `tools_import_export_data`) validava la query con un controllore di bilanciamento delle parentesi scritto a mano, `_is_query_parens_balanced()`. Quel controllore trattava sempre una barra rovesciata prima di un apice singolo (`\'`) come se facesse escaping dell'apice, cioè come se `standard_conforming_strings` fosse disattivato. PostgreSQL ha `standard_conforming_strings` impostato su `on` per impostazione predefinita dalla versione 9.1 (2010), l'impostazione predefinita su ogni versione di PostgreSQL attualmente supportata da pgAdmin 4 (13-18); con questa impostazione predefinita, il tokenizer di `\copy` di psql tratta `\` come un carattere ordinario, quindi un apice singolo immediatamente successivo chiude la stringa letterale. Una query come `SELECT 'a\') TO PROGRAM 'echo pwned' x'` veniva quindi accettata come "bilanciata" dal controllore di pgAdmin (che credeva che la `)` fosse ancora all'interno della stringa), mentre psql, eseguito tramite la riga di comando effettivamente renderizzata, chiude la stringa in quel punto e tratta la `)` successiva come la fine della sottoquery wrapper `\copy (...)`, esponendo una clausola `TO PROGRAM '<comando>'` scelta dall'attaccante che psql esegue tramite `popen()` — indipendentemente da un successivo errore di sintassi più avanti sulla stessa riga. Si tratta della stessa classe di bug di CVE-2025-12762/CVE-2025-13780 (RCE tramite meta-comando psql/iniezione COPY durante il ripristino di dump in formato PLAIN), raggiunta attraverso una difesa scritta indipendentemente in un modulo diverso (Import/Export Data piuttosto che Restore) che aveva il proprio, diverso bug logico (semantica invertita dell'escaping con barra rovesciata piuttosto che un ancoraggio regex aggirato tramite BOM). La correzione rifiuta qualsiasi barra rovesciata all'interno di una stringa con apici singoli nella query, piuttosto che scegliere una delle due possibili interpretazioni di psql. Questa scelta è intenzionalmente conservativa: poiché l'interpretazione corretta di `\` dipende dall'impostazione `standard_conforming_strings` del server di destinazione, che il controllore non può conoscere in modo affidabile al momento della validazione, rifiutare la query è più sicuro che indovinare. Questo problema riguarda pgAdmin 4: dall'introduzione di `_is_query_parens_balanced()` prima della versione 9.18.
Utilizzo responsabile
Utilizza le informazioni sulla vulnerabilità solo sui sistemi che possiedi o che sei autorizzato a testare. Kitploit si collega ai metadati della ricerca pubblica e non memorizza codici exploit o payload dannosi.