2010-04-20 9 views
2

Je prévois d'écrire une application enfichable en python (+ qt4). Cependant, j'ai de grandes préoccupations au sujet de la sécurité. Les plugins devraient être assez puissants pour faire ce qu'ils veulent dans l'application (et comme contrainte supplémentaire, il y aura un processus de signature et un avertissement pour l'utilisateur lors de l'utilisation d'un tel plugin) mais interagir avec l'environnement (système de fichiers, autres processus , réseau, etc) devrait être fait par les plugins seulement à travers un code python que je vais écrire.plugins python sandboxed

Existe-t-il un moyen sûr et facile d'y parvenir, en plus d'avoir à faire une analyse de code statique sur le code des plugins avant de les installer?

Répondre

5

En bref: Non

Explication: Pendant des années, les gourous de Python essayer de construire un bac à sable pour Python. Le problème avec le bac à sable est que vous avez besoin de deux ou trois choses pour faire des E/S (c'est-à-dire pouvoir transférer des données entre votre sandbox et l'application). Ils n'ont pas trouvé de façon automatique et pythonique de le faire. Soit, vous ne pouvez pas échanger des données avec le plugin ou introspection permettrait alors de marcher dans l'arbre des objets dans l'application -> accès à tout ce que vous aimez. Imaginez votre idée: Le plugin appelle du code python que vous écrivez. Cela signifie probablement appeler une méthode ou une fonction. Cela signifie que vous devez me donner une méthode valide ou un objet fonctionnel. De la méthode ou de l'objet fonction, je peux obtenir votre objet module. De votre module, je peux obtenir tous les symboles (c'est-à-dire les importations). De là, je peux faire tout ce que votre module peut faire (au moins).

See this article pour certains pointeurs.

+0

Merci pour l'explication et pour le lien. Encore une question: Puis-je encore y parvenir en écrivant mon application en C++ et en utilisant python via PythonQt comme langage de script, fournissant des plugins écrits en python avec des objets (non fiables) de mon application? – Flavius

+0

Comme je l'ai dit: Si vous omettez tout ce qui accède à un module de bibliothèque Python et toutes les fonctions IO (fichiers ouverts, etc). Ce qui restera sera un peu plus que la syntaxe elle-même. Si vous échangez des données, le plugin peut atteindre tout ce que votre objet de données peut atteindre. –

2

Le code Python s'exécutant dans un processus Python normal ne peut pas être mis en sandbox car vous pouvez toujours explorer, mais vous pouvez bac à sable un interpréteur Python entier.

Par exemple PyPy prend en charge sandbox: http://codespeak.net/pypy/dist/pypy/doc/sandbox.html

Si vous vouliez, vous pourriez probablement écrire une bibliothèque Python pour exécuter un script python dans une instance pypy-c sécurisée avec une mémoire partagée utilisée pour transférer des données qui vous avez confiance et une sorte de signaux pour déclencher des événements dans votre programme. Vous pouvez également utiliser l'interpréteur cpython embarqué normal à l'aide de quelque chose comme selinux que je crois pouvoir être utilisé dans le code (il s'agit normalement d'un système d'administration) et qui est supporté par la plupart des distributions Linux. votre plate-forme. Google Chrome a un certain code sandbox si vous êtes prêt à creuser si le code de base géant.

1

C'est une question très ancienne, mais peut-être que QtScript pourrait être la réponse. Cependant, je n'ai aucune idée si vous pouvez bac à sable ceci et si QtScript est assez puissant pour votre application.