Linux'ta bir sanal alanda, dosyaları açmasını, çatallanmasını vb. Engelleyen güvenilmeyen bir C programı çalıştırın.


110

Linux'ta bir sandbox altında güvenilmeyen bir C programını çalıştırmanın bir yolu olup olmadığını merak ediyordum. Programın dosyaları veya ağ bağlantılarını açmasını veya çatallanmasını, çalıştırılmasını vb. Engelleyecek bir şey?

Bir sunucuya yüklenen ve üzerinde birim testleri olan küçük bir program, bir ev ödevi olabilir. Yani program kısa ömürlü olacaktı.


Bu, 5 dakika boyunca 1 kez çalıştırmanız gereken tek bir C programı gibi mi yoksa sürekli çalıştırmanız gereken bir şey mi?
bwawok

Yüklenen ve üzerinde birim testleri olan küçük bir program olacaktır. Yani program kısa ömürlü olacaktı.
Frank

Sistem hangi dağıtımı kullanıyor? Bazı dağıtımların korumalı alan için hazır araçları vardır. Sisteminizde SELinux veya AppArmor gibi bir güvenlik modeli etkin mi?
thkala

Fedora 13 kullanıyorum. SELinux Sandbox politikasını araştırıyorum. Başka hangi seçeneklerin olduğunu merak ediyorum.
Frank

Yanıtlar:


47

Güvenilmeyen programları hem etkileşimli hem de otomatik modda sandbox için Systrace'i kullandım . Bu bir var ptrace()özel ayrıcalıkları olmayan bir Linux sisteminde kullanılmasına izin verir tabanlı arka uç yanı sıra çekirdek yama gerektiren bir çok daha hızlı ve daha poweful arka uç.

O chroot(1)kadar kolay veya güvenli olmasa da, Unix benzeri sistemlerde bir sandbox oluşturmak da mümkündür . Linux Kapsayıcıları ve FreeBSD jails , chroot'a daha iyi bir alternatiftir. Linux'ta başka bir alternatif, üretim sistemleri için önereceğim olan SELinux veya AppArmor gibi bir güvenlik çerçevesi kullanmaktır .

Tam olarak ne yapmak istediğinizi söylerseniz size daha fazla yardımcı olabiliriz.

DÜZENLE:

Systrace sizin durumunuz için işe yarar, ancak dağıtımınıza bağlı olarak AppArmor veya SELinux gibi Linux Güvenlik Modeline dayalı bir şeyin daha standart ve dolayısıyla tercih edilen bir alternatif olduğunu düşünüyorum.

DÜZENLEME 2:

İken chroot(1)en geçerli (tüm?) Unix benzeri sistemler, bu epeyce sorunları vardır:

  • Parçalanabilir. Sisteminizde güvenilmeyen C programlarını gerçekten derleyecekseniz veya çalıştıracaksanız, özellikle bu soruna karşı savunmasızsınızdır. Ve eğer öğrencileriniz benimki gibiyse, birisi hapishaneden kaçmaya ÇALIŞACAKTIR.

  • Göreviniz için gerekli olan her şeyi içeren tam bağımsız bir dosya sistemi hiyerarşisi oluşturmalısınız. Chroot'ta bir derleyiciye sahip olmanız gerekmez, ancak derlenmiş programları çalıştırmak için gereken her şey dahil edilmelidir. Buna yardımcı olan yardımcı programlar olsa da, hala önemsiz değil.

  • Chroot'u korumalısınız. Bağımsız olduğu için, chroot dosyaları dağıtımınızla birlikte güncellenmeyecektir. Ya chroot'u düzenli olarak yeniden oluşturmanız ya da gerekli güncelleme araçlarını buna dahil etmeniz gerekir, bu da onun tam gelişmiş bir Linux dağıtımı olmasını gerektirir. Ayrıca, sistem ve kullanıcı verilerini (parolalar, giriş dosyaları vb.) Ana sistemle senkronize tutmanız gerekecektir.

  • chroot()sadece dosya sistemini korur. Kötü amaçlı bir programın ağ soketlerini açmasını veya kötü yazılmış bir programın mevcut tüm kaynakları emmesini engellemez.

Kaynak kullanımı sorunu tüm alternatifler arasında yaygındır. Dosya sistemi kotaları , programların diski doldurmasını engeller. Uygun ulimit( setrlimit()C'de) ayarlar, belleğin aşırı kullanımına ve herhangi bir çatal bombasına karşı koruma sağlayabilir ve ayrıca CPU domuzlarını durdurabilir. nice(1)bu programların önceliğini düşürebilir, böylece bilgisayar daha önemli görülen herhangi bir görev için sorunsuz bir şekilde kullanılabilir.


systrace benim için basit programlar için çalıştı, ancak GNU (1) GCC tarafından çalıştırıldığında süresiz olarak takıldı. Ben de vazgeçtim. Bu, systrace'de düzeltilmemiş
pts

Paylaşılan belleğin, ileti kuyruklarının ve semaforların korumalı alandaki işlemler arasında paylaşılmamasını sağlamanın bir yolu var mı?
daveagp

1
Systrace bağlantısı koptu.
Collin

2
Ya Firejail? Artık fs'yi kullanmak zorunda değilsiniz.
m3nda

18

Yakın zamanda Linux'ta korumalı alan tekniklerine genel bir bakış yazdım . Bence en kolay yaklaşımınız, çatallama ve benzeri konulara aldırış etmiyorsanız, bu ortamda gerçekten önemli olmayan Linux kapsayıcıları (lxc) kullanmak olacaktır. İşleme salt okunur bir kök dosya sistemi, yalıtılmış bir geri döngü ağ bağlantısı verebilir ve yine de kolayca öldürebilir ve bellek sınırlarını vb. Ayarlayabilirsiniz.

Seccomp biraz zor olacak çünkü kod hafızayı bile ayıramıyor.

Selinux diğer seçenek, ancak bence bir konteynerden daha fazla iş olabilir.


6

Ödevleri hızlı bir şekilde test etmek için Qemu'yu kullanabilirsiniz. Aşağıdaki bu prosedür 5 yaşındaki dizüstü bilgisayarımda 5 saniyeden kısa sürüyor.

Öğrencinin, "-1" ile bir satır gelene kadar, her biri kendi satırında işaretsiz girişler alan bir program geliştirmesi gerektiğini varsayalım. Program daha sonra tüm girişlerin ortalamasını almalı ve "Ortalama:% f" çıktısı vermelidir. Programı tamamen izole olarak nasıl test edebileceğiniz aşağıda açıklanmıştır:

  1. Öncelikle, root.binJslinux'dan alın, bunu kullanıcı alanı olarak kullanacağız (tcc C-derleyicisine sahiptir):

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

  2. Öğrencinin gönderisini eklemek istiyoruz root.bin, bu nedenle döngü cihazını ayarlayın:

    sudo losetup /dev/loop0 root.bin

    (bunun için de fuseext2 kullanabilirsiniz, ancak çok kararlı değildir. Eğer stabilize olursa, bunların hiçbiri için root'a ihtiyacınız olmayacaktır)

  3. Boş bir dizin oluşturun:

    mkdir mountpoint

  4. Montaj root.bin:

    sudo mount /dev/loop0 mountpoint

  5. Bağlanmış dosya sistemini girin:

    cd mountpoint.

  6. Düzeltme hakları:

    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. Gönderimi sanal makineye kopyalayın:

    cp ~/student_assignment.c root/assignment.c

  11. Sanal makinenin kök FS'sinden çıkın:

    cd ..

  12. sudo umount mountpoint
  13. Şimdi görüntü hazır, sadece çalıştırmamız gerekiyor. Önyüklemeden sonra gönderimi derleyecek ve çalıştıracaktır.
  14. mkfifo /tmp/guest_output
  15. Ayrı bir terminal açın ve misafir çıktısını dinlemeye başlayın:

    dd if=/tmp/guest_output bs=1

  16. Başka bir terminalde:

    qemu-system-i386 -kernel vmlinuz-3.5.0-27-generic -initrd root.bin -monitor stdio -nographic -serial pipe:/tmp/guestoutput (Burada Ubuntu çekirdeğini kullandım, ancak birçok çekirdek çalışacak)

  17. Konuk çıkışı "HAZIR" gösterdiğinde, qemu komut isteminden sanal makineye anahtarlar gönderebilirsiniz. Örneğin, bu ödevi test etmek için şunları yapabilirsiniz:

    (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. Şimdi Average = 12.000000konuk çıkış borusunda görünmelidir. Olmazsa öğrenci başarısız oldu.

  19. Qemu'dan çıkın: quit

Testi geçen bir program burada: https://stackoverflow.com/a/14424295/309483 . Bunun tcclib.hyerine kullanın stdio.h.


5

Kullanıcı modu Linux'u deneyin . CPU yoğun işler için yaklaşık% 1 performans ek yükü vardır, ancak G / Ç yoğun işler için 6 kat daha yavaş olabilir.


4

Firejail bunu yapmak için en kapsamlı araçlardan biridir - seccomp, dosya sistemi kapsayıcıları, yetenekler ve daha fazlasını destekler:

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


Bu cevap mükemmel, yangın hapının aktif bir şekilde harika belgelerle korunduğu, diğer tüm cevapları olmasa da çoğunu kapsadığı ve nispeten kullanımı kolay olacak şekilde tasarlandığı düşünüldüğünde gerçekten daha fazla oyu hak ediyor.
Jeff Hykin

3

Sanal bir makinede çalıştırmak size istediğiniz tüm güvenliği ve kısıtlamaları sunmalıdır.

QEMU bunun için iyi bir uyum olacaktır ve tüm işler (uygulamayı indirmek, disk görüntüsünü güncellemek, QEMU'yu başlatmak, içindeki uygulamayı çalıştırmak ve çıktıyı daha sonra almak üzere kaydetmek) otomatik testler için komut dosyası haline getirilebilir.


2
OP hakkında bilgim yok, ancak test programı başına bir sanal makine başlatmak çoğu durumda kabul edilemez. Çevremde (ben bir asistanım) 2 saatlik bir süre içinde her biri 10-12 program sunan 200 öğrenci olabilir. Hiçbir program 10 saniyeden daha uzun bir CPU süresi boyunca çalışmaz, ancak gönderimler biriktiğinde 15 dakika veya daha fazla dönüş süreleri elde ederiz. Her program için bir sanal makinenin tanıtılması, CPU süresini program başına 60 saniye veya daha fazlasına çıkarır ve geri dönüş sürelerini hiç düşünmek istemiyorum. Belki oturum başına bir
sanal makine

@thkala Bu iyi bir nokta. QEMU fikrini beğendim ancak her gönderim için bir VM başlatmak iyi değil.
Frank

Bu durumda, aynı sanal makineyi her zaman çalışır durumda tutun.
Laurent Parenteau

Tamamı önyüklenmiş ve kodu derleyip çalıştırmaya hazır bir sanal makinenin anlık görüntüsünü kullanarak bir şeyler yapabilir misiniz? Bilginize, sanal makinelerin delmeye karşı bağışıklığı olması gerekmez. Bunun bir donanım sürümünü de oluşturabilirsiniz - bir özgeçmiş görüntüsünü salt okunur ortamdan veya ağ üzerinden önyükleyen ve ağ veya seri yoluyla çıktı sağlayan ve ardından bir sonraki için yeniden başlatılan küçük bir sistem. Birkaç saniye içinde linux'u yükselten bazı hızlı önyükleme ilerlemeleri oldu.
Chris Stratton

@thkala: Bu, seri olarak yayınladıysanız, gönderim başına 3 saniyeden daha azına ihtiyacınız olacağı anlamına gelir. Yayınladığım yaklaşım muhtemelen modern bir makinede (seri olarak) yaklaşık 3 saniye sürüyor. Paralellik yaparsanız (ki bunu da yapabilirsiniz) yeterince hızlı olacaktır.
Janus Troelsen

3

Ptrace (strace) check-out'a dayalı sanboxing söz konusu olduğunda:

" sydbox " sandbox ve " pinktrace " programlama kitaplığı (bu C99 ama bildiğim kadarıyla python ve ruby'ye bağlantılar var).

Konuyla ilgili toplanan bağlantılar:

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

(Maalesef doğrudan bağlantılar değil, ancak henüz yeterli itibar puanı yok)



1

Bu kütüphane hedefinize iyi hizmet etmelidir

http://sandbox.sourceforge.net

İyi şanslar!


8
Bu aktif olarak sürdürülmüyor gibi görünüyor. Aynı zamanda bir Linux çekirdek yaması gerektiriyor gibi görünüyor, bu da son sürümünün 2003 yılına dayandığını düşünürsek, onu çoğunlukla işe yaramaz hale getirecek.
thkala


-1

tamam tüm cevaplar sayesinde bana çok yardımcı oldular. Ama asıl soruyu soran kişi için hiçbirini çözüm olarak önermem. Bahsedilen tüm araçlar, öğrencilerin kodlarını bir öğretmen, özel öğretmen, profesör olarak test etmek amacıyla çok çalışma gerektirir. Bu durumda en iyi yol, bence sanal kutu olacaktır. Tamam, tam bir x68 sistemini taklit ediyor ve bu şekilde sandboxing'in anlamı ile hiçbir ilgisi yok, ancak programlama öğretmenimi hayal edersem onun için en iyisi olurdu. Debian tabanlı sistemlerde "apt-get install virtualbox", diğerleri http://virtualbox.org/ adresine gider , bir vm oluşturun, bir iso ekleyin, kur'a tıklayın, biraz bekleyin ve şanslı olun. Kullanıcı modu linux'u kurmak veya bazı ağır işlerle uğraşmak için kullanmak çok daha kolay olacak ...

Ve eğer öğrencilerinizin sizi hacklemesinden korkuyorsanız, sanırım bir otorite probleminiz var ve bunun çözümü onları tehdit eder, eğer yaptıkları çalışmada sadece bir ısırık kötü amaçlı yazılım ispatlayabilirseniz, onların canlı gün ışığını dava edeceksiniz. sen...

Ayrıca bir sınıf varsa ve bunun% 1'i bu tür şeyleri yapabileceği kadar iyiyse, onları bu kadar basit görevlerle sıkmayın ve onlara biraz daha kodlamaları gereken büyük görevler verin. Bütünleştirici öğrenme herkes için en iyisidir, bu yüzden eski kilitli yapılara geçmeyin ...

Ve nedense, web'de gezinmek ve yazılımı test etmek gibi şeyler için kullandığınız önemli şeyler için (tasdik ve sınav yazmak gibi) asla aynı bilgisayarı kullanmayın.

Önemli şeyler için çevrimdışı bir bilgisayar ve diğer her şey için çevrimiçi bir bilgisayar kullanın.

Ancak paranoyak öğretmen olmayan herkese (kimseyi gücendirmek istemiyorum, ben sadece programcı öğretmeni olmaya başlamadan önce güvenlik ve toplumumuzla ilgili temel bilgileri öğrenmeniz gerektiği fikrindeyim ...)

... neredeydim ... herkes için:

mutlu hackler !!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.