GNU/Linux >> Znalost Linux >  >> Linux

Spustit nedůvěryhodný program C v karanténě v Linuxu, která mu brání v otevírání souborů, větvení atd.?

Použil jsem Systrace k sandboxu nedůvěryhodných programů jak interaktivně, tak v automatickém režimu. Má ptrace() -based backend, který umožňuje jeho použití na linuxovém systému bez speciálních oprávnění, stejně jako mnohem rychlejší a výkonnější backend, který vyžaduje záplatování jádra.

Je také možné vytvořit sandbox na unixových systémech pomocí chroot(1) , i když to není tak snadné a bezpečné. Linuxové kontejnery a vězení FreeBSD jsou lepší alternativou k chrootu. Další alternativou v Linuxu je použití bezpečnostního rámce, jako je SELinux nebo AppArmor, což je to, co bych navrhoval pro produkční systémy.

Byli bychom schopni vám pomoci více, kdybyste řekli, co přesně chcete dělat.

UPRAVIT:

Systrace by ve vašem případě fungoval, ale myslím si, že něco založeného na modelu zabezpečení Linuxu, jako je AppArmor nebo SELinux, je standardnější, a tedy preferovanou alternativou, v závislosti na vaší distribuci.

ÚPRAVA 2:

Zatímco chroot(1) je k dispozici na většině (všech?) Unixových systémech, má několik problémů:

  • Dá se to vylomit. Pokud se chystáte skutečně kompilovat nebo spouštět nedůvěryhodné programy C na vašem systému, jste tímto problémem obzvláště zranitelní. A pokud jsou vaši studenti něco jako moji, někdo se POKUSÍ dostat z vězení.

  • Musíte vytvořit úplnou nezávislou hierarchii souborového systému se vším, co je pro váš úkol nezbytné. Nemusíte mít kompilátor v chrootu, ale mělo by být zahrnuto vše, co je potřeba ke spuštění zkompilovaných programů. I když existují nástroje, které s tím pomáhají, stále to není triviální.

  • Musíte udržovat chroot. Protože je nezávislý, chroot soubory nebudou aktualizovány spolu s vaší distribucí. Chroot budete muset buď pravidelně znovu vytvářet, nebo do něj zahrnout potřebné aktualizační nástroje, což by v podstatě vyžadovalo, aby se jednalo o plnohodnotnou linuxovou distribuci. Budete také muset udržovat systémová a uživatelská data (hesla, vstupní soubory atd.) synchronizovaná s hostitelským systémem.

  • chroot() chrání pouze souborový systém. Nebrání to škodlivému programu v otevření síťových soketů ani tomu, aby špatně napsaný soket vysával všechny dostupné zdroje.

Problém s využitím zdrojů je společný pro všechny alternativy. Kvóty souborového systému zabrání programům zaplnit disk. Správné ulimit (setrlimit() Nastavení v C) může chránit před nadměrným používáním paměti a jakýmikoli výbuchy vidlic, stejně jako zastavit prasata CPU. nice(1) může snížit prioritu těchto programů, takže počítač lze bez problémů použít pro jakékoli úkoly, které jsou považovány za důležitější.


Nedávno jsem napsal přehled technik sandboxu v Linuxu. Myslím, že vaším nejjednodušším přístupem by bylo použití linuxových kontejnerů (lxc), pokud vám nevadí forking a tak dále, na kterých v tomto prostředí opravdu nezáleží. Procesu můžete dát kořenový souborový systém pouze pro čtení, izolované síťové připojení zpětné smyčky a stále jej můžete snadno ukončit a nastavit limity paměti atd.

Seccomp bude trochu obtížný, protože kód nedokáže ani alokovat paměť.

Selinux je druhá možnost, ale myslím, že by to mohlo být více práce než kontejner.


Qemu můžete použít k rychlému testování úkolů. Tento postup níže trvá na mém 5 let starém notebooku méně než 5 sekund.

Předpokládejme, že student musí vyvinout program, který vezme nepodepsané inty, každý na svém vlastním řádku, dokud nepřijde řádek s "-1". Program by pak měl zprůměrovat všechny ints a vypsat "Average:%f". Zde je návod, jak můžete otestovat program zcela izolovaný:

  1. Nejprve získejte root.bin z Jslinux, použijeme to jako uživatelskou zemi (má kompilátor tcc C):

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

  2. Chceme dát studentovu práci do root.bin , takže nastavte zařízení smyčky:

    sudo losetup /dev/loop0 root.bin

    (můžete k tomu také použít fuseext2, ale není příliš stabilní. Pokud se stabilizuje, nebudete k ničemu z toho potřebovat root)

  3. Vytvořte prázdný adresář:

    mkdir mountpoint

  4. Připojte root.bin :

    sudo mount /dev/loop0 mountpoint

  5. Zadejte připojený souborový systém:

    cd mountpoint .

  6. Opravit práva:

    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. Zkopírujte odeslání do virtuálního počítače:

    cp ~/student_assignment.c root/assignment.c

  11. Ukončete kořenový FS virtuálního počítače:

    cd ..

  12. sudo umount mountpoint
  13. Nyní je obrázek připraven, stačí jej spustit. Po spuštění zkompiluje a spustí odeslání.
  14. mkfifo /tmp/guest_output
  15. Otevřete samostatný terminál a začněte poslouchat výstup hosta:

    dd if=/tmp/guest_output bs=1

  16. V jiném terminálu:

    qemu-system-i386 -kernel vmlinuz-3.5.0-27-generic -initrd root.bin -monitor stdio -nographic -serial pipe:/tmp/guestoutput (Právě jsem zde použil jádro Ubuntu, ale mnoho jader bude fungovat)

  17. Když se na výstupu hosta zobrazí „READY“, můžete odeslat klíče do virtuálního počítače z příkazového řádku qemu. Chcete-li například otestovat toto přiřazení, můžete provést

    (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. Nyní Average = 12.000000 by se měl objevit na výstupním potrubí hosta. Pokud ne, student neuspěl.

  19. Ukončit qemu:quit

Program, který prošel testem, je zde:https://stackoverflow.com/a/14424295/309483. Stačí použít tcclib.h místo stdio.h .


Linux
  1. Jak vytvořit video ze souborů PDF v Linuxu

  2. Linux – Jak spustit bootloader z Linuxu?

  3. Jak spustím program s jiným pracovním adresářem, než je aktuální, z prostředí Linux?

  1. Linux – která data by měla být vyloučena ze souborů protokolů, chybových zpráv atd., pokud jsou zveřejněna online?

  2. Migrace linuxového serveru z příkazového řádku

  3. Jak programovat soubory stromu zařízení Linux .dts?

  1. Tisk souborů z terminálu Linux

  2. Programujte hardware z příkazového řádku Linuxu

  3. Spuštění potenciálně škodlivého programu na Linuxu