2012-11-12 21 views
9

मैं एक प्रोग्राम लिख रहा हूं जो बाल प्रक्रियाओं को जन्म देता है। सुरक्षा कारणों से, मैं सीमित करना चाहता हूं कि ये प्रक्रियाएं क्या कर सकती हैं। मुझे प्रोग्राम के बाहर से सुरक्षा उपायों के बारे में पता है जैसे chroot या ulimit, लेकिन मैं उससे कुछ और करना चाहता हूं। मैं बाल प्रक्रिया द्वारा किए गए सिस्टम कॉल को सीमित करना चाहता हूं (उदाहरण के लिए open(), fork() और ऐसी चीजों पर कॉल को रोकना)। क्या उसे करने का कोई तरीका है? सबसे अच्छा, अवरुद्ध सिस्टम कॉल को एक त्रुटि के साथ वापस आना चाहिए, लेकिन यदि यह संभव नहीं है, तो प्रक्रिया को मारना भी अच्छा है।कुछ सिस्टम कॉल निष्पादित करने के लिए प्रक्रियाओं को रोकना

मुझे लगता है कि इसे ptrace() पर किया जा सकता है लेकिन मैन पेज से मैं वास्तव में समझ नहीं पा रहा हूं कि इस उद्देश्य के लिए इसका उपयोग कैसे किया जाए।

+3

शायद आप SELinux http://en.wikipedia.org/wiki/Security-Enhanced_Linux चाहते हैं, मैं 100% निश्चित नहीं हूं, लेकिन इसमें प्रोग्राम करने योग्य API होना चाहिए। –

+4

['prctl (PR_SET_SECCOMP, ...)'] (http://www.kernel.org/doc/man-pages/online/pages/man2/prctl.2.html) जो भी आप चाहते हैं हो सकता है। जैसा कि आप प्राप्त कर सकते हैं "syscalls की अनुमति नहीं" के करीब है। – Damon

+1

'prctl (PR_SET_SECCOMP, ...) 'के साथ समस्या यह है कि यह' exec() 'कॉल को भी अवरुद्ध करता है, इसलिए यह मेरे लिए उपयोग करने योग्य नहीं है। – petersohn

उत्तर

5

यदि आप इसे ptrace तरीके से करना चाहते हैं, तो आपके पास कुछ विकल्प हैं (और कुछ वास्तव में सरल हैं)। सबसे पहले, मैं आपको ट्यूटोरियल explained here का पालन करने की सलाह देता हूं। इसके साथ आप सीख सकते हैं कि सिस्टम कॉल किस प्रकार कॉल किया जा रहा है, और मूल ptrace ज्ञान भी (चिंता न करें, यह एक बहुत छोटा ट्यूटोरियल है)। विकल्प (जो मुझे पता है) आपके पास निम्नलिखित हैं:

  • बच्चे को मारना सबसे आसान होगा, this exact code here है।
  • दूसरा, आप बच्चे को PTRACE_SETREGS के साथ रजिस्टरों को बदलकर, गलत मान डालकर, असफल हो सकते हैं, और यदि आप चाहें तो सिस्टम कॉल के रिटर्न वैल्यू को भी बदल सकते हैं (फिर से, PTRACE_SETREGS के साथ)।
  • अंत में आप सिस्टम कॉल को छोड़ सकते हैं। लेकिन इसके लिए आपको सिस्टम कॉल कॉल के बाद पता पता होना चाहिए, निर्देश रजिस्टर को वहां इंगित करें और इसे सेट करें (फिर से, PTRACE_SETREGS के साथ)।
+2

ध्यान दें कि सैंडबॉक्सिंग के लिए ptrace का उपयोग करके कुछ [बड़ी चेतावनी] (http://stackoverflow.com/a/4421762/134633) हैं। – caf

6

यह SECCOMP_FILTER जैसा लगता है, कर्नेल संस्करण 3.5 में जोड़ा गया है, जो आप बाद में हैं। libseccomp library इस कार्यक्षमता के लिए उपयोग में आसान API प्रदान करता है।

वैसे, chroot() और setrlimit() दोनों प्रोग्राम कॉल हैं जिन्हें आपके प्रोग्राम के भीतर बुलाया जा सकता है - आप संभवतया एक या दोनों का उपयोग seccomp फ़िल्टरिंग के अलावा करना चाहते हैं।

+0

अच्छा लगता है, लेकिन मैं 2.6.32 कर्नेल का उपयोग कर रहा हूँ। – petersohn