2008-11-06 17 views
17

लिनक्स (या सोलारिस) पर /proc/self/maps हाथ से पार्सिंग से बेहतर तरीका है यह पता लगाने के लिए कि क्या आप स्मृति में एक या अधिक पते पर संग्रहीत, पढ़ या निष्पादित कर सकते हैं?मेमोरी सुरक्षा को समझने के लिए पार्सिंग/proc/self/maps से बेहतर तरीका है?

उदाहरण के लिए, विंडोज़ में आपके पास VirtualQuery है।

लिनक्स में, मैं उन मानों को बदलने के लिए mprotect कर सकता हूं, लेकिन मैं उन्हें वापस नहीं पढ़ सकता।

इसके अलावा, वहाँ किसी भी तरह से पता करने के लिए जब उन अनुमतियों को बदलने है (उदाहरण के लिए जब कोई मेरे पीठ के पीछे एक फ़ाइल पर mmap उपयोग करता है) कुछ बहुत आक्रामक कर रहे हैं और इस प्रक्रिया में सभी धागे पर ptrace का उपयोग करने और बनाने के लिए किसी भी प्रयास में अवरोध डालने के अलावा अन्य syscall जो मेमोरी मैप को प्रभावित कर सकता है?

अद्यतन:

दुर्भाग्य से, मैं एक JIT कोड यह क्या स्थिर है की एक सन्निकटन प्राप्त करने के लिए निष्पादित हो रहा है के बारे में बहुत कम जानकारी है कि इस के अंदर उपयोग कर रहा हूँ। हां, मुझे एहसास है कि मेरे पास लिनक्स द्वारा उपयोग किए गए बनामस्केल पेज की तरह म्यूटेबल डेटा का निरंतर मानचित्र हो सकता है। I सुरक्षित रूप से एक धारणा पर वापस आ सकता है कि प्रारंभिक पार्स में शामिल नहीं किया गया कुछ भी परिवर्तनीय और खतरनाक है, लेकिन मैं उस विकल्प से पूरी तरह से खुश नहीं हूं।

अभी मैं क्या करता हूं मैं /proc/self/maps पढ़ता हूं और एक संरचना का निर्माण करता हूं, मैं किसी दिए गए पते की सुरक्षा के लिए बाइनरी खोज कर सकता हूं। किसी भी समय मुझे किसी ऐसे पृष्ठ के बारे में कुछ जानने की ज़रूरत है जो मेरी संरचना में नहीं है, मैं इसे पढ़ता/proc/self/maps मानता हूं कि यह उस दौरान जोड़ा गया है या मैं किसी भी तरह से segfault करने वाला होगा।

ऐसा लगता है कि इस जानकारी को पाने के लिए पाठ को पार्स करना और यह नहीं जानना कि यह कब बदलता है वह बहुत क्रूर है। (/dev/inotify/proc में बहुत कुछ भी काम नहीं करता है)

उत्तर

6

मुझे लिनक्स पर VirtualQuery के बराबर नहीं पता है। लेकिन कुछ अन्य तरीकों से यह जो या काम नहीं हो सकता है ऐसा करने के लिए कर रहे हैं:

  • आप एक संकेत हैंडलर फँसाने SIGBUS/SIGSEGV सेटअप और अपने पढ़ने को आगे या लिखें। अगर स्मृति सुरक्षित है, तो आपके सिग्नल फँसने वाले कोड को बुलाया जाएगा। यदि आपका सिग्नल फँसाने वाला कोड नहीं कहा जाता है। किसी भी तरह से आप जीतते हैं।

  • प्रत्येक बार जब आप mprotect पर कॉल करते हैं तो ट्रैक कर सकते हैं और एक संबंधित डेटा संरचना तैयार कर सकते हैं जो यह जानने में आपकी सहायता करता है कि कोई क्षेत्र पढ़ा गया है या संरक्षित है या नहीं। यह अच्छा है अगर आपके पास mprotect का उपयोग करने वाले सभी कोड तक पहुंच है।

  • आप mprotect फ़ंक्शन को फिर से परिभाषित करने वाली लाइब्रेरी के साथ अपने कोड को जोड़कर अपनी प्रक्रिया में सभी mprotect कॉलों की निगरानी कर सकते हैं। इसके बाद आप यह जानने के लिए आवश्यक डेटा संरचना बना सकते हैं कि कोई क्षेत्र सुरक्षित है या संरक्षित है या फिर सुरक्षा को सेट करने के लिए सिस्टम mprotect पर कॉल करें।

  • आप /dev/inotify का उपयोग करने का प्रयास कर सकते हैं और किसी भी बदलाव के लिए फ़ाइल /proc/self/maps पर नजर रख सकते हैं। मुझे लगता है कि यह काम नहीं करता है, लेकिन कोशिश करने लायक होना चाहिए।

+1

समय तक मुझे एसआईजीएसईजीवी बहुत देर हो चुकी है। मुझे यह जानने की ज़रूरत है कि कुछ डेटा यह जानने के लिए निरंतर है कि मैं इसके माध्यम से लगातार "सुरक्षित" हो सकता हूं। स्थिर mmap'ed गैर-निरंतर डेटा और बनामस्कूल पृष्ठ के लिए उचित हैक्स के साथ। –

0

वहाँ sorta है/था/proc/[pid | आत्म]/PageMap, कर्नेल में प्रलेखन, यहाँ चेतावनियां: https://lkml.org/lkml/2015/7/14/477 तो यह नहीं पूरी तरह से हानिरहित है ...