Organizing Programming Contest – Comment comstackr et exécuter

Je construis une interface Web où les gens peuvent saisir du code C simple pour résoudre des questions de programmation algorithmique. J’utilise l’éditeur Ace où les gens peuvent taper du code et lorsque le bouton Exécuter est pressé, le code C est envoyé au serveur, compilé et renvoyé.

Comment faire la seconde partie de manière sécurisée. Je veux dire donné un fichier de code C, le comstackr et l’exécuter. Je ne peux pas faire confiance au code alors comment puis-je m’assurer qu’il n’est pas malveillant et ne nuira pas à mon système. Aussi comment imposer des limites de mémoire et de temps.

Existe-t-il un système open source de système existant que je peux modifier pour répondre à mes besoins? Je n’ai rien trouvé dans ma recherche. Ou des conseils sur la façon dont je devrais procéder ensuite?

edit: Trouvé http://cs.sru.edu/~contest/rocktest/ et essayant de comprendre leur code mais toujours à la recherche de meilleures options, de préférence en php

Je recommande l’API Ideaone: http://ideone.com/api

Permettez-moi de twigr AppArmor , un mécanisme simple de contrôle d’access obligatoire qui peut simplifier la création de ces sortes de sandbox. Voici un profil que j’ai mis en place pour confiner mon xpdf PDF:

 #include  /usr/bin/xpdf { #include  #include  #include  #include  /dev/tty rw, owner /dev/pts/* rw, /etc/papersize r, /etc/xpdf/* r, /bin/bash ix, /usr/bin/xpdf r, /usr/bin/xpdf.bin rmix, /usr/share/xpdf/** r, /usr/share/icons/** r, owner /**.pdf r, owner /tmp/* rw, } 

Vous pourriez apprendre les bases des applications de confinement de votre choix en une demi-journée ou plus et avoir des profils écrits pour votre serveur dans une autre demi-journée. (Ce profil xpdf m’a pris environ quatre minutes pour écrire, mais je sais ce que je fais. Nous avons déployé AppArmor sur les serveurs publics d’un grand détaillant en ligne au cours d’un après-midi, avec des résultats similaires avec d’autres déploiements.)

AppArmor fournit également une interface simple pour configurer les limites d’exécution , telles que la quantité de mémoire qu’un processus est autorisé à allouer:

 rlimit as <= 100M, # limit address space to 100 megabytes 

AppArmor serait plus facile à utiliser sur les dissortingbutions Ubuntu, openSUSE, SLES, PLD, Mandriva, Pardis ou Annvix, à mesure que les outils sont pré-installés. Mais les fonctionnalités principales d'AppArmor sont les kernelx Linux 2.6.36 et plus récents, et il est possible d'installer AppArmor sur n'importe quelle dissortingbution Linux .

D'autres outils similaires incluent SElinux , TOMOYO ou SMACK . Je pense que SMACK serait le prochain plus facile à déployer, mais chacun d'entre eux pourrait empêcher le code malveillant de nuire à votre système.

Vous devrez exécuter le code dans un environnement en bac à sable . Il y a une question similaire sur SO qui pourrait aider.

Vous pouvez également exécuter des machines virtuelles pour exécuter le code, mais cela est simplement un exemple de sandboxing – juste un peu lourd.

Exécutez le code dans un bac à sable – une machine virtuelle.

En plus de cela, je supprimerais l’access à tous les appels système et n’autoriserais que les appels aux bibliothèques C standard. Remplacez également tous les appels de bibliothèque non sécurisés par vos propres appels qui vérifient l’entrée et délèguent des entrées sûres aux fonctions réelles (en particulier pour malloc, vous pouvez définir une limite supérieure à l’allocation de chaque programme).

Si vous faites ce qui précède, une seule machine virtuelle devrait suffire au code de chacun.

Je vais utiliser uevalrun :

“Le principal cas d’utilisation de uevalrun est l’évaluation des programmes soumis par les concurrents des concours de programmation: uevalrun comstack la solution, l’exécute avec l’entrée de test, compare sa sortie avec la sortie attendue et écrit un rapport d’état.”