पढ़ने की अनुमति के बिना निष्पादन योग्य अनुरेखण


17

मैंने straceएक निष्पादन योग्य पर उपयोग करते समय Ubuntu 14.04 पर कुछ आश्चर्यजनक व्यवहार पाया , जिस पर मुझे पढ़ने की अनुमति नहीं है। मुझे आश्चर्य है कि अगर यह एक बग है, या अगर कुछ मानक इस अस्पष्ट व्यवहार को अनिवार्य करते हैं।

पहले देखते हैं कि क्या होता है जब मैं पृष्ठभूमि में एक साधारण निष्पादन योग्य शुरू करता हूं और इसे संलग्न करता हूं। जैसा कि इस काम की उम्मीद है:

$ /bin/sleep 100 &
[2] 8078
$ strace -p 8078
Process 8078 attached
restart_syscall(<... resuming interrupted call ...>

अगला मैं एक निष्पादन योग्य के साथ प्रयास करता हूं, जिस पर मेरी कोई पठन अनुमति नहीं है:

---x--x--x 1 root root 26280 Sep  3 09:37 sleep*

इस प्रक्रिया को चलाने की अनुमति नहीं है:

$ ./sleep 100 &
[1] 8089
$ strace -p 8089
strace: attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted

यह वही है जो मैं उम्मीद करूंगा। पठन अनुमति के बिना निष्पादन की अनुमति देना बहुत अच्छा नहीं होगा, अगर मैं बस एक डिबगर को प्रक्रिया में संलग्न कर सकता हूं और प्रभावी ढंग से निष्पादन योग्य पर अनुमतियाँ पढ़ सकता हूं।

लेकिन अगर मैं पहले से ही ट्रेस प्रक्रिया के तहत निष्पादन योग्य शुरू कर देता हूं, तो मुझे ऐसा करने की अनुमति है:

$ strace ./sleep 100
execve("./sleep", ["./sleep", "100"], [/* 69 vars */]) = 0
brk(0)                                  = 0x9b7a000

यह मेरे लिए अप्रत्याशित है। क्या यह एक सुरक्षा बग है, या यह एक मानक द्वारा अनिवार्य विशेषता है?


3
@ स्टीफनचेज़ेलस: मुद्दा यह है कि वह इसे पियर्स कर सकता है, केवल स्ट्रेस के तर्क के रूप में इसका उपयोग करके। मूल कारण यह प्रतीत होता है कि execveकॉल पर , निष्पादित फ़ाइल की अनुमतियों को फिर से जाँच नहीं किया जाता है यदि प्रक्रिया पहले से ही पता लगाया जाता है। उनका प्रश्न यह है कि क्या यह सुरक्षा बग या अनिवार्य विशेषता है (यदि बाद वाला है, तो मैं अभी भी इसे सुरक्षा बग मानूंगा, बस विनिर्देशन का सुरक्षा बग)।
celtschk

@celtschk, क्षमा करें, मैंने प्रश्न को बहुत तेज़ी से पढ़ा।
स्टीफन चेजलस

1
EPERMसे आते हैं लगता है get_dumpable()(, जांच करने के लिए कोर डंपिंग अनुमति है या नहीं भी इस्तेमाल किया और इस प्रकार "dumpable") से कहा जाता है __ptrace_may_access()से कहा जाता है ptrace_attach()पर kernel/ptrace.c
नन्हलज

जब कोई प्रोग्राम चल रहा होता है, तो क्या डिबगर को उसके कोड वाले एक रन करने योग्य निष्पादन योग्य बनाने के लिए पर्याप्त जानकारी उपलब्ध होगी, या प्रोग्राम लोडर रिलोकेशन फ़िक्सअप जैसी चीज़ों को त्याग देगा जो प्रोग्राम को वास्तव में काम करने के लिए आवश्यक होगा?
15

@supercat जहाँ तक मुझे पता है, डिबगर के पास सभी उपयोगकर्ता मोड कोड के माध्यम से एकल चरण तक पहुंच है, जिसमें स्थानांतरण कोड भी शामिल है। पहुँच के उस स्तर के साथ एक कार्यशील निष्पादन योग्य को पुन: पेश करना बहुत मुश्किल नहीं होना चाहिए।
कास्परड सिप

जवाबों:


7

यह एक उत्तर नहीं है, बल्कि लिंक और विचारों का एक संग्रह है जब कोई और भी अध्ययन करना चाहेगा। क्योंकि यह काफी दिलचस्प बात है।

यूनिक्स और लिनक्स पर संबंधित उत्तर यह उल्लेख कर रहा है (या था, अभी वेनिला कर्नेल के साथ परीक्षण नहीं कर सकता है) केवल बायनेरिज़ को इस तरह से डंप करना संभव है।

Grsecurity इस विन्यास विकल्प और पैच को स्वयं ठीक करने की कोशिश कर रहा था (पूरी तरह से यह तब से बदल सकता है)

यह प्रतिबद्ध वास्तव में ऐसा लगता है कि, कर्नेल डेवलपर्स वास्तव में केवल डेडिंग डंपिंग के बारे में परवाह करते हैं।

लेकिन वास्तव में इस लाइन से मुझे लगता है कि कर्नेल एसयूआईडी स्थिति के अपठनीय बायनेरिज़ डंपिंग को रोकना चाहता है। और यह पंक्ति बताती है कि बायनेरिज़ जो डंप करने योग्य नहीं हैं, उन्हें ट्रेस करने योग्य नहीं होना चाहिए।

तो पहली नजर में ऐसा लगता है कि आपको सुरक्षा निहितार्थ के साथ कर्नेल में एक बग मिला है। लेकिन मैं कोई कर्नेल डेवलपर नहीं हूं, इसलिए मैं निश्चित रूप से नहीं कह सकता। मैं LKML पर पूछूंगा।

संपादित करें: एक और खोज, डीबगर के संबंध में, मूल पोस्ट में टिप्पणियों में उल्लेख किया गया है - त्वरित तनाव (फिर से) से यह मुझे लगता है, कि gdb ट्रेस किए गए बायनेरीज़ का उपयोग करता है और /proc/<pid>/mem। एक बार रनिंग बाइनरी पठनीय नहीं है, तो cat /proc/<pid>/memरिटर्न EPERM। यदि बाइनरी पठनीय है, तो यह वापस आ जाता है EIO। (इसका परीक्षण Ubuntu 14.10 पर किया गया है, जो कई सुरक्षा पैच चलाता है, इसलिए यह वेनिला कर्नेल से अलग हो सकता है। फिर मेरे पास वेनिला कर्नेल कहीं भी काम करने के लिए नहीं है :()

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.