Как я могу вызвать /sbin/iptables из Perl CGI в режиме taint?

Когда я вызываю "sudo /sbin/iptables..." в своих сценариях Perl CGI, я получаю сообщение об ошибке:

Insecure dependency in system while running with -T switch at usr/lib/perl5/vendor_perl/5.8.8/IPC/Run3.pm line 403

Я попытался добавить "/sbin:/etc/sysconf:/etc/init.d" в $ENV{'PATH'}, но безуспешно. У кого-нибудь есть идеи?


person Gelin Luo    schedule 12.10.2010    source источник


Ответы (2)


Предполагается, что вы ограничиваете путь, то есть устанавливаете его на небольшое количество известных значений, удовлетворяющих определенным требованиям (например, $ENV{PATH} = '/sbin:/usr/sbin:/usr/bin';), а не добавляете к нему. Подробнее см. в разделе Очистка пути в perlsec. .

В вашем простом случае лучше вообще его очистить и полагаться только на системные вызовы с полными именами файлов.

delete @ENV{qw(PATH ENV)};
system qw(/usr/bin/sudo /sbin/iptables -h);
person daxim    schedule 12.10.2010
comment
Да, я сделал это. Но этого недостаточно. Есть некоторые переменные, которые я передал в командную строку iptables. Вам нужно использовать сопоставление регулярных выражений, чтобы не запятнать эти переменные. Например. if ($port =~ /([0-9]+)) {$port = $1;} else {умереть недопустимый номер порта;}. После очистки всех переменных я могу заставить его работать - person Gelin Luo; 15.10.2010

Да, у вас есть небезопасная зависимость в системе при работе с ключом -T. :п

Вы запускаете свой скрипт в режиме taintperl и вызываете внешнюю программу (не менее чем с помощью sudo) с данными, основанными на информации, переданной от пользователя (которая может быть испорчена). Если вы действительно уверены, что выходные данные верны и не представляют опасности, вам необходимо очистить их: см. официальную документацию по отмывание испорченных данных.

Вы должны быть действительно осторожны при запуске внешних программ или выполнении системных операций из CGI — например, подумайте, что может произойти, если вы введете `rm -rf /` в качестве пользовательского ввода. На perldoc perlsec есть много информации, которая поможет вам начать работу, но о написании безопасных код тоже.

person Ether    schedule 12.10.2010