Содержание статьи
Это близкий к тексту пересказ статьи «Meta and Yandex are de-anonymizing Android users’ web browsing identifiers» с сайта Ars Technica. Ее автор — Дэн Гудин.
В расследовании участвовали:
- Аникет Гириш, аспирант в IMDEA Networks;
- Гюнеш Акар, доцент группы цифровой безопасности и iHub в Университете Радбауд;
- Нарсео Валлина‑Родригес, доцент IMDEA Networks;
- Нипуна Вирасекара, аспирант IMDEA Networks;
- Тим Влуменс, аспирант в COSIC, Лёвенский католический университет.
(*) Деятельность компании Meta Platforms признана экстремистской и запрещена в России.
(**) Программы Facebook и Instagram принадлежат компании Meta, деятельность которой признана экстремистской и запрещена на территории РФ.
Песочница Android изолирует процессы, чтобы те не взаимодействовали с ОС или другими приложениями на устройстве, отрезая доступ к важным данным и системным ресурсам. Меры защиты, такие как разделение состояния и разделение хранения, встроенные во все основные браузеры, контейнеризуют данные сайтов, защищая от покушений со стороны других сайтов. Однако это удалось обойти.
Скрытое отслеживание через трекеры Meta Pixel и «Яндекс Метрики» позволяет Meta и «Яндексу» обходить основные механизмы безопасности и конфиденциальности как Android, так и браузеров для этой ОС.
Прорыв
«Один из основных принципов безопасности в вебе и мобильных системах называется песочницей, — объясняет в интервью Нарсео Валлина‑Родригес, один из исследователей, нашедших проблему. — Ты запускаешь все в песочнице, и между разными элементами взаимодействия нет. Однако эта уязвимость позволяет обойти песочницу, которая отделяет мобильный контекст от веб‑контекста. Этот канал дает возможность передавать информацию о том, что происходит в браузере, в мобильное приложение».
Байпас, который в «Яндексе» запустили еще в 2017 году, а в Meta подхватили прошлой осенью, позволяет компаниям прокидывать cookie и другие идентификаторы из браузеров на базе Firefox и Chromium в нативные Android-приложения Facebook, Instagram и разные приложения «Яндекса». В результате всю твою историю в браузере можно связать с учеткой, под которой ты залогинен в приложении.
Замечено такое пока только на Android. Исследователи говорят, что теоретически схожим методом можно атаковать и iOS. Ведь браузеры на этой платформе позволяют разработчикам программно устанавливать соединения с localhost, а приложения — отслеживать такие подключения.
В отличие от iOS, Android дает больше возможностей для локальных коммуникаций и фоновой работы процессов мобильных приложений. Meta Pixel и «Яндекс Метрика» без труда могут отправлять веб‑запросы с идентификаторами для веб‑трекинга на локальные порты, которые постоянно отслеживаются приложениями Facebook, Instagram и «Яндекса». В итоге эти приложения могут связывать веб‑айдентити с реальными пользовательскими данными, даже если ты сидишь в приватном режиме.
info
В Google Play сейчас ужесточили правила для загружаемых в магазин приложений — как раз чтобы пресекать такое.
Meta Pixel и «Яндекс Метрика» — это аналитические скрипты, созданные, чтобы помочь рекламодателям. Meta Pixel установлен примерно на шести миллионах сайтов, а «Яндекс Метрика» — на трех миллионах ресурсов.
Meta и «Яндекс» умудрились обойти ограничения, используя базовую возможность современных мобильных браузеров — общение с нативными приложениями. Эта штука позволяет браузерам отправлять веб‑запросы на локальные порты Android, чтобы, например, создавать соединения через протокол RTC, шейрить файлы и отлаживать приложения.

Вот концептуальная схема, где видно, как веб‑трекеры, работающие в браузере, обмениваются идентификаторами с нативными приложениями Facebook, Instagram и «Яндекс» для Android.
Хотя технические детали различаются, Meta Pixel и «Яндекс Метрика» занимаются своеобразным злоупотреблением протоколом, чтобы получить доступ к локальным портам на IP 127.0.0.1, который предоставляет Android. Браузеры спокойно обращаются к этим портам без каких‑либо уведомлений для пользователя. Приложения Meta и «Яндекса» тихо слушают эти порты, в реальном времени снимают идентификаторы и связывают их с пользователем, который залогинен в приложении.
Представитель Google заявил, что такое поведение нарушает условия использования платформы Play и ожидания пользователей Android в плане конфиденциальности.
«Программисты, которых упомянули в этом докладе, умудрились использовать возможности браузеров на iOS и Android так, что это просто в корне противоречит нашим принципам безопасности и конфиденциальности, — заявил представитель, имея в виду тех, кто пишет JavaScript для Meta Pixel и «Яндекс Метрики». — Мы уже внесли изменения, чтобы предотвратить подобные маневры. Также мы запустили свое расследование и напрямую общаемся с причастными сторонами».
Представитель Meta не стал отвечать на вопросы, но прислал такое заявление:
«Мы ведем переговоры с Google, чтобы уладить недопонимание относительно применения их правил. Когда мы поняли, что возникли вопросы, решили приостановить использование этой возможности, пока вместе с Google не разберемся в ситуации».
В письме представитель «Яндекса» сообщил, что в компании прекращают эту практику и уже работают с Google:
«Яндекс строго соблюдает стандарты защиты данных и не деанонимизирует пользовательскую информацию, — отмечается в заявлении. — Эта функция не собирает никакой конфиденциальной информации и предназначена исключительно для того, чтобы улучшить персонализацию в наших приложениях».
Как вычисляют пользователей Android
Разработчики Meta Pixel хитро обходили протоколы, чтобы внедрить скрытую прослушку, причем начали они этим заниматься в сентябре прошлого года. Сначала они заставляли приложения отсылать HTTP-запросы на порт 12387. Но уже через месяц Meta Pixel прекратил отправку этих данных, хотя приложения Facebook и Instagram не переставали мониторить этот порт.
В ноябре 2024 года Meta Pixel перешел на новенький метод — с использованием WebSocket, протокола для двустороннего обмена данными, который работал на порте 12387.
В том же месяце в Meta Pixel внедрили новую фишку — использование WebRTC. Это пиринговый протокол, который обычно применяют для звонков через браузер.
Тут дело в магии, называемой SDP munging: JavaScript позволяет менять данные SDP (Session Description Protocol) перед их отправкой. SDP munging в исполнении Meta Pixel подмешивает содержимое куки _fbp
в поля, которые обычно хранят информацию о соединении.
В итоге браузер отправляет эти данные в STUN-запросе на локальный хост Android, где приложение Facebook или Instagram спокойно считывает их и связывает с юзером.
В мае в бета‑версии Chrome появилась защита, блокирующая этот тип модификации SDP. Однако всего через несколько дней разработчики Meta Pixel обошли эту защиту, добавив новый метод, который заменял запросы STUN запросами TURN.

Исследователи досконально показали, как устроена кука _fbp
, которую сайт отправляет в нативное приложение. Оттуда информация уже идет на сервер Meta.
- Пользователь запускает нативное приложение Facebook или Instagram, которое затем отправляется в фоновый режим и создает фоновую службу для прослушивания входящего трафика на порте TCP (12387 или 12388) и на UDP (первый свободный в диапазоне 12580–12585). Для этого юзер должен быть залогинен в приложении.
- Далее юзер открывает браузер и заходит на сайт с интегрированным Meta Pixel. На некоторых сайтах перед загрузкой Meta Pixel требуется согласие пользователя. Но, по нашим данным из 100 тысяч страниц, лишь меньшинство сайтов делает это, в то время как более 75% затронутых ресурсов не требуют согласия.
- Загружается скрипт Meta Pixel, который отправляет куку
_fbp
в нативное приложение Instagram или Facebook через WebRTC (STUN) SDP munging. Этот же скрипт шлет значение_fbp
наhttps://
вместе с URL страницы (www. facebook. com/ tr dl
), метаданными сайта и браузера, а также типом события (ev
), например «Просмотр страницы», «Добавление в корзину», «Пожертвование» или «Покупка». - Приложения Facebook или Instagram получают куку
_fbp
от скриптов Meta, запущенных в браузере, и передают данные на эндпоинт GraphQL (https://
) вместе с другими постоянными идентификаторами пользователя, связывая твойgraph[.] facebook[.] com/ graphql fbp
(веб‑посещение) с твоей учетной записью Facebook или Instagram.ID

«Яндекс»
Известно, что «Яндекс Метрика» начала связывать посещенные сайты в браузерах Android с идентификаторами приложений в мае 2017 года, когда трекер стал отправлять HTTP-запросы на локальные порты 29009 и 30102. В мае 2018 года «Яндекс Метрика» начала слать данные через HTTPS на порты 29010 и 30103.


Некоторые браузеры для Android начали блокировать особо наглые скрипты в трекерах. Возьмем DuckDuckGo: он и раньше отсеивал домены и IP, связанные с этими трекерами, чтобы браузер ничего не сливал компании Meta. Точно так же он рубит на корню и большую часть обращений к доменам, связанным с «Яндекс Метрикой». После того как исследователи сообщили DuckDuckGo о неполном черном списке, разработчики быстро добавили недостающие адреса.
Браузер Brave, кстати, тоже умеет блокировать передачу идентификаторов благодаря своим длиннющим блек‑листам и защите от запросов на localhost без явного согласия пользователя. А вот Vivaldi, другой браузер на базе Chromium, при стандартных настройках приватности отправляет идентификаторы на локальные порты Android. Исследователи говорят, что, если включить блокировку трекеров, это решает проблему утечки истории просмотров.

Как бороться
Лекарства, которые прописали себе DuckDuckGo, Brave, Vivaldi и Chrome, пока что действуют как надо, но исследователи предупреждают, что в любой момент это может перестать работать.
«Попытки создать черные списки для браузеров закончатся бесконечной гонкой вооружений, и это всего лишь частичное решение, — говорит Валлина‑Родригес о текущих методах борьбы. — Создавать эффективные списки блокировок — задача непростая, ведь разработчикам браузеров придется постоянно мониторить, как используются эти возможности, чтобы выявлять другие хосты, которые могут злоупотреблять каналами localhost, и обновлять свои списки».
Он продолжает:
Может, такой подход и сработает, когда тебе известны нужные хостнеймы, но это не лучший способ решения проблемы. Трекеры могут найти обходной путь (например, использовать временные хостнеймы). Долгосрочное решение должно включать в себя разработку и внедрение механизмов конфиденциальности и безопасности для каналов localhost: чтобы пользователи могли узнавать о том, что происходит такое взаимодействие, и при необходимости ограничивать его (например, через разрешения).
Chrome и большинство других браузеров на базе Chromium выполняли JavaScript так, как задумали в Meta и «Яндексе». Firefox тоже прошел этот тест, но по непонятным причинам браузер не смог успешно выполнить SDP munging, используемый в последних версиях кода.
В ранней майской бета‑версии Chrome заблокировал STUN-вариант SDP munging, а продакшен‑версия, выпущенная две недели назад, начала блокировать как STUN-, так и TURN-варианты.
Скорее всего, другие браузеры на базе Chromium внедрят это в ближайшие недели. Представитель Mozilla заявил, что в организации придают большое значение конфиденциальности пользователей и серьезно отнесутся к этому отчету.
«Мы активно расследуем описанное поведение и пытаемся выяснить все его технические нюансы и последствия, — сообщили в Mozilla. — На основании того, что мы уже видели, считаем это серьезным нарушением наших антитрекинговых политик и ищем способы защититься от новых трекинговых хитростей».
Исследователи предупреждают, что нынешние фиксы настолько завязаны на конкретный код трекеров Meta и «Яндекса», что обойти их можно простым обновлением.
«Они понимают, что если кто‑то другой зайдет и попробует другой порт, то вполне может обойти эту защиту, — говорит Гюнеш Акар, тот самый исследователь, который впервые наткнулся на эту уязвимость, имея в виду разработчиков Chrome из Google. — Но насколько мы понимаем, они хотят послать четкий сигнал: так издеваться над системой все же не прокатит».
Исследователь Валлина‑Родригес считает, что самый надежный способ предотвратить злоупотребления — это чтобы Android полностью пересмотрел, как он обрабатывает доступ к локальным портам.
«Основная проблема в том, что доступ к сокетам локального хоста на Android вообще не контролируется, — объясняет он. — Пользователи не могут предотвратить такого рода связь на своих устройствах. Из‑за динамической природы JavaScript и сложности в обновлении блок‑листов, единственный верный способ постоянно блокировать такие штуки — это ограничить подобный доступ на уровне мобильной платформы и браузера, внедряя более строгие политики, чтобы ограничить киберзлоупотребления».
Дано ли согласие?
Нет никаких признаков того, что Meta или «Яндекс» сообщили сайтам с трекерами или пользователям, которые на них заходят, об отслеживании. На форумах разработчиков видно, что многие владельцы сайтов, использующие Meta Pixel, были в шоке, когда обнаружили, что скрипты обращаются к локальным портам.
«С 5 сентября наш внутренний трекер ошибок JS начал отмечать неудачные запросы fetch к localhost:12387, — написал один из разработчиков. — С нашей стороны никаких изменений не было, а пиксель трекинга Facebook, которым мы пользуемся, грузится через Google Tag Manager».
«А можно как‑то это отключить?» — спросил еще один разработчик, столкнувшись с загадочным доступом к локальному порту.
Не совсем ясно, нарушает ли отслеживание переходов из браузера в нативные приложения законы о приватности в разных странах. Но Meta и прочие компании, использующие ее Meta Pixel, уже не раз попадали под раздачу в суде. Вспомни хотя бы эти случаи:
- Facebook users sue Meta for bypassing beefy Apple security to spy on millions
- Major tax-filing websites secretly share income data with Meta
- Tax preparers that shared private data with Meta, Google could be fined billions
- AMC to pay $8M for allegedly violating 1988 law with use of Meta Pixel
Во всех этих делах утверждается, что сбор данных нарушает правила конфиденциальности. Более того, в исследовании 2023 года (когда Meta Pixel еще назывался Facebook Pixel) выяснилось, что он трекает действия пользователей на сайтах в пугающих подробностях, особенно на тех, которые попадают под понятие «чувствительных» согласно GDPR.
Вывод
Пока что в Google не сообщают о планах изменить способ обработки локального доступа к портам в Android. Если хочешь максимально защититься от слежки через Meta Pixel и «Яндекс Метрику», самый надежный способ — не ставить приложения Meta и «Яндекса» на свои устройства с Android.