मैंने 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
यह मेरे लिए अप्रत्याशित है। क्या यह एक सुरक्षा बग है, या यह एक मानक द्वारा अनिवार्य विशेषता है?
EPERM
से आते हैं लगता है get_dumpable()
(, जांच करने के लिए कोर डंपिंग अनुमति है या नहीं भी इस्तेमाल किया और इस प्रकार "dumpable") से कहा जाता है __ptrace_may_access()
से कहा जाता है ptrace_attach()
पर kernel/ptrace.c
।
execve
कॉल पर , निष्पादित फ़ाइल की अनुमतियों को फिर से जाँच नहीं किया जाता है यदि प्रक्रिया पहले से ही पता लगाया जाता है। उनका प्रश्न यह है कि क्या यह सुरक्षा बग या अनिवार्य विशेषता है (यदि बाद वाला है, तो मैं अभी भी इसे सुरक्षा बग मानूंगा, बस विनिर्देशन का सुरक्षा बग)।