Перейти к содержимому

Блог

Почему Facebook связывает ваши аккаунты между собой: семь сигналов

Два ваших аккаунта живут в разных профилях, за каждым стоит свой прокси, а площадка всё равно свела их в одну пару. Решает она не по имени и не по одной мелочи: в пару два аккаунта сводит совпадение, которого у чужих друг другу людей не бывает.

Команда ARMANOS8 мин

Совпадения решают, а не имена

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

Семь таких мелочей названы ниже поимённо. Первые три площадка снимает сама: рукопожатие между приложениями, учёт внутри страницы и счётчик на чужих сайтах. Остальные четыре приходят с вашей стороны.

Рукопожатие между Facebook и Instagram

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

Один запрос уходит от Facebook, встречный от Instagram, и оба несут идентификатор соседнего приложения в самом адресе. Открыв в одном профиле обе площадки, вы отдаёте им готовую связку из двух аккаунтов, и никакой прокси её не разорвёт.

  1. 1

    Вы открываете страницу

    Ни входа в аккаунт, ни нажатия для этого обмена не нужно.

  2. 2

    Facebook зовёт соседа

    Адрес facebook.com/ig_xsite_user_ выносит идентификатор наружу.

  3. 3

    Instagram отвечает тем же

    Адрес instagram.com/accounts/xuserid называет того же человека.

Своя слежка внутри самой страницы

Кроме рукопожатия между приложениями, Meta ведёт внутри страницы собственный учёт: что вы открыли, сколько смотрели, докуда долистали. Такие запросы уходят на тот самый адрес, куда вы пришли, и на чужой счётчик не похожи вовсе.

Обычный блокировщик по доменам их пропускает. Закрыть их можно только правилом по адресу самого запроса, и в профиле со сценарием «Соцсети» вы такие правила получаете вместе со списком.

Площадка и её собственные запросыАдресов под правилом
Facebook и Instagram11
X6
Pinterest4
Всего в этом наборе21

Правило работает только на своих адресах

Кусок адреса вроде /ajax/bz встречается и на чужих сайтах, и перекрытый везде он ломал бы посторонние страницы. Поэтому правила набора соцсетей заперты на адресах самих площадок: у Facebook и Instagram это по два имени, своё и хранилища картинок, и ещё пять имён приходятся на X и Pinterest.

На чужом сайте тот же кусок адреса проходит как обычно. На своей площадке он перекрывается, и площадка теряет отчёт, а не страницу.

Пиксель встречает вас на чужих сайтах

Второй слой учёта живёт вне самой площадки. Магазин, блог или посадочная страница ставит у себя её счётчик, и он сообщает о вашем визите ещё до первого нажатия.

Этот счётчик узнаёт браузер по тем же мелочам, что и площадка, поэтому два ваших профиля он сводит так же легко, и ещё до того, как вы дошли до самой площадки. Ниже по сетям разложен список счётчиков соцсетей, который идёт со сценарием «Соцсети».

Чей счётчик ждёт снаружиАдресов в списке
Meta6
TikTok13
X5
Pinterest3
Другие сети рядом6

Метки в ссылке срезаются при переходе

Ссылка из рекламы или из переписки несёт хвост: fbclid, igshid, mibextid и ещё тридцать семь меток, по которым площадка узнаёт, кто и откуда вас прислал. Одна и та же метка, пришедшая в два профиля, связывает их без всякого отпечатка.

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

Один выход на несколько аккаунтов

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

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

Часы и язык против страны выхода

Часовой пояс и список языков браузера страница читает без всякого разрешения. Если прокси выводит вас из Бразилии, а часы показывают Москву, площадка видит человека, который прячется.

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

Страну выхода спрашивают четыре источника

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

Если не отвечает ни один из четырёх, страна не выдумывается: профиль открывается с тем поясом, что выпал ему при создании, и предупреждение об этом выходит на экран. Выдуманная страна была бы хуже честного «не знаю».

Окно шире объявленного экрана

Браузер называет странице размер экрана и размер окна, и оба числа она читает одной строкой. Окно шире объявленного экрана описывает машину, которой не бывает.

На наборе из 900 профилей развёрнутое окно не помещалось в объявленный экран примерно у шести профилей из десяти, и это замер для монитора 1920 на 1080. На другом мониторе доля будет своя. Разных экранов в наборе было 18.

Видеокарта спорит с архитектурой машины

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

Такая пара попадалась на профилях с macOS: имя Apple M1 рядом с архитектурой x86, и ловится она одним сравнением двух строк. Именно ради этого случая у нас заведена проверка согласия видеокарты с архитектурой, и сегодня она держит их вместе. Настоящий Mac на этой видеокарте архитектуру x86 не называет, и одного расхождения площадке хватает.

Что проверить у своих профилей

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

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

  1. 1

    Сверьте адрес выхода

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

  2. 2

    Сверьте часы и языки

    Пояс и языковой набор обязаны идти от страны, из которой вы выходите.

  3. 3

    Сверьте экран и окно

    Окно не бывает шире экрана, который профиль объявляет странице.

  4. 4

    Посмотрите сетевые запросы

    На первой загрузке видно, уходит ли обмен идентификаторами между приложениями.

Чего это не утверждает

  • Это не полный список того, что читает площадка. Здесь семь сигналов, которые вы проверите сами, а полного перечня не публикует ни одна площадка.
  • Это не утверждает, что сошедшиеся семь делают аккаунт безопасным. Поведение, платёжные данные и история жалоб остаются при вас, и ни один браузер их не меняет.
  • Порядок сигналов здесь не означает их веса. Какая мелочь стоит дороже других, площадки не говорят, и вывести это со стороны нечем.
  • Числа про наборы правил описывают сценарий «Соцсети» на сегодня. Набор лежит файлом внутри программы и обновляется вместе с ней: ленты, которая подтягивала бы его отдельно, у нас нет.

Где это можно увидеть самому

Каждое число выше выходит из кода, который можно открыть и запустить.

Собственные запросы площадок перечислены поимённо, вместе с обменом между Facebook и Instagram
apps/desktop/src/lib/tracker-rules.js
Эти правила исполняются на профиле и заперты на хостах своей площадки
apps/desktop/test/слежка-по-хостам.js
Счётчики на чужих сайтах лежат отдельным списком, разложенным по сетям
apps/desktop/assets/trackers_social.json
Часы и языки профиля выводятся из страны и сверяются на настоящих отпечатках
packages/shared/src/index.js · apps/desktop/test/fingerprint-consistency.js
Видеокарта и архитектура профиля не спорят между собой
apps/desktop/test/fingerprint-consistency.js
Окно профиля не открывается шире объявленного экрана
apps/desktop/src/lib/окноПрофиля.js · apps/desktop/test/окно-не-шире-экрана.js

Вопросы

Разные прокси у меня уже есть, этого мало?
Адрес это один сигнал из семи. Два профиля с разных адресов сводятся по часам, по экрану или по обмену между приложениями.
Если не заходить в Instagram, связки не будет?
Обмен идёт на загрузке страницы, а не на входе в аккаунт. Достаточно того, что вкладка соседнего приложения открыта в том же профиле.
Помогает ли режим инкогнито?
Он забывает куки после закрытия окна и не трогает ни адрес выхода, ни часы, ни экран, ни видеокарту. Четыре сигнала из семи остаются на месте целиком.
Блокировщик рекламы закроет эти запросы?
Списки доменов закрывают счётчики на чужих сайтах. Запросы самой площадки они не трогают: те идут на тот адрес, куда вы и пришли.
Чем это отличается от подмены user agent?
Строка user agent это одно поле, а сигналов семь. Подменив одно поле, вы чаще заводите новое расхождение, чем закрываете старое.
Сколько аккаунтов можно вести с одного компьютера?
Предел ставит не компьютер, а совпадения между профилями. Разойдутся адрес, часы, экран и видеокарта, и вопрос переедет с числа профилей на их непохожесть.

Посмотрите, что ваш браузер рассказывает о вас

Проверка читает 12 значений прямо в окне и никуда их не отправляет.