来源: https://mysk.blog/2026/08/04/webkit-proxy-icloud-private-relay-ip-leak/
iOS 和 macOS 上基于 WebKit 的浏览器可以配置为将所有网络流量路由到代理服务器,iOS 上的 Tor 浏览器和我们自己的 Psylo 浏览器都是这样工作的。我们发现了 WebKit 的三个特性——DNS 预取、WebAuthn 相关源请求和 WebTransport——它们会绕过配置的代理,直接从设备发送流量,从而暴露用户的真实网络。同样的漏洞也影响了苹果的 iCloud Private Relay。这三个漏洞均已在 Psylo 1.3.1 中修复。
Summary
iOS 和 macOS 上基于 WebKit 的浏览器可以配置为将所有网络流量路由到代理服务器。所有 iOS 上的代理浏览器,包括 iOS Tor 浏览器和我们自己的浏览器 Psylo,都是这样工作的。网页建立的每个网络连接都应该通过配置的代理服务器,因此网站只能看到代理服务器的 IP 地址。我们发现了 WebKit 的三个特性,它们可以绕过代理配置,直接从设备发送流量:
DNS prefetching 通过设备自身的 DNS 路径解析主机名,从而显示用户的真实 DNS 服务器,而不是代理服务器的 DNS 服务器。此功能自 iOS 26.0 起可用。
WebAuthn Related Origin Requests 使操作系统凭证服务直接从设备获取验证文件。这会暴露设备的真实 IP 地址。此功能自 iOS 18.0 起可用。
WebTransport 会直接建立 HTTP/3 连接,绕过代理服务器,但这也会暴露设备的真实 IP 地址。此功能自 iOS 26.4 起可用。
这些泄露事件也会影响苹果的 iCloud Private Relay。需要注意的是,VPN 不受影响,因为它们会在系统层面上对设备的全部网络流量进行隧道传输。
Psylo 1.3.1 已修复: Psylo 现在默认阻止dns-prefetch 提示信息并禁用 WebTransport 和 WebAuthn。对于确实需要这些功能的网站,可以通过每个独立组件的开关重新启用它们。这种明确的选择加入机制将隐私权衡权交到了用户手中。详情请参阅Psylo 1.3.1 中引入的缓解措施。
Background
iOS 和 macOS 上的 Proxy Configuration
iOS 17 和 macOS 14 中引入的这项功能,WKWebsiteDataStore.proxyConfigurations 允许基于 WebKit 的浏览器在应用层将所有网络流量路由到代理服务器。该 API 是 iOS 上代理浏览器的基础:网页建立的每个网络连接都应该通过配置的代理服务器,因此网站只能看到代理服务器的 IP 地址。
Psylo 用户报告 DNS 泄漏
这项调查始于一位Psylo用户提交的错误报告,该用户发现访问某些特定网站时会出现 DNS 泄漏,我们立即展开了调查。Psylo 会将每个 silo 的所有流量路由到Mysk 私有代理网络(或用户自行配置的自定义代理),因此所有 DNS 查询都应该来自代理服务器,而不是用户设备本身。此外,该问题仅影响部分网站而非全部网站,这一点也令人费解。
随着调查的深入,我们找到了DNS泄漏的源头,以及另外两个能够暴露设备真实IP地址的泄漏点。这三个泄漏点都存在于WebKit中,它们绕过了提供的代理设置WKWebsiteDataStore.proxyConfigurations 。由于苹果App Store的政策要求所有iOS浏览器都必须使用WebKit,因此任何依赖此API进行代理的iOS浏览器都会受到影响,包括所有iOS Tor浏览器和Psylo。这些泄漏点也存在于苹果的iCloud Private Relay中。另一方面,VPN不受这些问题的影响,因为设备的所有网络流量都会在系统层面通过VPN进行隧道传输。
iCloud Private Relay
iCloud Private Relay是苹果为 iCloud+ 订阅用户提供的隐私功能。启用后,它会将 Safari(且仅限 Safari)的网络流量和 DNS 查询代理到两跳中继服务器,其设计目的是确保任何一方(包括苹果)都无法同时看到您的身份和访问的网站。然而,本文中提到的所有三个漏洞都发生在 WebKit 的标准页面加载过程之外,这意味着 Private Relay 也容易受到同样的漏洞影响。
1. DNS Prefetching
DNS 预取允许网站在需要主机名之前就请求浏览器解析该主机名。这样,当稍后需要连接到该主机名时,解析已经完成,连接速度更快。这是通过<link rel="dns-prefetch"> HTML 标签实现的。
当页面包含该标签时,WebKit 会通过设备的正常 DNS 路径解析主机名,而不管浏览器通过 设置了什么代理WKWebsiteDataStore.proxyConfigurations 。页面可以在这些标签中嵌入每个访问者独有的主机名,然后观察查询是否从访问者的真实网络到达其自身的权威 DNS 服务器,而不是通过代理服务器。
这就是最初用户报告背后的漏洞,也解释了为什么只有某些网站会触发它:如果没有页面上的预取标签,WebKit 就不会执行此 DNS 查询。
私有中继无法捕获到这种情况。它通常会代理 Safari 的 DNS 查询,但这些预取查询会跳过它。即使启用了私有中继,查询仍然会从设备的真实网络到达权威服务器。
桌面版 Safari 自 Safari 5 起就已支持此功能
<link rel="dns-prefetch">,但 iOS 直到 iOS 26.0(2025 年 9 月)才开始支持,当时 WebKit 在移除 iOS 旧版隐式推测性 DNS 预取功能的同一更改中启用了此功能(bug 285744,290327 @ main;浏览器兼容性数据)。该解析器在前一年已被重写,目的是在隐私浏览期间将主机名从系统日志中移除(bug 272190,279199 @ main)。
2. WebAuthn Related Origin Requests
WebAuthn 是支持密码验证的 Web 标准。通常情况下,一个密码绑定到单个域,但相关源请求 (Related Origin Requests) 允许组织在其拥有的少量域中使用同一个密码。
rpId 为了实现这一点,当一个页面请求一个与其自身来源不同的凭据时,客户端首先获取https://<rpId>/.well-known/webauthn 一个 JSON 文件,其中列出了哪些来源可以使用该凭据rpId 。
这种验证请求并非来自浏览器的网络协议栈。WebKit 将 WebAuthn 操作交给操作系统的凭证服务,由其直接从设备发出 HTTPS 请求,而无需感知主机应用配置的任何代理。页面可以自行选择rpId 主机,即使没有用户交互,请求也会触发:页面mediation: "conditional" 不会显示任何用户界面。
同样的道理也适用于 iCloud 私密中继。由于获取请求是由操作系统的凭证服务而非 Safari 发出的,因此它不会进入私密中继的代理路径。无论如何,目标服务器都能看到设备的真实 IP 地址。
苹果在Safari 18.0 的 WebKit 功能中宣布了 iOS 18.0 / Safari 18.0(2024 年 9 月)的这项功能。WebKit 的底层架构在当年早些时候已经实现(bug 268426,274592 @ main),甚至在 iOS 17.4 中以非功能形式发布;执行获取操作的系统组件直到 18.0 才获得支持。
3. WebTransport
WebTransport 是 WebSocket 的低延迟替代方案。它基于 HTTP/3 和 QUIC 运行,提供多个独立流以及不可靠的数据报传输,并且在 QUIC 不可用时可以回退到 HTTP/2。
调用new WebTransport(url) 会直接从设备打开一个 QUIC 连接。WebKit 使用自己的网络参数建立连接,并且从不向其提供会话代理,因此服务器看到的是设备的真实 IP 地址,而不是代理的 IP 地址。
私有中继在这里也无济于事。WebKit 在私有中继代理的 Web 流量之外建立连接,因此即使启用了私有中继,WebTransport 服务器仍然可以获知设备的真实 IP 地址。
但有一个例外:Onion Browser 的“Silver”安全级别将 WebKit 配置为锁定模式,完全禁用 WebTransport,因此 Silver 级别的 Onion Browser 用户不会受到此特定漏洞的影响。
该 API 的最初迹象出现在 2023 年(bug 260810,267408 @ main),但一直处于禁用状态,直到 2025 年 12 月才对具有足够 Network.framework 支持的平台启用(bug 303453,303860 @ main)。它随 iOS 26.4(2026 年 3 月)正式发布;请参阅Safari 26.4 的 WebKit 功能和Safari 26.4 发行说明。
Psylo 1.3.1 版本中引入的缓解措施
我们在 Psylo 1.3.1 中修复了所有三个漏洞:
- Psylo 会阻止
dns-prefetch提示,因此页面无法再使您的设备解析攻击者控制的主机名。 - WebTransport 默认处于禁用状态。
- WebAuthn 默认处于禁用状态。
Passkeys 和 WebTransport 都有其合法用途,因此两者都可以通过每个独立服务器的开关随时重新启用。这确保了 Psylo 开箱即用时不会发生数据泄露,而需要在特定站点上使用这些功能的用户可以明确选择启用,并清楚地了解其中的利弊。