DNS流量在Android上可能会泄漏
2024年5月3日
我们最近注意到Android上存在多种潜在的DNS泄漏问题。这些问题源自Android系统本身的漏洞,仅影响某些应用程序。
在2024年4月22日的星期一,我们发现了一个来自,内容是关于一个。该报告详细描述了用户在启用“阻止没有VPN的连接”时,禁用和启用VPN导致DNS查询泄漏的情况。我们立即开始了内部调查,并确认了这一问题。调查还发现了其他可能导致Android上DNS泄漏的场景。
发现
我们识别出Android系统可能导致DNS流量泄漏的场景:
- 当VPN活动但未配置任何DNS服务器时。
- 在VPN应用程序重新配置隧道或被强制停止/崩溃的短时间内。
泄漏似乎仅限于对C函数getaddrinfo
的直接调用。使用这种方式解析域名的应用程序会在上述场景中导致泄漏。我们没有发现仅使用AndroidAPI(如)的应用存在泄漏。Chrome浏览器是一个可以使用getaddrinfo
的应用示例。
上述情况无论是否启用“始终开启VPN”和“阻止没有VPN的连接”,都适用。这与预期的操作系统行为不符,因此应在操作系统中进行修复。
我们确认这些泄漏在多个版本的Android上发生,包括最新版本(Android 14)。
改进措施
我们的应用在阻止状态下当前并不设置任何DNS服务器。当我们的应用无法以不可恢复的方式建立隧道时,它会进入阻止状态。在此状态下,应用会停止流量离开设备。然而,在这个状态下并未设置任何DNS服务器,导致上述描述的DNS泄漏可能发生。我们将通过暂时设置一个虚假的DNS服务器来规避操作系统的漏洞。您可以期待不久后发布包含此修复的版本。
在应用中缓解隧道重新连接期间的泄漏相对困难。我们仍在寻找解决方案。我们可能会减少隧道重新配置的次数,但目前我们认为无法完全防止此泄漏。
应该明确的是,这些变通方案不应在任何VPN应用中被需求。应用使用getaddrinfo
来解析域名并没有错。相反,这些问题应在操作系统中解决,以保护所有Android用户,无论他们使用什么应用。
我们已向谷歌报告了,希望他们能迅速处理。
重现步骤
以下步骤将重现上述第二种场景,其中VPN用户更改隧道配置,例如切换到其他服务器或更改DNS服务器。
我们使用WireGuard应用程序,因为它已成为Android VPN实现的参考。值得注意的是,这些泄漏可能也能通过其他任何AndroidVPN应用程序重现。我们使用Chrome来触发泄漏,因为这是我们已确认使用getaddrinfo
的一款应用。
- 下载
- 安装WireGuard应用和Chrome
- 将和导入WireGuard
- 在WireGuard应用中启用wg1隧道并允许VPN权限
- 在Android VPN设置中为WireGuard启用“始终开启VPN”和“阻止没有VPN的连接”
通过使用如
tcpdump
开始在路由器上捕获数据
$ tcpdump -i <INTERFACE> host <IP of android device>
将屏幕分割,以便并排显示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 NXDomain0/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 NXDomain0/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 IPOpenWrt.lan.53 > Pixel-Tablet.lan.16747: 44584 NXDomain 0/0/0 (61)
由于启用了“阻止没有VPN的连接”,因此除了加密的WireGuard流量外,设备本不应有任何流量离开,但这里我们看到未加密的DNS流量离开了设备。
结论与建议
DNS泄漏可能对用户的隐私产生严重影响,并且可以用来推测用户的大致位置或了解用户使用的网站和服务。
这些发现再次表明“阻止没有VPN的连接”并没有如其名称(或文档)所指示的那样发挥作用,并且存在多处缺陷。在上述情况下,应用仍可能泄漏DNS流量,如所示,它仍然泄漏连接检查流量。
根据您的威胁模型,这可能意味着您应避免在Android设备上进行任何敏感操作,或采取其他措施来防止泄漏。我们旨在部分缓解我们应用中的这些问题,因此请确保保持应用更新。