決定性陷阱:Mullvad 出口 IP 如何造成指紋識別向量
對於許多注重隱私的使用者而言,VPN 是對抗追蹤與監控的首要防線。Mullvad 常因其對匿名性的承諾而受到讚譽,但最近的一項技術深入分析揭示了該服務在分配出口 IP 地址方面的一個令人驚訝的缺陷。Mullvad 並非在連線時真正隨機分配 IP,而是使用一種決定性的過程,這可以被利用來對不同伺服器位置的使用者進行指紋識別。
出口 IP 分配的機制
Mullvad 採用「垂直擴展」策略,為單一伺服器提供多個出口 IP,以防止熱衷於 IP 封鎖和對熱門網站進行速率限制。雖然這對可用性是有利的,但分配邏輯的實作方式卻造成了安全漏洞。
研究顯示,分配給使用者的出口 IP 並非按工作階段隨機化。相反,它會根據使用者的 WireGuard 公鑰決定性地挑選。雖然官方的 Mullvad app 會在 1 到 30 天內輪換這些金鑰,但使用第三方用戶端的用戶可能會發現他們的金鑰——以及他們的出口 IP——完全不會輪換。
揭開模式:比例分析
為了測試這一點,研究人員繪製了幾個伺服器的出口 IP 範圍。透過追蹤跨越九個伺服器的 3,650 個不同的公鑰,他們發現了一個驚人的模式。儘管在這些伺服器中存在數兆種可能的 IP 組合,但公鑰卻始終被分配到僅 284 個唯一的組合中。
發現的關鍵在於「比例」。透過計算分配的 IP 相對於該伺服器 IP 池起始位置的數值位置,並將其除以總池大小,得出了一個一致的比例。
例如,如果使用者在一個伺服器上的 IP 被分配在池中的第 81 百分位數,那麼他們在幾乎所有其他連線的伺服器上,很可能也會被分配在池中的第 81 百分位數。這表明 Mullvad 使用的是基於種子的隨機數生成器 (RNG),其中使用者的金鑰充當種子,而池大小則是上限。
Rust 實作缺陷
研究人員假設這種行為是基於 Rust 編程語言(Mullvad 的後端和用戶端皆使用該語言)中 random_range 函數的工作方式。在許多 RNG 實作中,熵池不受範圍函數提供的邊界影響。相反,RNG 會生成一個浮點數並將其作為邊界的乘數:min + round((max - min) * float)。
由於對於給定的種子,無論範圍如何,都會生成相同的浮點數,因此相對位置(百分位數)在不同的池大小之間保持不變。這很可能是一個開發者的誤解——假設改變範圍會會導致不同的相對輸出——而非刻意的設計選擇。
影響:關聯攻擊
這種決定性的行為允許進行「關聯攻擊」。透過觀察使用者在不同伺服器上使用的出口 IP,觀察者可以推斷出與該使用者種子相關聯的浮點數值。
雖然單一 IP 無法唯一地識別使用者,但重疊的浮點數範圍可以顯著地縮小身分識別範圍。研究人員開發了一個工具來估算這些浮點數值,發現特定的一組 IP 可能會解析為僅由 0.34% 的使用者群體所共用的浮點數範圍。在一個擁有 100,000 名活躍使用者的情境下,這將使用者的身分識別縮小到大約 340 人。
正如一位社群成員在 Hacker News 上所說:
"決定性的出口 IP 讓任何網站都能在不同工作階段建立持久的個人檔案。你並非在消除追蹤,只是在轉移追蹤者。"
對於一個論壇版主或擁有從多次數據洩漏中獲取的 IP 日誌的國家行為者而言,這意味著一個透過切換伺服器來避免封鎖或隱藏身分的使用者,實際上並非匿名。
如果兩個不同的帳號使用不同的 Mullvad 伺服器,但解析到相同的狹窄浮點數範圍,則極有可能他們是同一個人。
如何保護自己
在服務提供商解決此問題之前,使用者可以採取以下步驟來降低指紋識別的風險:
強制金鑰輪換: 登出 Mullvad app 以強制輪換你的公鑰,這將改變用於 IP 分配的種子種子。
力求真正的匿名性: 作為一些技術批判者所指出的,VPN 旨在用於隱私,而非完全的匿名性。對於需要高層級抗拒關聯攻擊的使用者而言,
Tor網路仍然是金標準。限制伺服器切換: 避免在同一個公鑰週期內頻繁切換伺服器,因為每個新伺服器都會為觀察者精煉你的浮點數範圍提供另一個數據點。