
SpeechBrain < 1.1.1 चेकपॉइंट मेटाडेटा में CKPT.yaml के असुरक्षित PyYAML पार्सिंग के माध्यम से RCE।
गंभीरता: उच्च, CVSS 4.0 8.7, CVSS 3.1 8.8 (VulnCheck, CNA द्वारा निर्धारित)
वेक्टर (v4.0): CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
वेक्टर (v3.1): CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
प्रभावित: SpeechBrain < 1.1.1
में ठीक किया गया: 1.1.1 / commit 22a6166
CWE: CWE-502 (अविश्वसनीय डेटा का डीसेरिएलाइज़ेशन)
खोजा और रिपोर्ट किया गया: Sai Teja Erukude द्वारा
प्रकाशित: 27 अगस्त, 2026
1.1.1 से पहले का SpeechBrain, चेकपॉइंट रिकवरी के दौरान CKPT.yaml चेकपॉइंट मेटाडेटा को पार्स करते समय PyYAML के असुरक्षित लोडर का उपयोग करता है।
एक हमलावर जो SpeechBrain चेकपॉइंट निर्देशिका की आपूर्ति या संशोधन कर सकता है, वह CKPT* चेकपॉइंट निर्देशिका के अंदर एक दुर्भावनापूर्ण CKPT.yaml फ़ाइल रख सकता है। जब कोई पीड़ित Checkpointer.recover_if_possible() को कॉल करता है, तो SpeechBrain चेकपॉइंट उम्मीदवारों को सूचीबद्ध करता है और प्रत्येक उम्मीदवार मेटाडेटा फ़ाइल को इसके साथ पार्स करता है:
yaml.load(fi, Loader=yaml.Loader)
क्योंकि yaml.Loader !!python/object/apply जैसे Python ऑब्जेक्ट निर्माण टैग का समर्थन करता है, हमलावर-नियंत्रित चेकपॉइंट मेटाडेटा चेकपॉइंट डिस्कवरी के दौरान Python कोड निष्पादित कर सकता है।
दुर्भावनापूर्ण चेकपॉइंट को चुनने या पुनर्स्थापित करने की आवश्यकता नहीं है। कोड निष्पादन तब होता है जब SpeechBrain चेकपॉइंट उम्मीदवारों की गणना कर रहा होता है।
एक हमलावर SpeechBrain चला रहे Python प्रक्रिया के संदर्भ में मनमाना Python कोड निष्पादित कर सकता है।
यह उन वर्कफ़्लो को प्रभावित कर सकता है जहाँ उपयोगकर्ता अविश्वसनीय चेकपॉइंट निर्देशिकाओं, मॉडल आर्टिफैक्ट्स, या अभिलेखागार से डाउनलोड, अनपैक, फिर से शुरू, या प्रशिक्षण/अनुमान चलाते हैं।
होस्टिंग प्रक्रिया के आधार पर, यह निम्नलिखित की अनुमति दे सकता है:
प्रभावित घटक SpeechBrain का चेकपॉइंट रिकवरी/लिस्टिंग प्रवाह है:
Checkpointer.recover_if_possible()
-> list_checkpoints()
-> _construct_checkpoint_objects()
चेकपॉइंट लिस्टिंग के दौरान, SpeechBrain CKPT* नाम की चाइल्ड डायरेक्टरीज़ को स्कैन करता है जिनमें CKPT.yaml होता है। अंतिम चेकपॉइंट चयन से पहले प्रत्येक उम्मीदवार मेटाडेटा फ़ाइल को पार्स किया जाता है।
असुरक्षित पार्स speechbrain.utils.checkpoints.checkpoints.py में होता है:
meta = yaml.load(fi, Loader=yaml.Loader)
PoC दो चेकपॉइंट बनाता है:
CKPT+poisoned-metadata: एक पुराना दुर्भावनापूर्ण चेकपॉइंट जिसके CKPT.yaml
में एक PyYAML object-apply पेलोड होता है।CKPT+benign-newer: एक नया सौम्य चेकपॉइंट जिसे
नवीनता के आधार पर चुना जाना चाहिए।सौम्य चेकपॉइंट चुना जाता है, लेकिन दुर्भावनापूर्ण चेकपॉइंट मेटाडेटा अभी भी उम्मीदवार सूचीबद्ध करने के दौरान निष्पादित होता है। यह चेकपॉइंट पुनर्स्थापन से स्वतंत्र मेटाडेटा पार्स-समय कोड निष्पादन को प्रदर्शित करता है।
package_builder.py हमलावर-नियंत्रित
चेकपॉइंट लेआउट बनाता है।
run_poc.py सत्यापन चलाता है, Checkpointer.recover_if_possible() को कॉल करता है,
और निष्पादन साक्ष्य प्रिंट करता है।
केवल स्थानीय परीक्षण वातावरण में चलाएँ:
python -m venv .venv
.venv\Scripts\activate
python -m pip install -r requirements.txt
python -B run_poc.py
कमजोर संस्करणों पर अपेक्षित प्रमाण:
speechbrain_version: 1.1.0
installed_package: True
recovery_error: None
benign_checkpoint_selected: True
marker_before_recovery: False
marker_after_recovery: True
marker_contents:
speechbrain_checkpoint_yaml_loader_rce_triggered
success: True
महत्वपूर्ण साक्ष्य यह है कि benign_checkpoint_selected: True और
marker_after_recovery: True एक साथ प्रकट होते हैं। यह दर्शाता है कि दुर्भावनापूर्ण
पुराना चेकपॉइंट रिकवरी के लिए चयनित नहीं किया गया था, लेकिन SpeechBrain द्वारा चेकपॉइंट
उम्मीदवारों को सूचीबद्ध करते समय इसका मेटाडेटा अभी भी पार्स और निष्पादित किया गया था।
पेलोड जानबूझकर हानिरहित है। यह केवल यह स्थानीय मार्कर स्ट्रिंग लिखता है:
speechbrain_checkpoint_yaml_loader_rce_triggered
यह शेल स्पॉन नहीं करता, नेटवर्क सेवा से कनेक्ट नहीं करता, सीक्रेट्स नहीं पढ़ता, डेटा डिलीट नहीं करता, या PoC डायरेक्टरी के बाहर फ़ाइलें संशोधित नहीं करता।
SpeechBrain 1.1.1 या बाद के संस्करण में अपग्रेड करें।
स्थायी कोड फिक्स चेकपॉइंट मेटाडेटा के लिए PyYAML के सेफ लोडर का उपयोग करना है:
yaml.safe_load(fi)
या:
yaml.load(fi, Loader=yaml.SafeLoader)
चेकपॉइंट मेटाडेटा को केवल unixtime और
end-of-epoch जैसे स्केलर मानों की आवश्यकता होती है, इसलिए इस
पार्स पथ के लिए Python ऑब्जेक्ट निर्माण सक्षम नहीं किया जाना चाहिए।
यदि तत्काल पैच या अपग्रेड उपलब्ध नहीं है:
CKPT.yaml में अप्रत्याशित टैग और फ़ील्ड को मान्य करें या अस्वीकार करें।Sai Teja Erukude द्वारा खोजा और रिपोर्ट किया गया।
प्रकटीकरण का समन्वय VulnCheck के माध्यम से किया गया था।
exploit_walkthrough.md