Коды JavaScript от американской Meta✴ и российского «Яндекса», которые владельцы многих сайтов устанавливают для сбора статистики о посещаемости, лишают их посетителей анонимности. Браузеры скрытным образом отправляют уникальные идентификаторы в установленные на те же мобильные устройства приложения обеих компаний — это расценивается как злоупотребление возможностями интернет-протоколов. Google пообещала провести проверку по данному факту.
На проблему указали учёные института IMDEA Networks (Испания), Университета Неймегена (Нидерланды) и Лёвенского католического университета (Бельгия) — их исследование посвящено сервисам Meta✴ Pixel и «Яндекс Метрика». Это аналитические скрипты, помогающие собирать статистику посещаемости сайтов и эффективности рекламных кампаний; по оценкам, они установлены на 5,8 млн и 3 млн сайтов соответственно. Реализованные в этих трекерах механизмы скрытого слежения позволяют компаниям Meta✴ и «Яндекс» обходить основные средства безопасности и защиты конфиденциальности, предоставляемые как ОС Google Android, так и браузерами, работающими на её основе.
В Android существует песочница — защитный механизм, изолирующий процессы друг от друга. Он не позволяет процессам осуществлять некоторые формы взаимодействия с системой и другими установленными на устройстве приложениями, перекрывая несанкционированный доступ к конфиденциальным данным и привилегированным системным ресурсам. В браузерах используются механизмы изоляции состояния (state partitioning) и изоляции хранилища (storage partitioning): файлы cookie и другие связанные с сайтами данные хранятся в контейнерах, уникальных для каждого домена верхнего (второго) уровня, что гарантирует их недоступность для других сайтов.
«Яндекс» начал обходить эти средства защиты в 2017 году; Meta✴ ввела аналогичную практику в сентябре прошлого года. Разработанные компаниями методы позволяют передавать файлы cookie и другие идентификаторы из браузеров на базе Firefox и Chromium не в другие браузеры, а в собственные приложения разработчиков — в клиенты Facebook✴ и Instagram✴ в случае Meta✴ и в приложения «Яндекса», ассортимент которых достаточно обширен. После передачи данных история просмотров сопоставляется с владельцем учётной записи, вошедшим в соответствующее приложение.
Эти недобросовестные схемы обнаружены только в экосистеме Android, и собранные исследователями данные свидетельствуют, что Meta✴ Pixel и «Яндекс Метрика» реализовывали их только с пользователями Android. Однако существует техническая возможность повторить их и на Apple iOS, так как браузеры на этой платформе позволяют разработчикам устанавливать соединения с приложениями, прослушивающими локальные порты. В отличие от iOS, платформа Android менее строго контролирует локальные подключения и фоновую работу мобильных приложений, а в магазинах приложений под Android осуществляется менее строгий контроль, что облегчает проведение подобных злоупотреблений.
Благодаря чрезмерной свободе действий Meta✴ Pixel и «Яндекс Метрика» прямо из мобильных браузеров без уведомления пользователя отправляют веб-запросы с идентификаторами отслеживания на определённые локальные порты (localhost или IP-адрес 127.0.0.1), которые постоянно прослушиваются клиентами Facebook✴, Instagram✴ и приложениями «Яндекса». В этих приложениях используемые в качестве псевдонимов идентификаторы связываются с фактическими идентификационными данными пользователей даже в режиме приватного просмотра. В итоге при просмотре сайтов, содержащих эти трекеры, пользователь лишается анонимности.
Представитель Google заявил, что такие схемы нарушают условия обслуживания платформы «Play Маркет» и обманывают ожидания пользователей Android в плане конфиденциальности. Компания уже развернула некоторые изменения для смягчения последствий таких злоупотреблений и напрямую связалась с замешанными в инциденте сторонами.
В Meta✴ не дали прямого ответа на вопросы, относящиеся к сомнительной схеме, но предоставили следующее заявление: «Мы вступили в переговоры с Google, чтобы устранить возможное непонимание в отношении действия их политик. Узнав о проблеме, мы решили приостановить работу функции, пока работаем с Google над решением проблемы». В «Яндексе» также заявили, что отказались от сомнительных действий и связались с Google. «„Яндекс“ строго соблюдает стандарты защиты данных и не деанонимизирует пользовательские данные. Эта функция не собирает никакой конфиденциальной информации и предназначается исключительно для улучшения персонализации в наших приложениях», — заявили в российской компании.
В сентябре прошлого года сервис Meta✴ Pixel начал отправлять HTTP-запросы на порт 12387. Месяц спустя служба прекратила отправку данных, но приложения Facebook✴ и Instagram✴ продолжали слушать порт. В ноябре Meta✴ Pixel переключился на другой метод, вызывающий протокол двусторонней связи WebSocket через тот же порт 12387. В ноябре же сервис развернул новый метод, в основу которого лёг протокол одноранговой связи WebRTC, который обычно используется для совершения аудио- и видеозвонков через браузер. В этом методе использовался сложный процесс SDP-манинга — изменение данных протокола описания сеанса (SDP) перед их отправкой. Этот метод применяется и по сей день: ключевые данные файла cookie «_fbp» вставляются в поля, предназначенные для информации о подключении. Браузер отправлял эти данные в рамках запроса STUN на локальный хост Android, где приложения Facebook✴ или Instagram✴ считывали их и связывали с пользователем. В мае в бета-версии Chrome используемый сервисом Meta✴ Pixel тип SDP-манинга заблокировали, и Meta✴ заменила запросы STUN на TURN.
Первый известный случай деанонимизации пользователей сервиса «Яндекс Метрика» датировали маем 2017 года, когда трекер начал отправлять HTTP-запросы на локальные порты 29009 и 30102. В мае 2018 года служба начала отправлять данные по защищённому HTTPS на порты 29010 и 30103 — оба метода по состоянию на вчерашний день продолжали работать.
Некоторые браузеры блокировали потенциально опасные директивы JavaScript в трекерах. Например, DuckDuckGo блокировал связанные с трекерами IP-адреса, не позволяя отправлять идентификаторы в Meta✴; большинство доменов «Яндекс Метрики» также блокировались браузером. Браузер Brave внёс трекеры в чёрные списки и блокировал отправку данных без явного согласия пользователя. Браузер Vivaldi отправлял данные на локальные порты только при настройках конфиденциальности по умолчанию, но при включении блокировки трекеров закрывал утечку истории просмотров. Но, предупреждают исследователи, Meta✴ и «Яндекс» в любой момент могут обойти эти меры защиты.
Надёжное и долгосрочное решение проблемы должно предусматривать создание средств управления конфиденциальностью на каналах localhost, чтобы пользователи знали об этом методе утечки данных, могли его контролировать и ограничивать подобные злоупотребления. Chrome и большинство браузеров на базе Chromium выполняли директивы JavaScript так, как хотели в Meta✴ и «Яндексе»; Firefox тоже вёл себя послушно, но по неизвестной причине не мог производить SDP-манинг в более поздних версиях кода. Две недели назад общедоступная версия Chrome начала блокировать как STUN-, так и TURN-запросы в рамках скрипта, и, вероятно, в ближайшее время такие же изменения ждут прочие браузеры на базе Chromium. Представитель разработчиков Firefox заявил, что компания всерьёз отнеслась к инциденту.
Проблема в том, что в текущем виде все эти исправления направлены исключительно на схемы, которые реализовывали Meta✴ и «Яндекс», а значит, от них будет достаточно минимальных изменений, чтобы обойти ограничения — например, поменять номера портов. Поэтому исследователи рекомендуют ограничить подобные схемы на уровне мобильной платформы и браузера, введя более строгие политики для ограничения злоупотреблений.
Google пока не дала никаких намёков, что намеревается внедрить новую реализацию обработки доступа к локальным портам на уровне Android. Самым надёжным способом защититься от злоупотреблений пока является отказ от клиентов Facebook✴ и Instagram✴, а также приложений «Яндекса» для Android.