Comments 10
Подобные браузеры с нуля с рабочей эффективностью на базе open-source Chromium + модифицированная Playwright обвязка для клиентского софта уже вайбкодятся за несколько часов. Частично на Fable, частично на Opus, где детектор Fable отказывается продолжать работу видя, чтото нежелательное. Сборка 1ч 45 минут на 270K plus. Ранее те самые коммерческие решения работали в основном под винду, теперь с нуля и под Linux работает.
Согласен, обвязка над Playwright + CDP-инъекции собирается быстро, и с моделями — ещё быстрее. Fury тоже написан так, я этого не скрываю. Разница не в том, кто писал код, а в том, где живёт подмена.
Playwright-обёртка подменяет через JavaScript: Object.defineProperty на navigator, прокси над getContext, скрипт через addInitScript. Это видно: в worker'е и в iframe с srcdoc скрипт не отработал — и там navigator.platform уже настоящий. Три строки на сравнение контекстов, и профиль отдаёт хост. А canvas и WebGL при таком подходе либо не трогают вообще (у одного платного антидетекта в статье canvas совпадал с чистой машиной байт в байт — это как раз такой случай), либо шумят случайно, и тогда хеш меняется между вызовами, что палится ещё проще.
У Fury подмена в C++ ядра, 29 патчей на Chromium 153, ноль инжектированного JS. Один и тот же ответ в main frame, worker'е и трёх видах iframe. Шум детерминированный — один профиль всегда даёт один хеш canvas. Это можно проверить самому: tools/detect-suite рядом в репозитории, там же baseline'ы с настоящего Chrome 150/153 и с чистого Chromium, чтобы было с чем сравнивать.
Про «1ч 45 минут»: сборка ядра Chromium у меня — 2 ч 42 мин на M5 (10 ядер, 16 ГБ, замерено 30.07), 57 528 таргетов под Windows. За 1:45 собирается обёртка, ядро — нет. Так что, скорее всего, у вас в браузере стоковый Chromium плюс JS сверху — и тогда см. первый абзац.
И самое дорогое там — вообще не код. Это данные: каталог персон с реальных машин (сейчас 27, последняя пришла через issue-форму вчера), чтобы подменённый профиль был существующей конфигурацией, а не «RTX 4060 + 4 ядра + экран 1366×768», которой в природе нет. Это модель не сгенерирует, это только собирать.
Если у вас реально работает по-другому — прогоните вашу сборку через detect-suite и покажите json, мне интересно. Пока что каждая «за несколько часов», которую я мерил, ломалась на worker'е.
интересно было бы посмотреть сравнение с brvae
Хороший вопрос, и признаюсь сразу: Brave через стенд не гонял, так что цифр пока нет.
Но задача у Brave обратная. Его farbling подмешивает в canvas, audio и WebGL случайный шум, свой на каждый сеанс и на каждый сайт. Цель в том, чтобы вас нельзя было узнать между визитами. Поэтому один и тот же браузер выдаёт разные хеши, и сайт это видит: конфигурация как будто меняется на ходу. Для приватности это нормально, для антидетекта это провал, потому что антидетект должен выглядеть как одна конкретная реальная машина, стабильно, в каждом контексте и в каждом вызове. Плюс Brave не трогает то, что как раз палит: navigator.platform, WebGL renderer, Client Hints, экран. Он остаётся Brave на маке, просто с шумным canvas.
Замерю на неделе и добавлю json в tools/detect-suite/baselines рядом с чистым Chrome, тогда можно будет сравнить не на словах. Если есть конкретные вектора, которые интересуют в первую очередь, напишите, начну с них.
он не меняет фингерпринет внутри работы, так что вряд ли для сайта выглядит как постоянно меняющаяся конфигурация. а вот в разных профилях отдает разные, но сохраняющиеся внутри профиля, фп
Вы правы, я ошибся. Поставил Brave и прогнал через свой стенд, вот что вышло.
Отпечаток стабилен внутри сеанса, переживает перезапуск браузера (тот же профиль, закрыл и открыл: ноль отличий) и разный у разных профилей (36 полей). Плюс он разный у разных сайтов в одном профиле: тот же профиль на 127.0.0.1 и на localhost даёт разный canvas, audio, число ядер и память. То есть «постоянно меняющаяся конфигурация» было неверно, беру слова назад.
Теперь про сравнение. Brave шумит canvas, audio, WebGL2-параметры (сдвигает на единицу: 120 стало 119, 4096 стало 4095), ядра (у меня 10, Brave отдал 9 в одном профиле и 4 в другом), память (16 стало 4), screen (подставляет размер окна), plugins, голоса синтеза речи.
И не трогает userAgent, platform (MacIntel как был), WebGL renderer (ANGLE Metal Renderer: Apple M5, как в Chrome), таймзону, шрифты. А в Client Hints brands пишет «Brave/153». Поведение тоже отличается от Chrome в 12 местах: Widevine отключён, Network Information API нет, keyboard layout API нет, акселерометр и гироскоп denied. По этому Brave узнаётся без всяких хешей.
Итого сайт видит: Brave на Apple M5 в ru-RU с такой-то таймзоной, с canvas, который не совпадает ни с одним другим Brave. Это ровно то, что Brave и обещает: вас нельзя связать с вами же на другом сайте. Но он не пытается быть кем-то другим.
Так что сравнение получается не «кто лучше», а «разные задачи». Brave прячет вас от трекинга между сайтами: вы один, сайтов много, и они не должны сложить вас в одну картинку. Fury для другого: когда команда ведёт десятки аккаунтов на одной площадке, и площадка не должна сложить их в одну картинку. Арбитраж, клиентские рекламные кабинеты, маркетплейсы, тест своего антифрода. Там каждый профиль должен быть отдельной правдоподобной машиной, во всех контекстах и во всех API одинаково, и оставаться ею месяцами.
Отсюда и разница в том, что вообще есть в продукте. У Brave один профиль на человека и всё. В Fury профиль это единица, которую передают: у него владелец, проект, права доступа, лок (двое не откроют один профиль одновременно и не затрут друг другу куки), аудит, кто и когда его открывал. Бандл профиля шифруется на клиенте и уезжает на ваш же сервер, который его прочитать не может, ключ у организации. Из-за этого сотрудник уходит, а аккаунты остаются; профиль открывается с другой машины и выглядит той же самой машиной. Ни одного из этих слов в Brave нет, потому что ему они не нужны.
Поэтому Brave как антидетект отсеется на первом же чтении navigator.platform: он честно отдаёт мак с M5 и подписывается Brave в Client Hints. А Fury как приватный браузер для одного человека избыточен, для этого хватит Brave.
Замер лежит в tools/detect-suite, команда fury-detect diff --mode identity, кто хочет, повторит.
В докере безголово можно запустить на линукс сервере где нет десктопа?
Сейчас нет. Ядро собирается под macOS и Windows, gn-конфигурации под Linux нет, и в планах её тоже нет. В докере на линукс-сервере живёт только командный сервер (он и есть docker compose up, один бинарник плюс Postgres), а браузеры запускаются на машинах людей.
Почему так, а не «пока не дошли руки». Первое, Linux как третья платформа, которую никто из нас не тестирует, это заявление, а не порт, а я обещал в README писать только то, что проверено. Второе, безголовый браузер на сервере это отдельный отпечаток: нет GPU, WebGL отдаёт SwiftShader, нет реального экрана и окна, и это видно проще, чем любая подмена canvas. Даже прогрев куков в Fury сделан не headless, потому что куки должны быть от того браузера, который потом залогинится.
Что есть вместо этого: локальный API (шесть эндпоинтов, bearer-токен) и рядом примеры на Playwright и Puppeteer, в том числе «прогнать задачу по всем профилям по одному». Это работает на Windows-VPS с обычным рабочим столом, туда же ставится агент, и оттуда профили открываются с сервера команды. Не docker, но серверный сценарий закрывает.
Если Linux нужен именно вам, самое полезное, что можно сделать, это собрать ядро и прогнать tools/detect-suite: gn-файлы под мак и винду лежат в core/args, патчи применяются к обычному Chromium. Приму, если стенд пройдёт.
Ну и ещё вопрос: на инстаграме тестили?
Нет. И про конкретные площадки я вообще ничего обещать не буду, ни про инстаграм, ни про другие. Сегодня прошло, завтра они обновили антифрод, и что стоила та проверка. Плюс бан зависит от прокси, истории, поведения, отпечаток там одна переменная из многих.
Что могу показать, это замеры: все контексты отдают одно и то же, отпечаток не меняется между запусками, поведение совпадает с настоящим Chrome, TLS не патчится. Всё в tools/detect-suite.
Прогон CreepJS 20 из 20 в планах и пока не сделан, это записано.
Если есть аккаунты, которые не жалко, лучший тест ваш, а не мой. Поймаете, принесите дамп из detect-suite, разберу.
Мы измерили платный антидетект‑браузер: canvas совпадал с чистой машиной байт в байт. Потом сделали свой, открытый