कुछ आश्वस्त करने के लिए, मुझे कारनामों को देखकर बग नहीं मिला, मेरे पास यह मानने का कोई कारण नहीं है कि इसका खुलासा होने से पहले इसका शोषण किया गया है (हालांकि निश्चित रूप से मैं इसे खारिज नहीं कर सकता)। मुझे यह bash
भी कोड को देखकर नहीं मिला ।
मैं यह नहीं कह सकता कि मुझे उस समय अपने विचारों की ट्रेन बिल्कुल याद है।
कि कमोबेश कुछ सॉफ़्टवेयर के कुछ व्यवहारों पर कुछ प्रतिबिंब मुझे खतरनाक (व्यवहार, सॉफ़्टवेयर नहीं) से मिले। जिस तरह का व्यवहार आपको लगता है कि: यह एक अच्छा विचार नहीं है ।
इस मामले में, मैं ssh के सामान्य विन्यास पर प्रतिबिंबित कर रहा था जो क्लाइंट से असंगत पर्यावरणीय चर को पार करने की अनुमति देता है बशर्ते कि उनके साथ शुरुआत हो LC_
। विचार इतना है कि लोग ssh
अन्य मशीनों में प्रवेश करते समय अपनी भाषा का उपयोग कर सकते हैं। एक अच्छा विचार जब तक आप यह विचार करना शुरू नहीं करते हैं कि विशेष रूप से कैसे स्थानीयकरण से निपटने के लिए यूटीएफ -8 को समीकरण में लाया जाता है (और यह देखते हुए कि यह कई अनुप्रयोगों द्वारा कितनी बुरी तरह से नियंत्रित किया जाता है)।
जुलाई 2014 के वापस, मैं पहले से ही glibc स्थानीयकरण से निपटने में एक जोखिम है कि के साथ संयुक्त बताया था sshd
config, और दो अन्य खतरनाक व्यवहार के bash
खोल
बशर्ते कि वे वहाँ फ़ाइलों को अपलोड करने में सक्षम थे (प्रमाणीकृत) हमलावरों Git सर्वर को हैक करने की अनुमति दी और bash
इस्तेमाल किया गया था गिट यूनिक्स उपयोगकर्ता (CVE-2014-0475) के लॉगिन शेल के रूप में।
मैं सोच रहा था कि यह संभवतः bash
उपयोगकर्ताओं के लॉगिन शेल के रूप में उपयोग करने के लिए एक बुरा विचार था , जो ssh पर सेवाएं दे रहा है, यह देखते हुए कि यह काफी जटिल शेल है (जब आप सभी की जरूरत है, बस एक बहुत ही सरल कमांड लाइन पार्स कर रहा है) और अधिकांश गलतियां विरासत में मिली हैं ksh का। चूँकि मैंने bash
उस संदर्भ में उपयोग किए जाने के साथ कुछ समस्याओं की पहले ही पहचान कर ली थी (ssh ForceCommand
s की व्याख्या करने के लिए ), मैं सोच रहा था कि क्या वहाँ संभावित रूप से अधिक थे।
AcceptEnv LC_*
ऐसे किसी भी चर की अनुमति देता है जिसका नाम शुरू होता है LC_
और मेरे पास अस्पष्ट पुनरावृत्ति थी जो bash
निर्यात किए गए कार्य ( समय उपयोगी सुविधा पर एक खतरनाक यद्यपि) पर्यावरण चर का उपयोग कर रहे थे, जिसका नाम कुछ ऐसा
myfunction()
था और सोच रहा था कि अगर वहाँ देखने के लिए कुछ दिलचस्प नहीं था।
मैं इसे इस आधार पर खारिज करने वाला था कि सबसे खराब चीज यह हो सकती है कि एक कमांड को फिर से परिभाषित किया जाए, LC_something
जो वास्तव में एक समस्या नहीं हो सकती है क्योंकि वे मौजूदा कमांड नाम नहीं हैं, लेकिन फिर मुझे आश्चर्य हुआ कि उन पर्यावरण चर को कैसे bash
आयात किया जाए ।
क्या होगा अगर चर को LC_foo;echo test; f()
उदाहरण के लिए बुलाया जाए ? इसलिए मैंने करीब से देखने का फैसला किया।
ए:
$ env -i bash -c 'zzz() { :;}; export -f zzz; env'
[...]
zzz=() { :
}
पता चला कि मेरी याद गलत थी कि चर को नहीं बुलाया गया था ( myfunction()
लेकिन myfunction
यह
मूल्य है जो इसके साथ शुरू होता है ()
)।
और एक त्वरित परीक्षण:
$ env 'true;echo test; f=() { :;}' bash -c :
test
bash: error importing function definition for `true;echo test; f'
मेरे संदेह की पुष्टि की है कि चर नाम स्वच्छता नहीं था, और कोड का मूल्यांकन स्टार्टअप पर किया गया था ।
इससे भी बदतर, एक बहुत बुरा, मूल्य या तो sanitized नहीं था:
$ env 'foo=() { :;}; echo test' bash -c :
test
इसका मतलब था कि कोई भी पर्यावरण चर एक वेक्टर हो सकता है।
जब मैंने समस्या की सीमा का एहसास किया, तो पुष्टि की कि यह HTTP ( HTTP_xxx
/ QUERYSTRING
... env vars) के साथ-साथ मेल प्रोसेसिंग सेवाओं, बाद में डीएचसीपी (और शायद एक लंबी सूची) जैसे अन्य लोगों के लिए शोषक था (इसे ध्यान से) ।