超越隱匿外掛:使用 Clark-Browser 實現真正的瀏覽器匿名

對於構建瀏覽器自動化代理的開發者來說,機器人偵測的『貓與老鼠』遊戲變得日益複雜。儘管 Puppeteer 和 Playwright 等工具是行業標準,但它们的預設無頭模式對現代安全服務來說很容易被偵測到。大多數開發者依賴 JavaScript 層級的『隱匿』外掛來掩蓋這些訊號,但隨著偵測引擎的演進,這些墊片正變得和它們試圖隱藏的機器人一樣易於被偵測。

進入 Clark-Browser,這是一個旨在將戰場從 JavaScript 層級移至 C++ 原始碼層級的 ungoogled-chromium 開源分支。透過修補瀏覽器二進位檔案本身,Clark-Browser 的目標是讓自動化實例與真實使用者安裝無法區分。

JS 層級隱匿的失敗

要理解為什麼需要 Clark-Browser,必須了解機器人偵測是如何運作的。標準 chromium --headless 會留下一系列明顯的訊號:

  • navigator.webdriver 被設定為 true
  • 外掛列表為空。
  • User-Agent 明確包含 HeadlessChrome
  • WebGL 字串顯示軟體渲染器,而非實體 GPU。

許多開發者使用如 puppeteer-extra-plugin-stealthplaywright-stealth 之類的函式庫。這些工具透過注入 JavaScript 來覆寫這些屬性。然而,進階的偵測套件——例如 FingerprintJS、BrowserScan 和 Cloudflare Turnstile——常能偵測到隱匿外掛本身的存在。當網站偵測到某個屬性是透過 JS proxy 或 getter 覆寫被修改時,會觸發高風險旗標。

C++ 方法:修補原始碼

Clark-Browser 採取了根本不同的方法。與其在瀏覽器啟動後試圖隱藏證據,不如在編譯二進位檔之前修改 blinkv8net 的原始碼。

透過在 C++ 層級實作反指紋技術,返回給 JavaScript 環境的值並非傳統意義上的「偽造」——它們是瀏覽器引擎所相信它擁有的實際值。這消除了 JS 層級墊片所造成的不一致性,使瀏覽器在整個可見於 JavaScript 的指紋表面上看起來像是原生的 Chrome 安裝。

隱匿表面

Clark-Browser 引入了一系列 --fingerprint-* 命令列開關,讓開發者能為瀏覽器實例定義決定性身份。這允許對以下內容進行精確控制:

  • 硬體設定檔: 模擬 GPU 廠商、渲染器、設備記憶體和硬體並發數。
  • 環境資料: 設定 IANA 時區、BCP 47 地區設定和地理位置座標。
  • 網路身份: 模擬 WebRTC IP 位址以防止洩漏。
  • 視覺噪聲: 實作 canvas 和音訊噪聲以防止決定性指紋(繼承自 Brave 的基礎設施)。

效能與驗證

根據專案文件,已發布的二進位檔案已通過幾項關鍵測試。它成功繞過 SannySoft WebDriver 測試和 Antoine Vastel 無頭測試(前提是使用正確的 Accept-Language 標頭)。它也通過 BrowserLeaks Client Hints 和 WebGL 測試,避免了無頭環境典型的 SwiftShaderllvmpipe 標記。

然而,社區仍持謹慎態度。正如 Hacker News 討論中的使用者所指出,現代偵測——特別是來自 Cloudflare——已經超越簡單的屬性檢查。

"他們不再僅僅看 navigator 屬性,而是在計時 canvas 操作並檢查渲染管線中的不一致性。"

雖然 Clark-Browser 解決了靜態指紋問題,但動態行為(計時攻擊和渲染管線分析)仍然是機器人偵測戰的前線。

開始使用

Clark-Browser 採用 MIT 授權,並提供一個 Python 包裝器,以方便與 Playwright 一起使用:

from clarkbrowser import launch

browser = launch()
page = browser.new_page()
page.goto("https://bot.sannysoft.com
print(page.title())
browser.close()

對於需要最大透明度或自訂配置的使用者,該專案提供了 Linux 和 macOS 的完整建置腳本,儘管建置過程資源需求高,大約需要 80 GB 磁碟空間和 32+ GB RAM。

結論

Clark-Browser 代表著朝著更專業等級的瀏覽器自動化發展的轉變。透過將反偵測邏輯移入二進位檔,它為需要在高度限制環境中運行的代理提供了更穩固的基礎。雖然沒有任何工具能保證對最先進的 AI 驅動偵測系統達成 100% 隱形,但從原始碼進行修補在客觀上比修補 DOM 更有效。

Sources