
ऑरमार ORM में एक गंभीर SQL इंजेक्शन पर गहन अध्ययन — प्रजनन, समाधान और परीक्षण
Python async ORM में एक गंभीर (CVSS 9.8) SQL इंजेक्शन भेद्यता पर गहन विश्लेषण, जिसमें पुनरुत्पादन, विश्लेषण और समाधान शामिल है।
Ormar Python के लिए एक लोकप्रिय async मिनी ORM है, जिसे आमतौर पर FastAPI और Starlette के साथ उपयोग किया जाता है। संस्करण 0.9.9 से 0.22.0 में min() और max() एग्रीगेट विधियों में SQL इंजेक्शन भेद्यता है।
मूल कारण एक "आंशिक कार्यान्वयन" बग है: जबकि sum() और avg() यह सत्यापित करते हैं कि कॉलम पैरामीटर एक वास्तविक संख्यात्मक फ़ील्ड को संदर्भित करता है, min() और max() इस जाँच को पूरी तरह से छोड़ देते हैं और उपयोगकर्ता इनपुट को सीधे sqlalchemy.text() — एक रॉ SQL सिंक — में पास कर देते हैं।
एक हमलावर "कॉलम" पैरामीटर के रूप में एक सबक्वेरी इंजेक्ट कर सकता है:
# अपेक्षित उपयोग
await Item.objects.max("price") # → SELECT max(price) FROM items
# हमले का पेलोड
await Item.objects.max("(SELECT password FROM users LIMIT 1)")
# → SELECT max((SELECT password FROM users LIMIT 1)) FROM items
# एडमिन का पासवर्ड लौटाता है!
| विशेषता | मान |
|---|---|
| CVE ID | CVE-2026-26198 |
| CVSS स्कोर | 9.8 (गंभीर) |
| CWE | CWE-89: SQL इंजेक्शन |
| प्रभावित | ormar 0.9.9 – 0.22.0 |
| समाधान | ormar 0.23.0 |
| प्रकाशित | 24 फरवरी, 2026 |
| प्रमाणीकरण आवश्यक? | नहीं — बिना प्रमाणीकरण |
├── README.md ← आप यहाँ हैं
├── vulnerable_app.py ← भेद्य पैटर्न वाला न्यूनतम FastAPI ऐप
├── exploit_demo.py ← इंजेक्शन को क्रियाशील दिखाने वाला सुरक्षित PoC
├── patched_app.py ← इनपुट सत्यापन के साथ समाधान संस्करण
├── test_vulnerability.py ← भेद्यता के अस्तित्व और समाधान की पुष्टि करने वाले परीक्षण
├── requirements.txt
└── analysis/
└── root_cause.md ← बग का विस्तृत कोड-स्तरीय विश्लेषण
git clone https://github.com/YOUR_USERNAME/CVE-2026-26198-analysis.git
cd CVE-2026-26198-analysis
python -m venv venv && source venv/bin/activate
pip install -r requirements.txt
# परीक्षण चलाएँ (कोई बाहरी DB आवश्यक नहीं — SQLite का उपयोग करता है)
python -m pytest test_vulnerability.py -v
# इंटरैक्टिव एक्सप्लॉइट डेमो चलाएँ
python exploit_demo.py
समाधान यह सत्यापित करता है कि कॉलम पैरामीटर sqlalchemy.text() तक पहुँचने से पहले मॉडल पर एक वास्तविक फ़ील्ड से मेल खाता है। यह व्हाइटलिस्ट दृष्टिकोण के माध्यम से किया जाता है: केवल वे कॉलम नाम अनुमत हैं जो मॉडल की फ़ील्ड परिभाषाओं में मौजूद हैं।
कार्यान्वयन के लिए patched_app.py और पूर्ण विवरण के लिए analysis/root_cause.md देखें।
sum()/avg() सत्यापित थे लेकिन min()/max() नहीं थे, ने सुरक्षा की झूठी भावना पैदा की।MIT