लिनक्स में सैंडबॉक्स में एक अविश्वसनीय सी प्रोग्राम चलाएं जो इसे फाइलों, फोर्किंग आदि को खोलने से रोकता है?


110

मैं सोच रहा था कि क्या लिनक्स में सैंडबॉक्स के तहत एक अविश्वसनीय सी प्रोग्राम चलाने का कोई तरीका मौजूद है। कुछ ऐसा जो प्रोग्राम को फाइल, या नेटवर्क कनेक्शन, या फोर्किंग, एक्जीक्यूट आदि खोलने से रोकेगा?

यह एक छोटा सा कार्यक्रम होगा, एक होमवर्क असाइनमेंट, जो सर्वर पर अपलोड हो जाता है और उस पर यूनिट टेस्ट होते हैं। इसलिए कार्यक्रम कम ही होगा।


क्या यह एकल सी प्रोग्राम जैसा है जिसे आपको 5 मिनट के लिए 1 बार चलाने की आवश्यकता है, या कुछ और जिसे आपको लगातार चलाने की आवश्यकता है?
bwawok

यह एक छोटा सा प्रोग्राम होगा जो अपलोड हो जाता है और इस पर यूनिट टेस्ट होते हैं। इसलिए कार्यक्रम कम ही होगा।
फ्रैंक

सिस्टम किस वितरण का उपयोग कर रहा है? कुछ वितरण में सैंडबॉक्सिंग के लिए तैयार उपकरण हैं। क्या आपके सिस्टम में कोई सुरक्षा मॉडल है जैसे SELinux या AppArmor सक्षम है?
थकाला

मैं Fedora 13 का उपयोग कर रहा हूं। मैं SELinux Sandbox नीति में देख रहा हूं। मैं सोच रहा हूं कि अन्य विकल्प क्या मौजूद हैं।
फ्रैंक

6
लिनक्स या यूनिक्स में सैंडबॉक्सिंग / जेलिंग प्रक्रियाओं पर समान क्यूएस : * unix.stackexchange.com/q/6433/4319 * stackoverflow.com/q/3859710/94687 * stackoverflow.com/q/4410447/94687 * stackoverflow.com/q / १०१
--० Ivan /

जवाबों:


47

मैंने सिस्ट्रेस का इस्तेमाल संवादात्मक रूप से और स्वचालित मोड में दोनों तरह से बिना लाइसेंस के सैंडबॉक्स के लिए किया है। इसमें एक- ptrace()बैकड बैकएंड है जो विशेष सिस्टम के बिना लिनक्स सिस्टम पर इसके उपयोग की अनुमति देता है, साथ ही साथ बहुत तेज़ और अधिक पॉज़फुल बैकएंड जिसे कर्नेल को पैच करने की आवश्यकता होती है।

यूनिक्स जैसी प्रणालियों का उपयोग करके सैंडबॉक्स बनाना भी संभव है chroot(1), हालांकि यह उतना आसान या सुरक्षित नहीं है। लिनक्स कंटेनर और फ्रीबीएसडी जेल चुरोट के लिए एक बेहतर विकल्प हैं। लिनक्स पर एक अन्य विकल्प SELinux या AppArmor जैसे सुरक्षा ढांचे का उपयोग करना है , जो कि मैं उत्पादन प्रणालियों के लिए प्रस्तावित करूंगा।

हम आपको और अधिक मदद करने में सक्षम होंगे यदि आपने बताया कि वास्तव में यह क्या है जो आप करना चाहते हैं।

संपादित करें:

सिस्ट्रेस आपके मामले के लिए काम करेगा, लेकिन मुझे लगता है कि लिनक्स सिक्योरिटी मॉडल पर आधारित कुछ जैसे AppArmor या SELinux एक अधिक मानक है, और इस प्रकार, आपके वितरण के आधार पर पसंदीदा, वैकल्पिक है।

संपादित करें 2:

जबकि chroot(1)अधिकांश (सभी?) यूनिक्स जैसी प्रणालियों पर उपलब्ध है, इसमें काफी कुछ मुद्दे हैं:

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

  • आपको अपने काम के लिए आवश्यक हर चीज के साथ एक पूर्ण स्वतंत्र फाइलसिस्टम पदानुक्रम बनाना होगा। चेरोट में आपके पास एक कंपाइलर होना जरूरी नहीं है, लेकिन संकलित कार्यक्रमों को चलाने के लिए जो कुछ भी आवश्यक है उसे शामिल किया जाना चाहिए। हालांकि ऐसी उपयोगिताएँ हैं जो इसकी मदद करती हैं, यह अभी भी तुच्छ नहीं है।

  • आपको चुरोट को बनाए रखना होगा। चूंकि यह स्वतंत्र है, इसलिए आपके वितरण के साथ चेरोट फाइलें अपडेट नहीं की जाएंगी। आपको या तो नियमित रूप से चेरोट को फिर से बनाना होगा, या इसमें आवश्यक अपडेट टूल शामिल करने होंगे, जिसमें अनिवार्य रूप से यह आवश्यक होगा कि यह पूर्ण विकसित लिनक्स वितरण हो। आपको सिस्टम और यूजर डेटा (पासवर्ड, इनपुट फाइल आदि) को होस्ट सिस्टम के साथ सिंक करके रखना होगा।

  • chroot()केवल फ़ाइल सिस्टम की सुरक्षा करता है। यह दुर्भावनापूर्ण प्रोग्राम को नेटवर्क सॉकेट खोलने से नहीं रोकता है या हर उपलब्ध संसाधन को चूसने से बुरी तरह से लिखा है।

सभी विकल्पों में से संसाधन उपयोग की समस्या आम है। फाइलसिस्टम कोटा डिस्क को भरने से प्रोग्राम को रोक देगा। उचित ulimit( setrlimit()सी में) सेटिंग्स मेमोरी अति प्रयोग और किसी भी कांटा बम के खिलाफ की रक्षा कर सकती हैं, साथ ही सीपीयू हॉग्स को भी रोक सकती हैं। nice(1)उन कार्यक्रमों की प्राथमिकता को कम कर सकता है ताकि कंप्यूटर का उपयोग उन कार्यों के लिए किया जा सके जिन्हें बिना किसी समस्या के अधिक महत्वपूर्ण माना जाता है।


सिस्ट्रेस ने मेरे लिए सरल, कार्यक्रमों के लिए काम किया, लेकिन जब जीएनयू (1) के रूप में जीसीसी द्वारा चलाया गया तो अनिश्चित काल के लिए अटक गया। इसलिए मैंने इसे छोड़ दिया। यह Systrace में एक unfixed बग है: forum.soft32.com/linux/...
अंक

क्या यह सुनिश्चित करने का एक तरीका है कि सैंडबॉक्स वाली प्रक्रियाओं के बीच साझा की गई मेमोरी, संदेश कतारें और सेमाफोर साझा नहीं हैं?
daveagp

1
सिस्ट्रेस लिंक टूट गया है।
कॉलिन

2
फायरजेल के बारे में क्या? अब आपको इसका उपयोग करके fs को बनाए नहीं रखना है।
m3nda

18

मैंने हाल ही में लिनक्स में सैंडबॉक्सिंग तकनीकों का अवलोकन लिखा था । मुझे लगता है कि आपका सबसे आसान तरीका लिनक्स कंटेनर (एलएक्सए) का उपयोग करना होगा, अगर आपको फोर्किंग आदि के बारे में बुरा न लगे, जो वास्तव में इस वातावरण में मायने नहीं रखता है। आप प्रक्रिया को केवल पढ़ने के लिए एक रूट फाइल सिस्टम, एक अलग लूपबैक नेटवर्क कनेक्शन दे सकते हैं और फिर भी आप इसे आसानी से मार सकते हैं और मेमोरी लिमिट आदि सेट कर सकते हैं।

Seccomp थोड़ा मुश्किल हो रहा है, क्योंकि कोड मेमोरी को आवंटित भी नहीं कर सकता है।

सेलिनक्स अन्य विकल्प है, लेकिन मुझे लगता है कि यह कंटेनर की तुलना में अधिक काम हो सकता है।


6

आप कार्य का परीक्षण जल्दी से करने के लिए Qemu का उपयोग कर सकते हैं। नीचे दी गई यह प्रक्रिया मेरे 5 साल पुराने लैपटॉप पर 5 सेकंड से भी कम समय लेती है।

मान लेते हैं कि छात्र को एक प्रोग्राम विकसित करना है, जो बिना लाइन के, प्रत्येक को अपनी लाइन पर लेता है, जब तक कि "-1" वाली लाइन नहीं आ जाती। कार्यक्रम को तब सभी चींटियों और आउटपुट का औसत "औसत:% f" होना चाहिए। यहां बताया गया है कि आप प्रोग्राम को पूरी तरह से अलग कैसे कर सकते हैं:

  1. सबसे पहले, root.binJslinux से प्राप्त करें, हम इसका उपयोग उपयोगकर्ता के रूप में करेंगे (इसमें tcc C-compiler है):

    wget https://github.com/levskaya/jslinux-deobfuscated/raw/master/root.bin

  2. हम छात्र का जमावड़ा लगाना चाहते हैं root.bin, इसलिए लूप डिवाइस सेट करें:

    sudo losetup /dev/loop0 root.bin

    (आप इसके लिए भी fuseext2 का उपयोग कर सकते हैं, लेकिन यह बहुत स्थिर नहीं है। यदि यह स्थिर हो जाता है, तो आपको इसके लिए रूट की आवश्यकता नहीं होगी)

  3. एक खाली निर्देशिका बनाएं:

    mkdir mountpoint

  4. माउंट root.bin:

    sudo mount /dev/loop0 mountpoint

  5. माउंटेड फ़ाइल सिस्टम दर्ज करें:

    cd mountpoint

  6. अधिकार तय करें:

    sudo chown -R `whoami` .

  7. mkdir -p etc/init.d
  8. vi etc/init.d:

    #!/bin/sh
    cd /root
    echo READY 2>&1 > /dev/ttyS0
    tcc assignment.c 2>&1 > /dev/ttyS0
    ./a.out 2>&1 > /dev/ttyS0
    
  9. chmod +x etc/init.d/rcS

  10. VM को सबमिशन कॉपी करें:

    cp ~/student_assignment.c root/assignment.c

  11. VM की मूल FS से बाहर निकलें:

    cd ..

  12. sudo umount mountpoint
  13. अब छवि तैयार है, हमें इसे चलाने की आवश्यकता है। यह बूटिंग के बाद सबमिशन को कंपाइल और रन करेगा।
  14. mkfifo /tmp/guest_output
  15. एक अलग टर्मिनल खोलें और अतिथि आउटपुट के लिए सुनना शुरू करें:

    dd if=/tmp/guest_output bs=1

  16. दूसरे टर्मिनल में:

    qemu-system-i386 -kernel vmlinuz-3.5.0-27-generic -initrd root.bin -monitor stdio -nographic -serial pipe:/tmp/guestoutput (मैंने अभी उबंटू कर्नेल का उपयोग किया है, लेकिन कई कर्नेल काम करेंगे)

  17. जब अतिथि आउटपुट "READY" दिखाता है, तो आप VM को कीमू प्रॉम्प्ट से कुंजी भेज सकते हैं। उदाहरण के लिए, इस असाइनमेंट का परीक्षण करने के लिए, आप कर सकते हैं

    (qemu) sendkey 1
    (qemu) sendkey 4
    (qemu) sendkey ret
    (qemu) sendkey 1
    (qemu) sendkey 0
    (qemu) sendkey ret
    (qemu) sendkey minus
    (qemu) sendkey 1
    (qemu) sendkey ret
    
  18. अब Average = 12.000000गेस्ट आउटपुट पाइप पर दिखाई देना चाहिए। यदि ऐसा नहीं होता है, तो छात्र विफल हो गया।

  19. क्यूमू छोड़ो: quit

परीक्षण पास करने वाला एक कार्यक्रम यहां है: https://stackoverflow.com/a/14424295/309483 । के tcclib.hबजाय बस का उपयोग करें stdio.h



4

फायरजेल ऐसा करने के लिए सबसे व्यापक उपकरणों में से एक है - यह seccomp, फाइलसिस्टम कंटेनरों, क्षमताओं और अधिक का समर्थन करता है:

https://firejail.wordpress.com/features-3/


यह उत्तर उत्कृष्ट है, यह वास्तव में अधिक upvotes के योग्य है, यह देखते हुए कि फायरजेल को महान प्रलेखन के साथ सक्रिय रूप से बनाए रखा जाता है, जिसमें अधिकांश अन्य उत्तर नहीं होते हैं और इसका उपयोग करने के लिए अपेक्षाकृत आसान होने के लिए डिज़ाइन किया गया है।
जेफ हेकिन

3

एक वर्चुअल मशीन के अंदर इसे चलाने से आपको अपनी सभी सुरक्षा और प्रतिबंधों की पेशकश करनी चाहिए।

QEMU उस और सभी काम के लिए एक अच्छा फिट होगा (एप्लिकेशन डाउनलोड करना, डिस्क छवि को अपडेट करना, QEMU शुरू करना, इसके अंदर एप्लिकेशन चलाना और बाद में पुनर्प्राप्ति के लिए आउटपुट को सहेजना) स्वचालित परीक्षणों के लिए स्क्रिप्ट किया जा सकता है।


2
मुझे ओपी के बारे में पता नहीं है, लेकिन कई मामलों में एक वीएम प्रति परीक्षण कार्यक्रम शुरू करना अस्वीकार्य होगा। मेरे वातावरण में (मैं TA) हूँ, 200 से अधिक छात्र 2-12 घंटे की अवधि के भीतर 10-12 कार्यक्रम प्रस्तुत कर सकते हैं। कोई भी कार्यक्रम 10sec से अधिक CPU-समय के लिए नहीं चलता है, लेकिन जब सबमिशन ढेर हो जाते हैं तो हमें 15min या उससे अधिक के टर्न-अराउंड समय मिलते हैं। प्रत्येक प्रोग्राम के लिए एक वीएम का परिचय CPU-समय को 60sec या अधिक प्रति प्रोग्राम में धकेल देगा और मैं बिल्कुल भी समय के बारे में नहीं सोचना चाहता। शायद एक वीएम प्रति सत्र, लेकिन कोई भी तरीका हम उस प्रति कार्यक्रम को नहीं कर सकते थे ...
थोकला

@thkala यह एक अच्छी बात है। मुझे QEMU का विचार पसंद है लेकिन प्रत्येक सबमिशन के लिए VM शुरू करना अच्छा नहीं है।
फ्रैंक

ठीक है, उस स्थिति में, एक ही वीएम को हर समय चालू रखें।
लॉरेंट पैरेंटो

क्या आप किसी vm के स्नैपशॉट का उपयोग करके कुछ कर सकते हैं जो सभी बूट किया गया है और कोड संकलित करने और चलाने के लिए तैयार है? FYI करें, vm भेदी के लिए जरूरी प्रतिरक्षा नहीं हैं। आप इसका एक हार्डवेयर संस्करण भी बना सकते हैं - एक छोटा सिस्टम जो रीड-ओनली मीडिया या नेटवर्क पर फिर से शुरू होने वाली छवि को बूट करता है और नेटवर्क या सीरियल के माध्यम से आउटपुट प्रदान करता है, फिर अगले के लिए रिबूट हो जाता है। कुछ क्विक बूटिंग एडवांस हुए हैं, जो कुछ ही सेकंड में लाइनक्स प्राप्त करते हैं।
क्रिस स्ट्रैटन

@thkala: इसका मतलब है कि यदि आपने उन्हें क्रमिक रूप से चलाया तो आपको प्रति सेकंड 3 सेकंड से कम की आवश्यकता होगी। मैंने जो दृष्टिकोण पोस्ट किया है वह शायद एक आधुनिक मशीन (क्रमबद्ध) पर लगभग 3 सेकंड लेता है। यदि आप समानांतर (जो आप के रूप में अच्छी तरह से हो सकता है) यह काफी तेजी से होगा।
जानूस ट्रॉल्सन

3

जब यह ptrace (स्ट्रेस) चेक-आउट के आधार पर सैन्बॉक्सिंग के बारे में होता है:

" sydbox " सैंडबॉक्स और " पिंकट्रेस " प्रोग्रामिंग लाइब्रेरी (यह C99 है लेकिन जहाँ तक मुझे पता है अजगर और माणिक के लिए बाइंडिंग हैं)।

विषय से जुड़े लिंक:

http://www.diigo.com/user/wierzowiecki/sydbox

(खेद है कि सीधे लिंक नहीं, लेकिन अभी तक कोई पर्याप्त प्रतिष्ठा अंक नहीं)



1

इस लाइब्रेरी को अपने लक्ष्य की अच्छी तरह से सेवा करनी चाहिए

http://sandbox.sourceforge.net

सौभाग्य!


8
यह सक्रिय रूप से बनाए रखा नहीं लगता है। इसके लिए लिनक्स कर्नेल पैच की आवश्यकता भी प्रतीत होती है, जो 2003 के पहले के नवीनतम संस्करणों पर विचार करते हुए इसे अधिक बेकार बना देगा।
thkala

1

यह भी आशाजनक लगता है। एक फाइलसिस्टम सैंडबॉक्स लिनक्स के लिए syscall इंटरसेप्ट का उपयोग करता है।

https://github.com/adtac/fssb


-1

ठीक है उन सभी उत्तरों के लिए धन्यवाद, जिन्होंने मुझे बहुत मदद की। लेकिन मैं उनमें से किसी को भी मूल प्रश्न पूछने वाले व्यक्ति के समाधान के रूप में सुझाऊंगा। एक शिक्षक, ट्यूटर, प्रोफेसर के रूप में छात्रों के कोड का परीक्षण करने के लिए सभी उल्लिखित टूल को बहुत काम करने की आवश्यकता है। इस मामले में सबसे अच्छा तरीका मेरी राय virtualbox में होगा। ठीक है, इसका पूर्ण x68-प्रणाली का अनुकरण करता है और इस तरह से सैंडबॉक्सिंग के अर्थ के साथ कोई लेना-देना नहीं है, लेकिन अगर मैं अपने प्रोग्रामिंग शिक्षक की कल्पना करता हूं तो यह उसके लिए सबसे अच्छा होगा। तो डेबियन आधारित सिस्टम पर "एप्ट-गेट इंस्टाल वर्चुअलबॉक्स", अन्य सभी http://virtualbox.org/ पर जाते हैं , एक vm बनाते हैं, एक आइसो जोड़ते हैं, इंस्टाल करते हैं, कुछ समय इंतजार करते हैं और भाग्यशाली होते हैं। उपयोगकर्ता-मोड-लिनक्स या कुछ भारी स्ट्रेस सामान सेट करने के लिए उपयोग करना बहुत आसान होगा ...

और अगर आपको अपने छात्रों को हैक करने के बारे में आशंका है, तो मुझे लगता है कि आपके पास एक प्राधिकरण समस्या है और इसके लिए एक समाधान उन्हें धमकी देगा कि आप जीवित दिन के उजाले का मुकदमा करेंगे, यदि आप काम देने के लिए मैलवेयर के सिर्फ एक काटने को साबित कर सकते हैं आप...

इसके अलावा, अगर कोई वर्ग है और उसका 1% भी उतना ही अच्छा है, तो वह इस तरह के काम कर सकता है, न ही उन्हें ऐसे सरल कामों से बोर करें और उन्हें कुछ बड़े काम दें, जहाँ उन्हें कुछ और कोड करना होगा। इंटीग्रेटिव लर्निंग सभी के लिए सबसे अच्छा है इसलिए पुराने डेडलॉक किए गए ढांचे पर भरोसा न करें ...

और कारण, कभी भी महत्वपूर्ण चीजों के लिए एक ही कंप्यूटर का उपयोग न करें (जैसे कि सत्यापन और परीक्षा लिखना), जिसका उपयोग आप वेब ब्राउज़ करने और सॉफ़्टवेयर का परीक्षण करने जैसी चीज़ों के लिए कर रहे हैं।

महत्वपूर्ण चीजों के लिए ऑफ लाइन कंप्यूटर और अन्य सभी चीजों के लिए ऑन लाइन कंप्यूटर का उपयोग करें।

हालांकि हर कोई जो एक पागल शिक्षक नहीं है (न ही किसी को नाराज करना चाहता है, मैं सिर्फ यह राय हूं कि आपको प्रोग्रामर शिक्षक होने से पहले सुरक्षा और हमारे समाज के बारे में मूल बातें सीखना चाहिए ...)

... मैं कहाँ था ... बाकी सभी के लिए:

हैप्पी हैकिंग !!

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