24.11.2008

Защита Internet Explorer 8. Анализ эффективности

Уязвимости типа Межсайтовое выполнение сценариев (Cross-Site Scripting, XSS) является самой распространенной проблемой Web. В новой версии Internet Explorer 8 появился XSS-фильтр, который делает реализацию XSS-атаки в нем намного более сложной задачей для злоумышленника. Вопрос в том, насколько сложной?

Дмитрий Евтеев, эксперт по информационной безопасности, MCSE:Security, MCTS
Сергей Гордейчик, руководитель отдела консалтинга и аудита, MCSE, CWNA, MCT, MVP Enterprise Security, CISSP
Компания Positive Technologies

Что такое XSS?

Наличие уязвимости «Межсайтовое выполнение сценариев» (Cross-site Scripting, XSS) позволяет атакующему передать серверу исполняемый код, который будет перенаправлен браузеру пользователя. Этот код обычно создается на языках HTML/Javascript, но могут быть использованы VBScript, ActiveX, Java, Flash, или другие поддерживаемые браузером технологии.

Переданный код исполняется в контексте безопасности (или в зоне безопасности) уязвимого сервера. Используя эти привилегии, код получает возможность читать, модифицировать или передавать важные данные, доступные с помощью браузера. У пользователя, в отношении которого производиться атака, может быть скомпрометирован аккаунт (кража cookie), его браузер может быть перенаправлен на другой сервер, или осуществлена подмена содержимого сервера. В результате тщательно спланированной атаки злоумышленник может использовать браузер жертвы для просмотра страниц приложения от имени атакуемого пользователя. Код может передаваться злоумышленником в URL, в заголовках HTTP запроса (Cookie, User-agent, Referrer), значениях полей форм и т.д.

Уязвимостям класса Cross-Site Scripting подвержено огромное количество Web-приложений. Это подтверждает как практика проводимых компанией Positive Technologies тестов на проникновение, так и независимые исследования. По данным исследования Web Application Security Consortium за 2007 год [1] самой распространенной уязвимостью является Cross-Site Scripting, эта уязвимость присутствует почти в 60% проанализированных сайтов (см. Рис. 1).

Рис. 1 Статистика WASC за 2007 г. «Процент уязвимостей от общего числа»

Продолжительное время степень риска, связанная с уязвимостями типа Cross-Site Scripting, недооценивалась. И лишь после многочисленных успешных атак с использованием XSS, а также с появлением Интернет-червей [2], способных размножаться путем эксплуатации уязвимостей Cross-Site Scripting, пришло осознание того, что необходимо как-то защищаться от подобной напасти.

И как с ним бороться?

Для борьбы с уязвимостью Cross-Site Scripting не достаточно только фильтровать данные, поступающие в Web-приложение со стороны пользователя. Например, уязвимость Cross-Site Scripting могла эксплуатироваться в контексте Web-сайта с помощью обращения к обычному PDF-документу [3], который содержится на этом Web-узле. Хотя существует множество полезных инструментов, которые помогают смягчить последствия XSS-атаки (например, Web Application Firewall), эти инструменты не удовлетворяют нуждам обычного пользователя по защите их самих от Cross-Site Scripting, когда они путешествуют в сети Интернет.

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

Так в новой версии Internet Explorer 8 появился XSS-фильтр, который делает реализацию XSS-атаки в нем намного более сложной задачей для злоумышленника. В настоящее время для скачивания доступна IE версии 8b2, собственно, про XSS-фильтр, реализованный в этой версии Интернет-браузера, и пойдет речь в данной статье. Логика работы фильтра описана в документе «IE 8 XSS Filter Architecture / Implementation», и за детальной информацией предлагается обращаться к первоисточнику [4]. Что же касается результатов работы, то при попытке передать на уязвимый сервер сакраментальный запрос:

http://www.example.com/script.asp?val=><script>alert(‘xss’)</script>

пользователю будет выдано сообщение в строке уведомлений, а в HTML-код будут внесены изменения, препятствующие выполнению кода.

Рис. 2 Реакция IE8 на проверку уязвимости Cross-Site Scripting

Методика исследования

Большинство исследователей выделяет три типа уязвимостей и атак, связанных с XSS: постоянные (сохраненные, persistent, stored, Type-2), непостоянные (отраженные, non-persistent, reflected, Type-1) [5] и DOM-based XSS (Type-3)[6]. Основным отличием между ними заключается в том, что в отраженном варианте передача кода серверу и возврат его клиенту осуществляется в рамках одного HTTP-запроса, а в сохраненном – может происходить и в разных запросах. Осуществление непостоянной атаки требует, чтобы пользователь перешел по ссылке, сформированной злоумышленником (ссылка может быть передана по email, ICQ и т.д.). В процессе загрузки сайта код, внедренный в URL или в заголовки запроса, будет передан клиенту и выполнен в его браузере. Сохраненная разновидность уязвимости возникает, когда код передается серверу и сохраняется на нем на некоторый промежуток времени. Наиболее популярными целями атак в этом случае являются форумы, почта с Web-интерфейсом и чаты. Для атаки пользователю не обязательно переходить по ссылке, достаточно посетить уязвимый сайт. Третий тип XSS (DOM-based) может присутствовать как в сохраненном, так и в отраженном варианте, но выделяется тем, что внедрение кода осуществляется с использованием AJAX-технологий (например, Javascript document.write и т.д.).

В ходе исследования анализировалась применимость механизмов противодействия XSS, встроенных в Internet Explorer beta 2, для всех трех вариантов атаки. При этом использовались распространенные методы обхода XSS-фильтров, описанные в XSS Cheat List [7], и собственные разработки авторов. В ближайшее время планируется расширить XSS Cheat List особенностями Internet Explorer 8.0.

Сохраненный вариант

Согласно логике работы, клиентский фильтр Internet Explorer не может противостоять сохраненному варианту атаки. Это связанно с тем, что фильтр работает на основе сравнения данных, переданных в запросе, и возвращенной страницы. Поскольку эксплуатация сохраненного варианта может происходить в разных сессиях запрос-ответ, пользователи остаются уязвимы для данного типа атак.

Эксперименты показали, что даже в случае сохраненного варианта атаки, фильтр Internet Explorer может заблокировать выполнения атаки в первой паре запрос-ответ (например, при создании сообщения в форуме). Однако все последующие запросы (например, просмотр форума), а, соответственно, и атаки проходят успешно.

DOM-based XSS

Как говорилось ранее, уязвимость данного типа возникает, когда внедрение кода динамически осуществляется с использованием Javascript и AJAX-технологий. Эксперименты показали, что фильтр XSS в Intenet Explorer beta 2 реализует защиту от большинства сценариев данного типа атак, но в некоторых случаях логику фильтра можно обойти. Примерами являются операторы выполнения скриптов напрямую (eval), изменение URL документа (document.location) и т.д. Ниже приведен пример уязвимого приложения, использующего клиентский Javascript для выполнения кода напрямую через метод eval().

Рис. 3 Уязвимый код web-приложения на языке PHP

Тогда, несмотря на фильтр XSS в IE8b2, возможно успешно провести атаку Cross-Site Scripting (см. рис 4).

Рис. 4 Эксплуатация DOM-based Cross-Site Scripting

В других распространенных случаях, когда Javascript используется для записи в код HTML-страницы или изменения DOM-объектов напрямую, атака блокируется фильтром.

Отраженный вариант

Можно выделить четыре основных ситуации, в которых возможен отраженный вариант атаки Межсайтовое выполнение сценариев:

  • внедрение кода в Javascript;
  • внедрение кода в тег;
  • внедрение кода в параметр тега;
  • внедрение кода в HTML.

Далее рассмотрено противодействие Internet Explorer в каждом их этих случаев.

Внедрение кода в Javascript

Данная ситуация очень схожа с DOM-based XSS. Однако код внедряется непосредственно в блок Javascript без использования функций AJAX. Пример уязвимого кода приведен ниже.

Рис. 5 Уязвимый java-script код

В этом случае злоумышленник может передать в качестве значения параметра XSS-значение:

500); alert(document.cookie);//

В результате код в странице приобретет вид:

setTimeout(“writetitle()”, 500); alert(document.cookie);//)

Два символа обратного слеша является комментарием в языке Javascript, поэтому, с точки зрения синтаксиса, здесь все верно. Таким образом, несмотря на фильтр XSS в IE8b2, возможно успешно провести классическую атаку Cross-Site Scripting (см. рис. 6).

Рис. 6 Эксплуатация внедрения java-script кода

Как часто можно встретить внедрение в код Javascript? Практика показывает, что подобные уязвимости – достаточно распространенное явление. По опыту авторов 10-15% Web-приложений, которые содержат уязвимости Cross-Site Scripting, будут содержать в том числе и уязвимость внедрения Javascript кода.

Внедрение кода в тег

Данный вариант уязвимости встречается редко, но сбрасывать его со счетов не стоит. Фильтр XSS в Internet Explorer пропускает конструкции, когда уязвимый параметр к Cross-Site Scripting встречается в следующих вариациях:

<img… $XSS ….>

<font… $XSS ….>

и т.п.

То есть в ситуациях, когда уязвимое значение включено в тег и не является параметром этого тега. В этом случае можно использовать обработчики событий Javascript (onClick(), onMouseover()) для передачи управления коду, используемому для атаки (см. рис. 7).

Рис. 7 Эксплуатация Cross-Site Scripting в тегах

Внедрение кода в параметр тега

Данная ситуация является одним из самых распространенных случаев XSS. Она возникает, когда уязвимый параметр к Cross-Site Scripting встречается в параметре тега:

<img… src=$XSS ….>

<font… size=$XSS ….>

<a… href=$XSS ….>

и т.п.

Тестирование показало, что фильтр Internet Explorer прекрасно справляется с данным видом атак, включая все опробованные комбинации и кодировки.

Внедрение кода в HTML

Классическая ситуация, в которой внедрение происходит непосредственно в HTML, и для проведения атаки необходимо открыть тег. И в этом случае фильтр Internet Explorer показал себя с лучшей стороны, отфильтровав все опробованные комбинации и кодировки.

Использование расщепления HTTP-ответа

Для тех разработчиков Web-приложений, которые захотят отключить фильтр XSS на своих сайтах, в Internet Explorer подобная возможность предусмотрена путем установки HTTP-заголовка «X-XSS-Protection: 0» в возвращаемом Web-сервером ответе.

Однако это можно использовать для обхода фильтра XSS. Такая возможность возникает, когда приложение уязвимо для XSS и для уязвимости типа «Расщепление HTTP-ответа» (HTTP Response Splitting). Используя расщепление, злоумышленник может внедрить дополнительный HTTP-заголовок, который будет отключать фильтр XSS, и эксплуатировать уязвимость (см. рис. 8).

Рис. 8 Эксплуатация Cross-Site Scripting совместно с HTTP Response Splitting

Не смотря на то, что подобная ситуация встречается не часто, ее тоже необходимо учитывать. По статистике Web Application Security Consortsium, ручной анализ позволяет идентифицировать HTTP Response Splitting в 7,75% всех приложений.

Заключение

Исследование механизма противодействия атакам «Межсайтовое выполнение сценариев», встроенного в браузер Internet Explorer 8b2, показало, что подход защиты от Cross-Site Scripting на стороне клиента может быть достаточно эффективным в борьбе с отраженным вариантом XSS. К сожалению, решить проблему с сохраненным типом атаки лишь на стороне клиента в настоящее время не представляется возможным (отключение Javascript и прочих активных объектов – это не решение проблемы), поэтому это тема лежит за рамками поддерживаемого функционала XSS-фильтра в IE8. Кроме того, не поддерживается фильтрация некоторых DOM-based атак, которые весьма актуальны в современном мире AJAX и Web 2.0. Неплохим расширением функций фильтра была бы фильтрация атак типа HTTP Response Splitting, что позволило бы избежать некоторых методов обхода фильтра.

Сводная таблица возможностей Internet Explorer 8 в части фильтрации XSS приведена ниже.

Таблица 1. Фильтрация XSS в Internet Explorer 8 beta 2


Сохраненный вариант

Нет

DOM-Based

Частично

Отраженный вариант

В теге

Нет

В Javascript

Нет

В HTML

Да

В параметре тега

Да

Учитывая, что отраженный вариант Межсайтового выполнения сценариев является самым распространенным типом уязвимостей этого типа, возможности Internet Explorer позволяют значительно снизить количество успешных атак с использованием данного вектора.

Литература

1. Web Application Security Consortium Security Statistics Projects
http://webappsec.org/projects/statistics/
2. Wikipedia, XSS Worm
http://en.wikipedia.org/wiki/XSS_Worm
3. Common Vulnerability and Exposures, CVE-2007-0044
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2007-0044
4. Microsoft Security Vulnerability Research & Defense, IE 8 XSS Filter Architecture / Implementation
http://blogs.technet.com/swi/archive/2008/08/19/ie-8-xss-filter-architecture-implementation.aspx
5. Web Application Security Consortium Threat Classification
http://www.webappsec.org/projects/threat/v1/WASC-TC-v1_0.rus.txt
6. Amit Klein, Третий тип XSS: Межсайтовый скриптинг через DOM
http://www.securitylab.ru/analytics/275087.php
7. XSS Cheat List
http://ha.ckers.org/xss.html

или введите имя

CAPTCHA
27-11-2008 07:09:38
Очередной "самый защищенный продукт"?? ) могу ошибаться, но кажется они перерисовывают оперу...
0 |
27-11-2008 09:02:34
Не соглашусь. По мнению авторов, найден разумный компромисс между защитой и функциональными возможностями. Иначе многие сайты блокировались бы и защита отключалась бы пользователями. Общались с разработчиком фильтра (David Ross), обещал добавить в релиз слайдер для выбора уровня "паранойи" фильтра.
0 |
29-11-2008 20:30:09
Похоже на некоторое обобщение в IE частично Firefox, частично Opera.
0 |