Je me demandais s'il existe un moyen d'exécuter un programme C non approuvé sous un bac à sable sous Linux. Quelque chose qui empêcherait le programme d'ouvrir des fichiers ou des connexions réseau, ou de forger, d'exécuter, etc.?
Ce serait un petit programme, une tâche de devoirs, qui est téléchargé sur un serveur et sur lequel des tests unitaires sont exécutés. Le programme serait donc de courte durée.
Réponses:
J'ai utilisé Systrace pour sandbox des programmes non approuvés à la fois de manière interactive et en mode automatique. Il a un
ptrace()
backend basé sur qui permet son utilisation sur un système Linux sans privilèges spéciaux, ainsi qu'un backend beaucoup plus rapide et plus puissant qui nécessite de patcher le noyau.Il est également possible de créer un bac à sable sur des systèmes de type Unix en utilisant
chroot(1)
, bien que ce ne soit pas aussi facile ou sécurisé. Les conteneurs Linux et les prisons FreeBSD sont une meilleure alternative au chroot. Une autre alternative sous Linux est d'utiliser un framework de sécurité comme SELinux ou AppArmor , ce que je proposerais pour les systèmes de production.Nous serions en mesure de vous aider davantage si vous nous disiez exactement ce que vous voulez faire.
ÉDITER:
Systrace fonctionnerait pour votre cas, mais je pense que quelque chose basé sur le modèle de sécurité Linux comme AppArmor ou SELinux est une alternative plus standard, et donc préférée, en fonction de votre distribution.
MODIFIER 2:
Bien qu'il
chroot(1)
soit disponible sur la plupart (tous?) Des systèmes de type Unix, il présente de nombreux problèmes:Il peut être brisé. Si vous allez réellement compiler ou exécuter des programmes C non approuvés sur votre système, vous êtes particulièrement vulnérable à ce problème. Et si vos élèves ressemblent à moi, quelqu'un essaiera de sortir de prison.
Vous devez créer une hiérarchie de système de fichiers indépendante complète avec tout ce qui est nécessaire pour votre tâche. Vous n'avez pas besoin d'avoir un compilateur dans le chroot, mais tout ce qui est nécessaire pour exécuter les programmes compilés doit être inclus. Bien qu'il existe des utilitaires qui aident à cela, ce n'est toujours pas anodin.
Vous devez maintenir le chroot. Puisqu'il est indépendant, les fichiers chroot ne seront pas mis à jour avec votre distribution. Vous devrez soit recréer le chroot régulièrement, soit y inclure les outils de mise à jour nécessaires, ce qui exigerait essentiellement qu'il s'agisse d'une distribution Linux à part entière. Vous devrez également synchroniser les données système et utilisateur (mots de passe, fichiers d'entrée, etc.) avec le système hôte.
chroot()
ne protège que le système de fichiers. Cela n'empêche pas un programme malveillant d'ouvrir des sockets réseau ou un programme mal écrit d'aspirer toutes les ressources disponibles.Le problème d'utilisation des ressources est commun à toutes les alternatives. Les quotas de système de fichiers empêcheront les programmes de remplir le disque. Des paramètres appropriés
ulimit
(setrlimit()
en C) peuvent protéger contre la surutilisation de la mémoire et toutes les bombes de fourche, ainsi que mettre un terme aux porcs CPU.nice(1)
peut réduire la priorité de ces programmes afin que l'ordinateur puisse être utilisé pour toutes les tâches jugées plus importantes sans problème.la source
J'ai récemment écrit un aperçu des techniques de sandboxing sous Linux . Je pense que votre approche la plus simple serait d'utiliser des conteneurs Linux (lxc) si cela ne vous dérange pas de forking et ainsi de suite, ce qui n'a pas vraiment d'importance dans cet environnement. Vous pouvez donner au processus un système de fichiers racine en lecture seule, une connexion réseau en boucle isolée, et vous pouvez toujours le tuer facilement et définir des limites de mémoire, etc.
Seccomp va être un peu difficile, car le code ne peut même pas allouer de mémoire.
Selinux est l'autre option, mais je pense que cela pourrait être plus de travail qu'un conteneur.
la source
Vous pouvez utiliser Qemu pour tester rapidement les affectations. Cette procédure ci-dessous prend moins de 5 secondes sur mon ordinateur portable de 5 ans.
Supposons que l'étudiant doit développer un programme qui prend des entiers non signés, chacun sur sa propre ligne, jusqu'à ce qu'une ligne avec "-1" arrive. Le programme doit alors faire la moyenne de tous les entiers et afficher "Moyenne:% f". Voici comment tester un programme complètement isolé:
Tout d'abord, obtenez
root.bin
de Jslinux, nous l'utiliserons comme utilisateur (il a le compilateur C tcc):wget https://github.com/levskaya/jslinux-deobfuscated/raw/master/root.bin
Nous voulons mettre la soumission de l'étudiant
root.bin
, alors configurez le périphérique de boucle:sudo losetup /dev/loop0 root.bin
(vous pouvez également utiliser fuseext2 pour cela, mais ce n'est pas très stable. S'il se stabilise, vous n'aurez besoin de root pour rien de tout cela)
Créez un répertoire vide:
mkdir mountpoint
Monter
root.bin
:sudo mount /dev/loop0 mountpoint
Entrez le système de fichiers monté:
cd mountpoint
.Corriger les droits:
sudo chown -R `whoami` .
mkdir -p etc/init.d
vi etc/init.d
:chmod +x etc/init.d/rcS
Copiez la soumission sur la VM:
cp ~/student_assignment.c root/assignment.c
Quittez le FS racine de la VM:
cd ..
sudo umount mountpoint
mkfifo /tmp/guest_output
Ouvrez un terminal séparé et commencez à écouter la sortie de l'invité:
dd if=/tmp/guest_output bs=1
Dans un autre terminal:
qemu-system-i386 -kernel vmlinuz-3.5.0-27-generic -initrd root.bin -monitor stdio -nographic -serial pipe:/tmp/guestoutput
(Je viens d'utiliser le noyau Ubuntu ici, mais de nombreux noyaux fonctionneront)Lorsque la sortie de l'invité affiche «READY», vous pouvez envoyer des clés à la VM à partir de l'invite qemu. Par exemple, pour tester cette affectation, vous pouvez faire
Maintenant
Average = 12.000000
devrait apparaître sur le tube de sortie de l'invité. Si ce n'est pas le cas, l'étudiant a échoué.quit
Un programme réussissant le test est ici: https://stackoverflow.com/a/14424295/309483 . Utilisez simplement à la
tcclib.h
place destdio.h
.la source
Essayez Linux en mode utilisateur . Il a une surcharge de performances d'environ 1% pour les travaux gourmands en ressources processeur, mais il peut être 6 fois plus lent pour les travaux gourmands en E / S.
la source
Firejail est l'un des outils les plus complets pour ce faire - il prend en charge seccomp, les conteneurs de système de fichiers, les capacités et plus encore:
https://firejail.wordpress.com/features-3/
la source
L'exécuter dans une machine virtuelle devrait vous offrir toute la sécurité et les restrictions souhaitées.
QEMU serait un bon choix pour cela et tout le travail (téléchargement de l'application, mise à jour de l'image disque, démarrage de QEMU, exécution de l'application à l'intérieur et enregistrement de la sortie pour une récupération ultérieure) pourrait être scripté pour des tests automatisés.
la source
Quand il s'agit de sanboxing basé sur l'extraction ptrace (strace):
« Sydbox bac à sable » et « pinktrace bibliothèque de programmation » (il est C99 , mais il y a des liaisons à python et ruby pour autant que je sache).
Liens collectés liés au sujet:
http://www.diigo.com/user/wierzowiecki/sydbox
(désolé que pas de liens directs, mais pas encore assez de points de réputation)
la source
seccomp et seccomp-bpf accomplissent cela avec le moins d'effort: https://www.kernel.org/doc/Documentation/prctl/seccomp_filter.txt
la source
Cette bibliothèque devrait bien servir votre objectif
http://sandbox.sourceforge.net
Bonne chance!
la source
Cela semble également prometteur. Un sandbox de système de fichiers pour Linux utilisant des interceptions syscall.
https://github.com/adtac/fssb
la source
ok merci à toutes les réponses, ils M'ont beaucoup aidé. Mais je ne suggérerais aucun d'entre eux comme solution pour la personne qui a posé la question initiale. Tous les outils mentionnés nécessitent beaucoup de travail pour tester le code des étudiants en tant que professeur, tuteur, prof. Le meilleur moyen dans ce cas serait à mon avis virtualbox. Ok, il émule un système x68 complet et n'a rien à voir avec le sens du sandboxing de cette manière, mais si j'imagine mon professeur de programmation, ce serait le meilleur pour lui. Donc, "apt-get install virtualbox" sur les systèmes basés sur Debian, tous les autres se dirigent vers http://virtualbox.org/ , créez une VM, ajoutez un iso, cliquez sur installer, attendez un peu et soyez chanceux. Ce sera beaucoup plus facile à utiliser que de configurer le mode utilisateur-linux ou de faire des choses lourdes ...
Et si vous craignez que vos élèves vous piratent, je suppose que vous avez un problème d'autorité et qu'une solution à cela les menacerait de poursuivre les vivants en justice si vous pouvez prouver qu'une seule bouchée de malware dans le travail qu'ils donnent tu...
De plus, s'il y a une classe et que 1% de celle-ci est aussi bonne qu'il pourrait faire de telles choses, ne les ennuyez pas avec des tâches aussi simples et donnez-leur de grandes tâches où elles doivent coder davantage. L'apprentissage intégratif est ce qu'il y a de mieux pour tout le monde, alors ne vous fiez pas aux anciennes structures bloquées ...
Et bien sûr, n'utilisez jamais le même ordinateur pour des choses importantes (comme la rédaction d'attestations et d'examens) que vous utilisez pour des choses comme la navigation sur le Web et le test de logiciels.
Utilisez un ordinateur hors ligne pour les choses importantes et un ordinateur en ligne pour toutes les autres choses.
Cependant, à tous ceux qui ne sont pas un enseignant paranoïaque (ne voulez offenser personne, je suis juste d'avis que vous devriez apprendre les bases de la sécurité et de notre société avant de commencer à être un enseignant de programmeurs ...)
... où étais-je ... pour tout le monde:
bon piratage !!
la source