根据Mullvad的最新文章,安卓(Android)系统上存在多个潜在的DNS泄漏问题。 它们源于Android系统本身的漏洞,并且只影响某些应用程序。
4月22日星期一,Mullvad注意到Reddit上的一份关于DNS泄漏的用户报告。 该报告详细介绍了用户如何在禁用和启用VPN的同时开启“阻止无VPN的连接”,从而泄露 DNS 查询。 Mullvad立即开始内部调查,确认了这一问题。调查还发现了更多可能导致 Android系统上DNS泄露的情况。
调查结果
确定了Android操作系统可能泄漏DNS流量的情况:
泄漏似乎仅限于直接调用C函数getaddrinfo
。 使用这种方式解析域名的应用程序会在上述场景中造成泄漏。 Mullvad尚未发现仅使用Android API的应用程序(例如DnsResolver)存在任何泄漏。 Chrome浏览器是可以直接使用getaddrinfo
的应用程序例子。
无论是否启用“始终开启 VPN ”和“阻止没有 VPN 的连接”,上述情况都会出现,这不是预期的操作系统行为,因此应在操作系统上游进行修复。
Mullvad已经能够确认这些DNS泄漏发生在多个Android版本中,包括最新版本(Android 14)。
改进
Mullvad的应用程序目前不会在阻塞状态下设置任何DNS服务器。 当Mullvad的应用程序无法以不可恢复的方式建立隧道时,它就会进入阻塞状态。 在此状态下,它会阻止流量离开设备。 但是,在此状态下它不会设置任何DNS服务器,因此可能会发生上述DNS泄漏。 Mullvad现在将通过设置一个伪造的DNS服务器来解决操作系统错误。 用户很快就会收到包含此修复程序的版本。
Mullvad更难在应用程序中缓解隧道重新连接期间的泄漏, Mullvad仍在寻找解决方案。 Mullvad可以最大程度地减少隧道重新配置发生的次数,但Mullvad目前认为无法完全防止这种泄漏。
应该明确的是,任何VPN应用程序都不需要这些解决方法,应用程序使用getaddrinfo来解析域名也没有错。 相反,这些问题应该在操作系统中得到解决,以保护所有Android用户,无论他们使用哪些应用程序。
Mullvad已向Google报告了这些问题并提出了改进建议,希望他们能够尽快解决此问题。
重现步骤
以下步骤重现了上述第二种情况,即VPN用户更改隧道配置,例如切换到另一个服务器或更改DNS服务器。
这里Mullvad使用WireGuard应用程序,因为它已成为Android VPN实现的参考。应该指出的是,任何其他Android VPN应用程序也可能会重现泄漏。 Mullvad使用Chrome来触发泄漏,因为Mullvad已确认它是使用getaddrinfo
的应用程序之一。
下载 spam_get_requests.html
安装 WireGuard 应用程序和 Chrome 浏览器
将 wg1.conf、wg2.conf 导入 WireGuard
在 WireGuard 应用程序中启用 wg1 隧道并允许 VPN 权限
在 Android VPN 设置中为 WireGuard 启用 “始终开启 VPN ”和 "阻止无 VPN 的连接
使用tcpdump
等工具开始捕获路由器上的数据$ tcpdump -i host <安卓设备的 IP 地址
分割屏幕,并排显示 WireGuard 和 Chrome 浏览器
用 Chrome 浏览器打开 spam_get_requests.html,然后按 “开始”。
在 WireGuard 应用程序中的 wg1 和 wg2 之间来回切换,直到看到下一步中的泄漏。
在路由器上观察与此类似的 DNS 流量:
11:50:27.816359 IP Pixel-Tablet.lan.53353 > OpenWrt.lan.53: 11200+ A? 307lf5rgn6-19282-11-50-27-519z.mullvad.test.lan. (65)
11:50:27.816359 IP Pixel-Tablet.lan.48267 > OpenWrt.lan.53: 44347+ A? 307lf5rgn6-19284-11-50-27-579z.mullvad.test.lan. (65)
11:50:27.816396 IP Pixel-Tablet.lan.16747 > OpenWrt.lan.53: 44584+ A? 307lf5rgn6-19289-11-50-27-729z.mullvad.test. (61)
11:50:27.816458 IP OpenWrt.lan.53 > Pixel-Tablet.lan.53353: 11200 NXDomain 0/0/0 (65)
11:50:27.816476 IP Pixel-Tablet.lan.45727 > OpenWrt.lan.53: 40503+ A? 307lf5rgn6-19290-11-50-27-759z.mullvad.test. (61)
11:50:27.816542 IP OpenWrt.lan.53 > Pixel-Tablet.lan.48267: 44347 NXDomain 0/0/0 (65)
11:50:27.816588 IP Pixel-Tablet.lan.43821 > OpenWrt.lan.53: 36295+ A? 307lf5rgn6-19291-11-50-27-789z.mullvad.test. (61)
11:50:27.816625 IP OpenWrt.lan.53 > Pixel-Tablet.lan.16747: 44584 NXDomain 0/0/0 (61)
由于“阻止没有 VPN 的连接”处于活动状态,因此除了加密的WireGuard流量外,不应该有任何流量离开设备,但在这里可以看到明文DNS离开设备。
结论和建议
DNS泄露可能会严重影响用户的隐私,可用于推算用户的大致位置或找出用户使用的网站和服务。
这些发现也再次表明,“在没有 VPN 的情况下阻止连接 ”名不副实,它存在多个缺陷。在上述情况下,应用程序仍可能泄露DNS流量,而且正如之前所报告的,它仍会泄露连接检查流量。
根据您的威胁模型,这可能意味着您应该完全避免使用安卓系统处理任何敏感信息,或采用其他缓解措施来防止泄漏。