Программные методы информационной защиты Интернет-приложений
По статистике поисковых систем, каждый день в Интернете появляется приблизительно 260762 новых сайтов, которые посещают около 694 миллионов человек во всем мире. Из этих сайтов только очень небольшая часть, является ресурсами, защищенными от хакерских атак. Создатели сайтов редко беспокоятся об их безопасности, и из-за этого чаще всего страдают обычные пользователи. Допустив, пусть даже случайно, всего одну ошибку при разработке программного кода сайта можно однажды потерять все: сам сайт, его пользователей, собственную репутацию. Если при разработке сайта была допущена критическая ошибка, то у хакеров открывается огромный простор для действий: они могут украсть базу данных с ценной информацией, распространять через взломанный сайт спам, распространять через этот сайт вредоносные программы.
Основная проблема современных интернет-ресурсов заключается в недостаточной защите информации пользователей. Казалось бы, эта тема интересна лишь специалистам. Однако, это далеко не так. Сейчас сайты создаются практически повсеместно. Все чаще у коммерческих и государственных организаций, да и у частных лиц появляются собственные интернет-ресурсы. В некоторых, достаточно частых, случаях, ценность информации на таких ресурсах может быть очень высока. Чаще всего за взломом сайта какой-либо организации следует утечка важной коммерческой информации. Не меньше проблем возникнет и у пользователей этих сайтов. Взлом посещаемого ими веб-сайта может обернуться для них от утечкой информации или заражения компьютера вредоносным ПО. В обоих случаях может быть украдена любая пользовательская информацию: пароль email-адреса, пароли от различных сайтов и программ, данные кредитных карт или электронных кошельков. Другая сторона проблемы: именно взломы самых обычных веб-ресурсов чаще всего оказываются одной из причин распространения спама и вредоносных программ, а также крупнейших DDOS-атак, перед которыми не могут устоять даже самые посещаемые и защищенные ресурсы.
Основные проблемы, затронутые в данной статье:
- Защита от основных угроз веб-безопасности
- Защита интернет-сервера от несанкционированного доступа
- Принципы построения заведомо безопасной архитектуры WEB-приложения
- Работа с прикладными инструментами защиты
- Безопасные решения при разработке web-ресурса
- WAF (Web Application Firewall) и HTACCESS-защита
- Глобальные проблемы DDOS-атак
Легко осваиваемые языки веб-программирования, ориентированные на разработчиков интернет-проектов, получили широчайшее распространение. Скриптовые изначально были ориентированы на эффективное решение иных задач, нежели языки программирования системного и прикладного уровня, поскольку они создавались как компоненты к уже готовым программным решениям. Преимущества такого подхода перед статическим наполнением веб-сайтов видны невооруженным взглядом. Это и гибкость построения HTML-кода, и создание отчетов по записям в БД в реальном времени, и генерация полноценных HTML-документов из существующих элементарных компонентов (блоков и модулей системы).
Применение готовых систем управления контентом (CMS, Content Management System) еще больше упростило задачу хакерам: теперь возможно взламывать интернет-проекты с невообразимой ранее скоростью: после нахождения уязвимости в популярном программном продукте, количество взломанных ресурсов за минимальное время практически ничем не ограничено, и по примерным оценкам может достигать 3000 сайтов в минуту. Более подробно типичные сценарии атак были рассмотрены в соответствующей части работы.
Уязвимости Интернет-приложений
Исследование безопасности Интернет-ресурсов
Для того, что бы оценить защищенность современных веб-ресурсов, было проведено тестирование интернет-приложений при помощи поисковой системы Google, с применением технологии dork-фраз.
Результаты следующие:
- Около 112000000 сайтов подвержены критическим уязвимостям.
- Около 182000000 сайтов подвержены некритическим при определенных условиях уязвимостями.
- Более 33400000 выводят критическую системную информацию, которая в определенных условиях может привести к взлому.
- Около 311600000 сайтов используют готовые CMS.
- Около 9600000 сайтов используют CMS собственной разработки.
- Из сайтов, использующих CMS, безопасными являются около 905000. Следовательно, остальные (320295 000) могут быть взломаны в любой момент.
Так выглядит общая ситуация с безопасностью в сети Интернет сейчас. Однако на самом деле, количество уязвимых сайтов в разы больше, и постоянно появляются новыми.
После анализа статистики оказалось, что крупные финансовые ресурсы (сайты банковских систем) не менее уязвимы: из 8 взятых для тестирования [6] сайтов банковских систем среднего звена, 6 были взломанными за несколько минут.
Взломам могут подвергаться и достаточно крупные ресурсы, и вот тому подтверждение:
- В 2007 был взломан сайт официальный сайт Московского государственного университета имени М. В. Ломоносова (МГУ), получен доступ к персональной информации студентов.
- В 2008 году был взломан официальный сайт МГТУ им. Н. Э. Баумана, главного технического вуза России. Получен доступ к базе данных.
- В 2009 году была найдена критическая уязвимость на ресурсе rambler. ru. Уязвимость позволяла получить доступ к спискам адресов e-mail, а также номерам ICQ пользователей сайта.
- В 2009 взломан сайт самого популярного в России ICQ-мессенджера QIP.
- В 2009 взломан сайт армии США, крупнейшая (самая популярная в мире) социальная сеть Facebook.
- В 2009 взломан сайт популярнейшей соц. cети Twitter.
Это лишь небольшая часть взломов крупных Интернет-ресурсов, последствия от которых были наиболее разрушительными.
Основные типы уязвимостей
Чаще всего атаки на интернет-проекты происходят из-за одних и тех же уязвимостей. Рассмотрим некоторые из них.
- XSS. Эта аббревиатура расшифровывается как “Cross-site scripting”, или межсайтовый скриптинг. Буква "X" используется для того чтобы не было путаницы, ведь аббревиатура "CSS" имеет ещё одну расшифровку – “Cascading StyleSheets” Года 4-5 назад на сайтах хакерской тематики можно было найти множество статей, в которых данный вид уязвимостей именовался как "CSS". Данный тип атак интересен тем, что работает не по системе “пользователь атакует сервер”, а совсем наоборот – “сервер атакует пользователя”. Уязвимости типа XSS представляют собой вставку произвольного JavaScript-кода в результат работы скрипта, когда он не фильтрует поступившие от пользователя данные или фильтрует их недостаточно. Исторически сложилось так, что программисты не всегда понимают всей опасности уязвимостей данного типа. Из-за этого многие сайты сейчас страдают XSS-уязвимостями. И если разработчик веб-приложения старается устранить подобные уязвимости как можно быстрее, то разработчики отдельных сайтов просто оставляют всё как есть. Хакер, используя XSS-уязвимость, может делать очень многое – нажимать на кнопки, проходить по ссылкам, заполнять формы, отправлять их и много чего ещё. Всё ограничивается только его фантазией и знаниями. Все XSS-уязвимости делятся на два основных вида – пассивные и активные. Пассивная XSS – это XSS которая сработает только при передаче пользователем определённых данных. Хакер должен каким-либо образом заставить пользователя вызвать выполнение вредоносного кода – это является самым большим и основным недостатком уязвимостей данного вида. Активные XSS представляет собой уязвимость, с помощью которой можно осуществить вставку JS-кода в тело определённой web-страницы. Данные для использования активной XSS всегда должны поставляться через какую-либо форму.
- SQL-injection (SQL-инъекция) – уязвимость, которая позволяет подменить запрос скрипта к базе данных. Очень часто, при использовании подобной уязвимости, хакер может читать любые данные из доступных ему таблиц или файлов. В редких случаях, дело может дойти и до изменения данных в доступных хакеру таблицах. Скрипты страдают данной уязвимостью из-за того, что многие программисты не заботятся о фильтрации входных данных, которые напрямую попадают в запрос. А большинство из тех, кто заботится, ограничиваются введением простой фильтрации опасных символов, которую давно уже научились обходить.
- CSRF. Аббревиатура "CSRF" расшифровывается как “Cross-Site Request Forgery” , межсайтовая подделка запроса. Данный тип атак направлен на имитирование запроса пользователя к уязвимому сайту. CSRF-уязвимости широко распространены среди сегодняшних интернет-приложений из-за того, что многие из них не чётко определяют - действительно ли запрос сформирован настоящим пользователем или скриптом. Хотя в некоторых ситуациях определить это просто невозможно. Единственным средством распознавания пользователя являются cookies. Соответственно если заставить браузер отправить нужный нам запрос на сторонний сайт, то этот запрос сможет вполне нормально пройти даже к тем скриптам, в которых нужна авторизация – ведь браузер при запросах к сайту отправляет ему и данные из cookies. Главное чтоб пользователь заранее был авторизирован.
SQL-инъекции
Сейчас большинство сайтов работают с базами данных. С базой данных может работать лента новостей, форум, онлайн-магазин и ещё много различных веб-приложений. Но чаще эти уязвимости можно обнаружить в самых неожиданных местах. Например, на каком-либо сайте при загрузке файла может не подвергаться фильтрации его имя - и иньекция будет возможна при определенном имени файла. Или же программисты могут не учитывать фильтрацию различных HTTP-заголовков. Вообще с HTTP-заголовками ситуация сейчас очень интересная – если раньше многие программисты не фильтровали данные, передающиеся в cookies-файлах, то теперь они не фильтруют HTTP-заголовки. Как же распознать СУБД при SQL-инъекции удалённо? Здесь возможно 2 варианта:
- Если ошибки выводятся с именем СУБД.
- Если ошибки выводятся без имени СУБД.
Если ошибки выводятся, то следует просто вчитаться в текст ошибки, в нём, в 90% случаев, вы сможете обнаружить имя БД.
Если же ошибка выводится, но имени СУБД в ней нет, то можно посмотреть на имя PHP-функции, которая её вызвала. Для каждой СУБД используются функции с разными именами, но есть некоторые общие моменты в названиях функций для одной СУБД.
Межсайтовый скриптинг
Что же можно сделать с помощью XSS-уязвимости? Ответ на этот вопрос один – "Всё что может сделать с помощью браузера пользователь". Фактически хакер, используя XSS, может делать всё – нажимать на кнопки, заполнять формы, отправлять их и совершать другие действия.
Основные цели, преследуемые взломщиками, при использовании XSS-уязвимостей:
1. Кража cookies или идентификатора сессии.
2. Вывод различных надписей
3. Вирусная атака на одного пользователя или группу пользователей.
Чаще всего XSS-уязвимости применяется для воровства cookies или перехвата сессии. Вторая по популярности цель– шуточные атаки с выводом различных сообщений.
Третья причина – вирусная атака. Но сейчас вредоносный код через подобные уязвимости встраивают хакерские группы, желающие увеличить свой ботнет. В огромных масштабах подобные заражения производят с помощью кражи паролей к FTP-серверам.
Другие уязвимости
LFI и RFI – атаки
Часто программисты подключают код одного файла к другому. Это позволяет не только выиграть во времени, но и удобнее работать дальше над интернет-проектом. Если взглянуть на исходные коды любой CMS – там обязательно есть конфигурационный файл, который подключается к каждому скрипту. Это логично – не надо много раз набирать одно и то же. Но бывает, что сайт полностью держится на подключении файлов. Из-за того, что программист не уделил особого внимания безопасности, может произойти взлом ресурса. Суть подобных уязвимостей в том что хакер, при определённом стечении обстоятельств, получает возможность подключения локальных (LFI, Local File Inclusion) или удалённых (RFI, Remote File Inclusion) файлов к скрипту. В лучшем, для нападающего, случае он сможет подключить и выполнить произвольный PHP-код. В худшем – это будет html-код включающийся прямо в страницу. Это переводит подобную уязвимость в разряд XSS.
XPath-инъекции
Сейчас XML-файлы используются как базы для хранения данных. В основном это удобно тогда, когда данные невозможно хранить в БД по каким-либо причинам. При работе с XML-базами программисты часто используют запросы на языке XPath для того, что бы ускорить поиск какой-либо информации. Если пользователь может как-то влиять на тело запроса и при этом отсутствует должная фильтрация, возможны атаки типа "XPath-injection". С помощью данной уязвимости злоумышленник может дописать в настоящий запрос свой код и тем самым добиться определённого результата.
Типичные сценарии атак
Для проникновения на удаленный сервер с помощью описанных ранее уязвимостей хакерами используется 3 основных подхода, каждый из которых предназначен для определенных целей.
- Ручной поиск уязвимостей. Этот способ используется для поиска уязвимостей на каком-либо конкретном Интернет-проекте. Для осуществления атаки хакер перебирает вручную всевозможные параметры скриптов с целью поиска определенного типа уязвимостей.
- Автоматизированный поиск уязвимостей. Отличается от предыдущего способа только тем, что для взлома не нужны какие-либо особые навыки: уязвимости находит специальная программа-сканер, хакеру же выдается готовый результат сканирования и вспомогательная информация. Для взлома хакеру остается только выполнить инструкции, описанные в программе. Как правило, такие программы не применяются продвинутыми хакерами, так как легко дают себя обнаружить.
- Исследование исходных кодов. Этот способ применяется при условии, что у взломщика есть исходные коды веб-приложения. Этот способ применяется как для целенаправленного взлом конкретного интернет-ресурса, так и для поиска уязвимостей в CMS. В последнем случае этот способ крайне эффективен – в случае успеха хакер может сразу получить доступ к десяткам и сотням тысяч интернет-проектов – все зависит от популярности CMS.
Методы защиты
Стандартные методы
Для защиты от уязвимостей интернет-проектов применяется ряд стандартных функций.
- Защита от SQL: функция mysql_real_escape_string мнемонизирует специальные символы в строке для использования в операторе SQL с учётом текущего набора символов в кодировке соединения.
- Защита от XSS: функция htmlspecialchars конвертирует только специальные символы (’&’, ‘”‘, ”’, ‘<’ и ‘>’) в HTML сущности (’&’, ‘"’).
Функции, описанные выше, обеспечивают достаточную защиту скрипта от соответствующих атак. Для защиты от других типов атак стандартных функций нет. Защита от них реализуется с помощью специальных алгоритмов.
WAF
Понятие «Web Application Firewall» (защитный экран для web-приложений) достаточно широкое. WAF может быть реализован в двух формах: аппаратной или программнй — большую часть представляют последние.
Условно выделяют три типа WAF по принципу действия:
1. Реализованные в виде обратного прокси-сервера;
2. Работающие в режиме маршрутизации;
3. Уже встроенные в веб-приложения.
К первым можно отнести такие реализации защитных компонентов, как “ModSecurity”.
Работа этого типа WAF строится по схеме первоначальной обработки входящих данных, WAF может блокировать или перенаправить запрос к веб-серверу без изменения или с правкой данных. Третий тип подразумевает наличие в веб-приложении дополнительного функционала, реализующего цели WAF. Ярким примером служит встроенный WAF в CMS Битрикс. По специфике действия правил различают WAF, работающие по принципу blacklist (производится сопоставление со списком недопустимых условий) и whitelist (принимаются только разрешенные действия), а также смешанный тип. Самым надежным, конечно, считается последний. Например, среди сигнатур для черного списка могут быть строки: «UNION», «< script >», «/etc/passwd»; белый список может определять диапазон значений для числового параметра (от 0 до 65535). В результате это делает атаку бесполезной для хакера. WAF — это специальный механизм, накладывающий определенный набор правил на то, как взаимодействуют между собой сервер и клиент, обрабатывая HTTP-пакеты. В основе кроется тот же принцип, что и в обычных пользовательских файрволах, — контроль всех данных, которые поступают извне.
В рамках этого проекта мною был разработан WAF, который позволяет защитить любой скрипт от большинства типов атак.
Его основные характеристики:
- Использование. htaccess-файлов для блокировок
- Фильтрация GET, POST, COOKIE - переменных, согласно принципу GPC Protection.
- Экстра-защита POST-переменных.
- Поддержка “магических кавычек”
- Защита от DDOS-атак
- Крайне простая установка на сервер
- Противодействие HTTP-атакам, включая атаки на переполнение буфера и действия вредоносных программ
- Защита от всех известных уязвимостей на достаточном уровне
Для оценки уровня эффективности разработанный WAF был внедрен на 519 тестируемых уязвимых сайтов. По результатам дополнительного тестирования, после установки WAF, уязвимыми осталось только 8 из них.
HTACCESS – защита
Одним из самых эффективных средств защиты является правильное конфигурирование файла. htaccess. Этот файл выполняется веб-сервером до запуска php-интерпретатора, а значит его обработка занимает минимальное время и обеспечивает защиту высокого уровня, обойти которую невозможно.
В рамках этого проекта мною была разработана HTACCES-конфигурация, которая позволяет защитить любой скрипт почти от всех атак.
Основные возможности разработанной защиты:
- Фильтры для строки параметров (защита от SQL-inj)
- Защита от эксплойтов специально сформированным URI
- Запрет “левых” методов запроса (delete, track, trace)
- Понижение нагрузки на PHP-интерпретатор
- Фильтрация GPC - переменных.
- Экстра-защита GET-переменных.
- Поддержка “магических кавычек”
- Защита от DDOS-атак
- Крайне простая установка на сервер
- Противодействие HTTP-атакам, включая атаки на переполнение буфера и действия вредоносных программ
- Защита от всех известных уязвимостей на достаточном уровне
- Проактивная защита
- Защита от code injection
- Защита от CSRF и XSS
- Защита от раскрытия исходного кода
DDoS – атаки
История DDoS-атак
Во времена своего рассвета DDoS-атаки были настоящей катастрофой для серверов. Web-сайт можно было легко вывести из строя с помощью одного-единственного хоста, реализующего атаку типа Smurf. Рабочие станции с установленной ОС Windows “падали” от атак типа Ping of Death, Land, WinNuke. Сегодня всего этого не стоит опасаться.
Самые крупные DDoS-атаки:
- 1997 год - DDoS-атака на сайт Microsoft. Сайт был недоступен 1 день.
- 1999 год – в результате DDoS-атаки оказались недоступны web-сайты Yahoo, CNN, eBay и др.
- Октябрь 2002 - атака на корневые DNS-серверы интернета (фактически эта атака на весь Интернет). На некоторое время были выведены из строя 7 из 13 серверов, но Интернет устоял.
- 21 февраля 2003 года - DDoS-нападение на LiveJournal. com. Два дня сервис был недоступен.
Основные виды DDOS – атак
DDoS-атака (от англ. Distributed Denial of Service, распределённая атака типа «отказ в обслуживании») подразумевает метод грубой силы - хакер тем или иным способом пытаетется "забить" канал, открывая максимально возможное количество соединений на тот или иной сервис или отправки огромного кол-ва информации которое сервер не в состоянии обработать. Опасность DDoS-атак – в их прозрачности и "нормальности". Ведь если ошибка в ПО может быть исправлена, то полное исчерпание ресурсов сервера - явление почти обыденное. С ними сталкиваются многие администраторы, когда ресурсов машины (ширины канала) становится недостаточно, или web-сайт подвергается слэшдот-эффекту. И если “резать” трафик и ресурсы для всех, то можно спастись от DDoS, но потеряеть большое число посетителей. Это приводит к потере скорости или полной остановке работы атакуемого ресурса. DDoS - одна из наиболее сложных в плане предотвращения атак. Суть заключается в том, что на сервер идет огромный поток информации (flood), отчего банально заканчиваются ресурсы системы, и сервер не может справиться с нагрузкой. DDOS-атака является распределенной и осуществляется при помощи сети из зараженных вирусом компьютеров.
Виды DDOS-атак:
- SYN-флуд. На атакуемый сервер отправляется большое количество SYN-пакетов по протоколу TCP. При этом на атакуемой системе через короткое время исчерпывается количество открытых сокетов и сервер перестаёт отвечать. Так как поток ACK-пакетов очень велик, очередь оказывается заполненной, и ядро дает отказ на попытки открыть новое соединение.
- HTTP-флуд. В этом случае основную нагрузку принимает на себя сервис приложений, как следствие, мы имеем большую нагрузку на ядро системы. Способ основан на бесконечной посылке HTTP-сообщений GET/POST на 80-ый или 8080-ый порт с целью загрузить web-сервер или скриптовой интерпретатор настолько, чтобы он оказался не в состоянии обрабатывать все остальные запросы. Индикатором атаки служит аномально быстрый рост логов web-сервера.
- Переполнение канала. Количество запросов на сервер настолько велико, что исчерпываются ресурсы сетевого подключения ОС. Защита от этого вида атак может представлять собой скрипт, размещенный на WEB-сервере. Его основная задача – снизить нагрузку на интерпретатор PHP и базу данных приложения. Пример программы для организации DDOS-атак на переполнение канала.
Аппаратные методы защиты
Защита от крупных DDOS-атак не может базироваться только на программных компонентах. Защита от любой DDOS-атаки среднего уровня невозможно без аппаратных компонентов. Сейчас эти компоненты установлены практически у всех ведущих хостинг-провайдеров. Полнофункциональное решение по защите от атак DDoS, как написано на официальном сайте компании Cisco (ведущая компания в области разработки различных сетевых компонентов, включая защиты от DDOS-атак) это решение основано на принципах “выявления, переориентации, верификации и пересылки, применение которых гарантирует полную защиту”. Аппаратные решения защитит наиболее критичные к простою системы от DDoS атак любого типа, включая, что не мало важно, совершенно новые разновидности атак этого типа. Решения Cisco обеспечивает оперативную реакцию на атаки DDoS, скорость которой измеряется секундами.
В решении Cisco System по защите от DDoS-атак важную роль играют два компонента - Cisco Traffic Anomaly Detector и Cisco Guard. Первый компонент действует как система пассивного контроля и направлена на выявления аномалий заданной сети. Если система считает, что количество TCP-пакетов передаваемых из какого-либо источника превышает допустимые значения, то она перенаправляет подключения компоненту Cisco Guard. Он представляет из себя устройство для устранения DDOS-атак. Cisco Guard подвергает тщательному пятиступенчатому анализу весь входящий трафик.
Архитектура Cisco Guard включает в себя 5 стадий по выявлению вредоносного сетевого трафика.
Программные методы защиты
Для программной защиты от DDOS-атак на программном уровне мною были разработаны следующие рекомендации:
- Отключение ответов на запросы ICMP ECHO
- Увеличение очереди "полуоткрытых" TCP-соединений
- Уменьшение времени удержания "полуоткрытых" соединений
- Включение механизма TCP syncookies
- Ограничение максимального числа "полуоткрытых" соединений с одного IP к конкретному порту
- Установка лимита на количество соединений в единицу времени к DNS-серверу на стороне шлюза
- Увеличение числа подключений к базе данных одновременно
- Установка перед web-сервером Apache производительный nginx
Также мною были разработаны две информационные системы для ограничения степени влияния DDOS-атак на компоненты веб-сервера (WAF и HTACCESS-защита). Для оценки эффективности этих систем был проведен ряд тестов. На тестовую систему была произведена DDOS-атака средней мощности.
Публичные интернет-сеpвеpа продолжают оставаться объектами атак хакеров, которые хотят с помощью этих атак нанести урон организации или добиться каких-либо других целей. Хорошие меры защиты могут защитить интернет-сайт от многих неприятностей, которые могут произойти в случае успешной атаки на него. Первым правилом веб-программиста, желающего написать более-менее защищенное веб-приложение, должно стать "Никогда не верить данным, присылаемым пользователем". Публичные сеpвеpа сейчас взламываются ежеминутно, угpоза того, что будет совершена атака и на ваш веб-сеpвеp, - реальна. В этой работе были описаны рекомендации по защите интернет-проектов от хакерских атак, разработаны системы защиты от них, проведены необходимые тесты. Сейчас ситуация такова, что с ростом популярности веб-ресурса увеличивается интерес к нему хакеров, а следовательно, и вероятность взлома.
Комментарии