WebGPU 無需任何偵錯擴充功能就能揭露適配器廠商、架構與裝置字串。了解它如何形成新的指紋採集面及現有防護手段。
WebGPU 是 WebGL 的現代繼任者——一套更低階、更低開銷的 API,讓網頁能夠直接存取 GPU 的運算與算繪管線。自 Chrome 113 和 Edge 113 於 2023 年 5 月將其作為穩定版發布以來,WebGPU 在 Chromium 生態系統中的採用率持續增長。隱私與安全社群正在注意到,WebGPU 揭露的硬體識別資訊比 WebGL 更多,且透過標準的一等 API 介面實現,而無需那個各瀏覽器正逐步棄用的偵錯擴充功能。這使得 WebGPU 成為下一個主要的 GPU 指紋採集面——而大多數反偵測工具尚未跟進。
關鍵要點
navigator.gpu.requestAdapter()預設回傳適配器中繼資料——無需擴充功能或權限提示即可取得廠商、架構、裝置和驅動程式字串。- 支援的 Limits 和 Features 本身就構成高基數指紋,即使不直接讀取廠商字串。
- 運算著色器基準測試產生與硬體相關的浮點輸出,可被雜湊為每台裝置的穩定憑證,類似 WebGL 算繪像素雜湊。
- 大多數反偵測工具專注於 WebGL,導致大多數隱私加固配置中的 WebGPU 訊號無防護。
- 一致的偽裝極難實現:偽造適配器資訊而不同時修改運算輸出,會讓你更加可識別,而非相反。
WebGPU 如何揭露 GPU 身份
WebGL 需要一個特殊擴充功能——WEBGL_debug_renderer_info——才能取得真實的 GPU 廠商和算繪器字串。WebGPU 無需這種變通。呼叫 navigator.gpu.requestAdapter() 傳回一個 GPUAdapter,其同步屬性 .info 提供一個包含四個欄位的 GPUAdapterInfo 物件:vendor(廠商)、architecture(架構)、device(裝置)和 description(描述)。在典型桌面裝置上,這些欄位會透露 GPU 製造商、微架構系列、裝置型號,有時還包含驅動程式建置標籤——全程無需任何使用者提示。
適配器還揭露了:
limits— 包含 30 餘個數值能力值的GPUSupportedLimits物件:最大材質尺寸、最大緩衝區大小、最大運算工作群組數量、最大綁定群組數量等。這些數值反映了實體 GPU 和驅動程式,在不同硬體系列之間差異顯著,增加了可觀的資訊熵。features— 列舉 GPU 和驅動程式支援的可選能力的GPUSupportedFeatures集合,如float32-filterable、timestamp-query、shader-f16等。精確的功能集取決於 GPU 系列和驅動程式版本。isFallbackAdapter— 一個布林標誌,當瀏覽器回退至軟體算繪器時為true。軟體算繪器是無頭或虛擬化環境的強烈訊號,與 WebGL 中的llvmpipe算繪器字串類似。
這些屬性共同產生了比大多數 WebGL 實作更豐富的指紋,且在初始的非同步適配器請求之後可同步存取。
實務中讀取適配器
以下程式碼展示了收集核心 WebGPU 硬體訊號所需的極少操作。
async function getWebGPUFingerprint() {
if (!navigator.gpu) return { supported: false };
const adapter = await navigator.gpu.requestAdapter();
if (!adapter) return { supported: false, reason: 'no-adapter' };
// 直接取得硬體身份——無需擴充功能
const { vendor, architecture, device, description } = adapter.info;
// 數值能力 Limits(30 餘個值,均與硬體相關)
const limits = {};
const limitKeys = [
'maxTextureDimension2D',
'maxBufferSize',
'maxComputeWorkgroupSizeX',
'maxComputeWorkgroupsPerDimension',
'maxBindGroups',
];
for (const key of limitKeys) {
limits[key] = adapter.limits[key];
}
// 可選功能集
const features = [...adapter.features];
return {
supported: true,
isFallback: adapter.isFallbackAdapter,
info: { vendor, architecture, device, description },
limits,
features,
};
}
您可以使用 BrowserInsight 的指紋偵測工具即時查看自己瀏覽器的 WebGPU 適配器值。
運算著色器輸出雜湊
最強大的 WebGPU 指紋技術超越了中繼資料層面。腳本可以從適配器請求一個裝置,上傳一段執行浮點運算的運算著色器,在 GPU 上執行,並將輸出緩衝區讀回 JavaScript。由於不同架構和驅動程式版本的 GPU 在浮點取整、精度和截斷處理上存在細微差異,不同硬體系列的計算結果各不相同——而對同一裝置在不同頁面載入之間保持穩定。
async function computeHash(device) {
// 用於著色器寫入結果的小型緩衝區
const outputBuffer = device.createBuffer({
size: 16,
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
});
// 著色器執行因 GPU 實作而異的浮點運算
const shaderCode = `
@group(0) @binding(0) var<storage, read_write> out: array<f32>;
@compute @workgroup_size(1)
fn main() {
out[0] = sqrt(2.0) * sin(1.5707963);
out[1] = log(exp(1.0)) + pow(2.0, 0.5);
}
`;
// ... 編譯、排程、讀回、雜湊
}
實際結果是一個與適配器資訊字串相關但增加了額外資訊熵的穩定裝置特定數值。網站可以將兩者結合,獲得更高置信度的 GPU ID。
WebGPU 與 WebGL 作為指紋採集面的比較
WebGPU 和 WebGL 在最終揭示的內容——您的 GPU——上有所重疊,但在追蹤者需要付出多少努力以及結果的健全性上有所不同。
| 屬性 | WebGL | WebGPU |
|---|---|---|
| 身份字串 | 透過 WEBGL_debug_renderer_info 擴充功能 | 預設內建於 GPUAdapter.info |
| 擴充功能棄用風險 | 部分瀏覽器標記為待移除 | 不適用——info 是核心 API |
| 數值 Limits | ~15 個能力值 | 30 餘個結構化 Limits |
| 可選功能集 | 因驅動程式而異 | 明確的 features 集合 |
| 運算雜湊 | 透過算繪場景的 readPixels() | 透過運算著色器的 readBuffer() |
| 軟體算繪器訊號 | llvmpipe 或 SwiftShader 算繪器字串 | isFallbackAdapter: true |
追蹤者的關鍵優勢在於 WebGPU 是一個更簡潔的 API:中繼資料是結構化的而非嵌入在自由格式字串中,Limits 更多且定義更精確,輸出雜湊的運算路徑是專為計算而構建的,而非借用算繪管線。關於 WebGL 的深入分析,請參閱我們的 WebGL 指紋深度解析。兩者共同構成了瀏覽器指紋完整指南中描述的整體指紋圖景。
新興威脅格局
WebGPU 規範是 W3C 標準,其隱私影響已在相關工作組中討論——但該規範將實現高效能圖形和計算置於最小化硬體暴露之上。追蹤者對 WebGPU 的意識正在增長:它在 Dolphin Anty 等專業反偵測瀏覽器中作為可切換選項出現,恰恰證明活躍的指紋採集者已在使用它。
與此同時,大多數為 WebGL 訊號添加雜訊的瀏覽器擴充功能和消費者隱私工具尚未更新以涵蓋 WebGPU。這一滯後使得 WebGPU 指紋對當今大多數使用者而言實際上是一個全新的採集面。
防護措施及其權衡
Brave:將 Farbling 擴展至 WebGPU
Brave 已將其 Farbling 系統擴展至 WebGPU,對適配器資訊字串和運算輸出添加每源站、每會話的隨機化。管理 WebGL Farbling 的相同模型在此適用:會話內的雜訊是確定性的(避免頁面損壞),但在不同源站和會話之間有所差異(難以建構跨站 ID)。這是目前日常瀏覽中最實用的消費級防護。
Tor Browser
Tor Browser 限制 WebGPU 存取,將其視為高風險指紋採集面。目標與 WebGL 相同:追求統一性而非偽裝——每個 Tor 使用者呈現相同的(缺失的)表面,理論上更強,但可能破壞 GPU 加速的 Web 應用程式。
在 Firefox 中停用 WebGPU
Firefox 透過標誌(about:config 中的 dom.webgpu.enabled)支援 WebGPU。完全停用可消除該採集面,但與停用 WebGL 一樣,WebGPU 的缺失本身在日益預設啟用的瀏覽器群體中也成為一個區分特徵。
為何臨時偽裝會適得其反
如果您更改了 GPUAdapter.info 回傳的廠商字串,但沒有同時修改 Limits、功能集或運算輸出,您就建立了一幅內部矛盾的圖景。偵測器會關聯這些欄位:一個回報「Apple」廠商字串但呈現 NVIDIA 形態 Limits 和運算結果的裝置立刻引人懷疑。有效的偽裝要麼需要全面的訊號一致性,要麼需要共享的統一性(Tor 和 Brave 的方式)。沒有協調的個人隨機化通常適得其反。
常見問題
讀取 WebGPU 適配器資訊需要任何權限嗎?
不需要。呼叫 navigator.gpu.requestAdapter() 不會觸發權限提示。適配器中繼資料——廠商、架構、裝置——預設回傳,就像螢幕解析度或時區一樣。不需要任何使用者手勢。
WebGPU 指紋已在真實網站上使用了嗎?
是的,至少在指紋研究和反偵測社群中已有使用。BrowserLeaks 等工具包含 WebGPU 讀出,反偵測瀏覽器供應商明確將 WebGPU 偽裝作為功能提供,這證實了活躍的指紋採集者已在使用它。主流廣告和分析指令碼添加它的速度較慢,但差距正在縮小。
我可以測試自己的 WebGPU 暴露情況嗎?
BrowserInsight 的指紋偵測工具顯示您的即時 GPU 訊號,包括瀏覽器支援的 WebGPU 適配器資料,以及其餘的指紋元件。
WebGPU 指紋與 WebGL 有何不同?
WebGL 主要透過 WEBGL_debug_renderer_info 擴充功能(部分瀏覽器對此有所限制)揭露硬體中繼資料。WebGPU 透過核心 API 屬性揭露結構化適配器資訊——廠商、架構、裝置、驅動程式——無需任何擴充功能。WebGPU 還提供更多能力 Limits、更簡潔的功能集列舉,以及用於基於行為雜湊的運算導向輸出路徑。
停用 JavaScript 能阻止 WebGPU 指紋嗎?
能,WebGPU 是 JavaScript API,停用 JavaScript 會消除該採集面。然而,停用 JavaScript 也會破壞絕大多數現代 Web 應用程式,對大多數使用者而言並不實用。


