Je me rends compte que cela sonne un peu fou, mais je travaille sur un projet pour lequel j'ai besoin d'un serveur pour exécuter un code rubis fourni par l'utilisateur et renvoyer le résultat.
Je cherche à prévenir quelque chose comme ceci: P>
system("rm -rf /")
eval("something_evil")
# etc...
4 Réponses :
Exécuter le programme ptracé avec une liste blanche de systèmes SysCalls autorisés, en tant qu'utilisateur / groupe personne, avec des limites de ressources (utilisation de la mémoire, etc.), dans un chroot minimal. P>
Trois suggestions: p>
1) Jetez un coup d'œil à Ruby NIVELERRER "PERCEAUX" Ceci fournit un certain degré de protection contre, 2) Sauf si l'utilisateur n'a pas besoin d'accéder au système de fichiers local, utilisez quelque chose comme fakefs p>
3) Peu importe ce que vous faites d'autre que vous faites Suivre la suggestion de Tronic (peut être une douleur à la configuration, mais les Jails Chroot limités sont sur le seul moyen de faire absolument sûr que l'utilisateur ne peut pas accéder aux ressources que vous ne voulez pas explicitement). P> eval ('evil_code') code> Type Things, etc. P>
Une "ardoise vierge" est un objet dépouillé de (la plupart des) méthodes. Une "chambre propre" est un objet dans lequel vous évaluez une salle potentiellement dangereuse. Si vous évaluez le code dans une "salle blanche" qui est également une "ardoise vierge", changeant le niveau de sécurité jusqu'à ce qu'elle ira, vous vous permettrez de très bien protéger. Rien de sécurité n'est certainement sûr, cela devrait donc être considéré comme une couche de votre sécurité, pas nécessairement le seul em> couche. P>
J'ai eu le même problème, mais je suis tombé sur eval.so et a décidé d'écrire un wrapper API pour cela, appelé Sandie . C'est aussi simple que:
sandie = Sandie.new(language: 'ruby')
# => #<Sandie:0x00000002e30650>
sandie.evaluate(code: 'puts "hello world"')
# => {"stdout"=>"hello world\n", "stderr"=>"", "wallTime"=>487, "exitCode"=>0}