ARMANOS

Сценарий

Приватность

Профиль для обычного чтения сети. Он перекрывает список трекерных доменов, снимает метки слежки с каждого перехода, запрещает WebRTC ходить мимо прокси и держит куки отдельно от других ваших профилей. Анонимности он не даёт, и здесь прямо сказано, где проходит граница.
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
Экран «Защита» в ARMANOS со счётчиками перекрытых запросов за сегодня, за семь дней и всего, с разбивкой по видам и по профилям.
Каждый перекрытый запрос и каждая очищенная ссылка считаются по профилю и сохраняются после закрытия программы. На снимке свежая установка, поэтому счётчики пока на нуле.

Сорок меток слежки снимаются до того, как запрос уйдёт

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. 1

    Запустите тест утечки в своём обычном браузере

    Инструмент строит RTCPeerConnection с пустым списком серверов ICE, поэтому наружу не уходит ничего, и показывает адреса, которые браузер отдаёт без спроса.

  2. 2

    Запустите его внутри профиля ARMANOS

    Откройте профиль с прокси и ту же страницу в нём.

  3. 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. 1

    Измерьте свой обычный браузер

    Откройте проверку отпечатка и скопируйте восьмизначный код.

  2. 2

    Измерьте каждый профиль

    Откройте ту же страницу внутри каждого профиля ARMANOS и скопируйте коды.

  3. 3

    Посчитайте повторы

    Вставьте все коды в счётчик на той же странице. Два профиля с одним кодом выглядят для сайта одной машиной.

  4. 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

Два профиля на бесплатном тарифе

Поставьте ARMANOS, создайте профиль на сценарии «Приватность», прогоните проверку отпечатка в нём и в своём обычном браузере и сравните два кода.