2010-11-13 17 views
1

Je crée une application de type corewars qui s'exécute sur django et permet à un utilisateur de télécharger du code python qui contrôlera son caractère. Maintenant, je sais que le réel répondre à cela est que tant que je prends des entrées de code d'utilisateurs non fiables, je vais avoir des failles de sécurité. J'essaie juste de minimiser le risque autant que possible. Voici quelques-uns qui viennent à l'esprit:Quelles fonctions intégrées ne doivent pas être exécutées par des utilisateurs non autorisés?

  • __import__ (je ferai probablement aussi une analyse de ast pour vous assurer qu'il n'y a pas de déclarations d'importation)
  • open
  • file
  • input
  • raw_input

Y at-il d'autres éléments qui me manquent?

+6

Oui, c'est la vraie réponse: "tant que je prends des entrées de code d'utilisateurs non fiables, je vais avoir des failles de sécurité." Cela ressemble à une reprise de "Comment puis-je analyser HTML avec des expressions régulières? Je sais que c'est faux." – hughdbrown

+0

@hughdbrown - Dans le pire des cas, quelqu'un entrerait dans la base de données et gâcherait les parties de l'autre ou des deux personnes (au maximum) qui joueraient probablement au jeu ou bousilleraient quelque chose qui me forcerait à essuyer le serveur recommencer. Mon but est seulement de faire le prix de quelque chose de plus que la récompense potentielle pour le faire. Ce n'est qu'un projet parallèle que je fais pour m'amuser, pas quelque chose que je ferais dans un système de production. –

Répondre

1

Si vous n'êtes pas engagé à utiliser Python comme langage dans le jeu, une possibilité serait d'intégrer Lua en utilisant LunaticPython (je suggère la branche corrections de bugs au https://code.launchpad.net/~dne/lunatic-python/bugfixes). Il est beaucoup plus facile de mettre en sandbox Lua que Python, et il est beaucoup plus facile d'intégrer Lua que de créer son propre langage de programmation.

+0

En fait, je ne suis pas allé avec Lua, mais je suis d'accord pour souligner que Python pourrait ne pas être la meilleure solution. J'ai fini par aller avec [raquette] (http://racket-lang.org) car il y a un très bon système sandbox. :-) –

1

Vous devez utiliser une liste blanche plutôt qu'une liste noire. Si vous utilisez une liste noire, vous manquerez toujours quelque chose. Même si vous ne le faites pas, Python ajoutera une fonction à la bibliothèque standard, et vous ne mettrez pas à jour votre liste noire à temps.

choses vous permettant actuellement, mais ne devrait probablement pas inclure:

  • compile
  • eval
  • reload (s'ils accéder au système de fichiers en quelque sorte, c'est essentiellement import)

Je suis d'accord que ce serait très difficile à faire correctement. Une complication (parmi d'autres) pourrait être un utilisateur accédant à l'une de ces fonctions à travers un champ d'une autre classe.

Je considérerais utiliser un autre mécanisme d'isolation, tel qu'une machine virtuelle, à la place ou en plus de cela. Vous pouvez regarder comment le fait codepad.

+0

Ceci! La liste blanche est l'endroit où vous devriez commencer. Vous devez également sécuriser votre machine lorsque votre serveur Web est rooté. –

2

Vous aurez vraiment besoin d'éviter eval. Imaginez un code tel que:

eval("__impor" + "t__('whatever').destroy_your_server") 

Ceci est probablement le plus important.

+0

Je ne suis pas sûr d'avoir ça. Cela retourne un 'SyntaxError' plutôt que d'essayer d'importer '' quelquechose ''. –

+0

@Jason, c'était juste une faute de frappe, que j'ai corrigé. Le point est valide. –

2

Comme vous le son déterminé à ce faire, je vais vous relier au module rexec standard, pas parce que je pense que vous devriez l'utiliser (ne le font pas - il a known vulnerabilities), mais parce qu'il pourrait être un bon point de départ pour compromettre votre serveur Web votre propre cadre d'exécution restreinte.

En particulier, sous la rubrique «Définition d'environnements restreints», plusieurs modules et fonctions sont considérés comme raisonnablement sûrs par le concepteur rexec; ceux-ci pourraient être utilisables comme une liste blanche initiale de toutes sortes. Je suggère également d'examiner son code pour d'autres pièges auxquels vous n'avez peut-être pas pensé.

3

Il ya beaucoup de réponses sur ce qu'il faut faire en général pour restreindre Python à http://wiki.python.org/moin/SandboxedPython.Quand je l'ai regardé il y a quelque temps, le Zope RestrictedPython a regardé la meilleure solution, fonctionnant avec un système de liste blanche. Vous devrez toujours prendre soin de votre propre code afin de ne pas exposer les failles de sécurité, mais cela semble être le meilleur système.

2

Oui, vous devez être en liste blanche. Il y a tellement de façons de cacher les mauvaises commandes.

C'est pas le pire scénario:

le scénario du pire est que quelqu'un pénètre dans la base de données

Le pire des cas est de se la machine entière enracinée et vous ne en remarquant comme il sonde vos autres machines et keylogs vos mots de passe. Isolez cette machine et considérez-la comme hostile (DMZ, empêchez-la de lancer des attaques en interne et en externe, etc.). Exécutez tripwire ou AIDE sur des supports non inscriptibles et consignez tout sur un deuxième hôte.

Enfin, comme le montre plash, il y a beaucoup d'appels système dangereux qui doivent être protégés contre.