Современные браузеры поддерживают функцию HTTP Strict Transport Security (HSTS). Флаг HSTS показывает, что с определённого домена нужно запрашивать шифрованную HTTPS-версию — даже если переход осуществляется по HTTP, а не HTTPS. Механизм нужен для обеспечения дополнительного уровня безопасности: браузер мог бы запросить HTTP-версию страницы, которую легко прослушать или подменить. Так можно избежать некоторых атак с понижением уровня защиты и перехват куки.
Данные, что у конкретного домена был установленный флаг HSTS, сохраняются в браузере пользователя. Это логическая переменная (true/false). Это не куки-файлы, а информация о безопасности, поэтому браузеры относятся к ней иначе. О слежении с помощью куки хорошо известно. Пользователь может зайти в настройки браузера и удалить те куки, которые ему не нравятся. Есть отдельные дополнения, которые запрещают приём куки от доменов маркетинговых компаний. Очистка настроек HSTS не так прозрачна — в браузерах можно удалить лишь все флаги для всех сайтов сразу. В январе Сэм Гринхал продемонстрировал, что с помощью HSTS можно создать суперкуки, которые не так легко удалить.
В прошлом месяце Янь Чжу показала на конференции ToorCon в Сан-Диего Sniffly. Проект использует HSTS и Content Security Policy для того, чтобы определить, какие сайты из списка пользователь уже посетил.
Sniffly выглядит как обычная веб-страница. После перехода на неё Sniffly проверит ряд сайтов и покажет, на каких ресурсах пользователь, вероятно, был, а на каких, вероятно, не был. В некоторых случаях Sniffly выдаёт данные с большими ошибками. Перед посещением рекомендуется отключить HTTPS Everywhere, если это дополнение установлено. Sniffly работает только в основных браузерах, и не показывает правильные результаты в Chrome для iOS, Internet Explorer и Safari.
Как это работает?
Принцип работы Sniffly прост и кратко описан в презентации для ToorCon. Если владелец sneaky.com знает, что example.com использует HSTS, то он может встроить любой элемент example.com на свою страницу sneaky.com. Затем при каждом посещении sneaky.com пользователь будет запрашивать этот элемент, что означает запрос к example.com.
Если пользователь уже посещал example.com, то его браузер уже хранит данные HSTS, поэтому произойдёт внутренний редирект на HTTPS-версию страницы example.com. Этот редирект происходит практически мгновенно. Если пользователь никогда не был на example.com, то будет совершён полноценный сетевой запрос с получением кода HTTP 301 или 302 — то есть редирект на HTTPS-версию. Этот запрос займёт куда больше времени. Замер времени позволит произвести тайминг-атаку и установить факт посещения того или иного ресурса с HSTS.
Но нужно произвести замер времени. Для этого используется злоупотребление Content Security Policy (политика безопасности контента). Забавно, что как и HSTS, это тоже инструмент безопасности. Стандарт предназначен для предотвращения загрузки контента, что призвано избавить от XSS-атак. Всё, что нужно sneaky.com для проведения своей атаки — это запрет загрузки картинок по HTTPS. При попытке загрузить картинку по HTTPS происходит ошибка, которую регистрирует код на JavaScript. Если пользователь был на example.com и имеет флаг HSTS, ошибка приходит в течение порядка миллисекунды. Если совершается полноценный запрос, то ошибка приходит через сотню миллисекунд или больше.
Sniffly применяет изложенные выше принципы к нескольким сотням HSTS-ресурсов, которые были отобраны из первого миллиона рейтинга Alexa.com. Sniffly может хуже работать с новыми версиями браузеров, с дополнениями HTTPS Everywhere или в браузере Tor. Автор утверждает, что в принципе можно попробовать отследить с помощью тайминга не только факт посещения ресурса, но и наличия файла в кэше.
Легко найти применение этому инструменту. Это не только различные системы для изучения вкусов пользователя с целью продать ему релевантную рекламу. Это также утечка важной личной информации. Можно установить круг интересов пользователя, его взгляды и предпочтения.
Противостоять атаке можно. Современные браузеры имеют встроенный список доменов, доступ к которым будет осуществляться только по HTTPS. Достаточно добиться попадания доменного имени ресурса в список HSTS Preload популярных браузеров, и установить факт его посещения уже будет невозможно.
Автор: atomlib