2009-11-15 3 views
7

Je suis à la recherche d'un projet qui consiste à exécuter du code python que l'utilisateur saisit via un formulaire HTML. Je sais que cela peut être potentiellement mortel (exec), mais je l'ai vu avec succès dans au moins one instance. J'ai envoyé un email aux développeurs du Python Challenge et on m'a dit qu'ils utilisaient une solution qu'ils ont eux-mêmes trouvée, et ils ont seulement fait savoir qu'ils utilisaient "les fonctions de sécurité fournies par le système d'exploitation" et que "Le système d'exploitation [Linux] fournit la plupart de la sécurité dont vous avez besoin si vous savez comment l'utiliser."Exécution en toute sécurité du code python soumis par l'utilisateur sur le serveur

Quelqu'un pourrait-il savoir comment le faire en toute sécurité? J'ai pensé à créer une nouvelle machine virtuelle pour chaque soumission, mais cela aurait trop de frais généraux et serait presque impossible à mettre en œuvre efficacement.

+0

+1 pour la balise suicide .. lol –

+0

Venez y penser ... n'est pas question mieux adapté à SF (ou peut-être SU)? – Stephan202

+1

@ Stephan202: pas nécessairement, parce que c'est * un ** problème ** de programmation **. – voyager

Répondre

0

L'utilisation de chroot (Wikipedia) peut faire partie de la solution, par ex. combiné avec ulimit et d'autres outils communs (ou personnalisés).

2

Si vous exécutez le script en tant qu'utilisateur nobody (sous Linux), il peut écrire pratiquement nulle part et ne lire aucune donnée dont les autorisations sont correctement configurées. Mais il pourrait encore provoquer une attaque par déni de service, par exemple:

  • remplissant /tmp
  • manger tous RAM
  • manger toutes les CPU

De plus, les connexions réseau à l'extérieur peuvent être ouverts, etc. etc. Vous pouvez probablement les verrouiller avec des limites de noyau, mais vous devez oublier quelque chose. Je pense donc qu'une machine virtuelle sans accès au réseau ou au vrai disque dur serait la seule route (raisonnablement) sûre. Peut-être que les développeurs du Python Challenge utilisent KVM qui est, en principe, "fourni par le système d'exploitation".

Pour des raisons d'efficacité, vous pouvez exécuter toutes les soumissions dans la même machine virtuelle. Cela vous épargne beaucoup de frais généraux, et dans le pire des cas, ils ne font que vous entraver, mais pas votre serveur.

3

Sur un Linux moderne en plus de chroot (2), vous pouvez restreindre davantage le processus en utilisant clone (2) au lieu de fork (2). Il y a plusieurs clones intéressants (2) drapeaux:

CLONE_NEWIPC (new namespace for semaphores, shared memory, message queues) 
CLONE_NEWNET (new network namespace - nice one) 
CLONE_NEWNS (new set of mountpoints) 
CLONE_NEWPID (new set of process identifiers) 
CLONE_NEWUTS (new hostname, domainname, etc) 

Auparavant, cette fonctionnalité a été implémentée dans OpenVZ et a ensuite fusionné en amont, donc il n'y a pas besoin de noyau patché plus.

1

http://codepad.org/about a mis en place un tel système avec succès (comme un code public coller/service correspondant!)

codepad.org est un compilateur en ligne/interprète, et un simple outil de collaboration. C'est un pastebin qui exécute le code pour vous. [...]

Comment ça marche

L'exécution de code est géré par un superviseur basé sur geordi. La stratégie consiste à exécuter tout sous ptrace, avec de nombreux appels système non autorisés ou ignorés.Les compilateurs et les exécutables finaux sont tous deux exécutés dans une prison chroot, avec des limites de ressources strictes. Le superviseur est écrit en Haskell.

[...]

Lorsque votre application est l'exécution de code à distance, vous devez attendre à des problèmes de sécurité. Plutôt que de compter uniquement sur le superviseur chroot et ptrace, j'ai pris quelques précautions supplémentaires:

  • Le superviseur processus exécutés sur des machines virtuelles, qui sont firewalled tels qu'ils sont incapables de faire les connexions sortantes.

  • Les machines qui exécutent les machines virtuelles sont également fortement protégées par un pare-feu et restaurées périodiquement à partir de leurs images source.

Questions connexes