2010-11-17 11 views
23

Cette question est similaire à Exploitable PHP Functions.Fonctions Python exploitables

Les données corrompues proviennent de l'utilisateur, ou plus précisément d'un attaquant. Quand une variable contaminée atteint une fonction de puits, alors vous avez une vulnérabilité. Par exemple, une fonction qui exécute une requête sql est un puits, et les variables GET/POST sont des sources d'altération.

Quelles sont toutes les fonctions de puits dans Python? Je suis à la recherche de fonctions qui introduisent une vulnérabilité ou software weakness. Je suis particulièrement intéressé par les vulnérabilités d'exécution de code à distance. Y a-t-il des classes/modules entiers qui contiennent des fonctionnalités dangereuses? Avez-vous des exemples de vulnérabilités Python intéressantes?

+6

Que diriez-vous de faire de ce wiki un wiki communautaire? –

+0

@Sven Marnach comment cela rendrait-il cela meilleur? Je n'ai pas fait ça avant. – rook

+0

Il est (serait?) Très difficile de sécuriser Python à un degré élevé; la langue est simplement trop flexible pour cela. Si vous essayez de créer un environnement Python sécurisé, vous avez une très grande tâche à accomplir. – katrielalex

Répondre

6

Le module subprocess contient fonctionnellement méchant qui dépréciée ces manières d'exécuter des commandes/processus:

os.system 
os.spawn* 
os.popen* 
popen2.* 
commands.* 

Il y a aussi exec qui exécutera le code Python et eval qui « évaluer » une expression et peut être utilisé pour manipuler des variables.

14

eval et exec sont les classiques. Cependant, open et file peut être abusée aussi:

open('/proc/kcore', 'w').write('0' * 1000 * 1000 * 1000) 

Ensuite, il y a les os, sys, subprocess et dircache modules. Presque tout ce qui touche le système de fichiers ou peut être utilisé pour transformer les données en code exécutable (comme os.system) va être sur la liste.

Comme l'a souligné S. Lott dans les commentaires, l'écriture dans le système de fichiers et l'exécution de programmes externes arbitraires ne sont pas spécifiques à Python. Cependant, ils méritent d'être pris en compte par les auditeurs de sécurité. La plupart de ces fonctions peuvent être utilisées en toute sécurité sans trop se soucier de la sécurité. eval et exec, d'autre part, sont de grands grands drapeaux rouges. Les utiliser en toute sécurité nécessite des soins méticuleux.

+2

L'ouverture de '/ proc/kcore' nécessite des privilèges que la plupart des processus n'ont pas. C'est un type d'exploit différent car il nécessite des privilèges et ne se limite pas au codage minable. –

+2

@ S.Lott: Bien sûr, mais ce n'était qu'un exemple (dramatique). Peut-être qu'un attaquant s'attend à être exécuté en tant qu'utilisateur du serveur Web et ouvre '/ var/www/index.html' à la place. Une bonne sécurité est en couches. Nous ne pouvons pas nous attendre à ce que tous les administrateurs de nos utilisateurs s'assurent que tout fonctionne avec des permissions optimales tout le temps, donc ça vaut la peine de payer un peu plus d'attention et de chercher ce genre de chose. – nmichaels

+0

"Une bonne sécurité est superposée". Ce n'est pas tout à fait le point. Les 'eval' et' exec' sont des exploits Python qui ne reposent pas sur la sécurité. L'autre exploit est différent en nature - c'est sans rapport avec Python, puisque toutes les langues l'ont. Cela fait partie de la gestion des privilèges du système d'exploitation. Si vous allez lister cela, alors vous devez commencer à lister tous les exploits du système d'exploitation qui n'ont rien à voir avec Python. Je pense que vous devriez séparer cela plus clairement dans votre réponse comme un type différent d'exploit qui n'utilise que Python. –

14

droit de la documentation pickle:

Warning 

The pickle module is not intended to be secure against erroneous or maliciously constructed data. Never unpickle data received from an untrusted or unauthenticated source. 
+1

Les données décapées sont des plus mauvaises, car elles ne sont pas assez structurées ou lisibles pour être désinfectées, et du code arbitraire peut être exécuté ** alors que ** décuple. Par exemple, l'envoi de structures de données décapées sur DBUS (ou un autre mécanisme IPC ouvert) peut être un trou de sécurité massif, mais cela n'est pas forcément évident pour quelqu'un de nouveau sur Python ou DBUS. Une meilleure approche consiste à écrire une méthode de sérialisation explicite, à l'aide de JSON ou de XML, et à l'envoyer par-dessus le protocole que vous utilisez. – detly

3

La fonction input, qui évalue la chaîne donnée et renvoie le résultat, a certaines restrictions, mais peut-être encore exploitable.

+0

Peut confirmer qu'il est exploitable. '__import __ ('os'). system ('ls')' L'alimentation dans la chaîne ci-dessus dans stdin, entraîne l'exécution de la commande 'ls' dans le shell. – gtux

9

Je tends vers le paranoïaque en cherchant ce genre de chose. D'autant plus que j'ai tendance à faire beaucoup de métaprogrammation.

  • commandes effet plus secondaires (dont d'autres postes couvrent)
      de manipulation de fichiers
    • (open, tarfile, zipfile, ...)
    • appels réseau (urllib2, socket, ...)
    • Sérialisation/persistance des données (pickle, shelve, ...)
    • processus/gestion de threads (subprocess, os.fork, os.kill, ...)
  • builtins
    • getattr
    • setattr
    • delattr
    • eval
    • exec
    • execfile
    • __import__

Et probablement d'autres que je oublie. Je me méfie également de l'entrée de l'utilisateur dans les fonctions où je modifie sys.path, sys.modules, etc.

Questions connexes