切换主题
Agent 的隐身术:CloakBrowser 反检测拆解
如果你让 AI Agent 去网上办事,或者写过任何需要稳定访问网页的脚本,多半遇到过这样的情况:代码跑得好好的,突然弹一个人机验证;数据抓到一半,IP 被封了。站在网站的角度,它只是在回答一个问题:访问我的是人,还是程序?
这个问题的答案,散落在浏览器暴露给网页的无数细节里。navigator.webdriver 是不是 true,Canvas 画出来的图形有没有噪声,TLS 握手和正常 Chrome 是否一致,鼠标移动轨迹是不是太直。任何一环露馅,轻则验证码,重则封 IP。
过去几年,绕过检测的主流思路是在 JS 层打补丁:页面加载前注入一段脚本,把 webdriver 改成 false,给 Canvas 指纹加噪声。但反检测厂商也在升级。
CloakBrowser 是另一种思路:直接改 Chromium 的 C++ 源码,把伪装编译进二进制。它自称"通过所有机器人检测测试",GitHub 上拿到约 30.5K Star(2026 年 8 月官网快照),是这个细分赛道里开源项目的第一名。
一、73 个补丁,补在源码里
CloakBrowser 本质上是一个定制版 Chromium。它的仓库描述写得很直白:不是打补丁的配置,不是 JS 注入,是一个在 C++ 源码层修改了指纹的真实 Chromium 二进制。检测系统把它当成普通浏览器打分,因为它本来就是。
目前 v0.5.8 版本包含 73 个源码级补丁,覆盖的指纹面包括:
| 指纹面 | 做了什么 |
|---|---|
| 基础导航 | navigator.webdriver=false、plugins.length=5、window.chrome 对象完整、UA 无 HeadlessChrome 字样 |
| Canvas / WebGL | 渲染噪声注入,指纹每次不同但内部一致;GPU 厂商/渲染器字符串对齐真实硬件;Windows 下真实硬件值直接透传 |
| Audio / 字体 | AudioContext 指纹对齐真实设备;字体列表匹配平台 |
| 网络与计时 | DNS/连接/SSL 时序归零,Proxy-Connection 头剥离,高精度计时器去关联 |
| WebRTC | 解析代理出口 IP 并伪造 ICE 候选,防止 IP 泄漏 |
| TLS 指纹 | ja3n/ja4/Akamai 指纹与真实 Chrome 逐字节一致 |
| CDP 行为 | 隐藏 DevTools Protocol 输入痕迹,键盘鼠标操作人类化 |
为什么源码级补丁更难被识破? 关键在两点。第一,网页里跑 Function.prototype.toString 检查,这些函数返回的是货真价实的 [native code],因为它们在编译时就是原生代码,没有注入痕迹可查。第二,每次启动时,CloakBrowser 会从随机种子生成一整套内部一致的"设备身份":GPU 型号、屏幕尺寸、Canvas 噪声、字体列表全部联动,像一台真实设备,而不是随机拼凑。
还有一个细节值得单独说。Akamai 的 sensor.js 会尝试加载 60 个已知扩展的 manifest 文件。真实用户总有几个扩展,headless 浏览器一个都没有,60 个请求全部失败,这在统计上不可能。CloakBrowser 自带装好真实扩展的 profile 来应对这个探测。这里要说明一下,这不算 Cloak 的独家优势:Chromium 和 Firefox 的扩展协议体系不同,Firefox 系的 Camoufox 也用自己的路径做同类对抗(moz-extension:// 体系加伪造扩展探测结果),只是实现方式不一样。
二、实测数据:reCAPTCHA v3 可达 0.9 分,公开检测站 30/30
官方 README 公布了一组对比测试,数据源是 2026 年 8 月、Chromium 151 基线的最新构建,成绩看上去相当优秀。这些成绩全部来自公开免费的机器人检测面板(bot.sannysoft.com、BrowserScan 这类),只能说明基础指纹过关,不等于能绕过 Kasada、PerimeterX 这类企业级 WAF。 
三、上手
CloakBrowser 最讨喜的地方是迁移成本。它兼容 Playwright 和 Puppeteer 的 API,从 Playwright 迁过来只改一行:
python
# 旧写法
from playwright.sync_api import sync_playwright
pw = sync_playwright().start()
browser = pw.chromium.launch()
# 新写法
from cloakbrowser import launch
browser = launch()首次运行会自动下载定制 Chromium 二进制(约 200MB,本地缓存),下载过程用 Ed25519 固定签名校验,防止镜像投毒。但是可能因为众所周知的网络问题而下载失败。所以如果下载失败的话建议尝试代理。
几个常用参数:
- proxy:支持 HTTP 和 SOCKS5,内联凭据
- geoip=True:从代理出口 IP 自动推断时区、语言,同时自动伪装 WebRTC IP
- headless=False:有窗口模式
- humanize=True:鼠标 Bézier 曲线、逐字符键盘输入(带思考停顿)、物理化滚动
- launch_persistent_context():持久 profile,cookies 跨会话保留,能加载扩展,能播 Widevine DRM 视频
humanize 是我觉得最实用的功能。它不解决验证码,而是让验证码不出现。配合 geoip 和住宅代理,行为层和指纹层同时覆盖,这是多数开源方案做不到的。浏览器启动后可以看到其图标与Chrome相似,只是偏蓝色,功能使用方面几乎一样。 
生态方面,browser-use、Crawl4AI、Scrapling、Stagehand、LangChain 这些 AI Agent 框架都有 drop-in 集成,多个项目已经在官方文档里加了 CloakBrowser 示例。还有 cloakbrowser-mcp 可以把浏览器暴露成 MCP 端点,Docker 镜像一行命令就能跑。
上手实测了抖音网站,目前体验下来效果不错: 
测试使用的是免费key,限定1个session。在经过多次测试时有的时候会遇到以下两个问题: CloakBrowser Pro: couldn't verify your license (license server unreachable or a connection problem). 以及 CloakBrowser Pro: session limit reached for your plan. Close another running session or upgrade your plan. 可见CloakBrowser对于license的检测非常严格,甚至会影响系统运行的稳定性。
四、其他语言支持
官方没有直接的 Java wrapper,但我们可以通过CDP 远程连接来实现。方案是使用CloakBrowser 的 JS/Python wrapper 来启动一个带 CDP 端口的浏览器,Java 通过 Chrome DevTools Protocol 连接。 启动 CloakBrowser的示例脚本
import { launchPersistentContext } from "cloakbrowser";
import net from "node:net";
import path from "node:path";
const cdpHost = "127.0.0.1";
const cdpPort = Number(process.env.CLOAKBROWSER_CDP_PORT ?? "9222");
const userDataDir = path.resolve(
process.env.CLOAKBROWSER_USER_DATA_DIR ?? "./cloakbrowser-profile",
);
let context;
try {
await assertPortAvailable(cdpHost, cdpPort);
context = await launchPersistentContext({
userDataDir,
headless: false,
humanize: true,
args: [
"--remote-debugging-address=127.0.0.1",
`--remote-debugging-port=${cdpPort}`,
],
});
const page = await context.newPage();
await page.goto("about:blank");
const cdpVersionUrl = `http://${cdpHost}:${cdpPort}/json/version`;
for (let attempt = 0; attempt < 100; attempt++) {
try {
const response = await fetch(cdpVersionUrl);
if (response.ok) break;
} catch {
// Chromium may need a short moment to bind the CDP port.
}
if (attempt === 99) {
throw new Error(`CloakBrowser started but CDP is unavailable: ${cdpVersionUrl}`);
}
await new Promise((resolve) => setTimeout(resolve, 100));
}
console.log(`CloakBrowser CDP listening on http://${cdpHost}:${cdpPort}`);
console.log("Press Ctrl+C to stop it.");
const keepAlive = setInterval(() => {}, 60_000);
let cdpMonitor;
let stopping = false;
let resolveExit;
const waitForExit = new Promise((resolve) => {
resolveExit = resolve;
});
const stop = () => {
if (stopping) return;
stopping = true;
clearInterval(keepAlive);
clearInterval(cdpMonitor);
resolveExit();
};
cdpMonitor = setInterval(async () => {
try {
const response = await fetch(cdpVersionUrl);
if (!response.ok) throw new Error(`HTTP ${response.status}`);
} catch {
console.error("CloakBrowser Chromium disconnected.");
stop();
}
}, 2_000);
process.once("SIGINT", stop);
process.once("SIGTERM", stop);
await waitForExit;
} finally {
if (context) {
try {
await context.close();
} catch (error) {
console.error(`CloakBrowser cleanup failed: ${error.message}`);
}
}
}
function assertPortAvailable(host, port) {
return new Promise((resolve, reject) => {
const server = net.createServer();
server.once("error", (error) => {
if (error.code === "EADDRINUSE") {
reject(new Error(`CDP 端口 ${host}:${port} 已被占用,请关闭占用进程或设置 CLOAKBROWSER_CDP_PORT`));
return;
}
reject(error);
});
server.listen(port, host, () => server.close(resolve));
});
}Java 侧可以用 Selenium 4 的 CDP 支持:
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("debuggerAddress", "127.0.0.1:9222");
WebDriver driver = new ChromeDriver(options);
driver.get("https://www.douyin.com");这种方式下,CloakBrowser 负责启动和 humanize,Java 负责业务逻辑,但架构上需要维护一个独立的启动进程。
五、不止浏览器:开源版 Multilogin
CloakBrowser 团队还做了一个叫 Manager 的桌面应用,定位是 Multilogin、GoLogin、AdsPower 的自托管替代,GUI 部分开源(MIT)。每个 profile 是一台"真正独立的电脑":独立指纹、GPU、屏幕、时区、代理、cookies、历史,互不串味。关掉一个 profile,下个月再打开,还是同一个人。
商业指纹浏览器大多按 profile 数量收费,超了要升级套餐;不过 AdsPower、GoLogin 的部分版本也支持"不限休眠 profile、只收并发运行"的计费,并非全部按总数收费。Manager 的 profile 数量不限,只按同时运行的数量计费。官方原话是"一抽屉休眠账号不花一分钱"。每个运行中的 profile 暴露 CDP 端点,可以一边用 Playwright 驱动,一边肉眼看着同一个窗口。
六、免费与付费
CloakBrowser 目前的模式是:GitHub 登录拿免费 key,用最新 Chromium 151 构建,限 1 个并发会话;v146 老构建永久免费(限非商业用途),在 GitHub Releases 直接下载,商业场景仍需 Pro 授权;Pro 版按并发扩到 5、20、200、2000+ 会话,优先拿到新补丁,有人工支持。
对比商业产品:Multilogin 每月 29-99 欧元,Kameleo 每月 59-149 美元,GoLogin 每月 10-49 美元,AdsPower 每月 5.4-9 美元。CloakBrowser 的内核免费、profile 无限,对技术团队来说成本优势是碾压级的。代价是:二进制闭源授权、住宅代理自备;免费 key 没有企业级支持(Pro 付费版有人工支持),也没有合规背书。
许可方面要特别说明:Python/JS 包装层是 MIT,但浏览器二进制是专有 License,禁止再分发,明确禁止撞库、批量注册、未授权访问、违反目标站点服务条款。所以它其实是"开源包装 + 闭源内核"的双许可模式。
七、说点不好听的
社区热度高,不等于没有坑。以下几点,决定上生产前值得想清楚:
- 二进制闭源。核心反检测逻辑在专有二进制里,无法审计。有个第三方项目做过有限检测(pim97/cloakbrowser-analyze:静态字符串扫描加少量运行时检查,2.9M 字符串未发现可疑内容),但这远不等于完整安全审计——内存中动态解密、动态加载逻辑,静态扫描是看不到的。信任一个年轻组织的闭源二进制,本身就是风险。比较谨慎的评测建议在 Docker 或虚拟机里隔离运行,生产环境 pin 版本而不是自动更新。
- 版本滞后是常态。官方宣称 Chromium 上游大版本更新后 24-48 小时发布新二进制,但社区实际反馈,复杂版本合并时滞后常达数天甚至一周。检测技术每周都在变,老构建的通过率会快速衰减。
- 公开面板不等于生产防护。30/30 是公开检测站的成绩,Kasada、PerimeterX 这类用 JS 运行时探针和 JIT 引擎行为检测的高级 WAF,依然可能抓到你。这是一场持续的军备竞赛。
- 驱动方式本身也是指纹。只要通过 CDP/Playwright 驱动,浏览器内核再干净,CDP 运行特征依然可能被部分高级防护识别——Cloak 只是把痕迹藏得更深,不是消除。
- 部署环境会拖后腿。geoip 依赖代理 IP 地理位置库,库不准时区-IP 会直接对不上,这是致命指纹泄露;Docker 无头容器里 GPU/WebGL 指纹会退化,Widevine DRM 在 Linux 容器也经常失效;单实例内存 200MB+ 只是基线,多开页面后很容易到 500-800MB,批量跑之前先算好资源。
- 法律边界。反检测技术是典型的双用途工具。写这篇文章不是教唆绕过任何网站的服务条款,合法的使用场景是:测试自己的网站防护、做合规的数据采集、验证自家产品的反爬策略。撞库、批量注册这类行为,许可证禁止,法律也禁止。
结语
CloakBrowser 的走红说明一件事:在 JS 层打补丁这条路,已经走到头了。反检测厂商学会了对注入函数做源码检查之后,"伪装"这件事必须下沉到浏览器引擎本身。这也解释了为什么它能在几个月内冲到 30K Star——它把商业指纹浏览器(每月几十上百美元)的核心能力开源了出来,让普通开发者也能用上引擎级的反检测。
不过它没有解决军备竞赛,只是把战线往前推了一步。检测方会继续研究新的探针,补丁方会继续编译新的二进制。对普通开发者来说,更值得记住的是那句官方说明:它不解决验证码,只是让验证码不出现。这句话放在整个反检测领域也成立——没有一劳永逸的隐身,只有不断更新的伪装。
最后回到智能体本身。Agent 要替人上网办事,人机验证只是第一道坎,更常见的问题是网站把自动化流量当成攻击流量直接封掉,任务做到一半就断。CloakBrowser 这类工具解决的是"让 Agent 看起来像人"的工程问题,但它没有解决"Agent 凭什么值得被信任"的问题。浏览器指纹、IP 声誉、行为轨迹,都是外部信任的拼图;信任的真正来源,是 Agent 遵守目标站点的规则、控制请求频率、尊重数据边界。技术可以让 Agent 隐身,但让 Agent 长期稳定地办事,靠的还是合规地使用这份隐身能力。这也是智能体基建系列一直在强调的事:能力越强,越要清楚边界在哪。
如果你对示例测试代码感兴趣,请留言索取。如果你觉得文章对你有用,可以关注我获取更多前沿资讯。


