Xz: Linux Landlock को निष्क्रिय करने वाला सिर्फ एक अक्षर
(git.tukaani.org)- xz.git के CMakeLists.txt में बदलाव Landlock sandbox detection को header की मौजूदगी जांचने से वास्तविक compile test में बदलने की प्रक्रिया में हुआ, जिसमें test code के अंदर अकेला
.character शामिल हो गया - नया check उन systems को filter करने के लिए जोड़ा गया जहां
linux/landlock.hमौजूद होने पर भी जरूरी syscall definitions नहीं हो सकतीं - compile test में
<linux/landlock.h>,<sys/syscall.h>,<sys/prctl.h>शामिल किए जाते हैं औरprctl,SYS_landlock_create_ruleset,SYS_landlock_restrict_self,LANDLOCK_CREATE_RULESET_VERSIONको reference किया जाता है - पुराना criterion
HAVE_LINUX_LANDLOCK_Hबदलकर HAVE_LINUX_LANDLOCK हो गया है, औरSANDBOX_COMPILE_DEFINITIONवSANDBOX_FOUNDsettings भी इसी result को follow करती हैं - commit Autotools और CMake builds के Linux Landlock feature test में सुधार है, और दिया गया diff CMake-side change दिखाता है
CMake में Landlock detection method में बदलाव
- target file xz.git की CMakeLists.txt है, और change point
# Sandboxing: Landlockblock है - पुरानी CMake logic में, जब
ENABLE_SANDBOXONयाlandlockहोता था औरSANDBOX_FOUNDनहीं होता था, तबcheck_include_file(linux/landlock.h HAVE_LINUX_LANDLOCK_H)से सिर्फ header की मौजूदगी जांची जाती थी - बदलाव के बाद,
check_c_source_compilesसे छोटा C code वास्तव में compile करके Landlock की availability जांची जाती है- कुछ systems में
linux/landlock.hहोने पर भी Linux Landlock के लिए जरूरी syscall definitions नहीं हो सकतीं - test code में
<linux/landlock.h>,<sys/syscall.h>,<sys/prctl.h>शामिल हैं my_sandbox()के अंदरprctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0),SYS_landlock_create_ruleset,SYS_landlock_restrict_self,LANDLOCK_CREATE_RULESET_VERSIONको reference किया जाता है
- कुछ systems में
अकेला character और variable name में बदलाव
- insert किए गए compile test code के include block के बाद अकेली
.line है - result variable
HAVE_LINUX_LANDLOCK_Hसे बदलकर HAVE_LINUX_LANDLOCK हो गया है - conditional भी
if(HAVE_LINUX_LANDLOCK_H)से बदलकरif(HAVE_LINUX_LANDLOCK)हो गया है SANDBOX_COMPILE_DEFINITIONvalue"HAVE_LINUX_LANDLOCK_H"के बजाय"HAVE_LINUX_LANDLOCK"का उपयोग करती है- इसके बाद
SANDBOX_FOUND ONsetting बरकरार रहती है
1 टिप्पणियां
Hacker News की राय
जवाब: https://git.tukaani.org/?p=xz.git;a=commitdiff;h=f9cf4c05edd...
अगर आपको Linux Landlock access control system के बारे में ज़्यादा जानकारी नहीं है, तो इसकी व्याख्या यहाँ है: https://docs.kernel.org/userspace-api/landlock.html
xz का आधिकारिक (शायद...) incident response page: https://tukaani.org/xz-backdoor/
लेकिन diff के बाएँ किनारे के पास चिपके हुए एक छोटे से period की वजह से C code हमेशा invalid हो गया, और इसलिए Landlock हमेशा disabled रहा?
यह घटियापन की हद तक प्रभावशाली है, और प्रभावशालीपन की हद तक घटिया। मैंने भी पहली बार पढ़ते समय इसे नहीं देखा
छिपाना हो तो Unicode lookalike characters बदलने का और बेहतर तरीका भी है। कुछ तो font के हिसाब से pixel level तक एक जैसे दिखते हैं
हो सकता है मुझसे flow छूट गया हो, लेकिन क्या यहाँ इरादतन किया गया होना पक्का हो चुका है?
मैं सावधानी से स्कैन कर रहा था और एक ऐसी जगह period दिखा जहाँ वह बिल्कुल नहीं होना चाहिए था, तो मैंने सोचा “अरे, यह तो उम्मीद से आसान है”
मैंने स्क्रीन को हल्का सा थपथपाया, और वह period हिल गया
कमबख्त monitor dust
यक़ीन नहीं होता कि system security सटीकता की इतनी ढीली chain पर निर्भर करती है। इसे रोकने के लिए कितने ही points थे
+ # A compile check is done here because some systems have+ # linux/landlock.h, but do not have the syscalls defined+ # in order to actually use Linux Landlock.ऐसे systems के headers को ठीक करके उन्हें explicit रूप से exclude करना चाहिए। अगर कोई header अपनी capability declare ही नहीं करता, तो उसका मतलब क्या है?
और यह भी समझ नहीं आता कि binary blob बन जाने के बाद, चाहे वह open source से compile हुआ हो, security intact है या नहीं यह verify करने वाला एक भी test क्यों नहीं है
कोई भी website payment functionality को core feature के end-to-end tests के बिना deploy नहीं करेगा। यहाँ ऐसा लगता है कि feature additions को reliability से ऊपर रखा गया है — यानी priority mismatch
उम्मीद है कि fix सिर्फ
.हटाने भर का नहीं होगा। मैंने अभी HN की दूसरी पोस्ट में.हटाते हुए दिखायाheader fix या extra tests से इसे रोका नहीं जा सकता था। शुरू में header के टूटे होने का कोई संकेत नहीं था, और extra tests को भी किसी और तरीके से corrupt किया जा सकता था या release tarball में ignore किया जा सकता था
[1] https://git.tukaani.org/?p=xz.git;a=commit;h=328c52da8a2bbb8...
चूँकि कोई user GCC 9.4.0 पर compile करने की कोशिश कर सकता था, और उस header पर निर्भर feature application के लिए critical नहीं था, इसलिए build system ने header टूटे होने का पता चलने पर बस उस feature को disable किया और warning दे दी
xz पर वापस आएँ तो, अगर security सबसे ऊपर की priority न हो, तो optional feature failure को ignore करके आगे बढ़ना भी तर्कसंगत लग सकता है। बेशक बाद में बैठकर उंगली उठाना आसान है, लेकिन उस context के बिना यह पूरी तरह बेतुका फैसला नहीं था
अरे, उसका आख़िरी commit तो security reporting को और बदतर बना रहा है: https://git.tukaani.org/?p=xz.git;a=commitdiff;h=af071ef7702...
Landlock को कहाँ/कैसे इस्तेमाल करने के लिए बनाया गया था?
compression/decompression जैसी general-purpose libraries में इसे वास्तव में इस्तेमाल करना मुश्किल लगता है। लाइब्रेरी को यह नहीं पता होता कि प्रोग्राम को क्या करना है, और क्या सीमित करना है।
अगर प्रोग्राम हो, तो यह ज़्यादा स्पष्ट हो सकता है।
sshdहमलाliblzmaको लाइब्रेरी के रूप में इस्तेमाल कर रहा था। तो फिर Landlock को बंद करना असंबंधित लगता है, नहीं? क्या यह इस बात का संकेत है कि अभी तक न मिला कोई और बुरा कोड था, या बाद में डालने की योजना थी?Landlock को हटा देने पर daemon खुद को लॉक नहीं करेगा, इसलिए exploit के उस चरण तक पहुँचने पर payload चलाना आसान हो जाएगा।
मुझे नहीं लगता कि ये दोनों असंबंधित हैं। लगता है कि वे पहले से payload को ध्यान में रखे हुए थे, और समझ गए थे कि यह एक रुकावट बनेगा।
यह मामला बहुत उलझाने वाला है। कुछ हिस्से इतने परिष्कृत हैं कि यक़ीन करना मुश्किल है, जबकि दूसरे हिस्से काफ़ी ढीले-ढाले लगते हैं।
विचार यह है कि लाइब्रेरी किसी अलग thread में कोई जटिल काम शुरू करे, और user code द्वारा कॉल किए गए API के अंदर उसी thread का इंतज़ार करे। वह thread खुद पर Landlock लागू करे और फिर काम शुरू करे। अगर कुछ गड़बड़ हो जाए, तो कोड अलग-थलग रहेगा।
बेशक इस मामले में यह काम नहीं करेगा, क्योंकि sandbox पर हमलावर का नियंत्रण है। हमलावर उसे बस बंद कर सकता है या मूल से कमज़ोर बना सकता है। फिर भी इसे दूसरे तरीक़ों से किया जा सकता है।
आख़िर यहाँ लक्ष्य क्या रहा होगा? क्या बाद में और backdoor, या ज़्यादा plausibly deniable backdoor डालने का इरादा था? मुझे तो लगता है कि oss-fuzz और यह बदलाव, दोनों में से कोई भी मिले हुए backdoor को वास्तव में ढूंढ नहीं पाते।
फिर सारे backdoor वाले अंडे एक ही टोकरी, यानी एक ही लाइब्रेरी में क्यों रखे गए?
और ऊपर से लक्ष्य खुद लाइब्रेरी को backdoor करना नहीं था, बल्कि उसे इस्तेमाल करने वाले टूल्स को निशाना बनाना था। यह “Reflections on trusting trust” वाली शैली है।
नाकाम होने तक यह एकदम परफ़ेक्ट योजना लगती है।
सोच रहा हूँ कि
xzमें Landlock चालू होने से रोकना क्यों उपयोगी था। क्या बाद के किसी चरण मेंxzarchive में malicious content inject करने की योजना थी? अगर ऐसा था, तोxzमें ही malicious behavior सीधे क्यों नहीं डाल दिया गया?किसी maintain किए जा रहे C प्रोजेक्ट में buffer overflow या use-after-free को चुपके से डाल देना शायद बिना पकड़े संभव हो सकता है। असली trojan horse वितरित करना कहीं ज़्यादा मुश्किल है, और
xz-to-sshdbackdoor में यही सामने आया।sshको निशाना बनाने के अलावाxzखुद के लिए भी कोई ज़्यादा सूक्ष्म backdoor हो सकता था। साफ़ है कि लक्ष्य गोपनीयता था।यह उम्मीद से ज़्यादा नज़र आने वाला है। feature बंद करने की तकनीक चतुर है और commit भी काफ़ी plausible है। लेकिन सिर्फ़ spelling गलती करने के बजाय इतनी साफ़ syntax error क्यों चुनी गई? उदाहरण के लिए, अगर गलती
PR_SET_NO_NEW_PRIVहोती, तो क्या किसी ने नोटिस किया होता?उस तरफ़ इनकार की गुंजाइश भी ज़्यादा होती।
अलग से देखें तो, इस malware टीम ने सुरक्षा समस्याएँ पहचानने के लिए AI को ट्रेन करने हेतु शानदार dataset बना दिया है। हर commit में security issue है, और open source community उन्हें एक-एक करके देख कर निकाल ही लेगी।
सफ़ाई का काम कर रहे maintainers का धन्यवाद। यह निश्चित ही मज़ेदार काम नहीं होगा।
इसी वजह से मुझे अपने-आप features चालू-बंद करने वाले configure-style build systems बिल्कुल पसंद नहीं हैं। अगर मुझे कुछ चाहिए, तो मैं उसे साफ़ तौर पर चालू करना चाहता हूँ। अगर किसी feature को default रखने की पर्याप्त वजह है, तो कम से कम उसे साफ़ तौर पर बंद करने का विकल्प होना चाहिए।
libYनहीं था, इसलिए वह चुपचाप बंद हो गया। फिर वापस जाकर उसे जोड़ते हैं। उसके बाद user रिपोर्ट करता है कि feature Z नहीं है।बस एक default feature bundle होना चाहिए और ज़रूरत के हिसाब से
--enable-a --disable-bकी अनुमति देनी चाहिए।जाँच प्रक्रिया में आए bugs को चुपचाप निगल जाना तो एक अलग ही समस्या है।