调查研究-217 Fortress:当浏览器 Agent 开始被网站识别,开源 Chromium 反拦截引擎来了

0 阅读18分钟

TL;DR

  • 场景:Browser Use / Stagehand / Crawl4AI 等浏览器 Agent 真正进入网页后,反爬、指纹、验证码、行为识别成为落地主要障碍。
  • 结论:Fortress(tiliondev/fortress,2026/7/4 HN Show HN)把 stealth 从 JS 注入层下沉到 Chromium C++ 层,通过 34 个 single-surface 补丁保持浏览器故事自洽;这是 Agent stack 继续下沉的信号。
  • 产出:33 行版本矩阵 / 8 节正文 / 12 行错误速查卡 / 8 项可选精确化建议 / 参考来源。

版本矩阵

类别状态说明
项目主体GitHub 仓库 tiliondev/fortress✅ 已验证README / AGENTS.md / SECURITY.md / llms.txt / GAUNTLET_RESULTS.md / BUILD_NATIVE.md / BENCHMARK.md / CHROMIUM_VERSION / patches/ 均存在
项目主体仓库简介✅ 已验证"Stealth Chromium engine that stops scrapers and browser agents from getting blocked, with one line of code change"(README)
引擎版本CHROMIUM_VERSION 151.0.7908.0✅ 已验证raw 文件直接读取
引擎版本双 channel:stable (149) / latest (151)✅ 已验证README 显式说明
协议BSD-3-Clause✅ 已验证README "BSD-3-Clause for the Fortress patches and tooling"
协议字体 / Chromium 各自保留原协议✅ 已验证README 引用 LICENSE / NOTICE
补丁结构34 个 single-surface C++ patches✅ 已验证README + repo layout "patches/ 34 per-surface C++ patches"
补丁结构位于 patches/ 目录✅ 已验证repo layout
接口Raw CDP endpoint on :9222✅ 已验证README 多次提及
接口Runtime.enable leak(rebrowser bot-detector 验证)✅ 已验证README + GAUNTLET_RESULTS.md
接口兼容 Playwright / Puppeteer / browser-use / Crawl4AI / Stagehand / LangChain✅ 已验证README "Works with your stack" 表格
指纹一致性默认 coherent Windows identity✅ 已验证README + GAUNTLET_RESULTS.md
指纹一致性navigator.vendor 等 getter 来自 C++、跨 realm 一致、toString() 返回 [native code]✅ 已验证README "Native-code parity"
指纹一致性JA3/JA4 TLS 形态与 V8/Blink/User-Agent 一致✅ 已验证README "Coherent by construction"
指纹一致性WebGL Vendor Google Inc. (NVIDIA) / Renderer ANGLE (NVIDIA, NVIDIA GeForce RTX 3060 Direct3D11 vs_5_0 ps_5_0, D3D11)✅ 已验证GAUNTLET_RESULTS.md
Persona--uxr-* 完整覆盖 platform / UA / hw / webgl / canvas / audio / timezone / languages / screen / webrtc✅ 已验证README "Configure the persona" 完整列表
Persona单进程、单 persona(/proc/<pid>/cmdline 可见)✅ 已验证README troubleshooting "one persona per launch"
检测基线CreepJS:0% headless / 0% stealth✅ 已验证README + GAUNTLET_RESULTS.md
检测基线bot.sannysoft.com:0 failed / WebDriver Advanced passed✅ 已验证README + GAUNTLET_RESULTS.md
检测基线browserscan.net:"No bots detected — the visitor could be a human"✅ 已验证README + GAUNTLET_RESULTS.md
检测基线rebrowser bot-detector:无 Runtime.enable leak✅ 已验证README + GAUNTLET_RESULTS.md
检测基线Cloudflare Turnstile:bypassed(headed, datacenter IP)✅ 已验证README + GAUNTLET_RESULTS.md
平台Linux x64 native(149 + 151)✅ 已验证README "Build & verify"
平台Windows x64 native(仅 151,149 走 Docker)✅ 已验证README "Versions"
平台macOS 通过 Docker;原生 .app 仍在路线图✅ 已验证README troubleshooting + roadmap
平台linux/arm64 仍在路线图✅ 已验证README roadmap
平台代码签名安装包(Windows / macOS)✅ 已验证README roadmap
渠道PyPI tilion-fortress✅ 已验证README badge
渠道npm tilion-fortress✅ 已验证README badge
渠道Docker tilion/fortress(latest / 149 / 151 标签)✅ 已验证README + Releases
渠道GitHub Releases 含 SHA256SUMS✅ 已验证README "Verify a download"
社区HN Show HN 标题 "Show HN: Fortress – open-source Chromium that keeps browser agents unblocked"(HN item 48781600)✅ 已验证webfetch HN 页面确认标题、积分 7、提交时间约 2 days ago(≈ 2026/7/4)
社区HN 提交者 arhamislam5766;评论区出现 arhamshahrier / armanluthra_ 多账号讨论,被其他用户质疑为同一运营者群体⚠️ 项目方声明观察本身由 HN 评论直接给出(gnabgib 提问),不代表对 Fortress 功能的否定
路线图v2 MaskConfig runtime personas(IPC-delivered,seed-driven,单 binary 多 fingerprint)✅ 已验证README "What's next"
路线图Brave-style chromium_src/ overrides 迁移✅ 已验证README roadmap
路线图First-party MCP server + Puppeteer / raw-CDP SDK✅ 已验证README roadmap
路线图reCAPTCHA v3 / DataDome / Kasada benchmark 行(dated, reproducible)✅ 已验证README roadmap
上游 rebasemonthly Chromium rebase + dated reproducible gauntlet✅ 已验证README "Staying current"
上游 rebasebuild/rebase-monthly.sh 152.0.XXXX.0 脚本✅ 已验证README "Build & verify"
安全策略检测向量(detection vector)与安全漏洞分离✅ 已验证SECURITY.md "What counts as what"
安全策略检测向量走公开 issue + "Detection vector" 模板✅ 已验证SECURITY.md
安全策略真实漏洞走 GitHub private vulnerability reporting✅ 已验证SECURITY.md
AI 上下文AGENTS.md 提供"paste-anywhere"完整 setup 上下文给 AI Agent✅ 已验证文件存在 + README 引用
AI 上下文llms.txt LLM-friendly 项目摘要✅ 已验证文件存在
同类对比Stock Playwright / puppeteer-extra-stealth / undetected-chromedriver / Camoufox / CloakBrowser 五方对比表✅ 已验证README "How Fortress compares"
同类对比Camoufox 是 Firefox fork(约 3% 流量);Fortress 是 Chromium fork(主流 Chrome/V8 身份)✅ 已验证README FAQ
同类对比CloakBrowser 仍闭源,最新主版本 paywalled✅ 已验证README 对比表
上游经验fingerprint-chromium / ChromiumFish 等先前 Chromium fork 经验✅ 已验证README 致谢
行为指纹FP-Agent 论文:arXiv 2605.01247✅ 已验证arXiv 直接访问确认
行为指纹FP-Agent 结论:浏览器指纹在多 Agent 共用时区分力有限;行为指纹(typing / scrolling / mouse)更有区分度✅ 已验证论文摘要
行为指纹FP-Agent 检测全部 7 个 AI browsing agents,Cloudflare 仅检测 1 个✅ 已验证论文摘要 case study
行为指纹FP-Agent 作者 Ethan Wang / Zubair Shafiq / Yash Vekaria;提交 2026/5/2✅ 已验证arXiv 元数据
Web 安全Mind the Web 论文:arXiv 2506.07153✅ 已验证arXiv 直接访问确认
Web 安全Mind the Web 结论:Task-aligned injection 攻击 ASR > 80%,对带安全机制的 Agent 仍有效✅ 已验证论文摘要
Web 安全Mind the Web 作者 Avishag Shapira / Parth Atulbhai Gandhi / Edan Habler / Asaf Shabtai;v1 2025/6/8,v2 2025/10/20✅ 已验证arXiv 元数据
CloudflareBot Management / JavaScript Detections 文档存在并说明 headless browsers / malicious fingerprints 识别机制✅ 已验证developers.cloudflare.com/bots
局限Fortress 不能解决行为识别✅ 已验证README "Troubleshooting" + 第七节原文
局限Fortress 不能解决账号与业务风控(账号年龄、频率、支付、设备绑定、IP 信誉)✅ 已验证README troubleshooting
局限仍被 Cloudflare / DataDome / Kasada 拦截 ≈ 90% 概率是 IP(datacenter),不是 fingerprint✅ 已验证README "Troubleshooting" + AGENTS.md RULES 4
局限linux/arm64 与 macOS .app / 代码签名安装包仍待完成✅ 已验证README roadmap
Akamai 案例README 展示 aa.com / lowes.com / macys.com / kohls.com 同 residential IP 下从 blocked → cleared⚠️ 项目方截图与第三方独立基准不同,仅供 README 视觉佐证
GitHub starsREADME 引用 star-history.png;具体当前 star 数未在搜索结果中独立验证⚠️ 项目方声明链接可用,但未独立核对当前数值

过去一年,浏览器 Agent 的叙事明显加速。

Browser Use、Stagehand、Playwright Agent、Crawl4AI 这类工具,把"浏览器"变成了 Agent 的执行器:让 AI 打开网页、点击按钮、填写表单、提取数据,甚至跨站完成一个真实业务流程。

但一旦 Agent 真正进入网页世界,它面对的就不只是 DOM、按钮和表单。真实互联网里还有反爬、风控、验证码、行为识别、浏览器指纹检测、账号信誉、IP 质量和安全策略。

Fortress 就是在这个背景下出现的一个项目。

它的 GitHub 仓库是 tiliondev/fortress,项目定位很直接:一个 stealth Chromium engine,目标是让 scraper 和 browser agent 不容易因为自动化浏览器特征而被拦截。它在 2026 年 7 月 4 日出现在 Hacker News 的 Show HN 页面,标题是"Fortress - open-source Chromium that keeps browser agents unblocked"。HN 页面热度不算高,但它代表的方向值得关注:浏览器 Agent 的竞争,正在从"模型会不会操作网页",进入"浏览器执行环境能不能进入网页"。

这篇文章不把 Fortress 当成"绕过所有检测"的神器,而把它当成一个信号:Agent stack 正在继续下沉。模型、框架、浏览器控制层之外,浏览器内核、网络身份和风险边界都会成为基础设施的一部分。

一、Fortress 到底是什么

Fortress 不是一个新的爬虫框架,也不是一个 Puppeteer 插件。它更底层:它是一个 Chromium fork。

传统自动化方案通常是 Playwright、Puppeteer、Selenium 启动一个浏览器,再通过脚本层去隐藏自动化痕迹。例如改 navigator.webdriver,改 WebGL vendor,改 user agent,补 plugins、languages、permissions 等接口,或者在页面加载前注入 stealth 脚本。

Fortress 的思路不同。它不主要在页面 JavaScript 层打补丁,而是在 Chromium 的 C++ 层修改浏览器指纹表面。

按照项目 README 的说法,它会在 Chromium 内部修正 canvas、WebGL、audio、fonts、navigator 等多个浏览器指纹表面,使页面看到的结果更像普通 Chrome,而不是一个被自动化框架控制的浏览器。它同时暴露 CDP endpoint,因此现有 Playwright、Puppeteer 或任何 CDP 客户端可以继续连接,只是底层浏览器换成 Fortress。

这就是它所谓"一行代码替换"的含义:不是重写 Agent,不是重写爬虫流程,而是把原来的浏览器内核替换成一个经过指纹一致性处理的 Chromium。

二、为什么不能只靠 JS stealth 插件

Fortress 的核心判断是:JS 层伪装会自我暴露。

很多 stealth 插件会在页面加载前注入脚本,重写某些浏览器对象。早期反自动化检测比较粗糙,只要把几个显眼字段补掉,就能明显降低暴露概率。例如 navigator.webdriver 不要是 true,WebGL renderer 不要露出 Headless,plugins 和 languages 不要空得太奇怪。

但反 bot 脚本也在演进。它们不只看"字段值是什么",还会看"这个字段值是怎么来的"。

一个典型问题是原生 getter 与注入函数的差异。原生浏览器 API 的 toString() 往往表现为 native code,而 JS 注入改写的 getter 可能暴露脚本实现、属性描述符差异或跨 realm 不一致。更麻烦的是 iframe、worker、不同 execution realm 之间可以重新获取相对干净的原型方法,绕过主页面注入补丁。

所以 Fortress 的判断不是"还有哪个字段没补好",而是"补丁层本身会成为检测对象"。如果 stealth 逻辑停留在页面 JS 层,它就天然站在网站脚本可以观察和反推的位置。

Fortress 选择把伪装位置下沉到浏览器引擎内部。它让 getter 本身来自 C++,让 main frame、iframe、Web Worker 等不同环境里的返回更一致,也让页面脚本更难通过 toString() 或跨 realm 对比发现补丁痕迹。

这背后的判断很关键:反检测不再是"改几个字段",而是"让整个浏览器故事自洽"。

三、现代网站到底怎么识别 Agent

浏览器 Agent 被拦截,大体有三层原因。

第一层是自动化驱动痕迹。比如 ChromeDriver 特征、WebDriver 协议暴露、自动化变量、异常启动参数、Headless 行为差异。这类问题过去主要出现在 Selenium、早期 Headless Chrome 和不干净的自动化框架里。

第二层是浏览器指纹。网站会通过 JavaScript 读取 canvas、WebGL、AudioContext、字体、屏幕、时区、语言、硬件并发数、device memory、Client Hints 等信息,再判断这些信息是否像一个真实用户环境。Cloudflare 官方文档也提到,其 JavaScript Detections 会识别 headless browsers 和 malicious fingerprints,并在客户端执行轻量 JS 检测。

第三层是网络和行为。TLS 指纹、HTTP headers、IP 类型、代理质量、鼠标轨迹、滚动节奏、输入间隔、页面停留时间、点击路径,都会进入判断。

2026 年一篇关于 AI browsing agents 指纹识别的论文指出,浏览器指纹在多个 Agent 共用相似浏览器时区分力有限,但行为指纹更有区分度;研究者在受控网站上收集浏览器和行为特征,用于区分七类 AI browsing agents 与人类用户。

Fortress 主要解决第二层,也部分照顾第一层。它不能解决所有问题。项目 README 里也强调,如果仍然被 Cloudflare、DataDome、Kasada 等系统拦截,很多时候问题可能是 IP,而不是浏览器指纹;如果检测继续演进,也需要持续 rebase 和新增 patch。

这点很重要。Fortress 不是"万能通行证",而是把浏览器指纹这一层做得更接近真实 Chrome。

四、Fortress 的技术卖点

Fortress 的卖点可以概括为五个。

第一,基于 Chromium,而不是 Firefox。项目作者强调 Chrome/V8 是主流浏览器栈,因此用 Chromium fork 做 Chrome 身份更容易保持整体一致性。相比 Firefox fork,Chromium 在 user agent、Client Hints、V8、Blink、TLS 形态等方面更适合伪装为主流 Chrome 流量。

第二,补丁在 C++ 层。README 称当前有 34 个 single-surface C++ patches,覆盖多个指纹表面,并放在 patches/ 目录中,用户可以审计和重建。

第三,CDP 接入。Fortress 暴露 raw CDP endpoint,Playwright、Puppeteer、browser-use、Crawl4AI、Stagehand、LangChain Playwright toolkit 等都可以通过 CDP 接入。换句话说,它不是替代上层 Agent 框架,而是站在这些框架下面,作为浏览器执行环境。

第四,指纹一致性。README 提到它会让 V8、Blink、BoringSSL、user-agent、JA3/JA4 TLS 形态尽量一致,并默认提供一个 coherence-checked Windows identity。它也提供 --uxr-* 参数去覆盖 GPU、屏幕、时区、硬件、Client Hints 等表面。

第五,可验证。项目提供 gauntlet 测试,声称可复现 CreepJS、Sannysoft、BrowserScan、rebrowser bot-detector、Cloudflare Turnstile 等检测结果。README 中列出的结果包括 CreepJS 0% headless、Sannysoft 0 failed、BrowserScan "No bots detected"、rebrowser 无 Runtime.enable leak 等。

这些说法仍然应该被视为项目方声明,而不是独立第三方基准。它的价值在于:项目把"反检测能力"变成可复现测试,而不是只靠营销截图。

五、它为什么和 Agent 有关,而不只是和爬虫有关

过去"反检测浏览器"主要服务于爬虫、广告验证、账号矩阵、价格监控、自动化测试等场景。但 Agent 出现后,问题变了。

传统爬虫通常目标明确:打开 URL、解析 HTML、提取字段、翻页。Agent 的目标更接近真人操作:搜索、登录、比较、填写、购买、提交、跨站执行流程。它不只是读取网页,而是要在网页里行动。

这让浏览器从"采集工具"变成"执行环境"。Agent 能力越强,网站越有动机识别它。原因不只是反爬,还有安全、风控、欺诈、滥用和资源保护。

2025 年关于 Web-use agents 安全的研究指出,这类 Agent 拥有多标签页导航、DOM 操作、JavaScript 执行、认证会话访问等高权限能力,也会带来提示注入、越权操作、隐私泄露等攻击面。

因此,网站会越来越关心一个访问者到底是真人、普通自动化脚本,还是具备行动能力的 AI Agent。Fortress 站在 Agent 开发者一侧,试图让 Agent 不因为浏览器环境太"机器人"而被挡在门外。但从网站一侧看,这也意味着检测系统会继续升级到行为层、账户层、任务意图层。

这不是单向技术进步,而是一场对抗。

六、开源反检测浏览器的双刃剑

Fortress 的开源属性很有意义。商业反检测浏览器长期存在,但很多是闭源二进制,用户无法知道它到底改了什么,也无法确认有没有夹带风险。Fortress 把 patch series 放出来,允许用户自己构建、审计和验证。README 也写明它采用 BSD-3-Clause,补丁和工具链开放,Chromium 与字体保留各自许可证。

但这类工具天然有灰度。

合法用途包括:公开数据采集、自动化测试、可用性测试、研究测量、Agent 产品调试、浏览器指纹一致性研究。

风险用途包括:绕过网站风控、大规模爬取、账号滥用、垃圾注册、票务抢购、广告作弊、撞库辅助等。

Fortress README 自己也强调,它是用于合法自动化、测试和公开数据采集的浏览器工程项目,使用者需要遵守目标网站 ToS 和所在司法辖区法律。

这句话不是装饰。Agent 时代的浏览器自动化会变得更强,边界也会更敏感。越是底层的反检测能力,越需要明确用途边界。

七、它的局限在哪里

Fortress 目前至少有四个局限。

第一,它不能解决行为识别。Agent 的鼠标轨迹、滚动节奏、输入方式、任务路径、页面停留时间,仍然可能和真人不同。FP-Agent 论文的核心结论就是:行为指纹比浏览器指纹更能区分 AI browsing agents。

第二,它不能解决账号和业务风控。网站不只看浏览器,还看账号年龄、登录地点、支付方式、历史行为、请求频率、设备绑定、IP 信誉。浏览器像真人,不代表业务行为像真人。

第三,它需要持续维护。Chromium 版本、反 bot 脚本、Cloudflare、Akamai、DataDome、Kasada 的策略都会变化。Fortress README 也承认 detection keeps moving,并计划 monthly Chromium rebase 和新的 gauntlet rows。

第四,它当前平台支持还不完整。README 显示 Linux x64 和 Windows x64 有 native binary,macOS 仍通过 Docker,linux/arm64、macOS app、签名安装包等仍在路线图中。

所以 Fortress 更像一个"浏览器指纹层基础设施",而不是完整的 Agent 反拦截系统。

八、真正值得关注的趋势

Fortress 的出现说明一个趋势:Agent stack 正在分层。

第一层是模型。GPT、Claude、Gemini、Qwen、GLM 等负责理解任务和生成动作。

第二层是 Agent 框架。Browser Use、Stagehand、LangChain、Crawl4AI 等负责把自然语言任务转成浏览器动作、DOM 观察和结构化提取。

第三层是浏览器控制层。Playwright、Puppeteer、CDP、browser harness 负责把动作落到浏览器里。

第四层是浏览器执行环境。普通 Chromium、云浏览器、反检测浏览器、隔离浏览器、安全沙箱浏览器都会在这一层竞争。

第五层是网络和身份层。代理、会话、账号、cookie、权限、风控策略决定一次自动化是否能稳定、合规、可控地完成。

过去大家主要关注第一层和第二层,认为模型足够强,Agent 就能上网完成任务。Fortress 提醒我们:真正落地时,底层执行环境同样关键。Agent 不是在一个理想网页里工作,而是在一个充满风控、反自动化、验证码和动态检测的真实互联网里工作。

九、结论

Fortress 不一定会成为最终赢家,但它抓住了一个真实问题:浏览器 Agent 的瓶颈不只是"会不会点网页",还有"能不能以一个可信浏览器身份进入网页"。

它的技术路线是把 stealth 从 JS 注入层下沉到 Chromium C++ 层,通过引擎级指纹一致性减少自动化暴露;它的产品路线是保持 CDP 兼容,让现有 Playwright、Puppeteer 和 Agent 框架可以直接接入;它的开源路线是把 patch、build、gauntlet 公开,让用户能审计和复现。

但它也不会终结反 bot。网站检测会继续向行为层、账号层、网络层、任务意图层演进。未来的 Agent 浏览器不会只是"更像真人浏览器",还必须更安全、更可控、更合规,并能清楚区分授权自动化和滥用自动化。

Fortress 的意义不在于"绕过了某个检测",而在于它把一个新问题摆到了台面上:当 AI Agent 开始真正使用互联网,浏览器本身会成为 Agent 基础设施的一部分。


错误速查卡

症状根因定位修复
pip install tilion-fortress 安装后启动失败Docker 未启动 / 平台不支持 native binarypython -c "from tilion_fortress import Fortress; Fortress().start()" 报错信息Linux x64 / Windows x64 直接 native;其他平台先装 Docker,再走 tilion/fortress:latest 镜像
connect_over_cdp("http://localhost:9222") 报 connection refusedFortress 未启动 / 端口被占用curl http://localhost:9222/json/version确认 Fortress().start() 成功执行;或显式 --remote-debugging-port=9222
仍被 Cloudflare 拦截通常是 datacenter IP,不是 fingerprintcurl -v 看来源 IP 段切换 residential / mobile 代理出口;README 明确指出 ≈ 90% 的拦截源自 IP 而非 fingerprint
仍被 DataDome / Kasada 拦截行为指纹 / 账号风控参考 FP-Agent 论文结论调整鼠标轨迹、滚动节奏、任务路径;多账号隔离、设备绑定
bot.sannysoft.com 出现红行Persona 不一致或被识别为 headlessWebDriver AdvancedWebGL 两行核对 --uxr-* 参数与本地 TLS / OS 故事是否一致;避免 navigator.webdriver=true
CreepJS 报 headless 比例不为 0单 surface 补丁被新检测向量盯上tools/gauntlet.py --bundle ./tilion-fortress提 issue + 检测页面 → 下一个 patch
Runtime.enable leak 出现在 rebrowser bot-detectorCDP 客户端发了 Runtime.enable看控制层 CDP 调用切 raw CDP,不要 spawn chromedriver;Fortress README 三层检测框架明确这是 Layer B,需要控制层协作
creepjs 报 "38% like headless"(误读)误以为 38% 是 headless 命中率GAUNTLET_RESULTS.md 解释那是 resemblance 模糊评分;hard headless 标志仍是 0%
macOS 上 npm install tilion-fortress 报错macOS native binary 仍在路线图README troubleshooting装 Docker Desktop;或换 Linux x64 / Windows x64 走 native
linux/arm64(Apple Silicon 服务器 / ARM SBC)启动失败镜像未发布docker run 拉取失败临时用 linux/amd64 兼容(--platform linux/amd64);或跑 x64 emulator;等 roadmap
Persona 在 /proc/<pid>/cmdline 暴露单进程单 persona,且 cmdline 可读tr '\0' ' ' < /proc/<pid>/cmdline当前版本每个 persona 启一个进程;等 v2 MaskConfig runtime 上线(IPC-delivered,无 cmdline 痕迹)
升级 Chromium 主版本后 patches 部分失败上游 API 漂移build/apply-patches.shgit apply 失败build/rebase-monthly.sh 152.0.XXXX.0 三方合并;失败 patch 提 issue
Windows 149 channel 启动失败Windows native 仅支持 151SDK 默认 channel 是 stable (149)Fortress(channel="latest").start() 切到 151;或走 Docker

参考链接