Устранение угроз безопасности Ajax-приложенийИсточник: IBM developerWorks Россия Фредерик Де Кеукекларе, Майкл Стайнер, Наохико Урамото
Технология Asynchronous JavaScript + XML (Ajax), являющаяся ключевой технологией в Web 2.0, позволяет отделить взаимодействие пользователя с Web-страницами от взаимодействия Web-браузера с сервером. В частности, Ajax является основой mashup-приложений, которые интегрируют содержимое или сервисы нескольких сайтов в один пользовательский интерфейс. Однако Ajax и технология mashup дают ход новым типам угроз, связанных с их динамической и мультидоменной природой. Познакомьтесь с этими (связанными с Ajax) угрозами и передовым опытом их устранения. Ajax основан на технологиях Dynamic HTML (DHTML), в том числе:
В Ajax JavaScript-код на стороне клиента динамически обновляет вид Web-страницы, изменяя дерево объектов DOM и таблицу стилей. Кроме того, асинхронное взаимодействие, реализуемое следующими технологиями, позволяет динамически обновлять данные, не перезагружая всю Web-страницу:
Обратите внимание на то, что существуют другие широко применяемые в Ajax-приложениях альтернативы JSON, такие как XML и неформатированный текст. Здесь мы выбрали для обсуждения JSON, поскольку он некоторым образом влияет на систему защиты, исследуемую в данной статье. Освоение политики единства происхожденияКогда содержимое из нескольких источников каким-либо образом объединяется в одно приложение, эти источники могут иметь различные уровни доверия, либо необязательно доверяют друг другу. Естественным требованием является изолирование содержимого различных источников для минимизации их взаимного влияния. Политика единства происхождения (same-origin policy) является частью механизма защиты современных браузеров, которая изолирует приходящие из различных источников Web-приложения, предполагая, что домены представляют источники. То есть, если приложения в нескольких окнах или фреймах загружены с разных серверов, они не могут иметь доступ к данным и сценариям друг друга. Обратите внимание на то, что политика единства происхождения применима только к HTML-документам. JavaScript-файлы, импортированные в HTML-документ тегами В контексте
Обход политики единства происхождения: JSON и динамический тег scriptПоскольку JSON является просто обычным текстом с простой структурой, использующей скобки, обмениваться JSON-сообщением можно по многим каналам. Из-за политики единства происхождения вы не можете использовать
Когда JavaScript-код динамически вставляет тег <script> , браузер обращается по URL, указанному в атрибуте src . Это приводит к передаче информации в строке запроса к серверу. В листинге 1 в качестве пар ключ-значение передаются параметры username и reservation . Кроме того, строка запроса содержит выходной формат, запрашиваемый у сервера, и имя функции обратного вызова (т.е. showItinerary ). При загрузке тега <script> выполняется функция обратного вызова, а возвращенная с сервера информация передается через ее аргументы.
Обход политики единства происхождения: Ajax-проксиAjax-прокси - это прокси-сервер уровня приложения, являющийся посредником при обмене HTTP-запросами и ответами между Web-браузерами и серверами. Ajax-прокси позволяют Web-браузерам обходить политику единства происхождения и, таким образом, обращаться к сторонним серверам, используя
Обход политики единства происхождения: GreasemonkeyGreasemonkey - это расширение Firefox, позволяющее пользователям изменять стили и содержимое Web-страниц динамически, "на лету". Пользователи Greasemonkey могут связать файлы пользовательского сценария с набором URL. Эти сценарии выполняются при загрузке страницы из набора URL. Greasemonkey предоставляет API для пользовательских сценариев с дополнительными правами (по сравнению с правами сценариев, выполняющихся в "песочнице" (sandbox) браузера). Одним из этих API является Использование Исследование сценариев атакНе только разработчики обходят политику единства происхождения и открывают возможности для атаки злоумышленникам, но и текущие приложения также становятся уязвимыми к атакам при включении вредного кода в Web-приложения. К сожалению, вредный код может найти свой путь в Web-приложения различными способами. Мы кратко обсудим эти возможные пути, значение которых возрастает в контексте Web 2.0. Межсайтовые сценарии (XSS)XSS - это типичная атака, в которой злоумышленник внедряет вредоносный код в обычный нормальный сайт. Двумя основными XSS-атаками являются:
Атака с отраженным XSS использует уязвимые Web-приложения, отображающие входные параметры обратно в браузер, не проверяя их на наличие активного содержимого. Обычно взломщик завлекает жертвы для перехода по URL, используя код, приведенный в листинге 2. Листинг 2. Пример URL для отраженного XSS
Предположим, что на trusted.com размещена функция поиска, которая возвращает результаты поиска вместе с введенными ключевыми словами. Если поисковое приложение не фильтрует в URL специальные символы [например, символы меньше чем (<) и больше чем (>)], содержимое тега Сохраненная XSS-атака становится более важной в связи с широким распространением Web 2.0. Основой Web 2.0 является совместный доступ, взаимодействие и совместная работа, поэтому у потенциальных злоумышленников есть больше шансов увидеть вводимую другими пользователями (посредством публичных сетевых сервисов (social network services - SNS), wiki или блогов) информацию. В любом случае проверка и санитарная обработка вводимых значений является основой защиты от XSS-атак. Обычно Web-серверы удаляют сценарии из введенной пользователем информации, но часто злоумышленники для обхода этих фильтров используют уязвимости, что приводит к масштабным атакам, таким как черви (worms) Yamanner или MySpace. Mashup-приложенияMashup-приложение является Web-приложением, комбинирующим содержимое и сервисы из нескольких источников в один интегрированный пользовательский интерфейс. Типичное mashup-приложение представляет собой одно приложение, выполняющееся на стороне клиента, то есть различные части mashup-приложения могут совместно использовать информацию и взаимодействовать посредством нескольких ресурсов браузера, таких как дерево объектов DOM или свойства окна браузера. Когда какая-то часть mashup-приложения пишется со злым умыслом (или была подделана), возможно внедрение в приложение вредного кода и, как следствие, разные типы атак (аналогичных XSS), включая похищение важной пользовательской информации. Эффект атакиТеперь, когда вы знаете, как злоумышленники вводят свой код в приложения, рассмотрим последствия некоторых типичных атак. Кража куки или паролейСамой прямой выгодой для злоумышленника является получения важной пользовательской информации, такой как пароли или куки. Поскольку внедренные сценарии могут обращаться к любой части дерева объектов DOM, они в состоянии, помимо прочего, похищать пароли из текстовых полей форм регистрации. Например, в листинге 3 приведен код, похищающий информацию и передающий ее на сервер злоумышленника. Листинг 3. Пример атаки: Кража пароля из текстового поля
В этом примере взломщик, прежде чем получить данные пользователя, должен подождать, пока тот не нажмет кнопку submit. Ajax даже облегчает работу взломщика, поскольку позволяет ему передать произвольную информацию на удаленные сервера, не ожидая явных действий пользователя, таких как нажатие кнопки или ссылки. Подобный тип трафика обычно идентифицировался бы как подозрительное поведение, но благодаря асинхронной природе Ajax-приложений этот трафик не обнаруживается. Используя аналогичный подход, взломщик может также похитить куки документа ответственных Web-приложений (например, интерактивных банковских приложений). Куки документа дают возможность взломщику внедриться в сессию или войти в систему с похищенными полномочиями. Обратим внимание на то, что Microsoft Internet Explorer версии 6 и выше поддерживает Похищение событий клавиатуры с помощью клавиатурного регистратораВ листинге 4 приведен простой пример клавиатурного регистратора, похищающего события клавиатуры на Web-странице и передающего их на удаленный сервер. Это позволяет взломщику похитить любые данные, введенные пользователем; например, если пользователь использует сервис Web-почты, клавиатурный регистратор будет записывать и передавать весь введенный текст взломщику. Он может затем проанализировать записанные данные для извлечения конфиденциальной информации (например, пароли и конфиденциальную переписку). Листинг 4. Пример атаки: Клавиатурный регистратор
Похищение событий клавиатуры с помощью перехватчика событий мышкиПрограммные клавиатуры становятся типичным техническим приемом для защиты важной вводимой информации от атак с использованием клавиатурного регистратора, например, PIN-кода для интерактивных банковских сервисов. Однако перехватчики (sniffers) событий мышки могут использовать технологии, аналогичные клавиатурным регистраторам. Похищая координаты X и Y событий мышки, можно определить, какие клавиши были нажаты. В листинге 5 продемонстрирован пример перехватчика событий мышки. Листинг 5. Пример атаки: Перехватчик событий мышки
Вставка неправильной информацииИспользуя DOM-интерфейс, взломщик может изменить любую информацию в дереве объектов DOM. Например, при выполнении пользователем интерактивного перевода денег существует возможность изменить номер счета назначения платежа на принадлежащий взломщику. В результате переведенные деньги поступят на счет злоумышленника. В другом типе атаки взломщик может изменить таблицу стилей для скрытия информации от пользователей. Предположим, например, что Web-страница содержит предупреждающее сообщение, показанное в листинге 6.
Взломщик может изменить таблицу стилей для скрытия предупреждения. Например, в листинге 7 приведен JavaScript-код, меняющий стиль предупреждения и делающий его невидимым на белом фоне. Листинг 7. Пример атаки: Скрытие предупреждений
Рекомендуемые действияТеперь, когда у вас есть базовые знания о том, как могут быть реализованы атаки и какими могут быть их последствия, давайте кратко рассмотрим некоторые технические приемы, которые можно применить для улучшения защищенности Ajax-приложений. Добавление проверки вводимых значенийКак показали приведенные примеры, большинство атак, внедряя вредные сценарии, использует уязвимости на стороне сервера. Следовательно, проверка на корректность вводимой информации является первым шагом для защиты Web-приложений. Проверка ввода и очистка отсеивают все активное или вредное содержимое ненадежных данных. Два типа проверки введенных данных:
Нельзя считать ведение черного или белого списков надежным решением. Однако ведение белого списка обычно считается более защищенным вариантом. Следовательно, рекомендуется использовать ведение белого списка для очистки потенциально опасных данных. Еще одним способом повысить защищенность является модификация (escaping) специальных символов [например, изменение символа "меньше чем" (<) на "<lt;"] в строке, передаваемой и отображаемой в браузерах. Некоторые языки программирования предоставляют полезные встроенные функции для модификации специальных символов. Использование инструментальных средств проверки уязвимостиМногие Web-приложения уязвимы из-за похожих ошибок программирования. Эксперты по защите разработали инструментальные средства для обнаружения этих небезопасных приемов программирования. Такие средства, называемые средствами проверки уязвимости, обнаруживают возможные уязвимости заблаговременно. Одной из наиболее типичных уязвимостей, обнаруживаемых этими инструментальными средствами, является ситуация, когда программисты забывают вызвать процедуру очистки потенциально опасных введенных данных. Не генерируйте и не выполняйте код динамическиВ JavaScript-программе можно использовать несколько способов динамического генерирования кода. Одной из самых известных функций является функция Безопасное использование JSONПоскольку JSON основан на подмножестве JavaScript, он является содержимым сценария, который потенциально может содержать опасный код. Однако JSON - это безопасное подмножество JavaScript, в котором исключены присвоения и активизация. Следовательно, многие JavaScript-библиотеки используют функцию Листинг 8. Проверка JSON-строки с использованием регулярного выражения
Еще более надежной альтернативой является использование JSON-анализатора для синтаксического анализа JSON-данных. Поскольку грамматика JSON довольно проста, легко можно реализовать такой анализатор без существенных потерь для производительности. Использование <iframe> при интеграции подозрительного содержимогоВы можете воспользоваться политикой единства происхождения для затруднения получения злоумышленниками доступа ко всему дереву объектов DOM. При загрузке данных из различных доменов в ЗаключениеВ данной статье мы рассмотрели различные способы обхода политики единства происхождения в приложениях Web 2.0. Мы также продемонстрировали в этой связи новые направления атак на Web-приложения. Мы обсудили обычные типы атак и результаты, которых могут добиться взломщики. Наконец, мы завершили статью коротким разделом передовых методик устранения возможностей проведения некоторых наиболее типичных атак. |