
fortress v150.0.7871.114
隐形Chromium引擎,仅需更改一行代码即可阻止爬虫和浏览器代理被屏蔽。
一统天下的浏览器引擎
隐身 Chromium 引擎
Fortress 是一款隐身 Chromium 引擎,只需改动一行代码,即可阻止你的爬虫和浏览器代理被屏蔽。 机器人检测工具通过读取浏览器指纹来识别自动化;Fortress 在 Chromium 的 C++ 内部修正该指纹,使浏览器表现为普通的 Chrome 安装。爬虫顺利完成运行,代理到达指定页面,CreepJS、Sannysoft、BrowserScan 和实时的 Cloudflare Turnstile 均将其判为真人。将你现有的 Playwright 或 Puppeteer 通过 CDP 指向 Fortress,代码中其他部分无需任何改动。
Blink · V8 · BoringSSL 树内打补丁 · ANGLE / D3D11 驱动的 WebGL · JA3/JA4 一致的 TLS · 每月 上游合并 · 可重现、经严苛测试套件把关的 发布版
34单表面C++ 补丁 | 0%CreepJS无头 / 隐身 | 跨越每个 | BSD-3开放引擎,自行重建 |

未编辑的真实窗口中 Fortress 二进制程序捕获:它通过实时的 Cloudflare 挑战,将 bot.sannysoft.com 全部变绿,随后显示 BrowserScan“正常”。使用 tools/gauntlet.py 重现。
原生代码一致性每个伪造的 getter 都是 C++ 的 getter: |
即插即用 CDP在 |
通过严苛测试套件CreepJS 显示 0% 无头;Sannysoft、BrowserScan 和实时的 Cloudflare Turnstile 均通过,如同普通的 Chrome 安装。 |
可审计的补丁
|
天然一致真正的 V8、Blink 和 BoringSSL 确保引擎、用户代理和 JA3/JA4 TLS 形态一致:在匹配的堆栈上呈现 Windows 角色。 |
可调角色单一二进制,经过一致性检查的 Windows 身份; |
🆕 更新内容 — 151.0.7908.0 · 引擎刷新
已发布。 每次启动一致的角色,更加强化。
- 每区域键盘(QWERTY / QWERTZ / AZERTY)· 每角色媒体设备· 完整的交付一致性检查。
- 平台 ↔ GPU ↔ 时区 ↔ 语言 ↔ 语音 ↔ 键盘作为一个一致的真实设备移动——每次启动,单一二进制即可。
- 原生代码一致性(
toString()保持[native code]),跨领域不变(主/工作线程/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)** | 介绍、安装、第一个脚本、AI代理设置 |
| **[Fortress MCP 协议](#the-fortress-mcp--stealth-browsing-as-agent-tools)** | 面向AI代理的29个隐形浏览器工具(测试版) |
| **[为什么修补引擎而非页面](#why-patch-the-engine-not-the-page)** | 自我暴露JS论点 + 三层检测机制 |
| **[Fortress 与其他方案对比](#how-fortress-compares)** | 对比 puppeteer-stealth · Camoufox · CloakBrowser · 闭源供应商 |
| **[证明:实时检测结果](#proof-live-detector-results)** | CreepJS / Sannysoft / BrowserScan / Cloudflare 及截图 |
| **[配置身份特征](#configure-the-persona)** | `--uxr-*` 指纹表面 |
| **[适配你的技术栈](#works-with-your-stack)** | browser-use · Crawl4AI · Stagehand · LangChain |
| **[构建与验证](#build--verify)** | 从源码复现、验证来源 |
| **[参考](#reference)** | 故障排除 · 常见问题 · 路线图 · 仓库结构 |
---
## 它是什么
Fortress 是一个 Chromium 分支,从引擎内部伪造浏览器指纹。机器人检测器读取的表面(canvas、WebGL、音频、字体、navigator 以及约三十余项)均在 Chromium 的 **C++** 层中被修正,无需在页面之上叠加 JavaScript 补丁层,以免被页面捕获。
它以普通浏览器二进制文件形态发布,暴露 CDP 端点。将 Playwright、Puppeteer 或任何 CDP 客户端指向它,现有自动化代码无需修改即可运行。
JavaScript 隐身补丁会留下一个页面可发现的额外层:`.toString()` 显示覆盖代码的源码,从 iframe 或 worker 重新读取同一原始对象可绕过补丁。Fortress 直接在引擎中修正表面,因此 `navigator.vendor` 解析为真实的 C++ 访问器,报告 `[native code]`,且从每个 realm 读取结果一致。自检页面看到的将是标准 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();
12秒快速导览
一轮完整真实抓取:通过 CreepJS / Sannysoft / BrowserScan / rebrowser → 通过 CDP 提取结构化数据 → 在 aa.com · lowes · macys · kohls 上清除 Akamai(同一住宅 IP)。
真实抓取,完全无头
Fortress 引擎通过 CDP 驱动的未修饰抓取视频。无隐式插件、无 JS 补丁:指纹在二进制层面修正。请用 examples/scrape_demos.py 复现任意示例。
结构化提取:每个条目被读取时,记录实时构建为类型化 JSON。
![]() 自动分页:3 页共 30 条语录。 | ![]() 深度详情抓取:UPC · 价格 · 税费 · 库存 · 评价。 |
真实 Akamai 清除 —— 前后对比
同一住宅 IP、同一网站(aa.com · Akamai Bot Manager)。普通/无头浏览器收到 Access Denied(参考编号 #);Fortress 加载真实页面,Akamai 颁发其 _abck 传感器 Cookie —— Bot Manager 将其视为真实浏览器。变量在于指纹,而非 IP。
![]() lowes.com · 被拦截 → 已清除 | ![]() macys.com · 被拦截 → 已清除 | ![]() kohls.com · 被拦截 → 已清除 |
并非单一网站偶发现象 —— 在多个受 Akamai 保护的主流零售商网站上,相同住宅 IP 每次运行均呈现同样前后对比效果。
快速开始```bash
Python / Node: prebuilt native binary auto-fetched (Linux x64 & Windows x64), SHA-256 verified
pip install tilion-fortress npm install tilion-fortress
Any OS via Docker: raw CDP on :9222 (~302 MB pull / 851 MB on disk, stripped single-layer)
docker run --rm -p 9222:9222 tilion/fortress:latest
Portable bundle (extract-and-run, like a Chromium snapshot)
tar xzf tilion-fortress-linux-x64.tar.gz # Linux ./tilion-fortress/tilion --headless=new --remote-debugging-port=9222 --user-data-dir=/tmp/p
Debian / Ubuntu
sudo apt install ./tilion-fortress_151.0.7908.0_amd64.deb && tilion https://example.com
> [!TIP]
> SDK 附带编译好的构建版本 **以及 `patches/`**,因此你可以自行重新构建引擎,并根据源代码验证每一项表层修正。下载文件会自动通过 `SHA256SUMS` 进行 SHA-256 校验。
### 版本
Fortress 基于 **两个 Chromium 内核版本** 发布——根据隐匿性与最新性之间的权衡进行选择:
| 频道 | Chromium 版本 | 使用场景 |
|---|---|---|
| **`stable`** *(默认)* | **149** | 推荐 —— 与大多数真实用户运行的 Chrome 版本一致,因此隐匿性最佳 |
| **`latest`** | **151** | 最新引擎(报告版本略高于稳定版) |```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
本地二进制文件:Linux x64(两个版本)+ Windows x64(151);Windows-149 和 macOS 通过 Docker 镜像运行。
将其放入你的 AI 代理
Fortress 是你的代理驱动的浏览器:在 :9222 上提供原始 CDP,无需连接任何隐身插件。有两种接入方式。
选项 1:在聊天助手中预加载打开。 一键点击;它会读取我们的 AGENTS.md 并引导你完成整个设置过程:
选项2:为代理复制(所有内容到剪贴板)。 点击下方文本框右上角的复制图标。它会将整个设置上下文复制到你的剪贴板:包括是什么、安装、连接、角色和规则,全部浓缩自 AGENTS.md。将其粘贴到 Cursor、Claude Code、Copilot、ChatGPT 或任何代理中,它就能直接开始工作:```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:
- Drive over raw CDP (:9222); don't spawn chromedriver.
- Never pass --user-agent (use --uxr-ua-*); it desyncs UA vs UA-Client-Hints.
- No puppeteer-stealth / undetected-chromedriver / JS fingerprint patches.
- Blocked ~90% = my IP (datacenter), not the fingerprint. Use a residential/mobile proxy, then retry.
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>
Raw 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 — 设置 → 开发者 → 编辑配置 (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 服务器) — 相同的块:```json
{ "mcpServers": { "fortress": { "command": "tilion-mcp" } } }
然后只需对你的代理说——*“从这个StockX页面获取价格”*——它就会自行调用`fetch_protected_page`。
### 代理获取的内容
| | 工具 |
|---|---|
| **获取被屏蔽的页面** | `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` → 用于Playwright / Puppeteer / browser-use的CDP URL |
工具带有注释(读取自动批准,写入门控),启动时**预加热**(首次调用约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` | 原生getter在错误的`this`上会抛出一个特定的`TypeError`;简单的垫片保持沉默,而沉默就是信号。 |
| 域重新获取 | 检测器从另一个域中抓取一个原始原语,并在你的函数上使用它: |```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.
您的主世界补丁存在于与 iframe 不同的领域。相同的陷阱也会从 Web Worker 触发,您的主线程 shim 运行在 Worker 旁边,而非内部。
Fortress 没有这一层。navigator.vendor 的 getter 就是 C++ getter:它报告 [native code],因为它本身就是原生代码,在所有领域内都是相同的。Camoufox 很好地总结道:“没有可检测到的 JavaScript 劫持。” Fortress 将同样的理念应用于 V8 和 Blink 以取代 Gecko。
机器人检测的三个层面,以及 Fortress 所处的位置
现代的防机器人系统(Cloudflare、DataDome、Kasada、HUMAN、Akamai)在三个不同的位置读取三个结构上不同的层面。单一工具很少能同时修复所有三个层面:
| 层面 | 特征标记 | 修复所在位置 | Fortress |
|---|---|---|---|
| A: 驱动/二进制工件的痕迹 | cdc_ ChromeDriver 变量、WebDriver 协议表面 | 直接驱动原始 CDP,跳过 chromedriver | |
| B: CDP 副作用 | Runtime.enable 通过 sourceURL + init-script 足迹泄露,无论二进制文件多干净 | 控制/CDP 客户端层:阻止 Runtime.enable,使用 Runtime.addBinding + 隔离世界 | |
| C: 指纹表面 | canvas、WebGL、音频、字体、navigator,遍布主框架、iframe、worker | 引擎(C++),因为 JS 覆盖会自我暴露 |
Fortress 是一个 C 层面的引擎,构建为被驱动的方式,以便 A 和 B 层面也能保持。仅靠二进制文件会使 CDP 通道保持开放。这部分依赖于控制层面,否则就是被抓住的原因。
Fortress 的对比
| Stock Playwright | puppeteer-extra-stealth | undetected-chromedriver | Camoufox | CloakBrowser | Fortress | |
|---|---|---|---|---|---|---|
| 伪装层 | 无 | JS 注入 | CDP/配置补丁 | C++ 引擎 | C++ 引擎 | C++ 引擎 |
toString 返回 [native code] | 不适用 | 不适用 | ||||
| 在领域重新获取后(iframe/worker)存活 | ||||||
无 Runtime.enable 泄露 | ||||||
| 引擎 = Chrome / V8(主流流量) | ||||||
| 一致的 Chromium TLS 形状 | ||||||
| 完全开源引擎 | ||||||
| 已发布、可审计的补丁系列 | 不适用 | 不适用 | 不适用 | |||
| 可重现的从源码构建 | 不适用 | 不适用 | 不适用 | |||
| 声明自身局限性 | 不适用 | 不适用 | 不适用 |
Fortress 建立在真实的前人基础上:fingerprint-chromium、ChromiumFish 和 CloakBrowser 是先驱,商业供应商(Multilogin、Kameleo、GoLogin、AdsPower、Browserbase、Surfsky)则在闭源下重新编译 Chromium。这些工作大部分保持封闭:付费墙后的 fork 向您提供二进制文件并要求您信任它,供应商则将补丁保留在内部。
Fortress 走相反的方向,因为只有当依赖它的人能看到它的工作原理时,隐身引擎才能保持实用性。 每个表面修正都存在于 patches/ 中,是一个小的、单一目的的差异文件,您可以在一分钟内阅读完,整个引擎可以通过一个脚本从源码重建。当检测器发现新特征时,您可以追踪修复、打补丁并回馈。这个反馈循环是关键,并且只有当引擎保持足够开放以供阅读、扩展和重建时才有效。
证明:实时检测结果
用 tools/gauntlet.py --bundle ./tilion-fortress 重现任何一行。已针对实时检测器验证;重新运行日期记录在 docs/GAUNTLET_RESULTS.md 中。
| 检测套件 | 原版 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-script(原始 CDP) |
| Cloudflare Turnstile | 被拦截 | 绕过:一次人工点击清除了实时挑战(headed,数据中心 IP) |
证明:真实、未编辑的截图
| 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
| 环境变量 | 用途 |
|---|---|
| `TILION_NO_DEFAULTS=1` | 跳过默认角色(裸启动) |
| `TILION_TZ` / `TILION_LANG` | 快速时区/语言覆盖 |
> [!NOTE]
> **当前角色通过命令行传递。** `--uxr-*` 开关通过 `/proc/<pid>/cmdline` 对所有进程可读,因此每次启动只能设置一个角色,并且对主机上的其他进程可见。`MaskConfig` 运行时即将到来:它将通过 IPC 传递角色,打破每个进程一个角色的限制(参见[下一步计划](#whats-next))。
---
## 与您的技术栈配合使用
Fortress 在 `:9222` 上暴露原始 CDP,因此它可以嵌入任何支持 Playwright、Puppeteer 或 CDP 的工具。
| 框架 | 连接方式 |
|---|---|
| [**browser-use**](https://github.com/browser-use/browser-use)(约7万星) | `cdp_url="http://localhost:9222"` |
| [**Crawl4AI**](https://github.com/unclecode/crawl4ai)(约5.8万星) | CDP 端点 |
| [**Stagehand**](https://github.com/browserbase/stagehand)(约2.1万星) | `connectOverCDP` |
| [**LangChain**](https://github.com/langchain-ai/langchain) Playwright 工具包 | 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
构建与验证
从源码复现```bash
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/`),因此大部分补丁可以在上游版本中干净地重新应用;然后,这套严苛的流程会在检测到任何回归时阻止发布。
| 平台 | 状态 |
|---|---|
| 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 通过四个官方渠道发布。其他任何来源都视为不可信:
| | 官方来源 |
|---|---|
| **Source** | [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`,并且 `pip`/`npm` SDK 会在安装时自动为您运行此验证:```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镜像通过digest(而不仅仅是tag):```bash docker pull tilion/fortress:151.0.7908.0 docker inspect --format '{{index .RepoDigests 0}}' tilion/fortress:151.0.7908.0
compare the printed sha256:... against the digest in the GitHub Release notes
**或不信任任何东西,自行构建。** 整个分支包含 `patches/` 目录下的 34 个可读补丁;`build/build.sh` 从 Chromium 源码重现二进制文件,因此你可以将构建结果与我们提供的进行对比。
---
## Reference
<details><summary><b>Troubleshooting</b></summary>
<br/>
**仍然被 Cloudflare、DataDome 或 Kasada 拦截。** 大多数情况下是你的 **IP**,而不是指纹:数据中心 IP 段在页面脚本运行前就会被标记。请通过住宅或移动代理路由出口流量并重试;如果问题解决,则指纹是正常的。
**指纹在 Linux 主机上看起来异常。** 默认用户画像(persona)是 Windows,但 TLS 形状和一些面向操作系统的信号会跟随底层机器。请将用户画像与出口流量的操作系统匹配,或设置相应的 `--uxr-*` 标志,使操作系统信息与流量出口一致。
**macOS 拉取 Docker 镜像。** 目前原生 Linux + Windows 二进制文件已发布;macOS 仍需要通过官方 Docker 镜像(`tilion/fortress`)运行 Fortress。请安装 Docker Desktop,或在 Linux/Windows x64 上运行以使用原生二进制文件。
**用户画像出现在 `/proc/<pid>/cmdline` 中。** `--uxr-*` 标志在主机上对其他进程可见,每个启动对应一个用户画像。在运行时 `MaskConfig` 落地之前,请保持每个进程一个用户画像,并避免与不可信代码共享主机。
**检测器标记了某个测试通过的内容。** 检测手段在不断发展。请确认你使用的是最新的 Chromium 重置版本,然后使用测试页面提交 issue。该页面将成为下一个补丁。
</details>
<details><summary><b>FAQ</b></summary>
<br/>
**这是否合法?** Fortress 是一个浏览器工程项目,用于合法的自动化、测试和公开数据抓取。请尊重每个网站的服务条款以及您所在司法管辖区的法律。
**它真的免费吗?** 是的。BSD-3 许可,完全开源,可自行托管。补丁系列已发布,因此你可以自己从源码构建当前引擎。
**为什么不直接使用 puppeteer-stealth 或 undetected-chromedriver?** 它们在页面可以检查浏览器之后才修补 JS/CDP 层,因此会通过 `toString` 和 realm 重新获取暴露自身。Fortress 将伪装移入 C++,页面看到的是原生代码。(参见“为什么要修补引擎,而不是页面”)
**这与 Camoufox 有何不同?** 相同的 C++ 拦截思路。Camoufox 基于 Firefox 分支(约占 3% 流量,一直是个异常),而 Fortress 基于 Chromium 和 V8(主流引擎),因此 Chrome 用户代理从构造上是一致的。
**它会永远通过所有检测吗?** 不会。检测技术不断进步,因此我们提供带日期、可复现的测试套件和每月一次的 Chromium 重置;你随时可以看到当前通过的内容。
</details>
<details><summary><b>Roadmap</b></summary>
<br/>
- [ ] 运行时 JSON 配置集成到 C++ `MaskConfig`(一个二进制文件,多个一致的指纹,命令行无痕迹)
- [ ] 第一方 MCP 服务器以及 Puppeteer / 原生 CDP SDK(可直接用于 AI 代理)
- [ ] 已签名的 Windows `.exe` 和 macOS `.app`
- [ ] `linux/arm64` Docker 镜像
- [ ] 将 `patches/` 迁移到 Brave 风格的 `chromium_src/` 覆盖
- [ ] 发布 reCAPTCHA v3 / DataDome / Kasada 基准测试行(带日期,可复现)
</details>
<details><summary><b>Repo layout</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 的页面是你所能提供的最有价值的东西。它将成为下一个补丁。两条内部规则:每个能力声明都附带一条复现它的命令,每个限制都被记录在案。“不可检测”这个词不会出现在仓库中。
许可证
Fortress 补丁和工具采用 BSD-3-Clause 许可证(与 Chromium 一致)。Chromium 及捆绑字体保留其各自的许可证;参见 LICENSE 和 NOTICE。补丁系列已发布,你可以自行审计和重建引擎。
下一步
[!IMPORTANT]
v2:MaskConfig 运行时人设。 一个通过 IPC 传递的、种子驱动的人设图,为进程全局的 C++MaskConfig单例提供数据:从单个二进制文件生成数千个一致性不变的指纹,每个BrowserContext的身份隔离,以及零命令行痕迹。其余内容在路线图上。







