GPU 渲染器字串、系統版本與字型必須彼此吻合。了解哪些組合在物理上不可能存在,為何會讓偽造設定檔立即現形。
大多數指紋矛盾只是不尋常——例如罕見時區搭配常見語言——偵測系統必須以機率方式權衡。但有些矛盾比這更強烈:它們描述的是任何真實裝置都不可能出現的硬體與軟體組合,僅此而已。一個只在 Windows 上出現的 GPU 渲染器字串,卻由聲稱自己是 macOS 的瀏覽器回報,這不是低機率事件,而是一種矛盾。本文將說明這些不可能的組合從何而來——GPU 後端、僅限特定作業系統的字型,以及驅動程式世代——並解釋為何它們是偵測系統能夠採取行動的、最快速、信心度最高的訊號之一。
核心要點
- 有些指紋矛盾不只是統計上罕見——它們在物理上根本不可能存在,因為瀏覽器底層架構將一個訊號的可能值,直接綁定在另一個訊號上。
- 最明顯的例子是 WebGL 渲染器字串:它標示出圖形後端(Direct3D、Metal、OpenGL、Vulkan),而每種後端都只存在於特定的作業系統上。
- 已安裝字型清單的原理相同——Windows、macOS 與 Linux 各自內建其他系統沒有的預設字型家族,因此聲稱的作業系統若搭配錯誤的字型組合,就會露出馬腳。
- 不可能的組合檢查成本低廉,幾乎不會產生誤判,這也是為什麼它們常被當作詐欺或機器人偵測流程中的第一道過濾器,排在較慢的機率評分之前。
- 你可以透過 BrowserInsight 的指紋檢查查看自己的 GPU 渲染器字串與字型暴露情況。
「不可能」比「不一致」更強烈
指紋一致性檢查通常處理的是機率問題:不尋常的時區、不典型的語言順序、螢幕尺寸略顯怪異的行動裝置 user-agent——每一項都會提高懷疑分數,但單獨來看都不足以排除任何可能性,因為罕見的真實使用者確實存在。不可能的組合則屬於另一個類別。重點不在於某種配對有多常見,而在於根據瀏覽器實際的建構方式,這種配對是否可能存在。偵測系統不需要統計模型就能抓到這些情況——它只需要一張列出物理上可實現數值的對照表,任何超出這張表的內容都是矛盾,而不僅僅是離群值。
這個區別在實務上很重要。機率性的矛盾會被合併成一個加權分數,對個別真實使用者而言,這個分數有可能是錯的。不可能的組合則不需要加權——它們幾乎可以確定是偽造或合成設定檔的證據,這也正是為什麼反偵測瀏覽器工具會極力避免出現這類組合,卻仍然經常出錯。
為何 GPU 渲染器字串與作業系統緊密綁定
瀏覽器不會直接與你的 GPU 對話。WebGL 呼叫會經過 ANGLE(Almost Native Graphics Layer Engine),這是 Chromium 與 Firefox 用來將 OpenGL ES 呼叫轉譯成主機作業系統實際支援的圖形 API 的轉譯層。ANGLE 自己的文件將其用途描述為讓「多種作業系統的使用者能無縫執行 WebGL……內容,方法是將 OpenGL ES API 呼叫轉譯成該平台可用的、受硬體支援的其中一種 API」——而這個特定於平台的後端名稱,會直接出現在腳本讀回的字串中。
WEBGL_debug_renderer_info 擴充功能會將其以*未遮罩(unmasked)*的渲染器字串形式公開:
const gl = document.createElement('canvas').getContext('webgl');
const dbg = gl.getExtension('WEBGL_debug_renderer_info');
gl.getParameter(dbg.UNMASKED_RENDERER_WEBGL);
// Windows: "ANGLE (NVIDIA, NVIDIA GeForce RTX 4070 Direct3D11 vs_5_0 ps_5_0, D3D11)"
// macOS: "ANGLE (Apple, ANGLE Metal Renderer: Apple M2, Unspecified Version)"
// Linux: "ANGLE (Mesa, llvmpipe (LLVM 15.0.7, 256 bits), OpenGL 4.5)"
每一個後端權杖(token)——D3D11、Metal、OpenGL/Vulkan——都只會出現在真正提供該圖形 API 的作業系統上。Direct3D 是僅限 Windows 的 API;Metal 是僅限 Apple 的 API;D3D11 權杖若搭配 macOS 或 Linux 的 user-agent,等於是在描述一個運行著自己根本沒有的 API 的作業系統。沒有任何真實裝置會產生這種配對——只有在偽造工具替換渲染器字串、卻沒有根據所聲稱平台的實際後端重新產生字串時,才會出現。
偵測系統會檢查的不可能 GPU/OS 配對
除了後端權杖本身之外,還有幾種 GPU 端的配對實際上是不可能或已經絕跡的:
| 聲稱的平台 | 真實裝置的渲染器模式 | 不可能/已絕跡的配對 |
|---|---|---|
| macOS(近期任何版本) | ANGLE (Apple, ANGLE Metal Renderer: ...),或在較舊的 Intel Mac 上出現內建 Intel/AMD 字串 | NVIDIA 渲染器字串——Apple 早已停止搭載 NVIDIA GPU,並在多年前終止 NVIDIA 驅動程式支援 |
| macOS/Linux | Metal、OpenGL 或 Vulkan 後端權杖 | Direct3D9/Direct3D11 後端權杖,僅存在於 Windows |
| 行動裝置 UA(iPhone/Android) | Apple GPU、Adreno、Mali 或 PowerVR 渲染器字串 | 桌面等級的 NVIDIA/AMD/Intel 渲染器字串,任何手機都不會回報 |
| ARM 版 Windows | Qualcomm Adreno 渲染器字串 | 僅限 x86 的驅動程式簽章搭配 ARM64 平台權杖 |
這些都不需要機率模型——每一列都是一組封閉的數值集合,任何超出範圍的內容都是直接矛盾。支撐這項判斷的邏輯,同樣也是網站如何偵測 User-Agent 偽裝的基礎:一項聲稱只有在每一個可獨立驗證的訊號都與之相符時才能成立,而 GPU 後端權杖正是最難一致偽造的訊號之一,因為要偽造它們,就得針對所聲稱的每個平台重新產生整串渲染器字串,而不只是修改單一欄位。
只存在於單一作業系統的字型
已安裝字型清單帶有同樣的平台綁定關係,只是層級較粗略。不同作業系統會內建不同的預設字型家族,而透過以字型後備(fallback)機制量測字型的腳本,就能列舉出哪些字型存在。有幾組字型家族實際上是特定作業系統獨有的:
| 字型家族 | 預設內建於 |
|---|---|
| Segoe UI、Calibri、Cambria、Consolas | 僅限 Windows |
| Helvetica Neue、Menlo、Monaco、Avenir | 僅限 macOS |
| DejaVu Sans、Liberation Sans、Noto Sans(完整 CJK 字集) | Linux 發行版 |
一個聲稱是標準 Windows 安裝環境的設定檔,若回報沒有安裝 Segoe UI;或一個聲稱是 macOS 的設定檔,卻回報存在 Calibri 和 Cambria,就是在描述一組安裝時預設不會產生的字型集合。這在嚴格意義上並非不可能——使用者確實可以在 Linux 上手動安裝 Windows 字型——但這種情況相當罕見,一旦再搭配相符的 GPU 後端矛盾,就會從「不尋常」升級為「忘了偽造字型清單的偽造設定檔」。
驅動程式世代與作業系統版本不匹配
同樣問題還有一種更細微的版本,出現在時間軸而非類別上。圖形驅動程式、WebGL 擴充功能清單,以及著色器精度(shader-precision)行為,都會隨作業系統與驅動程式版本更新而改變。一個標示為當代最新硬體的渲染器字串,卻搭配數年前的作業系統組建編號——或瀏覽器版本比它據稱運行的作業系統版本還新——描述的是一條在真實、已更新的裝置上不會出現的時間軸。這些並不像 macOS 上出現 Direct3D 字串那樣是二元式的不可能,但它們是同一概念的低信心度變體:所聲稱的身分不僅要在回報了什麼上內部連貫,還要在這些數值何時可能共存上保持連貫。
偵測系統如何運用不可能的組合
詐欺防範與機器人偵測系統通常會依成本與信心度對檢查進行分層。不可能的組合位於低成本、高信心度的那一端:對照一組已知有效的「每個作業系統對應的 GPU 後端」與「每個作業系統對應的字型」配對表進行查找,只需微秒等級的時間,也不需要任何歷史基準——這與基於熵的唯一性評分或行為分析截然不同。這使它成為一道高效率的第一道過濾器:一旦命中不可能的配對,系統就能立即採取行動,把較慢的機率分層留給那些通過此檢查、但整體看起來仍像合成資料的設定檔。
這也正是反偵測瀏覽器工具最容易失手之處。要建構一個同時修改 user-agent、聲稱的作業系統與渲染器字串的設定檔——同時讓這三者彼此內部一致,並與所聲稱平台真正的後端和預設字型相符——遠比修改單一欄位困難得多,而這正是在實務中一再暴露出來的裂縫。
檢查你自己的環境
BrowserInsight 的指紋檢查會顯示你實際的 WebGL 渲染器字串,讓你一眼就能看出它是否與你目前使用的平台相符。瀏覽器核心檢查則針對你的渲染引擎做相同的比對,將你的 user-agent 所聲稱的內容,與執行環境實際的樣貌互相對照。如果你正在使用隱私工具或反偵測設定檔,這是檢查它究竟引入了 GPU/OS 矛盾、還是真的降低了你的獨特性的最快方法。
常見問題
每一種不尋常的 GPU/OS 配對都不可能存在嗎?
不是。較舊的 Intel Mac 確實曾搭載 AMD 和 Nvidia GPU,部分 Linux 系統也會執行 NVIDIA 的專有驅動程式——這些情況不尋常,但確實存在。真正不可能的情況,是後端權杖不匹配,例如非 Windows 聲稱下出現 Direct3D 字串,以及 Apple 已完全終止支援的平台。
建構完善的反偵測設定檔能避免這些矛盾嗎?
原則上可以——如果一個設定檔會針對所聲稱的平台,重新產生完全一致的渲染器字串、字型清單與驅動程式世代訊號,就能避免出現不可能的配對。但實務上,大多數工具只會修改一部分欄位,其餘維持預設值,而這正是裂縫出現的地方。
這也適用於行動裝置嗎?
適用。行動裝置 user-agent 搭配桌面等級的 GPU 渲染器字串——或反過來,桌面 UA 搭配手機 GPU 廠商字串——屬於同一類矛盾,只是核對的對象換成行動裝置 GPU 廠商清單(Apple、Adreno、Mali、PowerVR),而非桌面清單。
這與指紋一致性檢查有什麼不同?
一致性檢查涵蓋所有類型的矛盾,包括機率性的矛盾,例如不尋常的時區與語言配對。不可能的組合則是其中的一個子集:這種矛盾不僅僅是罕見,而是描述了現行瀏覽器與作業系統架構根本無法產生的東西——這也是為什麼偵測系統可以將它視為近乎確定,而不只是可疑而已。
總結
並非每一種指紋矛盾都同等重要。一種罕見的配對,可能屬於某個真實但不尋常的使用者;而 macOS 聲稱下出現 Direct3D 後端權杖,卻絕對不會,因為 Windows 與 macOS 根本不共用那個圖形 API。理解哪些訊號在架構上彼此綁定——GPU 後端對應作業系統、預設字型對應作業系統、驅動程式世代對應發行時間軸——說明了為何這些特定檢查對於任何建構或評估以指紋為基礎的偵測系統的人來說,會如此有效、又如此低成本。
推薦閱讀:


