Xzbot: xz बैकडोर के लिए नोट्स, honeypot और exploit डेमो
(github.com/amlweems)- xzbot xz बैकडोर (CVE-2024-3094) का विश्लेषण करने के लिए एक repository है, जो honeypot, ED448 public key patch, बैकडोर payload format, और remote code execution डेमो उपलब्ध कराती है
- honeypot, OpenSSH पर एक सरल patch लगाकर बैकडोर format से मेल खाने वाले public key N value के साथ आने वाले connection attempts को
sshdlogs में दर्ज करता है - ED448 patch, signature verification और payload decryption में बैकडोर द्वारा इस्तेमाल की जाने वाली hardcoded public key को उपयोगकर्ता द्वारा बनाई गई key से बदल देता है, ताकि बैकडोर को trigger किया जा सके
- बैकडोर payload, SSH certificate की CA signing key के N value में जाता है, और
a * b + cसे request type बनाता है; Type 2 null-terminated command कोsystem()से चलाता है - डेमो CLI, vulnerable SSH server से जुड़कर command चलाने का flow दिखाती है, और सफल exploitation INFO या उससे ऊपर के logs नहीं बनाती
xzbot का दायरा और संरचना
- xzbot xz बैकडोर CVE-2024-3094 का विश्लेषण करने के लिए एक project है
- इसमें चार चीज़ें शामिल हैं
- honeypot: exploit attempts का पता लगाने के लिए एक नकली vulnerable server
- ed448 patch: अपनी ED448 public key इस्तेमाल करने के लिए
liblzma.soको patch करना - backdoor format: बैकडोर payload format का विवरण
- backdoor demo: ED448 private key ज्ञात होने की स्थिति मानकर RCE trigger करने वाली CLI
honeypot: OpenSSH patch से attempts की पहचान
- openssh.patch OpenSSH पर लगाने के लिए एक सरल patch है, जो बैकडोर format से मेल खाने वाले public key N value के साथ आने वाले connection attempts को रिकॉर्ड करता है
- flow यह है कि
openssh-portableको clone करने के बाद patch लागू किया जाए औरautoreconf,configure,makeचलाए जाएँ - connection attempts
sshdlogs मेंxzbot: magic 1 [preauth]और payload bytes के रूप में दिखाई देते हैं
ED448 public key patch
- बैकडोर signature verification और payload decryption के लिए hardcoded ED448 public key का उपयोग करता है
- इस public key को उपयोगकर्ता की अपनी key से बदलने पर बैकडोर को trigger किया जा सकता है
- repository, attacker की ED448 public key और
seed=0से बनाई गई replacement public key value दोनों दिखाती है - शुरुआती चरण है बैकडोर शामिल
liblzma.so.5.6.1shared object तैयार करना- उदाहरण स्रोत के रूप में
xz-utils 5.6.1-1Debian snapshot दिया गया है pwntoolsinstall करने के बादpatch.py liblzma.so.5.6.1चलाने परliblzma.so.5.6.1.patchबनती है- इसके बाद संशोधित
liblzma.so.5.6.1.patchshared object के साथsshdचलाया जाता है
- उदाहरण स्रोत के रूप में
- assets में उदाहरण दिए गए हैं
बैकडोर payload format
- बैकडोर, SSH certificate के साथ connect करते समय CA signing key के N value के भीतर payload डालकर trigger किया जा सकता है
- इस payload को attacker की ED448 key से encrypt और sign किया जाना चाहिए
- बाहरी संरचना में ये fields शामिल हैं
a: 32-bitb: 32-bitc: 64-bitciphertext: 240 bytes
- request type
a * b + cसे निकाला जाता है- अगर value 3 से बड़ी हो, तो बैकडोर processing छोड़ देता है
- Type 1: उपयोग अज्ञात, और 0 bytes की अपेक्षा
- Type 2: null-terminated payload को
system()से चलाता है - Type 3: उपयोग अज्ञात, और 48-byte signature data की अपेक्षा
ciphertext, ED448 public key के शुरुआती 32 bytes को symmetric key बनाकर chacha20 से encrypt किया जाता है- इसी कारण exploit attempts को दिए गए 32-byte key से decrypt किया जा सकता है
- decrypt किए गए
ciphertextके भीतर 114-byte signature,xऔरy1-bit fields, length, command string आदि होते हैंxयाyसेट करने पर थोड़ा अलग code path लिया जाता है
- signature, RFC-8032 ED448 signature है
- input में 32-bit magic value, command से पहले का 5-byte field, वैकल्पिक रूप से command के
lengthbytes, और server hostkey के SHA-256 hash के पहले 32 bytes शामिल होते हैं
- input में 32-bit magic value, command से पहले का 5-byte field, वैकल्पिक रूप से command के
exploit डेमो CLI
- CLI को Go से install किया जाता है
go install github.com/amlweems/xzbot@latest
xzbot -hतीन मुख्य options दिखाता है-addr: SSH server address, default127.0.0.1:2222-seed: xz बैकडोर key से मेल खाने वाला ED448 seed, default0-cmd:system()से चलाया जाने वाला command, defaultid > /tmp/.xz
- उदाहरण
127.0.0.1:2222पर vulnerable SSH server से जुड़करid > /tmp/.xzcommand चलाता है - vulnerable server पर
system()call location पर watchpoint सेट करने से देखा जा सकता है किsshdprocessid > /tmp/.xzचला रहा है - execution के बाद
/tmp/.xzमेंuid=0(root) gid=0(root) groups=0(root)output बचा रहने का उदाहरण दिया गया है
process tree और log विशेषताएँ
- सामान्य SSH connection का process tree
sshdसे user session और shell तक जाता है - बैकडोर execution उदाहरण में
xzbot -cmd 'sleep 60'के बादsshd: root [priv],sshd: root [net],sh -c sleep 60,sleep 60दिखाई देते हैं - सफल exploitation INFO या उससे ऊपर के log entries नहीं बनाती
1 टिप्पणियां
Hacker News की राय
यह बात काफ़ी दिलचस्प है कि इसे ऐसा remote code execution नहीं बनाया गया जिसका कोई भी दुरुपयोग कर सके, बल्कि इसके लिए हमलावर की private key ज़रूरी रखी गई
विडंबना यह है कि यह बहुत security-conscious vulnerability जैसी दिखती है
अगर ऐसा बड़ा छेद छोड़ते कि कोई भी घुस सके, तो वह जल्दी मिलकर बंद कर दिया जाता; और अगर performance degradation न होती, तो यह व्यापक रूप से exploit करने योग्य नहीं है—इस वजह से शायद चुपचाप लंबे समय तक बची रहती
xz में किया गया पूरा योगदान आखिरकार इसी backdoor को डालने का काम लगता है; उदाहरण के लिए, malicious payload छिपाने के लिए test framework तक बनाया गया
xz पर काम करने से पहले उन्होंने BSD के libarchive में भी योगदान दिया था, और वहाँ vulnerability पैदा हुई
design और execution बेहद sophisticated थे, और performance issue के कारण इसका पता चलना लगभग पूरी तरह किस्मत जैसा लगता है
अगर ऐसा है, तो इसे servers पर अंधाधुंध नहीं फेंका जा सकता, और किसी एक host को भेजना भी computation के लिहाज़ से काफ़ी महंगा design है
यह घटना पूरे weekend मेरे दिमाग़ से नहीं निकली
mechanism दिलचस्प है और obfuscation तकनीकों का बेहतरीन संग्रह है, और social engineering वाला हिस्सा open source maintainers के लिए शर्मनाक हद तक जाना-पहचाना किस्सा है
सबसे दिलचस्प बात यह है कि attack vector के रूप में खराब test data चुना गया; एक अच्छा archive तैयार करके उसे संरचनात्मक रूप से manipulate करें और फिर fuzz testing के लिए खराब data की तरह इस्तेमाल करें, तो बाकी steps बेहद आसान हो जाते हैं
आगे के लिए कहूं तो ऐसी manipulation binary pattern graphs में दिखनी चाहिए
बाकी techniques payload तय हो जाने के बाद ज़्यादातर सामान्य obfuscation जैसी ही थीं, लेकिन सबसे कमाल की चाल यह थी कि इसी pattern से दूसरे test files में “patch” या बिल्कुल नया backdoor बिना पकड़ में आए जोड़ा जा सकता था
GitHub का repository को छिपाकर हटाना बिल्कुल मददगार नहीं रहा, और इस घटना का analysis करने में बाधा बना
पता चला कि वह dependency अजीब तरह से xz को पसंद करती है, और अगर यह installed न हो तो सुविधा feature की तरह host machine पर xz तक install कर देती है
दूसरी dependencies के साथ वह ऐसा व्यवहार नहीं करती, इसलिए यह थोड़ा अजीब है
ऐसी लंबी बाज़ी डरावनी है, और जब तक असल में “बुराई” execute नहीं होती, तब तक यह पता नहीं चलता कि क्या malicious है और क्या बस अजीब
खासकर अगर वह test failure साबित करने के लिए “binary garbage” file हो, तो malicious content छिपाने के लिए यह बहुत बढ़िया जगह है
community, खासकर amlweems, ने इतनी जल्दी proof-of-concept code implement और document किया—यह बहुत प्रभावशाली है
अगर crypto functions या payload loading functions में अतिरिक्त vulnerabilities नहीं हैं, तो key टूटने तक इसने बाकी सभी attackers के लिए security flaw खोला भी नहीं होगा
अगला कदम vulnerable distributions का पता लगाने का तरीका ढूंढना है, जो आसान नहीं लगता; और hardcoded key के साथ कोई SSH servers को actively scan कर रहा है या नहीं, इसकी निगरानी का तरीका upstream में डाला जा सकता है
original version के proof of concept के लिए हमलावर की non-public private key चाहिए
सबसे अच्छा जो किया जा सकता है वह और सूक्ष्म benchmarking है, लेकिन किसी random internet host के धीमे होने की वजह यह है कि वह vulnerable है, वह दूर है, या computer खुद धीमा है—यह पता नहीं लगाया जा सकता
पहले उस host से connect करने में कितना समय लगा था, इसका access भी नहीं होगा, और routing में बदलाव भी होते रहते हैं
जानना चाहूंगा कि क्या किसी ने इस proof of concept को abnormal process behavior detection tools पर चलाकर देखा है
Carbon Black, AWS GuardDuty, Sysdig जैसे products इसमें आते हैं, और यह देखना कि जब यह असल में deploy हुआ होता तो क्या कोई इसे अपेक्षाकृत जल्दी पकड़ पाता—इसके लिए यह product category बहुत सही case लगती है
GuardDuty, CrowdStrike या Carbon Black जैसे EDR की तरह process के अंदर नहीं झांकता, इसलिए उसे पकड़ना मुश्किल होगा; और Sysdig containers और cloud infrastructure देखता है, इसलिए exploit खुद पकड़ना मुश्किल लगता है
हालांकि privilege escalation के बाद threat actor के follow-up actions में anomalies पकड़ने की संभावना हो सकती है
अंततः exploit को खुद पकड़ने की सबसे अधिक संभावना endpoint processes monitor करने वाले EDR में, या upstream free/open source software के security issues monitor करने वाली software supply-chain assessment में दिखती है
दिलचस्प बात यह है कि यह एक बड़े security topic की ओर ले जाता है
development teams performance hit और isolation actions के समय user experience issues के कारण servers पर EDR लगाना पसंद नहीं कर सकतीं, और free/open source software के इस्तेमाल को सीमित करने वाली policies भी उन्हें पसंद नहीं आ सकतीं
यह exploit संगठन-स्तर की “vulnerability” के ठीक बीच में वार करता है, और position के हिसाब से exposure बनाए रखने की दलील भी बनती है और उसे ठीक करने की दलील भी
“runtime detection का एक तरीका यह monitor करना है कि SSHD malicious library load कर रहा है या नहीं। ऐसी shared libraries में अक्सर filename में version शामिल होता है” ऐसा कहा गया था
blog में वास्तविक detection rule का content भी है, जो मैंने दूसरी security companies में नहीं देखा
https://sysdig.com/blog/cve-2024-3094-detecting-the-sshd-bac...
मैंने नीचे दिए गए लिंक को गलत पढ़ लिया था, और मूल बात को रिकॉर्ड के लिए छोड़ रहा हूँ
उसी mail thread में नीचे देखने पर कहा गया था कि backdoor commit करने वाले व्यक्ति ने हाल में kernel contribution भी किया है ऐसा लगता है, लेकिन मूल विश्लेषण वाकई शानदार है, इसलिए ऐसी पोस्ट पढ़ना अच्छा है
https://www.openwall.com/lists/oss-security/2024/03/29/10
Lasse ने खुद भी कहा था कि यह बिल्कुल urgent नहीं है और इस merge window में नहीं आएगी, और कोई भी सामान्य व्यक्ति Lasse को malicious actor नहीं बता रहा है
इस घटना में कुछ साल पहले के Audacity incident से बेतुकी हद तक कई समानताएँ हैं
Cookie guy ने दावा किया था कि उस पर चाकू से हमला हुआ और federal police इस मामले में शामिल थी, जो संकेत देता है कि यह घटना 4chan से कहीं बड़े actor से जुड़ी हो सकती है
उस समय बहुत से लोगों को लगता था कि केवल Muse Group शामिल है, लेकिन शायद यह कोई Russian state actor भी हो सकता था
उससे पहले दावा किया गया था कि Audacity में बहुत सारी telemetry और backdoor थे, जिन्हें fork करने के बाद पहले commit में हटा दिया गया
शायद Audacity में सचमुच backdoor हो सकते हैं, इसलिए source code देखना चाहिए
आजकल वह APT29 के साथ operations मिला रहा है, और मैं होता तो cozy bear को नहीं जगाता
compile time पर honey pot openssh.patch https://github.com/amlweems/xzbot/blob/main/openssh.patch के बिना, असली exploit ने runtime पर यह कैसे किया होगा, यह जानना चाहता हूँ
chain
opensshd -> systemd notification -> transient dependency के रूप में शामिल xzथी, लेकिनliblzma.so.5.6.1memory में load होने के बाद कैसे पीछे जाकरopenssh_RSA_verifyतक hook या patch लगाता था, यह जानना चाहता हूँअगर यह libcrypto से पहले load हुआ हो, तो symbol audit handler register करता है, जो शायद glibc-specific feature लगता है, और libcrypto के symbols resolve होते समय notification पाकर GOT patching को delay कर सकता है
जानना चाहता हूँ कि क्या यह exploit सिर्फ SSH connection आने पर ही काम करता था
GitHub पर strings की list में
DISPLAYऔरWAYLAND_DISPLAYशामिल हैंhttps://gist.github.com/q3k/af3d93b6a1f399de28fe194add452d01
इनका SSH से साफ़ तौर पर कोई संबंध नहीं है, इसलिए संभव है कि connection न होने पर भी यह कुछ करता हो
यह उन लोगों के लिए महत्वपूर्ण हो सकता है जो मान रहे हैं कि उन्होंने code चलाया लेकिन SSH server को internet पर expose नहीं किया, इसलिए वे सुरक्षित हैं
यानी किसी के detection, reproduction या debugging की कोशिश वाली स्थिति से बचने का उपाय
अगर untrusted machine से connect करते समय इसे बंद न किया जाए, तो यह client side पर आम security hole बन जाता है
“successful exploitation does not generate a log entry” का मतलब क्या यह है कि अगर यह exploit पकड़ा नहीं जाता, तो attacker compromised host पर उस “connection” के लिए sshd log की एक भी entry के बिना root के रूप में arbitrary commands चला सकता था?
remote code execution connection phase में होता है, log बचने से पहले
जानना चाहता हूँ कि कौन-सी anomaly detection इसे पकड़ सकती थी
अगर test files को अलग repository में अलग कर दिया जाता ताकि build time पर उनका इस्तेमाल न हो सके, तो क्या इस attack को और मुश्किल बनाया जा सकता था, यह जानना चाहता हूँ
तर्क यह है कि build में जो कुछ भी शामिल हो सकता है, वह human-readable होना चाहिए
इस attack को aircraft accident की तरह treat करना चाहिए और इसके दोबारा सफल होने की संभावना घटाने वाले नए rules लाने चाहिए
भले ही हर एक contributor को verify न कर सकें, noisy test data को आसानी से अलग किया जा सकना चाहिए