
Двигатель Stealth Chromium, который предотвращает блокировку скраперов и браузерных агентов, всего одной строкой изменения кода.
Стелс-движок Chromium
Fortress — это стелс-движок Chromium, который предотвращает блокировку ваших скраперов и браузерных агентов одной строкой кода. Детекторы ботов выявляют автоматизацию, считывая отпечаток браузера; Fortress корректирует этот отпечаток внутри C++ Chromium, так что браузер представляется обычной установкой Chrome. Скраперы завершают свои сеансы, агенты доходят до нужных страниц, а CreepJS, Sannysoft, BrowserScan и живой Cloudflare Turnstile определяют его как человека. Укажите ваш существующий Playwright или Puppeteer на Fortress через CDP, и больше ничего в вашем коде не меняется.
Blink · V8 · BoringSSL патчи внутри дерева · WebGL на ANGLE / D3D11 · TLS с JA3/JA4-когерентностью · ежемесячный ребейз апстрима · воспроизводимые, прошедшие проверку полигоном релизы

Неотредактированный захват бинарного файла Fortress в реальном окне: он проходит живой вызов Cloudflare, делает bot.sannysoft.com полностью зелёным, и показывает BrowserScan «Нормальный». Воспроизведите с помощью tools/gauntlet.py.
Выпущено. Когерентные персоны для каждого запуска, усиленные.
toString() остаётся [native code]), независимость от контекста (main / worker / iframe) — согласованность скомпилирована в браузере, а не пропатчена в JavaScript.```bash
pip install -U tilion-fortress # or: docker run --rm -p 9222:9222 tilion/fortress:latest**[→ полные примечания к релизу](https://github.com/tiliondev/fortress/releases/tag/v151.0.7908.0)**
## Содержание
| | |
|---|---|
| **[Что это такое](#what-it-is)** · **[Быстрый старт](#quick-start)** | что это такое, установка, первый скрипт, настройка ИИ-агента |
| **[Fortress MCP](#the-fortress-mcp--stealth-browsing-as-agent-tools)** | 29 инструментов скрытного браузера для ИИ-агентов (бета) |
| **[Зачем патчить движок, а не страницу](#why-patch-the-engine-not-the-page)** | тезис о самораскрывающемся JS + три уровня обнаружения |
| **[Как Fortress сравнивается](#how-fortress-compares)** | сравнение с puppeteer-stealth · Camoufox · CloakBrowser · закрытые вендоры |
| **[Доказательства: результаты live-детекторов](#proof-live-detector-results)** | CreepJS / Sannysoft / BrowserScan / Cloudflare, со скриншотами |
| **[Настройка персоны](#configure-the-persona)** | поверхность отпечатка `--uxr-*` |
| **[Работает с вашим стеком](#works-with-your-stack)** | browser-use · Crawl4AI · Stagehand · LangChain |
| **[Сборка и проверка](#build--verify)** | воспроизведение из исходников, проверка происхождения |
| **[Справка](#reference)** | устранение неполадок · FAQ · дорожная карта · структура репозитория |
---
## Что это такое
Fortress — это форк Chromium, который подменяет отпечаток браузера изнутри движка. Поверхности, которые считывают детекторы ботов (canvas, WebGL, audio, шрифты, navigator и ещё около тридцати), исправляются в **C++** коде Chromium, без слоя JavaScript-патчей поверх, которые страница могла бы обнаружить.
Он поставляется как обычный бинарник браузера, предоставляющий CDP-эндпоинт. Направьте на него Playwright, Puppeteer или любой CDP-клиент, и ваша существующая автоматизация будет работать без изменений.
JavaScript-стелс-патч оставляет дополнительный слой, который страница может обнаружить: `.toString()` показывает исходный код переопределения, а повторное получение того же примитива из iframe или воркера обходит его. Fortress исправляет поверхность прямо в движке, поэтому `navigator.vendor` обращается к настоящему C++ геттеру, сообщает `[native code]` и возвращает одно и то же значение из любого контекста. Страница, проверяющая себя, видит обычный Chromium. Именно поэтому ваша автоматизация проходит там, где раньше её обнаруживали, а оставшиеся блокировки связаны с вашими прокси и поведением, а не с браузером. В разделе [Зачем патчить движок, а не страницу](#why-patch-the-engine-not-the-page) подробно описана механика обнаружения.```python
from tilion_fortress import Fortress
from playwright.sync_api import sync_playwright
with Fortress() as f: # launches the stealth engine on a CDP endpoint
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp(f.cdp_url)
page = browser.new_page()
page.goto("https://bot.sannysoft.com")
page.screenshot(path="all-green.png")
import { Fortress } from "tilion-fortress";
import { chromium } from "playwright";
const f = await Fortress.launch(); // stealth engine on a CDP endpoint
const browser = await chromium.connectOverCDP(f.cdpUrl);
const page = await browser.newPage();
await page.goto("https://browserscan.net");
await browser.close();
await f.close();
Один цикл, все реальные захваты: проходит CreepJS / Sannysoft / BrowserScan / rebrowser → парсит структурированные данные через CDP → обходит Akamai на aa.com · lowes · macys · kohls (один и тот же резидентный IP).
Неотредактированные захваты движка Fortress, управляемого через CDP. Никаких плагинов скрытности, никаких JS-патчей: отпечаток исправлен в бинарном файле. Воспроизведите любой из них с помощью examples/scrape_demos.py.
Структурированное извлечение: записи собираются в типизированный JSON по мере чтения каждого элемента.
Тот же резидентный IP, тот же сайт (aa.com · Akamai Bot Manager). Стандартный/безголовый браузер получает Access Denied (Reference #); Fortress загружает реальную страницу, и Akamai выдает свой _abck сенсорный cookie — Bot Manager принимает его как реальный браузер. Переменная — это отпечаток, а не IP.
pip install tilion-fortress npm install tilion-fortress
docker run --rm -p 9222:9222 tilion/fortress:latest
tar xzf tilion-fortress-linux-x64.tar.gz # Linux ./tilion-fortress/tilion --headless=new --remote-debugging-port=9222 --user-data-dir=/tmp/p
sudo apt install ./tilion-fortress_151.0.7908.0_amd64.deb && tilion https://example.com
> [!TIP]
> SDK поставляется со скомпилированной сборкой **плюс `patches/`**, так что вы можете пересобрать движок самостоятельно и проверить каждое исправление на соответствие исходному коду. Загрузки автоматически проверяются по SHA-256 относительно файла `SHA256SUMS` релиза.
### Версии
Fortress поставляется на **двух базах Chromium** — выбирайте компромисс между маскировкой и актуальностью:
| Канал | Chromium | Когда использовать |
|---|---|---|
| **`stable`** *(по умолчанию)* | **149** | Рекомендуется — соответствует версии Chrome, которую использует большинство реальных пользователей, поэтому лучше всего маскируется |
| **`latest`** | **151** | Новейший движок (сообщает версию немного новее, чем stable) |```python
Fortress().start() # Python: stable (149) by default
Fortress(channel="latest").start() # opt into 151
await Fortress.launch(); // Node: stable (149) by default
await Fortress.launch({ channel: "latest" });
docker run --rm -p 9222:9222 tilion/fortress:149 # or :151
# or set FORTRESS_CHANNEL=latest for either SDK
Native binaries: Linux x64 (both versions) + Windows x64 (151); Windows-149 and macOS run via the Docker image.
Fortress — это браузер, которым управляет ваш агент: сырой CDP на :9222, никаких плагинов стелс, которые нужно подключать. Есть два способа подключиться.
Option 1: open it pre-loaded in a chat assistant. One click; it reads our AGENTS.md and walks you through the whole setup:
Option 2: Copy for agent (everything, to your clipboard). Hit the copy icon at the top-right of the box below. It puts the entire setup context on your clipboard: what it is, install, connect, persona, and rules, all of AGENTS.md condensed. Paste it into Cursor, Claude Code, Copilot, ChatGPT, or any agent and it takes it from there:```text You're setting up Fortress, an open-source STEALTH Chromium engine, for browser automation. It corrects the browser fingerprint (canvas, WebGL, audio, fonts, navigator, +30 more) in Chromium's C++ and exposes raw CDP on http://localhost:9222, a drop-in for Playwright/Puppeteer. Do NOT add puppeteer-stealth or any JS fingerprint patching (it self-reveals and undoes Fortress).
LAUNCH (pick one; all expose CDP on http://localhost:9222): Docker: docker run -d --rm -p 9222:9222 tilion/fortress:latest Python: pip install tilion-fortress then from tilion_fortress import Fortress; f=Fortress(); f.start() Node: npm install tilion-fortress then import {Fortress} from "tilion-fortress"; const f=await Fortress.launch()
CONNECT (keep my existing automation code): Playwright(py): browser = p.chromium.connect_over_cdp("http://localhost:9222") Playwright(js): const browser = await chromium.connectOverCDP("http://localhost:9222") Puppeteer(js): const browser = await puppeteer.connect({ browserURL: "http://localhost:9222" }) browser-use / Crawl4AI / Stagehand / LangChain: point their CDP endpoint at http://localhost:9222
PERSONA (optional; default is a coherent Windows identity). Override any surface with --uxr-* flags: --uxr-timezone=America/New_York --uxr-hw-concurrency=16 --uxr-languages=en-US,en
RULES:
Now walk me through launching Fortress and wiring my automation to it. Full guide: https://github.com/tiliondev/fortress/blob/main/AGENTS.md
## Fortress MCP — скрытый браузинг в виде инструментов агента <sub>Beta</sub>
Сырой CDP предназначен для кода, который вы пишете. **Fortress MCP** — для агентов, вызывающих **инструменты**: сервер [Model Context Protocol](https://modelcontextprotocol.io), который предоставляет Claude, Cursor или любому MCP-клиенту скрытый браузер, поэтому как только запрос блокируется, он просто вызывает инструмент и получает страницу. **29 инструментов, локально и бесплатно** — `fetch_protected_page`, `extract_page`, `crawl_site`, `recon_site_apis`, `search_web`, `run_browser_task`, `save_profile`, `get_stealth_cdp_endpoint` и другие.
<p align="center"><img src="https://assets.kitploit.com/production/public/readmes/795/8f328e2498b09d7433208c5b4a9002450643537f2ee6b0519ac10420ef581bf3.gif" alt="Тот же сайт, тот же запрос: обычный браузер блокируется PerimeterX, в то время как агент с Fortress MCP возвращает чистый JSON" width="760"/></p>
<sub><i>Реальный, датированный запуск против <b>stockx.com</b> (PerimeterX). Обычный браузер получает <b>HTTP 403 — «Доступ запрещён»</b>; агент с Fortress MCP возвращает чистый JSON — тот же сайт, тот же запрос. Воспроизведите это из репозитория фреймворка.</i></sub>
### Настройте за 30 секунд
Два способа запуска — выберите один. `npx` требует Python в PATH; `pip` устанавливает его напрямую:```bash
pip install "tilion[mcp]" # command: tilion-mcp
# —or, zero-install—
npx -y tilion-mcp # auto-runs the server via uv (no global install)
Claude Desktop — Настройки → Разработчик → Edit Config (claude_desktop_config.json):```json
{ "mcpServers": { "fortress": { "command": "tilion-mcp" } } }
<sub>Предпочитаете npx? Используйте <code>"command": "npx", "args": ["-y", "tilion-mcp"]</code>. Перезапустите Claude, и появятся инструменты <b>fortress</b>.</sub>
**Claude Code** (CLI) — одна строка:```bash
claude mcp add fortress -- tilion-mcp # or: claude mcp add fortress -- npx -y tilion-mcp
Cursor (~/.cursor/mcp.json) · Cline / Windsurf (VS Code → MCP servers) — тот же блок:```json
{ "mcpServers": { "fortress": { "command": "tilion-mcp" } } }
Затем просто попросите своего агента — *«получить цену с этой страницы StockX»* — и он сам вызовет `fetch_protected_page`.
### Что получает агент
| | tools |
|---|---|
| **Получение заблокированных страниц** | `fetch_protected_page` · `read_page` · `get_page_html` · `search_web` |
| **Структурированные данные** | `extract_page` (с учетом схемы) · `extract_document` (PDF/DOCX/XLSX) |
| **Целые сайты** | `crawl_site` (авто-SPA) · `recon_site_apis` (найти частный JSON API) |
| **Управление страницей** | `page_elements` · `click_button` · `fill_field` · `press_key` · `wait_for` · `evaluate_js` |
| **Многошаговые потоки** | `run_browser_task` (вход, пагинация, бесконечная прокрутка, оформление заказа, …) |
| **Захват / аутентификация** | `screenshot_page` · `save_page` · `download_file` · `save_profile` / `load_profile` |
| **Свой собственный** | `get_stealth_cdp_endpoint` → CDP-URL для Playwright / Puppeteer / browser-use |
Инструменты аннотированы (чтение — автоодобрение, запись — шлюз), **предварительно прогреты** при запуске (~100 мс первый вызов), безопасны для параллельной работы, защищены от тайм-аутов и SSRF-атак. Размещенная конечная точка с **жилым исходящим трафиком скоро появится**.
→ Полная таблица 29 инструментов, бенчмарки и навыки агента: **[`mcp/`](https://github.com/tiliondev/fortress/blob/HEAD/mcp/README.md)**
---
## Почему патчить движок, а не страницу
Обычный подход патчит `navigator.webdriver`, подделывает поставщика WebGL и переопределяет `navigator.plugins` из скрипта. CreepJS и подобные детекторы всё равно его отмечают, и причина **структурная**, а не ещё одно незакрытое свойство. JavaScript-подмена — это функция, стоящая на месте нативной. Детекторы откладывают возвращаемое значение в сторону и выясняют, является ли возвращающий объект нативным:
| Признак | Почему это ловит JS-подмену |
|---|---|
| Саморазоблачение `toString` | Нативный метод преобразуется в строку как `function get vendor() { [native code] }`; переопределённый — в свой собственный исходный код, так что один `.toString()` ловит это. |
| Дескриптор и `hasOwnProperty` | `getOwnPropertyDescriptor` раскрывает переопределённые свойства, а `hasOwnProperty('toString')` возвращает `true` на подменённой функции, тогда как нативная возвращает `false`. |
| `failsTypeError` | Нативные геттеры выбрасывают определённый `TypeError` при неправильном `this`; наивная заглушка молчит, и тишина — это сигнал. |
Повторное получение realm — это то, что побеждает любой патч основного мира. Детектор захватывает неизменный примитив из другого realm и натравливает его на вашу функцию:```js
const iframe = document.createElement('iframe'); document.body.appendChild(iframe);
const realToString = iframe.contentWindow.Function.prototype.toString;
realToString.call(navigator.__lookupGetter__('vendor')); // returns your source code. Caught.
Ваш main-world патч находится в другой области (realm), нежели тот iframe. Та же ловушка срабатывает из Web Worker — потока, который ваш шим главного потока выполняет рядом, а не внутри.
У Fortress нет такого слоя. Геттер navigator.vendor является геттером C++: он возвращает [native code], потому что это нативный код, идентичный во всех областях. Camoufox хорошо это формулирует: «здесь нет перехвата JavaScript, который можно было бы обнаружить». Fortress применяет ту же идею к V8 и Blink вместо Gecko.
Современные антибот-системы (Cloudflare, DataDome, Kasada, HUMAN, Akamai) считывают три структурно различных поверхности в трёх разных местах. Один инструмент редко исправляет все три:
Fortress — это движок уровня C, спроектированный так, чтобы уровни A и B тоже соблюдались. Сам бинарник оставляет канал CDP открытым. Это задача слоя управления, и притворяться иначе — значит быть пойманным.
Fortress опирается на реально существующие наработки: fingerprint-chromium, ChromiumFish и CloakBrowser были первыми, а коммерческие вендоры (Multilogin, Kameleo, GoLogin, AdsPower, Browserbase, Surfsky) перекомпилируют Chromium за закрытыми дверями. Большая часть этой работы остаётся закрытой: форки за paywall выдают вам бинарник и просят доверять ему, а вендоры хранят свои патчи внутри компании.
Fortress идёт другим путём, потому что движок скрытности остаётся полезным только тогда, когда те, кто на него полагается, могут видеть, как он работает. Каждое исправление поверхности находится в patches/ как небольшой одноцелевой diff, который можно прочитать за минуту, а весь движок пересобирается из исходников одним скриптом. Когда детектор находит новый индикатор, вы отслеживаете исправление, патчите его и отправляете обратно. Эта обратная связь — суть, и она работает, только пока движок остаётся достаточно открытым для чтения, расширения и пересборки.
Любую строку можно воспроизвести с помощью tools/gauntlet.py --bundle ./tilion-fortress. Проверено на живых детекторах; дата повторного запуска указана в docs/GAUNTLET_RESULTS.md.
| BrowserScan | CreepJS | Cloudflare |
|---|---|---|
![]() | ![]() | ![]() |
Бинарник не содержит ни одной брендовой строки; лаунчер применяет согласованную персону Windows по умолчанию. Переопределите любую поверхность с помощью ключей --uxr-* или установите TILION_NO_DEFAULTS=1 для голого запуска.```
--uxr-platform / --uxr-ua-platform / --uxr-ua-os / --uxr-ua-arch / --uxr-ua-bitness
--uxr-ua-platform-version / --uxr-ua-brand / --uxr-hw-concurrency / --uxr-device-memory
--uxr-webgl-vendor / --uxr-webgl-renderer / --uxr-webgl-fullparams
--uxr-canvas-seed / --uxr-audio-seed / --uxr-timezone / --uxr-languages
--uxr-screen-width / --uxr-screen-height / --uxr-webrtc-policy=disable_non_proxied_udp
| Env var | Назначение |
|---|---|
| `TILION_NO_DEFAULTS=1` | Пропустить стандартную персону (чистый запуск) |
| `TILION_TZ` / `TILION_LANG` | Быстрое переопределение часового пояса / языка |
> [!NOTE]
> **Персона сегодня передается через командную строку.** Флаги `--uxr-*` доступны для чтения всем процессам через `/proc/<pid>/cmdline`, поэтому на один запуск приходится одна персона, и она видна другим процессам на хосте. Следом появится среда выполнения `MaskConfig`: она будет передавать персону через IPC и снимет ограничение на одну персону на процесс (см. [что дальше](#whats-next)).
---
## Работает с вашим стеком
Fortress предоставляет сырой CDP на порту `:9222`, поэтому он встраивается в любое решение, поддерживающее Playwright, Puppeteer или CDP.
| Фреймворк | Подключение |
|---|---|
| [**browser-use**](https://github.com/browser-use/browser-use) (~70k звезд) | `cdp_url="http://localhost:9222"` |
| [**Crawl4AI**](https://github.com/unclecode/crawl4ai) (~58k звезд) | CDP конечная точка |
| [**Stagehand**](https://github.com/browserbase/stagehand) (~21k звезд) | `connectOverCDP` |
| [**LangChain**](https://github.com/langchain-ai/langchain) Playwright toolkit | Playwright CDP |
| **Playwright / Puppeteer** (Python и JS) | `connect_over_cdp` / `connect` |```python
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp("http://localhost:9222") # Fortress under the hood
export CHROMIUM_VERSION=$(cat CHROMIUM_VERSION) build/build.sh # depot_tools, sync the tag, apply patches, gn gen, ninja build/rebase-monthly.sh 152.0.XXXX.0 # bump + 3-way apply + rebuild + gauntlet-gate
Вывод: `out/Fortress/chrome`. Форк состоит из 34 небольших одноповерхностных патчей (`patches/`), поэтому большинство из них чисто применяются при обновлениях upstream; затем «перчатка» (gauntlet) блокирует релиз при любых регрессиях.
| Платформа | Статус |
|---|---|
| Linux x64 (нативный) · **Windows x64 (нативный)** · любая ОС через Docker | <img src="https://raw.githubusercontent.com/tiliondev/fortress/HEAD/docs/assets/icons/check.svg" width="15" alt="yes"> **поставляется** |
| Установщики с цифровой подписью · macOS `.app` · `linux/arm64` | в процессе |
### Проверьте, что это действительно наше
Fortress поставляется из четырех официальных каналов. Ко всему остальному относитесь как к недоверенному:
| | Официальный источник |
|---|---|
| **Исходный код** | [github.com/tiliondev/fortress](https://github.com/tiliondev/fortress) |
| **Docker** | [`tilion/fortress`](https://hub.docker.com/r/tilion/fortress) |
| **Python** | [`tilion-fortress`](https://pypi.org/project/tilion-fortress/) |
| **Node** | [`tilion-fortress`](https://www.npmjs.com/package/tilion-fortress) |
**Проверьте загрузку.** Каждый релиз включает `SHA256SUMS`, а SDK для `pip`/`npm` выполняют эту проверку за вас при установке:```bash
BASE=https://github.com/tiliondev/fortress/releases/download/v151.0.7908.0
curl -LO $BASE/tilion-fortress-linux-x64.tar.gz
curl -Ls $BASE/SHA256SUMS | sha256sum -c --ignore-missing # -> OK
Проверьте образ Docker по дайджесту (а не только по тегу):```bash docker pull tilion/fortress:151.0.7908.0 docker inspect --format '{{index .RepoDigests 0}}' tilion/fortress:151.0.7908.0
**Или ничему не доверяйте и пересоберите его.** Весь форк состоит из 34 читаемых патчей в `patches/`; `build/build.sh` воспроизводит бинарник из исходников Chromium, так что вы можете сравнить то, что собрали, с тем, что мы поставляем.
---
## Справочник
<details><summary><b>Устранение неполадок</b></summary>
<br/>
**Всё ещё блокируется Cloudflare, DataDome или Kasada.** В большинстве случаев это ваш **IP**, а не отпечаток: диапазон дата-центра получает флаг до выполнения любого скрипта страницы. Направьте исходящий трафик через резидентные или мобильные прокси и повторите попытку; если блокировка снята, отпечаток был в порядке.
**Отпечаток выглядит неправильно на хосте Linux.** Персона по умолчанию — Windows, но форма TLS и некоторые сигналы, связанные с ОС, следуют за основной машиной. Сопоставьте персону с вашей исходящей ОС или установите соответствующие флаги `--uxr-*`, чтобы история ОС соответствовала тому, откуда исходит трафик.
**macOS использует образ Docker.** Нативные бинарники для Linux и Windows поставляются сегодня; macOS всё ещё запускает Fortress через официальный образ Docker (`tilion/fortress`). Установите Docker Desktop или запускайте на Linux/Windows x64 для нативного бинарника.
**Персона отображается в `/proc/<pid>/cmdline`.** Флаги `--uxr-*` читаемы другими процессами на хосте, одна персона на запуск. Пока не появится runtime `MaskConfig`, держите одну персону на процесс и избегайте общего хоста с недоверенным кодом.
**Детектор отмечает то, что gauntlet проходит.** Обнаружение движется. Убедитесь, что вы на текущем rebase Chromium, затем откройте issue с тестовой страницей. Эта страница станет следующим патчем.
</details>
<details><summary><b>Часто задаваемые вопросы</b></summary>
<br/>
**Это законно?** Fortress — это проект по разработке браузера для легитимной автоматизации, тестирования и сбора общедоступных данных. Уважайте условия использования каждого сайта и законы вашей юрисдикции.
**Он действительно бесплатный?** Да. BSD-3, полностью открытый и размещаемый самостоятельно. Серия патчей опубликована, так что вы можете собрать текущий движок из исходников самостоятельно.
**Почему бы просто не использовать puppeteer-stealth или undetected-chromedriver?** Они патчат слой JS/CDP *после* того, как страница может проверить браузер, поэтому они раскрывают себя через `toString` и повторное получение области. Fortress переносит подмену в C++, где страница находит нативный код. (См. «Почему патчить движок, а не страницу».)
**Чем это отличается от Camoufox?** Та же идея перехвата на C++. Camoufox форкает Firefox (~3% трафика, постоянная аномалия), в то время как Fortress форкает Chromium и V8 (основной движок), поэтому User-Agent Chrome согласован по построению.
**Будет ли он проходить всё всегда?** Нет. Обнаружение постоянно развивается, поэтому мы поставляем датированный, воспроизводимый gauntlet и ежемесячный rebase Chromium; вы всегда можете точно увидеть, что проходит сегодня.
</details>
<details><summary><b>План развития</b></summary>
<br/>
- [ ] Конфигурация JSON времени выполнения в C++ `MaskConfig` (один бинарник, множество согласованных отпечатков, ничего в командной строке)
- [ ] Собственный MCP-сервер и SDK для Puppeteer / raw-CDP (замена для AI-агентов)
- [ ] Подписанные кодом Windows `.exe` и macOS `.app`
- [ ] Образ Docker `linux/arm64`
- [ ] Перенести `patches/` на переопределения в стиле Brave `chromium_src/`
- [ ] Опубликованные строки бенчмарков reCAPTCHA v3 / DataDome / Kasada (датированные, воспроизводимые)
</details>
<details><summary><b>Структура репозитория</b></summary>```
patches/ 34 per-surface C++ patches (+ series), the source of truth for the fork
build/ args.gn, build.sh, apply-patches.sh, rebase-monthly.sh, windows/, macos/
packaging/ tilion launcher, fonts.conf, Dockerfile, .deb + bundle builders
fonts/ 33 metric-compatible Windows-named fonts (incl. color emoji)
sdk/ python + node (tilion-fortress) prebuilt-binary SDKs
tools/ gauntlet.py, the CreepJS / Sannysoft / BrowserScan CI gate
docs/ GAUNTLET_RESULTS, BUILD_NATIVE, BENCHMARK
Нашли вектор обнаружения или утечку, которую мы пропустили? Откройте issue с воспроизводимой тестовой страницей. Страница, которая надежно детектит Fortress, — это самое ценное, что вы можете отправить. Она станет следующим патчем. Два правила: каждое заявление о возможности сопровождается командой, которая её воспроизводит, и каждый предел задокументирован. Слово «необнаружимый» в репозитории не используется.
Лицензия BSD-3-Clause для патчей и инструментов Fortress (соответствует Chromium). Chromium и встроенные шрифты сохраняют свои собственные лицензии; см. LICENSE и NOTICE. Серия патчей опубликована, так что вы можете самостоятельно проверить и пересобрать движок.
[!IMPORTANT]
v2: Маскированные персоны времени выполнения MaskConfig. IPC-доставляемый, детерминированный граф персон, питающий глобальный для процесса синглтон C++MaskConfig: тысячи инвариантных к согласованности отпечатков из одного бинарного файла, изоляция идентичности поBrowserContextи нулевой след в командной строке. Остальное — в дорожной карте.
Обнаружение не стоит на месте, поэтому скрытый движок настолько хорош, насколько свежим был его последний ребейз. Fortress ежемесячно отслеживает последнюю версию Chromium, заново проходит полный набор тестов и выпускает патч, как только детектор находит новый признак, чтобы то, что вы запускаете, продолжало соответствовать реальной установке Chrome. Следите за релизами, чтобы быть в курсе работы над v2 MaskConfig, или поставьте звезду репозиторию, если он вам полезен.
Стелс, который можно читать, пересобирать и запускать самостоятельно.
0%CreepJSбезголовый / стелс |
в каждом |
BSD-3открытый движок,соберите сами |
Паритет нативного кодаКаждый поддельный геттер является геттером C++: |
Встраиваемый CDPСырой CDP в стиле nodriver на |
Проходит полигон0% headless в CreepJS; Sannysoft, BrowserScan и живой Cloudflare Turnstile пройдены, всё как в стандартной установке Chrome. |
Аудируемые патчи34 небольших одноцелевых diff'а в |
Когерентность по построениюНастоящие V8, Blink и BoringSSL поддерживают согласованность движка, user-agent и формы TLS JA3/JA4: персона Windows на совместимом стеке. |
Настраиваемая персонаОдин бинарный файл, проверенная на согласованность личность Windows; ключи |
![]() Авто-пагинация: 30 цитат на 3 страницах. | ![]() Глубокий обход деталей: UPC · цена · налог · остаток · отзывы. |
![]() lowes.com · заблокирован → обойден | ![]() macys.com · заблокирован → обойден | ![]() kohls.com · заблокирован → обойден |
Не случайность на одном сайте — такое же до/после на крупных ритейлерах, защищенных Akamai, каждый запуск с одного и того же резидентного IP.
| Уровень | Индикаторы | Где находится исправление | Fortress |
|---|
| A: артефакты драйвера / бинарные артефакты | cdc_ переменные ChromeDriver, поверхность протокола WebDriver | Используйте сырой CDP, пропуская chromedriver | |
| B: побочные эффекты CDP | Runtime.enable раскрывает информацию через sourceURL + следы init-скриптов, независимо от чистоты бинарника | Слой управления/CDP-клиент: откладывайте Runtime.enable, используйте Runtime.addBinding + изолированные миры | |
| C: поверхность отпечатков | canvas, WebGL, аудио, шрифты, navigator, во всех фреймах, iframe, worker'ах | Движок (C++), потому что JS-переопределения выдают себя |
| Stock Playwright | puppeteer-extra-stealth | undetected-chromedriver | Camoufox | CloakBrowser | Fortress |
|---|
| Уровень подмены | нет | JS-инъекция | патч CDP/конфига | C++ движок | C++ движок | C++ движок |
toString возвращает [native code] | н/д | н/д | ||||
| Выживает при повторном получении области (iframe/worker) | ||||||
Нет утечек Runtime.enable | ||||||
| Движок = Chrome / V8 (большинство трафика) | ||||||
| Согласованная форма TLS Chromium | ||||||
| Полностью открытый движок | ||||||
| Опубликованная, проверяемая серия патчей | н/д | н/д | н/д | |||
| Воспроизводимая сборка из исходников | н/д | н/д | н/д | |||
| Указывает собственные ограничения | н/д | н/д | н/д |
| Набор | Обычный Chromium | Fortress |
|---|
| CreepJS | помечен как headless | 0% headless · 0% stealth, сигналы worker согласованы |
| bot.sannysoft.com | красные строки | 0 ошибок · WebDriver Advanced пройден · WebGL = NVIDIA RTX 3060 / ANGLE D3D11 |
| browserscan.net | обнаружен бот | «Ботов не обнаружено, возможно, человек» |
| rebrowser bot-detector | утечка Runtime.enable | нет утечки · webdriver=false · чистые init-скрипты (сырой CDP) |
| Cloudflare Turnstile | заблокирован | обойдён: человеческий клик прошёл живой челлендж (headed, датацентровый IP) |