37 votes

Comment des sites comme codepad.org et ideone.com mettent-ils votre programme en bac à sable?

J'ai besoin de compiler et d'exécuter soumis par l'utilisateur scripts sur mon site, similaire à ce que codepad et ideone faire. Comment puis-je sandbox de ces programmes, de sorte que des utilisateurs malveillants de ne pas prendre vers le bas de mon serveur?

Plus précisément, je tiens à les enfermer à l'intérieur d'un répertoire vide et de les empêcher de lire ou d'écrire n'importe où en dehors de cela, de consommer trop de mémoire ou le PROCESSEUR, ou de faire quoi que ce soit malveillant.

J'ai besoin de communiquer avec ces programmes à travers des tuyaux (plus de stdin/stdout) à partir de l'extérieur du bac à sable.

24voto

Angus Points 999

codepad.org a quelque chose basé sur geordi, qui dirige tout dans un environnement chroot (j'.e restreinte à une sous-arborescence du système de fichiers) avec des restrictions de ressources, et utilise le ptrace API pour limiter la non approuvés du programme d'utilisation des appels système. Voir http://codepad.org/about .

J'ai déjà utilisé Systrace, un autre utilitaire pour restreindre les appels système.

Si la politique est mis en place correctement, la non approuvé le programme serait empêché de casser quoi que ce soit dans le bac à sable ou d'accéder à tout ce qu'il ne faut pas, donc il y aura peut être pas besoin de mettre des programmes en séparer chroots et les créer et les supprimer pour chaque exécution. Bien que cela fournir une autre couche de protection, qui ne serait probablement pas faire de mal.

17voto

thkala Points 36148

Il y a quelques temps j'étais à la recherche d'un sandbox de la solution à utiliser dans un système automatisé d'évaluation de l'attribution de système pour CS étudiants. Un peu comme tout le reste, il s'agit d'un compromis entre les différentes propriétés:

  • L'isolement et le contrôle d'accès granularité
  • Les performances et la facilité d'installation/configuration

J'ai finalement décidé sur un multi-niveaux de l'architecture, basée sur Linux:

  • Niveau 0 - Virtualisation:

    En utilisant une ou plusieurs machine virtuelle instantanés pour toutes les missions spécifiques au sein d'une plage de temps, il a été possible d'obtenir plusieurs avantages:

    • La séparation du sensible à partir de données non sensibles.

    • À la fin de la période (par exemple, une fois par jour ou après chaque session) le VM est à l'arrêt et le redémarrage de l'instantané, donc enlever tous les restes de malveillant ou non autorisé de code.

    • Un premier niveau de ressources de l'ordinateur de l'isolation: chaque machine virtuelle a limité disque, CPU et ressources mémoire et l'ordinateur hôte n'est pas directement accessible.

    • Straight-forward filtrage réseau: grâce à la machine virtuelle sur l'interface interne, le pare-feu sur l'ordinateur hôte pouvez choisir de filtrer les connexions réseau.

      Par exemple, une machine virtuelle destiné à tester les élèves du cours d'introduction à la programmation bien sûr on pourrait avoir toutes les connexions entrantes et sortantes bloqué, puisque les élèves à ce niveau n'aurait pas de réseau devoirs de programmation. Aux niveaux supérieurs de la correspondante VMs pourrait par exemple avoir toutes les connexions sortantes bloqué et autoriser les connexions entrantes uniquement à partir de l'intérieur de la faculté.

    Il serait logique d'avoir une VM pour le Web-based système de soumission que l'on pourrait télécharger des fichiers à l'évaluation des machines virtuelles, mais faire peu de chose.

  • Niveau 1 - Base de cperating-système de contraintes:

    Sur un système d'exploitation Unix qui contiendraient les accès traditionnels et des ressources mécanismes de contrôle:

    • Chaque bac à sable du programme peut être exécuté comme un utilisateur distinct, peut-être dans un autre chroot prison.

    • Strict des autorisations d'utilisateur, éventuellement avec des Acl.

    • ulimit des ressources des limites sur le temps du processeur et de la mémoire.

    • L'exécution en vertu de l' nice afin de réduire la priorité sur plus de processus critiques. Sur Linux, vous pouvez également utiliser ionice et cpulimit - je ne suis pas sûr de ce que équivalents existent sur d'autres systèmes.

    • Les quotas de disque.

    • Connexion par utilisateur de filtrage.

    Vous auriez probablement souhaitez exécuter le compilateur qu'un peu plus d'utilisateurs privilégiés; plus de mémoire et de temps CPU, l'accès à compilateur, des outils et des fichiers d'en-tête de l'e.t.c.

  • Niveau 2 - Avancé de système d'exploitation de contraintes:

    Sur Linux, je considère que l'utilisation de Linux Module de Sécurité, tels que AppArmor ou SELinux pour limiter l'accès à des fichiers spécifiques et/ou des appels système. Certaines distributions Linux offrent certains sandboxing des profils de sécurité, mais il peut encore être un processus long et douloureux pour obtenir quelque chose comme cela fonctionne correctement.

  • Niveau 3 - l'Utilisateur de l'espace "bac à sable" solutions:

    J'ai utilisé avec succès Systrace à petite échelle, comme mentionné dans cette ancienne réponse de la mine. Il y a plusieurs autres solutions bac à sable pour Linux, tels que libsandbox. De telles solutions peuvent fournir plus de contrôle fin sur le système d'appels qui peuvent être utilisées que LSM solutions de rechange, mais peut avoir un impact mesurable sur la performance.

  • Niveau 4 - les frappes Préemptives:

    Puisque vous va compiler le code vous-même, plutôt que de l'exécuter existant binaires, vous avez quelques outils supplémentaires dans vos mains:

    • Des Restrictions basées sur des métriques de code, par exemple un simple "Hello World", le programme ne devrait jamais être plus grand que 20 à 30 lignes de code.

    • Un accès sélectif à système de bibliothèques et fichiers d'en-tête; si vous ne voulez pas que les utilisateurs appellent connect() vous pourriez juste de restreindre l'accès à l' socket.h.

    • L'analyse statique de code; interdire le code d'assemblée, "bizarre", les littéraux de chaîne (c-shell-code) et l'utilisation de la restriction de fonctions du système.

    Un programmeur compétent pourrait être en mesure de contourner de telles mesures, mais que le rapport coût-bénéfices ratio augmente, ils seraient beaucoup moins susceptibles de persister.

  • Niveau 0 à 5 - Surveillance et d'enregistrement:

    Vous devez surveiller les performances de votre système et de la journalisation de toutes les tentatives ont échoué. Non seulement vous être plus susceptibles d'interrompre une en cours d'attaque au niveau du système, mais vous pourriez être en mesure de faire usage de mesures administratives pour protéger votre système, tels que:

    • en appelant l'responsables de la sécurité sont en charge de ces questions.

    • trouver que la persistance de la petite pirate de la vôtre et de leur offrir un emploi.

Le degré de protection que vous avez besoin et les ressources que vous êtes prêt à dépenser pour configurer sont à vous.

8voto

liuyu Points 704

Je suis le développeur de libsandbox mentionné par @thkala, et je ne le recommande pour les utiliser dans votre projet.

Quelques commentaires supplémentaires sur @thkala réponse,

  1. il est juste de classer libsandbox en tant qu'utilisateur des outils fonciers, mais libsandbox n'intégrer standard de l'OS au niveau des mécanismes de sécurité (c'est à dire chroot, setuid, et le quota de ressource);
  2. la restriction de l'accès à C/C++ en-têtes, ou de l'analyse statique de code, n'empêche PAS les fonctions du système comme connect() d'être appelé. C'est parce que le code de l'utilisateur (1) déclarer les prototypes de fonction par eux-mêmes sans y compris le système d'en-têtes, ou (2) invoquer le sous-jacent, kernel-land système des appels sans toucher fonctions wrapper en libc;
  3. au moment de la compilation de protection qui mérite l'attention, car malveillants code C/C++ peuvent épuiser votre CPU avec une infinie modèle de la récursivité ou de pré-traitement de macro d'extension;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X