Интернет проник во все сферы жизни, вклад этой технологии в прогресс невозможно переоценить. Интернет-браузеры (Chrome, Firefox, Safari, Opera и т.д.) занимают топ среди инструментов "использования интернета", а сайты, которые посещают через эти браузеры — самый распространенный способ для обмена информацией.

Читатель, вероятно, знаком с основными технологиями для создания сайтов: HTML, CSS и JavaScript (он же — ECMAScript). Первые две технологии — статичный текст со специальным синтаксисом, который браузер использует для формирования визуальной части сайта. JavaScript, в свою очередь, является полноценным языком программирования, который оживляет сайты, превращая их в веб-приложения. Код JavaScript чаще всего приходит с сервера в виде текста, как и HTML/CSS, но это не статичный макет страницы, а код, который исполняется интерпретатором, встроенным в браузер. Сайт с использованием JS может быть чем угодно: от полноценного мессенджера и приложения для видеоконференций до онлайн-шутера с 3D-графикой. Браузеры исполняют код JavaScript в изолированной среде с очень ограниченным доступом, поэтому сайты не имеют доступа, например, к терминалу операционной системы, файловой системе и другим приложениям.

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

Сложно переоценить пользу JS, который делает сайты интерактивными, удобными и современными. В то же время опасность, которая в нем таится, обычно ускользает от внимания. Эта статья — попытка заглянуть монстру в глаза, попутно открывая глаза читателя.

Картинка для привлечения внимания
Картинка для привлечения внимания

HTTP

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

Для связи с сервером браузеры используют HTTP — протокол передачи текста со ссылочками и кнопочками, т.е. передачи документов в формате HTML, красоту которому придает CSS (цвета, рамки, отступы между элементами и прочее).

Сообщения HTTP состоят из двух частей: заголовков и тела. В заголовках передаются служебные данные, а в теле — полезная нагрузка вроде файлов сайта для отображения в браузере или картинку, которую пользователя загружает на сайт со своего устройства.

При запросе на сервер, заголовки сообщают базовую информацию о клиенте: предпочитаемый язык, версию браузера, версию протокола HTTP и прочее, что сервер использует для отображения пользователю версии сайта, которая подойдет ему лучше всего. Например, будет содержать текст на родном языке.

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

Тонна куков на Github
Тонна куков на Github

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

Плашка сайта с предупреждением о использовании куков
Плашка сайта с предупреждением о использовании куков

HTTP разрабатывался до появления JavaScript и позволяет делать весьма сложные и функциональные сайты, но для обновления содержимого на странице такого сайта, страница должна быть полностью обновлена, например, по клику на кнопку. Пока этого не случится, страница неизменна с момента ее получения от сервера. О современном чате, который работает в реальном времени, или всплывающих уведомлениях, а также о многом другом, что современный пользователь привык видеть, без JS говорить не приходится.

JavaScript предоставляет разработчикам возможность создавать динамическое поведение на страницах, взаимодействовать с пользователем и изменять содержимое в реальном времени. Это делает его мощным инструментом, но также и источником потенциальных угроз. Поскольку JS-код это всегда "кот в мешке", существует риск выполнения вредоносного кода, который может украсть данные пользователя, отслеживать его действия и что еще похуже.

Слежка обыкновенная

Помимо простых куков, JavaScript предлагает такие механизмы, как LocalStorage, SessionStorage и IndexedDB, которые позволяют хранить данные в браузере. LocalStorage и SessionStorage схожи, отличие только в том, что LocalStorage сохраняет информацию на неограниченный срок, а SessionStorage очищается при закрытии вкладки. Оба метода при грамотном использовании улучшают общее впечатление от сайта, который запоминает выбранную тему оформления, товары в корзине и т.п. Третий тип хранилища отличается. IndexedDB — это уже не баловство с мелкими файликами, а база данных, которая позволяет упорядоченно хранить большие объемы информации, например, для возможности полноценного использования веб-приложения в режиме оффлайн, а также для явного кеширования большого объема данных, которые редко изменяются на сервере.

Шизофренией будет сказать, что все это придумано злодеями. Конечно нет, упомянутые технологии делают интернет таким, каким его любят миллионы людей. Но есть нюанс: пользователь, который понимает, что такое куки, которые открыто передаются в хедерах (заголовках) при каждом запросе, может не иметь представления о каком-то еще хранилище данных, которые записываются и читаются кодом JS. Следовательно, использовать эти данные и передавать их на сервер, JS-приложение, исполняемое в браузере, может более скрытно, неочевидно.

Чтобы веб-разработка не превратилась в очевидный бандитизм, существуют ограничения на то, чтобы использовать хранилища, включая куки, могли только те сайты, которые их установили. То есть хранилища в браузере работают с привязкой к домену сайта (есть Third-Party Cookies, но погоду это не делает). Таким образом, случайный визит на сайт Пети и Васи не может привести к краже токена авторизации от Хабра.

Познания в вопросах приватности при веб-сёрфинге на этом заканчиваются у 90% респондентов моего вымышленного опроса: историю надо чистить, куки удалять, хранилища освобождать. Все это на виду в настройках браузера.

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

Истоки недоверия

Кому-то может показаться, что эта статья и подобные материалы — глупая истерия фанатиков, которые либо занимаются криминалом, либо старадают паранойей. Чтобы контекст недоверия к JavaScript был более понятным, надо перечислить векторы злоупотребления.

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

Наивно полагать, что слежка за пользователем ограничивается экосистемой сервисов одного владельца вроде Google, Yandex и прочих. Самый посредственный сайт из провинции подключает внешнюю аналитику, чтобы наблюдать за посещаемостью, заодно сливая хозяевам мониторинга информацию о своих пользователях, которые загружают вредоносный JS-код, открывая страницу. Хозяевами таких мониторингов, как правило, являются те самые гигантские корпорации, обещающие, что их отслеживающие скрипты на странице стороннего сайта помогают индексировать его содержимое для выдачи при поисковых запросах — заманчиво!

Помимо отслеживания пользователей, на которое явно соглашается веб-мастер, обслуживающий сайт, существуют другие уловки. Например, внешний CDN. Просто говоря, это сервисы, которые дают возможность загружать JS-библиотеки, наборы готовых стилей CSS или красивые шрифты с их серверов. Почему-то у разработчиков не принято скачивать эти файлы к себе, а затем явно добавлять их в проект, загружая на свой сервер. Делается иначе: в страницу своего сайта они вставляют лишь ссылку на нужный файл на чужом сервере. В таком случае при загрузке страницы условно моего сайта, пользовательский браузер увидит, что какой-то файл надо скачать с другого адреса и обратится к нему. Если ранее сервер с ресурсами встречался на других сайтах и успел выдать вам идентификтор, браузер автоматически подставит его в запрос. Хитрый CDN отдаст файлы, а также запишет информацию с какого сайта к нему пришел пользователь (заголовок Referrer) и сделает все возможные выводы о его поведении.

В конце концов любой сайт может подключить отслеживание своих пользователей с полным осознанием — на основании специальной партнерской программы.

Запрос на сторонний сервис за сомнительным файлом на самом безобидном сайте
Запрос на сторонний сервис за сомнительным файлом на самом безобидном сайте

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

Не бэкдор, а фича

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

Fingerprint (отпечаток) — это общее название для любого уникального идентфикатора пользователя. В отличие от традиционных методов отслеживания, таких как куки, фингерпринтинг не может быть легко заблокирован пользователями, а его создание может быть адаптированным под возможные изменения источников. Это создает дополнительные сложности для тех, кто хочет сохранить свою анонимность в сети.

Удалили куки в один клик, но сайт при входе здоровается с вами по имени? Поздравляю, это фингерпринт. Откуда он берется узнаете дальше.

Фингерпринты

WebGL (Web Graphics Library) — это мощный инструмент для рендеринга 2D и 3D графики в веб-браузерах. Самое первое, что приходит на ум — майнинг условной криптовлюты в браузере, но более практичное нецелевое использование — фингерпринтинг. WebGL дает обширный набор параметров для их уникальной привязки к пользователю: аппаратное оснащение для параллельных вычислений (видеокарты), разрешение экрана(-ов) и прочие более специфичные аспекты.

Canvas — это HTML-элемент, который позволяет динамически рисовать графику с помощью JavaScript. Он предоставляет мощный инструмент для создания 2D и 3D графики, а также для работы с изображениями, анимацией и интерактивными приложениями. Canvas стал важной частью веб-разработки, особенно в контексте игр, визуализаций данных и других графически насыщенных приложений. Разные устройства и браузеры могут обрабатывать графику по-разному, что приводит к различиям в получаемых данных. Например, если на одном устройстве используется определенный шрифт, а на другом — другой, это может создать уникальный отпечаток, который можно использовать для идентификации пользователя.

Отпечаток шрифтов — это метод, который использует информацию о шрифтах, установленных на устройстве пользователя, для создания уникального профиля. Разные устройства могут иметь разные наборы шрифтов, и это может быть использовано для идентификации пользователя. Это может быть сделано с помощью создания текстовых элементов с различными шрифтами и измерения их ширины или высоты. Если браузер отображает текст с определенным шрифтом, это может быть использовано для определения, установлен ли этот шрифт на устройстве. Сравнение размеров текста с различными шрифтами позволяет определить, какие шрифты доступны, и создать уникальный отпечаток.

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

Audio API — одна из многих полезных штук браузеров, которая в конкретном случае отвечает за воспроизведение звуков. Веб-приложение может генерировать звук и собирать данные о различных характеристиках вывода, таких как: частота дискретизации, задержки и анализ частот (искажения или изменения в амплитуде).

Фингерпринтинг часто комбинирует в себе несколько уникальных значений в одно. Это позволяет создать более точный и уникальный отпечаток конкретного браузера, который может не меняться годами несмотря на очистку истории и прочих успокоительных мер. Приведенный здесь список источников для фингерпринта не полный.

WebRTC

WebRTC (Web Real-Time Communication) — мощная технология, разработанная для обеспечения прямой передачи аудио, видео и данных между браузерами без необходимости в промежуточных серверах. Она особенно привлекательна для создания сервисов видеозвонков, онлайн-игр и других интерактивных приложений.

Несмотря на свои достоинства, WebRTC представляет прямую угрозу для конфиденциальности пользователей. Одним из основных рисков является возможность утечки IP-адресов. Когда пользователь подключается к WebRTC-приложению, его реальный IP-адрес может быть раскрыт, даже если он использует VPN или прокси-сервер. Это происходит потому, что WebRTC устанавливает прямое соединение между участниками соединения, что может привести к утечке информации о местоположении пользователя.

Технически говоря, WebRTC работает по UDP. Запросы этого типа вовсе не отображаются во вкладке сети в инструментах разработчика. В ряде сценариев, они минуют настройки прокси и в лучших традициях UDP такие запросы разлетаются со всех сетевых интерфейсов устройства, имея потенциал даже для обхода VPN-подключения. Никаких внешних признаков — идеальный деанон.

Простой юзкейс: пользователь настроил в браузере HTTP-прокси, чтобы ходить на сайты с подмененным IP-адресом. Он заходит на сайт, который инициирует соединение по WebRTC и, если оно удалось, сервер тут же узнаёт реальный IP-адрес гостя. Этот прием часто используется антифрод-системами, чтобы определить пытается ли пользователь прятаться и где он на самом деле находится. Более фатально это выглядит в ситуации, когда речь идет о пользователе анонимной сети вроде I2P, который использует HTTP-прокси. При включенном JavaScript, любой сайт в анонимной сети может инициировать прямое соединение вызовом одного метода. Есть пара "но", но есть и успешные тесты.

Аудио-куки

Лично мне этот вектор деанонимизации кажется самым жутким по своей эффективности, простоте и неочевидности для зеваки-маминого-молодца.

Веб-приложения могут использовать динамики для воспроизведения звуковых сигналов с частотой выше 20 кГц, которые не воспринимаются человеческим ухом, но которые могут быть улавливаемы другими устройствами, такими как смартфоны, планшеты и другие устройства с микрофонами в радиусе квартиры или кафе (горячий привет всем "умным" колонкам в вашем доме!).

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

Как быть?

В лес нам наверняка уже не уйти, в землянке не жить. Чтобы статья не превратилась в околофилософскую воду, дам краткий и во многом очевидный набор советов.

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

Настройте веб-браузер. Пусть это будет Firefox или его форк — никакой привязки к корпорации со своим поисковиком из коробки, как это сделано в Google Chrome и прочих хромиумных клонах.

  1. Смените поисковик на DuckDuckGo - это меньшее из зол;

  2. Установите плагины для отключения WebRTC, затруднения фингерпринтинга и блокировки рекламы. Также можете установить NoScript, который полностью отключает JS и для каждого домена его надо будет разрешать вручную.

Базовый набор расширений браузера
Базовый набор расширений браузера

</>

В триллерах и детективах часто фигурируют "жучки", "трекеры" и прочие схожие термины, цель и суть которых в слежке. Если в фильмах и книгах такое встречается иногда и граничит с применением силы, то в современном интернете слежка встречается очень часто и зачастую красиво обставлена. Акцент на слове "очень" можно было бы отразить как "ООООЧЕНЬ", но и этого было бы мало.

JavaScript: удобство или угроза? Простого ответа нет. Ясно лишь, что технология не безобидная и использовать ее надо осторожно, ответственно и с теоритической подготовкой.

Приватность - право каждого пользователя, равно как и его личная ответственность.

Комментарии (1)


  1. Robastik
    23.12.2024 01:24

    Когда банки сливают данные KYC - это мы сразу чувствуем и поэтому понимаем. То же самое с госуслугами, всеми прочими госами (в т.ч. ВК и Я) и опсосами. Когда мне в телегу стучится фейковый руководитель, я понимаю, что это привет от соцфонда, госуслуг или опсоса.

    Но вот совет

    откажитесь от использования продукции корпораций

    не понятен. Ну да, гуглы и прочие фейсбуки (ровно как и скрепный касперский, и сбер) собирают каждый клик, сохраняют введенные и не отправленные тексты, сам характер ввода, фактически представляющий собой биометрию.

    Но звонки из "Центральных Банков", "Центральных Аппаратов МВД" и прочих "опросов общественного мнения" происходят явно не по вине гугла.

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

    Приватность - право каждого пользователя

    Это про страну с официально запрещенными ВПН и TLS 1.3 с ECH?


    1. MAXH0
      23.12.2024 01:24

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


      1. Robastik
        23.12.2024 01:24

        JavaScript: Удобство или Угроза?

        Ни в постановке, ни при раскрытии вопроса акцент на "там и здесь" отсутствует.

        совет

        откажитесь от использования продукции корпораций

        не понятен

        Именно мне непонятен, не кому-то "там". Я с "там" не сравниваю и "тамом" не интересуюсь.

        Если вам понятен, то раскройте вред от гугла в российском правовом ландшафте.