2010-10-12 22 views

Répondre

3

Vous êtes censé restreindre le chemin, c'est-à-dire le définir sur un petit nombre de valeurs connues qui remplissent certaines conditions (telles que $ENV{PATH} = '/sbin:/usr/sbin:/usr/bin';), sans y ajouter. Voir Cleaning Up Your Path in perlsec pour les détails.

Dans votre cas simple, il est préférable de l'effacer complètement et de ne compter que sur les appels système avec des noms de fichier complets.

delete @ENV{qw(PATH ENV)}; 
system qw(/usr/bin/sudo /sbin/iptables -h); 
+0

Oui, je l'ai fait. Mais ce n'est pas suffisant. Il y a quelques variables que j'ai passées à la ligne de commande d'iptables. Vous devez utiliser le mappage regex pour dénouer ces variables. Par exemple. if ($ port = ~/([0-9] +)) {$ port = $ 1;} else {die "numéro de port invalide";}. Après avoir défait toutes les variables, je peux le faire fonctionner –

3

Oui, vous avez une dépendance non sécurisée dans le système lors de l'exécution avec le commutateur -T. : p

Vous exécutez votre script en mode Taintperl, et appelez un programme externe (avec sudo, pas moins) avec des données basées sur les informations transmises par l'utilisateur (qui pourraient être corrompues). Si vous êtes vraiment assurez-vous que la sortie est valide et ne pose aucun risque, vous devez le désamorcer: consultez la documentation officielle sur laundering tainted data.

Vous devez être vraiment prudent lors de l'exécution des programmes externes ou d'effectuer des opérations de système à partir d'un CGI - par exemple, pensez à ce qui pourrait arriver si vous entrez `rm -rf /` comme entrée utilisateur. Il y a beaucoup d'informations au perldoc perlsec pour vous aider à démarrer, mais plusieurs livres ont également été écrits sur l'écriture de code sécurisé.