Сценарий
Приватность
- 31 домен
- Список блокировки этого сценария
- 40 меток
- Снимается с каждого перехода
- disable_non_proxied_udp
- Правило WebRTC
- ARMANOS Browser 153.0.7978.0
- Движок
- 3
- Бесплатных инструментов, ничего не отправляющих
Слежка это не то, что знает один сайт, а то, чем сайты делятся
Открытая страница сначала грузит свои файлы. Потом чужие: счётчик, рекламную биржу, запись сеанса. Каждый такой запрос несёт ваш адрес, ответы браузера о себе и часто куку домена, на котором вы никогда не были.
В этом весь ход. Два никак не связанных сайта грузят один и тот же чужой файл, и одна компания видит оба захода и сводит их под одним номером. Договариваться между собой сайтам не нужно.
Ссылка делает то же самое без куки. Метка клика едет в строке запроса и попадает в базу того сайта, куда вы пришли. Дальше идёт само устройство: экран, видеокарта, шрифты, часы, звук. Эти ответы устойчивы, а вместе ещё и редки.
Привычные средства закрывают по одной дороге каждое. Этот сценарий закрывает четыре в одном профиле, и здесь же названы те, что остаются открытыми.
| Средство | Что закрывает | Что оставляет |
|---|---|---|
| Режим инкогнито | Куки, когда окно закрылось | Те же ответы устройства, тот же адрес, те же метки в ссылках |
| VPN | Адрес, который видит сайт | Куки, отпечаток, кандидатов WebRTC, метки в ссылках |
| Расширение-подменщик отпечатка | Часть значений, переписанных внутри страницы | Переписанные свойства, которые страница может рассмотреть; сеть не тронута |
| Второй профиль браузера | Хранилище кук | Одну машину под ними: те же шрифты, ту же видеокарту, тот же местный адрес |
| Виртуальная машина | Почти всё, если честно | Гигабайты и отдельные обновления на каждую личность |
| Этот сценарий | Куки, устройство, запросы трекеров, метки в ссылках, кандидатов WebRTC | Вашего провайдера и любой сайт, куда вы вошли |
Сценарий это запись в коде, и её читают при каждом запуске
Сценарий не настроение. Это объект в packages/shared/src/index.js: стартовый адрес, вставляемые скрипты, списки трекеров, признак чистки ссылок и дневные потолки действий.
«Приватность» ещё и запасной вариант. Если профиль приходит со сценарием, которого код не знает, profiles.js пишет privacy, а не отказывает, и ввоз из таблицы берёт его же по умолчанию. Профиль, созданный впопыхах, попадает сюда, а не в пустоту.
Одно поле пусто нарочно. У других сценариев есть дневные потолки действий: публиковать и писать со скоростью машины это то, из-за чего аккаунты и замечают. У «Приватности» потолков нет, и в SCENARIO_DAILY_LIMIT у неё ноль. Вы читаете, а не действуете на площадке.
Смените сценарий позже, и он вступит в силу со следующего запуска. Перехват запросов помнит, под какой сценарий собран, и пересобирается при смене, поэтому правила прежнего сценария снимаются, а не остаются тихо работать.
- id
- privacy
- Стартовый адрес
- https://duckduckgo.com
- Вставляемые скрипты
- fingerprint, stealth
- Списки трекеров
- general
- Чистка ссылок
- включена
- Дневной потолок действий
- нет
- Состояние
- сделано (feasibility: now)
Снято с SCENARIOS.privacy и SCENARIO_DAILY_LIMIT в packages/shared/src/index.js.
В списке блокировки тридцать один домен, и оба движка читают один и тот же список
В общем списке 31 узел: счётчики, рекламные биржи, продуктовая аналитика, запись сеансов, отчёты о падениях и производительности, мобильная атрибуция. Запись совпадает с узлом и его поддоменами. Сверка принимает и узел вместе с куском пути, но в общем списке все записи это чистые имена узлов.
Дальше движки идут разными дорогами к одним и тем же правилам. На ARMANOS Browser список превращается в правила declarativeNetRequest внутри маленького расширения, которое пишется под профиль при запуске: блокировка идёт в сетевом слое, и странице не за что зацепиться. У встроенного запасного движка такого слоя нет, поэтому запрос отменяет сама программа в session.webRequest.
Виды запросов перечислены поимённо, вместе с main_frame. Без них declarativeNetRequest ловит всё, кроме main_frame, и переход прямо на перекрытый домен прошёл бы на одном движке и остановился на другом. Два движка, отвечающих по-разному, хуже любого одного ответа.
Чего список доменов не может, так это своей аналитики сайта. Когда сайт считает вас со своего же адреса, чужого узла для сверки просто нет. Правила по путям у ARMANOS есть, но только для площадок, на которых их проверяли, и «Приватность» не получает ни одного набора. Чужие правила по путям ломали бы посторонние страницы без всякой пользы.
| Разряд | Примеры из списка |
|---|---|
| Счётчики посещений | google-analytics.com, googletagmanager.com, analytics.google.com |
| Рекламные биржи | doubleclick.net, googlesyndication.com |
| Пиксели соцсетей | graph.facebook.com, pixel.facebook.com |
| Запись сеансов | hotjar.com, fullstory.com, logrocket.com, mouseflow.com |
| Продуктовая аналитика | mixpanel.com, amplitude.com, segment.com, heap.io |
| Отчёты о падениях и скорости | sentry.io, crashlytics.com, bugsnag.com, newrelic.com |
| Мобильная атрибуция | appsflyer.com, adjust.com, branch.io, kochava.com |

Сорок меток слежки снимаются до того, как запрос уйдёт
TRACKING_PARAMS это плоский список из 40 имён: метки клика рекламных площадок, метки кампаний, номера почтовых рассылок, связки счётчиков и набор профессиональной сети, с которого чистка начиналась. Это именованный список, а не догадка о том, что похоже на слежку.
На ARMANOS Browser это одно правило declarativeNetRequest с queryTransform, снимающим эти имена у main_frame и sub_frame. В адресной строке стоит чистый адрес, и метка не доходит до страницы вовсе. У встроенного движка запрос главного кадра перенаправляется на очищенный адрес до выхода в сеть.
У правила чистки нарочно меньший вес, чем у правил блокировки. Адрес, который и трекер, и с меткой клика, обязан быть перекрыт, а не очищен и пропущен. Перепутанный порядок превратил бы запрет в вежливый пропуск.
Каждый очищенный переход прибавляет счётчик на экране «Защита». Чистка трогает только строку запроса: номер внутри пути или после решётки остаётся на месте.
Метки клика рекламных площадок
fbclid, gclid, msclkid, dclid, ttclid, twclid, yclid, wbraid, gbraid, rdt_cid, ScCid, epik, igshid, mibextid, li_fat_id
15Метки кампаний
utm_source, utm_medium, utm_campaign, utm_content, utm_term
5Номера почтовых рассылок
mc_cid, mc_eid
2Связки счётчиков
_ga, _gl
2Набор профессиональной сети, с которого чистка начиналась
trk, trkInfo, lipi, lici, src, trackingId, refId, eBP, recommendedFlavor, midToken, midSig, trkEmail, connectionOf, orig, anchorTopic, contextUrn
16
WebRTC не имеет права ходить мимо прокси
WebRTC нужен, чтобы два браузера говорили напрямую. Ради этого он собирает кандидатов, включая адрес вашей машины в её собственной сети, и отдаёт их запросившей странице. Разрешения он не спрашивает, и на экране ничего не появляется.
Для набора профилей это худшая из утечек. Местный адрес одинаков у всех профилей на компьютере. Десять профилей на десяти разных прокси и один и тот же 192.168, и вся группа связана значением, которого не меняет ни один прокси.
ARMANOS ставит одно правило на обоих движках. ARMANOS Browser запускается с --force-webrtc-ip-handling-policy=disable_non_proxied_udp. Окна профилей встроенного движка получают setWebRTCIPHandlingPolicy с тем же значением, и то же правило лежит в отпечатке профиля полем webrtcPolicy.
Программа это измеряет, а не утверждает. В диагностике сети стояла фраза о настройке, и она печаталась бы так же спокойно, перестань настройка применяться. Теперь открывается скрытое окно с тем же правилом, кандидаты собираются и разбираются: настоящий частный адрес это отказ с показом самого адреса, меняющееся имя на .local это успех, а неудавшееся измерение честно говорит «не смогли», а не «чисто».
- 1
Запустите тест утечки в своём обычном браузере
Инструмент строит RTCPeerConnection с пустым списком серверов ICE, поэтому наружу не уходит ничего, и показывает адреса, которые браузер отдаёт без спроса.
- 2
Запустите его внутри профиля ARMANOS
Откройте профиль с прокси и ту же страницу в нём.
- 3
Сравните
Меняющееся имя на .local это браузер, который прячет адрес нарочно. Настоящий 192.168 или 10.x это то самое значение, что связывает ваши профили.
Браузер собран без тех частей, которые звонят домой
ARMANOS Browser это наша сборка Chromium, и настройки сборки вырезают отчётность. enable_reporting выключен, enable_rlz выключен, ключи Google API пусты, расширенная отчётность безопасного просмотра выключена. Сам безопасный просмотр оставлен собранным, потому что нулевой режим ломает сборку; без ключей ему некуда обращаться.
В странице скрипт stealth заменяет navigator.sendBeacon. Маячки уходят на выгрузке страницы, ровно тогда, когда трекер отправляет собранное, и обычный перехват запросов их уже не успевает увидеть. Замена возвращает true, поэтому страницы ведут себя как обычно, и прибавляет один местный счётчик.
Стартовую страницу профиля отдаёт петлевой сервер внутри программы, поэтому о запуске никто не узнаёт. Единственный её запрос наружу это определение адреса, и он идёт через прокси самого профиля, потому что смысл страницы в том, чтобы показать вам адрес выхода, который увидит сайт.
Куки и входы на сайты лежат в каталоге профиля на вашем компьютере. В аккаунт уезжают только настройки профиля. Когда сессия переезжает между вашими же машинами, она едет через выбранную вами папку файлом, зашифрованным scrypt и AES-256-GCM.
- enable_reporting
- false
- enable_rlz
- false
- use_official_google_api_keys
- false
- google_api_key
- пусто
- enable_extended_safe_browsing_reporting
- false
- safe_browsing_mode
- 1, и ключей для обращения к серверу нет
Настройки gn, с которыми собран отгружаемый движок, из engine/scripts/build-mac.sh. Сборка под Linux берёт тот же список.
Проверьте сами, и мы этих чисел не увидим
На сайте три бесплатных инструмента, и все три считают внутри вашего браузера. Это не обещание про наши серверы, это устройство кода: ни fetch, ни XHR, ни маячка, ни сокета в них нет, и стенд валит сборку, если что-то из этого появится.
Проверка отпечатка читает двенадцать значений, среди них те, что решают дело и которые многие проверялки пропускают: пиксели обратного чтения WebGL, отрисовку звука, список шрифтов. Всё это сводится в восьмизначный код, который легко сравнить глазами.
Тест утечки спрашивает у браузера его собственных кандидатов с пустым списком серверов ICE. Указать чужой сервер STUN значило бы рассказать о вас этому серверу, то есть сделать обратное задуманному.
Третий инструмент считает разные машины. Профили это отдельные браузеры без общей памяти, страница в одном ничего не знает о другом, и посчитать за вас мы не смогли бы при всём желании. Вы вставляете коды, он считает повторы.
- 1
Измерьте свой обычный браузер
Откройте проверку отпечатка и скопируйте восьмизначный код.
- 2
Измерьте каждый профиль
Откройте ту же страницу внутри каждого профиля ARMANOS и скопируйте коды.
- 3
Посчитайте повторы
Вставьте все коды в счётчик на той же странице. Два профиля с одним кодом выглядят для сайта одной машиной.
- 4
Загляните глубже в самой программе
Окно отпечатка профиля прогоняет самопроверку из 25 замеров на том браузере, с которым профиль и запускается, и ставит оценку из 100.
Чего это не делает
- Анонимности это не даёт. Провайдер по-прежнему видит сам факт соединения, а любой сайт, куда вы вошли, знает, кто вы.
- Список блокировки у этого сценария это 31 домен. Это отобранный список известных трекеров, а не полный набор правил блокировщика рекламы, и своей аналитики сайта в нём нет.
- Чистка ссылок снимает 40 названных меток из строки запроса. Номер, положенный в путь или после решётки, остаётся.
- Без прокси профиль выходит с вашего собственного адреса. Изоляция и согласованное устройство это не смена адреса.
- На встроенном запасном движке правила блокировки самого расширения исполняет ARMANOS, а не движок. Правила, которых мы выразить не можем, считаются и пропускаются, и это число печатается, а не прячется.
- Мы не обещаем, что сайты не отличат. Здесь сделаны изоляция, согласованное устройство и меньше данных, уходящих самих по себе.
Как проверить
За каждым утверждением выше стоит файл, а там, где это можно измерить, ещё и стенд, который краснеет, как только утверждение перестаёт быть правдой.
- Запись сценария говорит ровно то, что написано на этой странице
- packages/shared/src/index.js (SCENARIOS.privacy, SCENARIO_DAILY_LIMIT) · apps/desktop/src/lib/profiles.js (create)
- Блокировка трекеров и чистка ссылок действительно работают на отгружаемом движке, замер идёт через наш собственный прокси на петле
- apps/desktop/src/lib/tracker-rules.js · apps/desktop/test/блокировка-живьём.js
- Этот сценарий не наследует правила по путям, написанные для других площадок, и оба движка собирают одни правила вместе с их хостами
- apps/desktop/src/lib/forkExtension.js · apps/desktop/test/слежка-по-хостам.js
- Включённый блокировщик не обещает больше, чем умеет движок, а непонятые правила сосчитаны
- apps/desktop/src/lib/dnrBlock.js · apps/desktop/test/builtin-blocking.js · apps/desktop/test/extension-limits-honest.js
- Приговор по WebRTC измерен, а не заявлен
- apps/desktop/src/main/main.js (probeWebrtc, classifyWebrtcCandidates) · apps/desktop/test/leak-verdict.js
- Бесплатные инструменты не делают ни одного сетевого вызова
- apps/web/components/tools/LeakCheck.tsx · apps/web/test/тест-утечки.js · apps/web/test/инструмент-отпечатка.js
Дальше по теме
Проверка отпечатка браузера
Двенадцать показаний и один восьмизначный код, всё считается в вашем браузере.
Тест утечки WebRTC
Какие адреса ваш браузер отдаёт, не дожидаясь вопроса.
ARMANOS Browser
Наша сборка Chromium, которая подменяет отпечаток внутри движка.
Прокси
Свой прокси на профиль и география, под которую подгоняется отпечаток.
Реестр обещаний
Каждое утверждение сайта с файлом и стендом за ним.
Два профиля на бесплатном тарифе
Поставьте ARMANOS, создайте профиль на сценарии «Приватность», прогоните проверку отпечатка в нём и в своём обычном браузере и сравните два кода.