Текст книги "Защита от хакеров корпоративных сетей"
Автор книги: Коллектив Авторов
Жанр: Зарубежная компьютерная литература, Зарубежная литература
сообщить о неприемлемом содержимом
Текущая страница: 21 (всего у книги 69 страниц) [доступный отрывок для чтения: 22 страниц]
В языке программирования PHP предусмотрен ряд функций, полезных для обработки непредвиденных данных и данных неверного формата. Для фильтрации данных в соответствии с заданным набором символов можно использовать функцию замены ereg_replace языка PHP, основанную на регулярных выражениях regex:
ereg_replace(“regex string”, “replace with”, $data)
Ниже приведен вариант вызова функции для удаления из строки всех нечисловых символов:
ereg_replace(“[^0-9]”, “”, $data)
Вспомните, что шаблон «[^0–9]» означает, что надо заменить все, что не является числом на строку «», которая является пустой строкой, а значит, нечисловой символ удаляется.
Для пропуска символов из небольшого набора метасимволов (символов специального назначения) в PHP включена функция quotemeta:
$clean = quotemeta($data)
При использовании функции нужно быть внимательным, потому что число обрабатываемых функцией символов невелико, не больше следующего списка символов (.+?[^](*)$).
Функция addslashes – другая полезная функция, которая часто используется в запросах SQL:
$clean = addslashes($data)
Функция addslashes добавляет символ обратной косой черты () перед всеми символами одинарных кавычек (), двойных кавычек ("), обратной косой черты () и NULL-символами. Это серьезная защита от действий злоумышленника, пытающегося использовать SQL-запрос пользователя в своих целях. В SQL-запросах некоторых систем управления базами данных (например, Sybase или Oracle) для пропуска одинарных кавычек () используются их дублирование («), а не символ обратной косой черты (»). Для этого используется функция ereg_replace в следующем виде:
ereg_replace(“‘”, “‘’”, $data)
Пользователь может успешно противостоять атакам злоумышленника даже при всем богатстве арсенала средств использования злоумышленником SQL-запросов пользователя в своих преступных целях. На самом деле при правильном использовании SQL-запросов у злоумышленника почти нет шансов получить доступ к приложению пользователя.
Повсеместно используемый современный метод защиты от атак злоумышленника на SQL-запросы называется заключением в кавычки (quoting) и по существу основан на правильном заключении в кавычки передаваемых данных и контроле над отсутствием лишних кавычек. Многие средства программного интерфейса с базами данных (например, модули DBI языка Perl) предлагают использовать различные функции заключения строк в кавычки. Тем не менее, чтобы не было недопонимания по этому вопросу, рассмотрим процедуру quotedata на языке Perl.
sub quotedata {
my $incoming=shift;
$incoming=~s/[““]/’’/g;
return “‘$incoming’”; }
В процедуре для обработки входных данных используется функция подстановки языка Perl, которая в случае обнаружения одинарных или двойных кавычек подставляет вместо них две одинарные кавычки. Такой вариант обработки данных является допустимым способом размещения кавычек внутри данных запроса SQL. Другой вариант заключается в удалении всех кавычек, правда, при этом поток данных будет модифицирован. Обработанные данные заключаются в одинарные кавычки и возвращаются приложению, вызвавшему процедуру. В приложении функция quotedata должна быть использована следующим образом:
# … incoming user data is placed in $data
$quoted_data = quotedata($data);
$sql_query = “SELECT * FROM table WHERE column = $quoted_data”;
# … execute your SQL query
Таким образом, значение переменной $data будет правильно заключено в кавычки, а запрос – обработан системой управления базами данных без ошибки. Но только правильное заключение данных в кавычки не означает полную защиту от возможных проблем. Некоторые системы управления базами данных могут интерпретировать отдельные обнаруженные внутри данных символы как команды. Например, ядро базы данных Microsoft Jet до версии 4.0 распознавало среди данных внутренние команды VBA вне зависимости от того, правильно они были взяты в кавычки или нет.
Удалять неверные данные или сообщить об ошибке?При обработке входных данных пользователя у разработчика есть два варианта. Первый – при обнаружении неверных входных данных удалить их, не сообщая об этом пользователю, и, оставив правильные данные без изменения, продолжить обработку оставшихся данных. И второй – сразу же прекратить обработку данных при обнаружении в них ошибки и сообщить о найденной ошибке. Каждый подход имеет свои «за» и «против».
Если приложение сообщает пользователю о найденных ошибках входных данных, то злоумышленник может воспользоваться сообщениями для поиска прорех в защите приложения. Он сможет быстро определить, какие символы приложение пытается использовать не по назначению, пересылая их приложению и отслеживая результаты. Эта методика незаменима для обнаружения уязвимостей в приложениях с недоступным исходным текстом.
Незаметная для пользователя фильтрация входных данных, основанная на удалении неверных данных без сообщения об ошибке и допускающая ввод только безопасных символов, не лишена недостатков. Во-первых, не ошибитесь, данные после проверки на допустимость могут измениться. Во-вторых, если при фильтрации нарушена целостность данных, то результат непредсказуем. Например, удаление символов из пароля может породить ошибки. И наконец, в-третьих, приложение может оказать неоценимую услугу злоумышленнику, если оно печатает переданные данные после их фильтрации: злоумышленник увидит, что в запросе было удалено.
Правильное решение на самом деле зависит от рассматриваемого приложения. Рекомендуется использовать комбинацию двух подходов, исходя из типа передаваемых входных данных и требований к их целостности.
Функции контроля непредвиденных данныхЦентрализованная выдача диагностических сообщений об ошибках входных данных приложения в одной функции позволит упростить контроль непредвиденных входных данных. Значение контроля входных данных огромно. Благодаря контролю можно узнать ошибки фильтрации входных данных пользователя и, что более важно, когда и каким образом злоумышленник попытается изменить логику работы приложения. Поэтому настоятельно рекомендуется использовать централизованные функции выдачи диагностических сообщений об ошибках при вводе данных.
В централизованной функции контроля входных данных удобно организовать регистрацию всех нарушений и передачу необходимой информации для дальнейшей обработки. Минимум реализованных в подобной функции действий – запись неверных данных в журнал регистрации и анализ ошибки: было ли это случайной ошибкой пользователя, который ввел неправильный символ, или это была целенаправленная атака злоумышленника, пытающегося извлечь выгоду из приложения. Можно предусмотреть сбор информации об ошибках для последующей статистической обработки с целью определения «профиля ввода»(«input profiling»), то есть выявления наиболее часто встречающихся ошибок. Полученные результаты используются для более тщательной «настройки» фильтров приложения.
Ошибки входных данных следует фиксировать c самого начала эксплуатации приложения. С течением времени в функцию контроля входных данных вносятся необходимые дополнения и исправления. Основываясь на накопленной информации об ошибках, можно предусмотреть в функции контроля дополнительные правила проверки или оставить приложение без изменений. Функция контроля и выявления нарушений позволяет централизованно обрабатывать выявленные нарушения во входных данных, при необходимости сообщая о неверном вводе и прекращая работу приложения.
Подмена значенийПодмена значений – уловка, основанная на замене одного значения (обычно случайного значения ключа сессии большой длины) другим, который каким-то образом связан с уязвимыми данными. В результате клиенту вместо пересылки по сети уязвимых данных пересылается подмененное значение, использование которого ограничено рамками приложения. При использовании подмены уязвимых данных каким-либо значением оно должно быть случайным и большим, чтобы злоумышленник не смог угадать алгоритм его порождения и получить доступ к уязвимым данным. Это очень похоже на разработку cookies в протоколе HTTP.
Использование средств безопасности языков программирования для обработки непредвиденных данных
Противостояние непредусмотренным данным или данным неверного формата не является новым видом борьбы с угрозами безопасности. Во многие современные языки программирования и приложения включены средства безопасности, исключающие или снижающие печальные последствия поврежденных данных. Большинство из них используют концепцию «песочницы» (sandbox concept), которая предусматривает карантин для поврежденных данных до тех пор, пока они не будут проанализированы и исправлены. Рассмотрим отдельные средства безопасности некоторых популярных языков программирования.
Язык PerlИнтерпретатор Perl запускается в режиме проверки «дыр» в защите при помощи задания в командной строке команды – T. В этом режиме Perl предупреждает программиста о непосредственной передаче данных пользователя одной из следующих команд: bind, chdir, chmod, chown, chroot, connect, eval, exec, fcntl, glob, ioctl, kill, link, mkdir, require, rmdir, setpgrp, setpriority, socket, socketpair, symlink, syscall, system, truncate, umask, unlink, а также о команде – s и обратных галочек. (Обратные галочки – жаргонное обобщенное название символов «левые кавычки», «левая одиночная кавычка», «открывающиеся кавычки», «обратный апостроф»).
При попытке передать поврежденные данные системной функции Perl откажется выполнить сценарий и выдаст сообщение: Insecure dependency in system while running with – T switch at (script) line xx (Небезопасная зависимость в системе при работе с командой —T в сценарии yyyy в строчке xx).
Для проверки введенных пользователем данных следует использовать оператор сравнения (m///) регулярного выражения regex языка Perl для проверки соответствия данных заданным условиям. В следующем примере показано, как выполнить проверку того, что символы входных данных представлены в нижнем регистре:
#!/usr/bin/perl -T
# must setup a secure environment (system/OS dependant)
$ENV{PATH}=“/bin”;
delete $ENV{ENV};
delete $ENV{BASH_ENV};
# this is tainted
$echo=$ARGV[0];
# check to see if it’s only lower-case letters
if ($echo =~/^([a-z]+)$/) {
# we resave the command...
$echo=$1;
# ...and use it in a system function
system(“/bin/echo $echo”);
} else {
print “Sorry, you gave unexpected datan”;
}
Самая важная часть этого фрагмента кода – проверка входных данных:
If ($echo =~ /^([a-z]+)$/) {
$echo = $1;
При разборе входных данных проверяется, чтобы вся строка входных данных (символы ^ и $ подчеркивают это) состояли только из букв нижнего регистра ([a-z]) и строка состояла хотя бы из одной буквы (символ + после [a-z]).
При восстановлении данных следует быть осторожными связи с тем, что в действительности на данные накладываются дополнительные ограничения. Рассмотрим следующий фрагмент кода восстановления данных:
if ($data =~ /^(.*)$/) {
$data = $1;
В нем содержится ошибка: проверка на совпадение по шаблону при помощи регулярного выражения regex ничего не даст, поскольку на символы входных данных не наложено никаких ограничений. Более того, этот фрагмент кода позволяет избежать действительной проверки на безопасность введенных данных.
Система программирования PHPСистема программирования PHP имеет опцию конфигурации «safe_mode» для установки режима безопасной работы, которая ограничивает использование встроенных в язык функций. Этот режим не гарантирует правильных входных данных. Безопасный режим работы подстраховывает работу приложения, заставляя злоумышленника искать обходные пути преодоления контроля входных данных.
В безопасном режиме работы на функции работы с файлами include, readfile, fopen, file, link, unlink, symlink, rename, rmdir, chmod, chown и chgrp наложено ограничение. C их помощью можно получить доступ к файлам, если идентификатор их владельца совпадает с UID системы PHP (который обычно совпадает с идентификатором Web-сервера), или к файлам в директории, которой владеет пользователь с UID системы PHP.
Более того, язык PHP накладывает ограничения на использование функций exec, system, passthru и popen. С их помощью могут выполняться только приложения из директории PHP_SAFE_MODE_EXEC_DIR (директория определяется в файле php.h при компиляции сценария на языке PHP). А при помощи функции Mysql_Connect может быть установлено соединение с базой данных при условии совпадения идентификатора владельца базы данных с UID Web-сервера или UID выполняющегося сценария.
И наконец, для противодействия уловкам атак имитации соединения сценарии на языке PHP изменяют способ взаимодействия с механизмом аутентификации протокола HTTP (что является большей проблемой для систем с большим числом виртуальных хостовых Web-сайтов).
Язык разметки ColdFusionЯзык разметки ColdFusion реализует концепцию «песочницы» (sandbox concept), настройки которой из меню Advanced Security позволяют ограничить возможности встроенных в язык функций. Накладываемые на встроенные функции ограничения вынуждают злоумышленника искать обходные пути преодоления проверок, выполняемых приложением. В языке ColdFusion предусмотрены различные способы задания накладываемых на тэги CFML ограничений, общесистемных и индивидуальных политик пользователя. Примеры установки политик и настроек концепции «песочницы» могут быть найдены на следующих ресурсах:
www.allaire.com/Handlers/index.cfm?ID=7745&Method=Full
www.allaire.com/Handlers/index.cfm?ID=12385&Method=Full
Технология ASPСледует начать с того, что, к счастью, в технологии ASP(VBScript и JScript) предусмотрено немного системозависимых функций, а по умолчанию доступны все функции файловой системы.
В настройках ASP присутствует переключатель запрета использования в функциях файловой системы ссылки на родительскую директорию с помощью символа «../». Этот параметр ограничивает возможности злоумышленника получить доступ к файлу, расположенному за пределами корневой Web-директории. Для изменения параметра следует открыть конфигурационную консоль информационного сервера Интернет (Microsoft Management Console), выбрать нужный Web-сайт, перейти в меню Properties I Home Directory I Configuration I Application Options и отключить опцию Enable Parent Paths. Пример подобных манипуляций приведен на рис. 7.3.
Рис. 7.3. Отключение опции Enable Parent Paths, препятствующей получению доступа злоумышленника к файлу вне корневой Web-директории с использованием ссылки на родительскую директорию
Если в документах ASP не требуется поддержка файловой системы, то от нее можно отказаться, отменив регистрацию объекта File System Object при помощи консольной команды:
regsvr32 scrrun.dll /u
Система управления базами данных MySQL позволяет читать и писать данные в базу данных при помощи SQL-запросов со следующим синтаксисом:
SELECT * INTO FILE “/file/to/save.db” FROM table
Обращение к базе данных можно ограничить, задавая разрешения доступа к файлам пользователями во встроенной таблице привилегий MySQL.
Инструментарий обработки непредвиденных данных
Многие инструментальные средства так или иначе имеют отношение к обработке непредусмотренных данных. Некоторые из них полезны программистам для отладки их кода, другие – злоумышленникам или консультантам при обнаружении прорех в системе защиты. Поскольку подобных инструментальных средств очень много, то далее будут рассмотрены лишь самые популярные.
Программа Web SleuthWeb Sleuth (сыщик сети) – разработанная Дэйвом Циммером (Dave Zimmer) программа для Windows, позволяющая пользователю модифицировать HTTP-запросы и HTML-формы. Программа Web Sleuth широко использует возможности ядра Internet Explorer, добавляя свои собственные. Последняя версия программы Web Sleuth стала расширяемой благодаря применению подключаемых программ (plug-ins). В настоящий момент в число доступных подключаемых программ входят программы вскрытия HTTP-сессий методом «грубой силы», исследования Web-сайтов и тестирования SQL-запросов с помощью внесения в них изменений. Программа свободно доступна по адресу http://geocities.com/dizzie/sleuth.
Программа CGIAuditCGIAudit – автоматизированная программа тестирования интерфейса CGI методом «черного ящика», которая получает от пользователя HTML-форму и методично тестирует каждый ее элемент на известные уязвимости: переполнение буфера, выполнение метасимволов и внесение изменений в запросы SQL. В программе реализованы возможности Web-паука и поддерживается модуль доступа к сети Интернет (прокси-поддержка). CGIAudit написан на языке С и доступен по адресу www.innu.org/~super.
Инструментарий RATSRATS (Rough Auditing Tool for Security – инструментарий первичного аудита безопасности) – средство анализа исходных текстов программ на языках C, C++, Python, Perl и PHP. RATS просматривает исходный текст программ и сообщает о любых потенциально опасных ситуациях, включая статически размещаемые буфера и небезопасные функции. Инструментарий первичного аудита безопасности RATS не решает всех проблем, но помогает снизить потенциальные угрозы безопасности. RATS доступен по адресу www.securesw.com/rats.
Сценарий FlawfinderFlawfinder (определитель уязвимостей) – сценарий на языке Python, по своим функциональным возможностям схожий с RATS, но анализирует только программы на языке С. Создатель сценария Дэвид Уэллер (David Wheeler) отмечает, что Flawfinder распознает уязвимости там, где RATS бессилен. Его конечная цель – объединиться с RATS, но пока этого не случилось. Сценарий Flawfinder можно найти по адресу www.dhwheeler.com/flawfinder.
Сканер RetinaRetina – разработанный eEye коммерческий сканер уязвимостей позволяет исследователю сканировать приложения для выявления уязвимостей. В основе продукта лежат основные методы атак хакеров CHAM (Common Hacking Attack Methods), основанные на идеях «искусственного интеллекта», в основном автоматизирующие рутинный процесс поиска уязвимостей, например поиск переполнения буфера и схожих проблем в общедоступных сетевых сервисах. Сканер Retina можно приобрести по адресу www.eeye.com.
Программа HailstormПрограммный продукт Hailstorm разрекламирован как «средство поиска неисправностей в работе программ», основанный на методах, схожих с методами CHAM сканера Retina, предоставляющими исследователю дополнительные возможности. В состав Hailstorm входят написанная на языке Perl машина сценариев и инструментальные средства создания практически любых тестов поиска аномалий в приложениях. Продукт Hailstorm почти не ограничен в потенциальных возможностях поиска ошибок в программе, но требует квалификации в этой области. Программный продукт Hailstorm можно приобрести по адресу www.clicktosecure.com.
Программа PuddingПрограмма-посредник протокола HTTP (прокси-HTTP) Pudding написана Рольфом Теммингом (Roelef Temmingh) на языке Perl. Программа Pudding позволяет внести закодированные хитроумные вставки в проходящие через нее унифицированные указатели информационных ресурсов URL в запросах по протоколу HTTP вне зависимости от источника запросов: Web-браузера пользователя или инструментария оценки работы сети. Наиболее широко в программе используются кодировки UTF-8/Unicode. Программа Pudding может быть использована для уклонения от систем обнаружения вторжений IDS. Она доступна по адресу www.securityfocus.com/tools/1960.
Резюме
Проблемы безопасности возникают преимущественно из-за непредвиденных действий злоумышленника по отношению к приложению c целью обмана системы безопасности, логики работы приложения и т. д. Переполнение буфера происходит при пересылке в него большего количества данных, чем предусматривалось разработчиком программы. В результате изменения запроса SQL в запрос добавляются дополнительные команды SQL. К сожалению, во многих приложениях не предусмотрена даже простейшая фильтрация неверных данных. Похвалы достойны те, которые выполняет ее. Фильтрация данных позволит выиграть отдельные сражения, но не всю войну в целом. Для разработки действительно надежного и безопасного приложения следует сместить центр усилий от «удаления плохого» к «сохранению хорошего». Только тогда приложение сможет противостоять различным неправильным, поврежденным или непредсказуемым либо непредвиденным данным.
Непредсказуемые данные могут поразить любое приложение, начиная от программ c интерфейсом командной строки и заканчивая Web-приложениями интерфейса CGI, работающими в оперативном режиме. Процедуры аутентификации, сравнения данных и формирования SQL-запросов уязвимы по своей сути. Для определения уязвимости приложения широко используется метод «черного ящика», который позволяет найти, или, как некоторые говорят, разгадать, хитроумные уловки в конструкции приложения, изучая реакцию приложения на входные данные. Просмотр исходного текста программ приложения (подход, при котором программный код приложения внимательно анализируется c целью выявления уязвимостей) сулит исследователю больше выгоды.
К счастью, противостояние непредвиденным данным – не та область, где каждый сам за себя. В большинстве из общедоступных языков программирования (Perl, CFML и PHP) предусмотрены средства противодействия непредвиденным и поврежденным данным пользователя. Вдобавок ко всему есть еще дополнительные инструментальные средства, которые оказывают широкий спектр услуг исследователю от анализа исходного текста программ и выявления в нем уязвимостей до оказания помощи по правильному применению метода «черного ящика».
В заключение следует особо отметить, что неверные данные являются серьезной проблемой. Поэтому программистам следует внимательно относиться к вопросам корректной обработки неверных данных пользователя и исключить появление непредвиденных данных.
Правообладателям!
Данное произведение размещено по согласованию с ООО "ЛитРес" (20% исходного текста). Если размещение книги нарушает чьи-либо права, то сообщите об этом.Читателям!
Оплатили, но не знаете что делать дальше?