Android 的 VPN 漏洞與 Mullvad 加密 DNS 的停用
Android 的一個漏洞讓任何 App 繞過 VPN、洩漏真實 IP,開啟「封鎖沒有 VPN 的連線」也無法阻擋。Mullvad 的公開加密 DNS 將在 11 月 2 日停止服務,手動設定過的人需要更換。
VPN 業者 Mullvad 9 月的兩則公告,分別影響在 Android 上使用 VPN 的人,以及手動設定過 Mullvad 加密 DNS 的人。Android 新發現的漏洞使任何 App 不需特殊權限就能讓部分封包繞過 VPN,開啟「封鎖沒有 VPN 的連線」也無法阻擋。研究者估計多數 Android 12 以上的裝置受影響,但並非每個型號都實測過。Mullvad 的公開加密 DNS 則將在 11 月 2 日停止服務。
漏洞出在 keep-alive 封包(為了維持連線、定期送出的小封包)。惡意 App 可以要求 Android 建立一條 keep-alive 連線,由 Android 交給 Wi-Fi 或行動網路晶片送出。資安新聞網站 CyberInsider 報導,封包格式由 Android 決定,無法夾帶任意資料。接收的伺服器仍能看到裝置在 VPN 之外的真實 IP。
研究者 5 月 15 日把漏洞回報給 Google 的 Android 漏洞獎勵計畫,之後被標記為重複回報。公開前,Google 沒有告知修正或配發 CVE(公開漏洞的統一編號)。Mullvad 9 月 10 日的公告寫到,Google 不太可能處理。
9 月 3 日關於 DNS 的公告寫明,經營注重隱私的公開 DNS 需要高度專業,Mullvad 決定改為資助 Quad9 基金會(提供公開 DNS 的瑞士非營利組織)。使用 Mullvad VPN 的人不受影響,查詢由 VPN 伺服器處理。使用預設設定的 Mullvad Browser 會自動改用 Quad9,手動選過其他 Mullvad DNS 變體的人要改回預設。iOS 與 macOS 上 Mullvad 的 DNS 描述檔則會失效。
導讀觀點
開啟「封鎖沒有 VPN 的連線」時,系統會檢查每條連線是否經過 VPN,keep-alive 交給網路晶片之後就不經過這道檢查。網路硬體能同時維持的 keep-alive 連線有上限,依 Mullvad 的公告,理論上先把名額占滿就能擋住惡意 App。Mullvad 不打算這樣做,因為占位的連線同樣要在 VPN 外送出封包,惡意 App 也可能在 Mullvad App 啟動前就開始外洩。CyberInsider 9 月 11 日的報導寫到,當時沒有可靠的 App 層級修正。
Mullvad 的建議是只安裝信任的 App,可以的話改用 GrapheneOS 這類強化隱私與安全的 Android 版本,不過 GrapheneOS 的正式版本只支援 Pixel 6 以上的 Pixel 裝置。GrapheneOS 關閉這類 keep-alive 的修正在 9 月 28 日合併,到 9 月 29 日為止還沒有進入正式版本。
真實 IP 一旦外洩就有風險的人,可以參考 CyberInsider 報導的做法,讓手機連上強制走 VPN 的路由器。前提是關閉行動網路等其他連線路徑。手機離開這台路由器就失去保護。
手動設定過 Mullvad 加密 DNS 的人可以改用 Quad9,它的隱私政策寫明使用者的 IP 只在處理查詢的極短時間內留在記憶體。政策也寫到會保留依地區、電信網路與協定分類的統計,不含個別的 IP。改用之後,DNS 查詢仍集中在同一個營運者手上。
更換要在 11 月 2 日前完成。iPhone(iOS 14 以上)與 Mac(Big Sur 以上)要用 Safari 從 Quad9 說明頁下載描述檔,2027 年 1 月 19 日到期後需重新安裝。Android 9 以上在「私人 DNS」填入主機名稱 dns.quad9.net,這個欄位走 DoT(DNS over TLS),不能填 DoH(DNS over HTTPS)網址 https://dns.quad9.net/dns-query。
Quad9 的說明頁寫明,用其他 VPN 時描述檔與私人 DNS 通常不會生效,要改在 VPN App 的自訂 DNS 設定 Quad9。說明頁沒有中文。