
एक स्मार्ट Log4Shell/Log4j/CVE-2021-44228 स्कैनर
हालांकि संगठनों को क्रिटिकल Log4J / CVE-2021-44228 भेद्यता के प्रति संवेदनशील अनुप्रयोगों के लिए अपने वातावरण को स्कैन करने में मदद करने के लिए कुछ उत्कृष्ट उपकरण जारी किए गए हैं, मुझे लगा कि:
इसलिए Log4Shell Sentinel का जन्म हुआ। Log4Shell Sentinel एक फ़ाइल-आधारित स्कैनर है जिसमें कुछ अनूठी विशेषताएँ हैं। इसका उद्देश्य अन्य सभी उपलब्ध उपकरणों को बदलना नहीं है, बल्कि उनकी पूर्ति कर सकता है।
Log4Shell Sentinel एक फ़ाइल-आधारित स्कैनर है। यह लक्ष्य प्रणाली को निम्नलिखित फ़ाइल स्वरूपों की कलाकृतियों के लिए स्कैन करके Java-आधारित अनुप्रयोगों की खोज करता है:
| फ़ाइल प्रकार | विवरण |
|---|---|
| Simple jar | यह वह स्थिति है जहाँ log4j-core फ़ाइल एम्बेडेड नहीं है। |
| Fat / Uber jar | एक uber jar एक jar है जिसमें आपकी कक्षाएं/पैकेज और आपके एप्लिकेशन की सभी निर्भरताएँ (लाइब्रेरीज़, संसाधन और मेटाडेटा फ़ाइलें) एकल jar फ़ाइल के भीतर होती हैं। यह सबसे अधिक उपयोग की जाने वाली तैनाती विकल्प है। |
| WAR | एक war (Web Application Archive) फ़ाइल एक फ़ाइल है जिसमें आपके JSP, HTML और JavaScript कोड के अलावा आपकी लाइब्रेरीज़ और अन्य संसाधन शामिल होते हैं। यह प्रारूप कम इस्तेमाल होता है। |
| EAR | एक ear (Enterprise Application Archive) एक अन्य प्रारूप है जो Jakarta EE के साथ तैनाती के लिए पहले अधिक सामान्य था। |
और कमजोर log4j-core jars के उदाहरणों की खोज करता है। फिर यह:
कलाकृति का MD5 हैश की गणना करता है। यह एक विश्लेषक को विभिन्न मशीनों/कंटेनरों पर चलने वाले समान एप्लिकेशन की पहचान करने और उन्हें एकल खोज के रूप में मानने की अनुमति देता है।
उन फ़ाइलों के लिए जो कंटेनर से संबंधित होने का निर्धारण किया जाता है, जैसे: /var/lib/docker/overlay2/192768f471818601094bf4edd96d14bfc0e2b178a04a2efd00b2231ad4e46b33/merged/app/spring-boot-application.jar, यह फ़ाइल को संबंधित इमेज से मैप करने का भारी काम करता है। उदाहरण के लिए, यह ऊपर दिए गए को निम्नलिखित इमेज में अनुवाद करेगा: ghcr.io/christophetd/log4shell-vulnerable-app:latest। चूँकि विभिन्न कंटेनर रनटाइम इस मैपिंग को विभिन्न तरीकों से संग्रहीत करते हैं, यह एक विश्लेषक के घंटों की निराशा बचा सकता है। यह एक विश्लेषक को एक ही एप्लिकेशन चलाने वाले कई कंटेनरों को एकल खोज के रूप में मानने की भी अनुमति देता है।
यह बेकार मैचों को हटाता है, जैसे कि वर्तमान में नहीं चल रहे कंटेनरों से संबंधित मैच, जिनमें कैश की गई इमेज शामिल हैं। यह एक विश्लेषक को महत्वपूर्ण पर ध्यान केंद्रित करने की अनुमति देता है और फिर से विश्लेषक के घंटों के अनावश्यक काम को बचाता है।
यह एक विश्लेषक को इस आधार पर मैचों को अनदेखा करने की अनुमति देता है:
यह विश्लेषक को उन अनुप्रयोगों को हटाने की अनुमति देता है जिनके बारे में वे जानते हैं कि वे कमजोर नहीं हैं या जो CLI-आधारित अनुप्रयोगों के अनुरूप हैं जो कोई खतरा पैदा नहीं करते हैं। उदाहरण के लिए, यदि Logstash का एक उदाहरण पाया जाता है, तो एक विश्लेषक इसे अनदेखा करना चुन सकता है यदि वे उपकरण नहीं चलाते हैं या केवल कभी-कभी CLI से चलाते हैं।
यह आपके कॉन्फ़िगरेशन प्रबंधन उपकरणों जैसे Ansible के साथ काम करने के लिए अनुकूलित है, जो आपको मिनटों में अपने वातावरण को जल्दी से स्कैन करने की क्षमता देता है।
Log4Shell Sentinel द्वारा जोड़े गए मेटाडेटा संवर्धन के विवरण के लिए, मेरे ब्लॉग पोस्ट का संदर्भ लें।
सबसे आसान तरीका केवल प्री-कंपाइल्ड बाइनरी डाउनलोड करना है।
फिर, यह सीधा-सादा है। हालांकि, आप शायद अपने वातावरण में GLIBC-संबंधित भिन्नताओं से बचने के लिए एक स्थिर रूप से संकलित संस्करण बनाना चाहेंगे। उपकरण निम्नलिखित मॉड्यूल का उपयोग करता है जो डिफ़ॉल्ट रूप से CGO का उपयोग करते हैं:
os/usernetइन लाइब्रेरियों के Go-संस्करणों का उपयोग करने वाला एक स्थिर रूप से संकलित संस्करण बनाने के लिए, बस रिपो को क्लोन करें और फिर चलाएँ:
$ CGO_ENABLED=0 go build -ldflags="-s -w"
$ ldd log4shell_sentinel
not a dynamic executable
$ ./log4shell_sentinel -h
NAME:
Log4Shell Sentinel - by Osama Elnaggar
USAGE:
log4shell_sentinel [global options] command [command options] [arguments...]
VERSION:
v1.0.0
COMMANDS:
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--path value, -p value Path to search (default: ".")
--no-banner, --nb Suppress banner (default: false)
--no-messages, --nm Suppress messages except for CSV output (default: false)
--no-header, --nh Suppress header in CSV output (default: false)
--imd5 value, --im value Ignore MD5 hashes. Refer to the GitHub page for expected format
--ipath value, --ip value Ignore file path matches. Refer to the GitHub page for expected format
--icimage value, --ic value Ignore container image matches. Refer to the GitHub page for expected format
--print-headers, --ph Print CSV Headers only (default: false)
--help, -h show help (default: false)
--version, -v print the version (default: false)
डिफ़ॉल्ट रूप से, एक स्कैन बस वर्तमान निर्देशिका को स्कैन करेगा। उदाहरण के लिए:
$ ./log4shell_sentinel
░█░░░█▀█░█▀▀░█░█░█▀▀░█░█░█▀▀░█░░░█░░░░░█▀▀░█▀▀░█▀█░▀█▀░▀█▀░█▀█░█▀▀░█░░
░█░░░█░█░█░█░░▀█░▀▀█░█▀█░█▀▀░█░░░█░░░░░▀▀█░█▀▀░█░█░░█░░░█░░█░█░█▀▀░█░░
░▀▀▀░▀▀▀░▀▀▀░░░▀░▀▀▀░▀░▀░▀▀▀░▀▀▀░▀▀▀░░░▀▀▀░▀▀▀░▀░▀░░▀░░▀▀▀░▀░▀░▀▀▀░▀▀▀
- A CVE-2021-44228/CVE-2021-45046/CVE-2021-45105 Scanner
- v1.0.0
- by Osama Elnaggar
[*] WARNING: Running as non-root user.
Non-readable files / dirs will be skipped
Container mapping will fail
[*] Starting shallow scan ............ [DONE]
[*] Starting deep scan ............... [DONE]
[*] Calculating MD5 hashes ........... [DONE]
[*] Performing container image lookups [DONE]
[*] Processing ignore list(s) ........ [DONE]
[*] Generating output ................ [DONE]
IP,Hostname,AppName,Team,Ignore (Y/N),Comments,MD5Hash,Timestamp,Container,ContainerImage,FullPath,Version
192.168.121.121,server3,,,,,4e615cd580758b70c49ade1f79103328,2021-12-21T07:38:09Z,true,ghcr.io/christophetd/log4shell-vulnerable-app:latest,/run/containerd/io.containerd.runtime.v2.task/k8s.io/dc2c9c214809f506283c917244cd126a9b056ac7274322d12b59c9196d95dd9b/rootfs/app/spring-boot-application.jar,log4j-core-2.14.1.jar
यदि आप इसे गैर-root उपयोगकर्ता के रूप में चलाते हैं तो आपको तुरंत एक चेतावनी मिलेगी, क्योंकि इसे root अनुमतियों की आवश्यकता है:
यह root विशेषाधिकारों के बिना भी काम करेगा लेकिन सर्वोत्तम परिणाम नहीं दे सकता है।
एक नमूना निष्कर्ष इस प्रकार दिखता है:
IP,Hostname,AppName,Team,Ignore (Y/N),Comments,MD5Hash,Timestamp,Container,ContainerImage,FullPath,Version
192.168.121.121,server3,,,,,4e615cd580758b70c49ade1f79103328,2021-12-21T07:38:09Z,true,ghcr.io/christophetd/log4shell-vulnerable-app:latest,/run/containerd/io.containerd.runtime.v2.task/k8s.io/dc2c9c214809f506283c917244cd126a9b056ac7274322d12b59c9196d95dd9b/rootfs/app/spring-boot-application.jar,log4j-core-2.14.1.jar
कुछ फ़ील्ड जानबूझकर खाली छोड़ दी गई हैं और विश्लेषक द्वारा Excel आदि में भरने के लिए छोड़ दी गई हैं। प्रत्येक फ़ील्ड का संक्षिप्त विवरण नीचे दिखाया गया है:
उपकरण निम्नलिखित विकल्पों के साथ आता है:
Log4Shell Sentinel की अनूठी विशेषताओं में से एक, जो किसी अन्य उपकरण में नहीं मिलती है, फ़ाइल सिस्टम स्कैन में पाए जाने वाले jars जैसे:
/var/lib/docker/overlay2/192768f471818601094bf4edd96d14bfc0e2b178a04a2efd00b2231ad4e46b33/merged/app/spring-boot-application.jar
को संबंधित कंटेनर इमेज में अनुवाद करने की क्षमता है (उपरोक्त उदाहरण में ghcr.io/christophetd/log4shell-vulnerable-app:latest में अनुवादित होता है)। चूँकि विभिन्न कंटेनर रनटाइम इस मैपिंग को विभिन्न तरीकों से संग्रहीत करते हैं, यह एक विश्लेषक के घंटों की निराशा बचा सकता है। यह एक विश्लेषक को एक ही एप्लिकेशन चलाने वाले कई कंटेनरों को एकल खोज के रूप में मानने की भी अनुमति देता है। समाधान वर्तमान में निम्नलिखित लुकअप का समर्थन करता है:
पहचाने गए अनुप्रयोगों की संख्या शुरू में भारी हो सकती है या आप पहले पहचाने गए अनुप्रयोगों के किसी दिए गए उपसमूह पर ध्यान केंद्रित करना चाह सकते हैं, जैसे कि बाहरी उपयोगकर्ताओं के लिए उजागर होने वाले। या आप किसी दिए गए अनुपालन दायरे पर ध्यान केंद्रित करना चाह सकते हैं। इसका समर्थन करने के लिए, एप्लिकेशन एक सूची निर्दिष्ट करने का समर्थन करता है। Log4Shell वर्तमान में 3 अनदेखी सूचियों का समर्थन करता है:
सरल सूचियों के बजाय, यह इनपुट के रूप में एक CSV फ़ाइल की अपेक्षा करता है। यह विश्लेषक को यह दस्तावेज करने के लिए प्रोत्साहित करता है कि वे किसी दिए गए निष्कर्ष को क्यों अनदेखा कर रहे हैं। जैसे ही विश्लेषक निष्कर्षों को संसाधित करता है और मैन्युअल या स्वचालित स्रोत कोड विश्लेषण या DAST टूल आदि का उपयोग करके गैर-कमजोर अनुप्रयोगों की पहचान करता है।
सूची निम्नलिखित प्रारूप में एक सरल CSV फ़ाइल है:
MD5Sum,AppName,Reason
AppName और Reason कॉलम खाली हो सकते हैं लेकिन आपके लिए यह ट्रैक रखने के लिए हैं कि आप विशिष्ट अनुप्रयोगों को क्यों शामिल या बाहर कर रहे हैं।
नोट चूँकि यह सुविधा एप्लिकेशन के लिए गणना किए गए MD5 हैश का उपयोग करती है, यह केवल उन अनुप्रयोगों के लिए काम करेगी जो fat / uber jars, EARs या WARs हैं।
उदाहरण के लिए, यदि हमारे पास निम्नलिखित निष्कर्ष था:
IP,Hostname,AppName,Team,Ignore (Y/N),Comments,MD5Hash,Timestamp,Container,ContainerImage,FullPath,Version
192.168.121.121,server3,,,,,4e615cd580758b70c49ade1f79103328,2021-12-21T07:38:09Z,true,ghcr.io/christophetd/log4shell-vulnerable-app:latest,/run/containerd/io.containerd.runtime.v2.task/k8s.io/dc2c9c214809f506283c917244cd126a9b056ac7274322d12b59c9196d95dd9b/rootfs/app/spring-boot-application.jar,log4j-core-2.14.1.jar
और निर्धारित किया कि एप्लिकेशन कमजोर नहीं है, तो हम बस hashes.csv में निम्नलिखित सहेज सकते हैं:
4e615cd580758b70c49ade1f79103328,Demo App,Not vulnerable
और फिर इसे पुनः चलाएँ:
# ./log4shell_sentinel --im hashes.csv --path /
उपरोक्त निष्कर्ष दबा दिया जाएगा।
सूची निम्नलिखित प्रारूप में एक सरल CSV फ़ाइल है:
Container Image,AppName,Reason
पिछले उदाहरण पर आधारित, हम इसे किसी भी निष्कर्ष को अनदेखा करने के लिए कह सकते हैं जहाँ कंटेनर इमेज है: ghcr.io/christophetd/log4shell-vulnerable-app:latest ऐसी images.csv फ़ाइल बनाकर:
ghcr.io/christophetd/log4shell-vulnerable-app:latest,,
और फिर इसे चलाकर:
# ./log4shell_sentinel --ic images.csv -p /
फिर से, हमारा पिछला निष्कर्ष दबा दिया जाएगा।
फिर, यह निम्नलिखित प्रारूप में एक सरल CSV फ़ाइल है:
Path,AppName,Reason
उपरोक्त उदाहरण का उपयोग करते हुए, यदि हम निम्नलिखित paths.csv फ़ाइल बनाते हैं:
/run/containerd/io.containerd.runtime.v2.task/k8s.io/dc2c9c214809f506283c917244cd126a9b056ac7274322d12b59c9196d95dd9b/rootfs/app/spring-boot-application.jar,Demo App,Not vulnerable
पिछला निष्कर्ष दबा दिया जाएगा।
चेतावनी जब संभव हो, तो दमन के लिए MD5 हैश या कंटेनर इमेज नाम का उपयोग करना बेहतर होता है क्योंकि पथ अद्वितीय नहीं हो सकता है।
हालांकि Log4Shell Sentinel को एकल सर्वर पर चलाना पूरी तरह से ठीक है, यह वास्तव में तब चमकता है जब इसे आपके पसंदीदा कॉन्फ़िगरेशन प्रबंधन उपकरण (Ansible, Chef, Puppet, Salt, AWS SSM, आदि) या यहां तक कि सरल समानांतर SSH उपकरण जैसे parallel-ssh के साथ जोड़ा जाता है।
यह आपको कई लाभ देता है जिनमें शामिल हैं:
इसके क्रियान्वयन का एक पूर्ण उदाहरण के लिए, मेरे ब्लॉग पोस्ट का संदर्भ लें।
बड़े पैमाने पर अपने वातावरण की स्कैनिंग अनुभाग देखें।
root उपयोगकर्ता के रूप में नहीं चलाना (इसे उन स्थानों तक पहुंच की आवश्यकता है जहाँ आपके एप्लिकेशन स्थापित हो सकते हैं) या आपने सही path निर्दिष्ट नहीं किया है। यह अनुशंसित है कि आप इसे root उपयोगकर्ता के रूप में चलाएँ और --path / सेट करें।v1.0.0 तक, उपकरण वर्तमान में निम्नलिखित के लिए मैपिंग का समर्थन करता है:
यदि आप कुछ और उपयोग कर रहे हैं, तो मैपिंग काम नहीं करेगी। यदि आप उपरोक्त में से एक का उपयोग कर रहे हैं, तो हो सकता है कि आप उपकरण को root उपयोगकर्ता के रूप में नहीं चला रहे हैं या उपयोग किए जाने वाले सॉकेट/फ़ाइलें डिफ़ॉल्ट स्थान पर नहीं हैं।
द्वारा विकसित: Osama Elnaggar
| फ़ील्ड | उदाहरण | विवरण |
|---|
| IP | 192.168.121.121 | यदि इंस्टेंस में कई IP हैं, तो प्राथमिक IP जोड़ा जाता है |
| Hostname | server3 | होस्टनाम |
| AppName | यह उपयोगकर्ता द्वारा स्कैन पूरा होने के बाद पूरा करने के लिए छोड़ दिया गया है | |
| Team | यह उपयोगकर्ता द्वारा स्कैन पूरा होने के बाद पूरा करने के लिए छोड़ दिया गया है | |
| Ignore (Y/N) | यह उपयोगकर्ता द्वारा स्कैन पूरा होने के बाद पूरा करने के लिए छोड़ दिया गया है | |
| Comment | यह उपयोगकर्ता द्वारा स्कैन पूरा होने के बाद पूरा करने के लिए छोड़ दिया गया है | |
| MD5Hash | 4e615cd580758b70c49ade1f79103328 | हमारे एप्लिकेशन का एक अद्वितीय फिंगरप्रिंट |
| Timestamp | 2021-12-21T07:38:09Z | एक टाइमस्टैम्प जब स्कैन किया गया था। यह उपयोगी है यदि आप एक ही होस्ट के कई स्कैन को एकत्र करना चाहते हैं |
| Container | true | True = यह एक कंटेनर है |
| ContainerImage | ghcr.io/christophetd/log4shell-vulnerable-app:latest | यदि एक कंटेनर का पता चला, तो यह संबंधित इमेज है |
| FullPath | /run/containerd/io.containerd. runtime.v2.task/k8s.io/.../spring-boot-application.jar | निष्कर्ष का पूर्ण पथ। इस उदाहरण में, कमजोर JAR फ़ाइल एक fat / uber jar का हिस्सा है |
| Version | log4j-core-2.14.1.jar | पता लगाया गया lo4j-core संस्करण |
| विकल्प | विवरण |
|---|
--path value, -p value | यह निर्दिष्ट करता है कि किन पथों को खोजा जाए। डिफ़ॉल्ट रूप से, यह वर्तमान निर्देशिका को खोजता है। महत्वपूर्ण यह अनुशंसित है कि आप अपने पूरे फाइलसिस्टम को कवर करने के लिए इसे / पर सेट करें |
--no-banner, --nb | यह बैनर को दबाता है |
--no-messages, --nm | यह प्रगति-संबंधित संदेशों जैसे संदेशों को दबाता है |
--no-header, --nh | यह CSV आउटपुट के हेडर को दबाता है। कई सर्वरों पर चलाते समय यह अनुशंसित है |
--imd5 value, --im value | MD5 हैश को अनदेखा करें। इस पर अधिक जानकारी अनदेखी सूचियाँ अनुभाग में |
--ipath value, --ip value | फ़ाइल पथ मैचों को अनदेखा करें। इस पर अधिक जानकारी अनदेखी सूचियाँ अनुभाग में |
--icimage value, --ic value | कंटेनर इमेज मैचों को अनदेखा करें। इस पर अधिक जानकारी अनदेखी सूचियाँ अनुभाग में |
--print-headers, --ph | केवल CSV हेडर प्रिंट करें। जब आप एकाधिक सर्वरों पर Log4Shell Sentinel चलाते हैं और परिणामों को एकत्र करते हैं, तो आप आमतौर पर हेडर आउटपुट को अक्षम कर देंगे। यह कमांड केवल हेडर आउटपुट करता है ताकि आप इसे अपनी Excel शीट में जोड़ सकें |