iOS 15 iCloud Private Relay 漏洞识别
Apple 的新 iCloud Private Relay 服务允许用户向网站和网络服务提供商隐藏他们的 IP 地址和 DNS 请求。在本文中,我们将演示如何绕过此安全功能,并讨论用户可以采取哪些措施来防止其数据泄露。
您需要打开 iCloud Private Relay 来测试漏洞。目前 iCloud Private Relay 仅在 iOS 15 上的 Safari 中可供 iCloud+ 订阅者使用。_
在我们的博客上试用演示
请注意,此泄漏仅发生在 iOS 15 上的 iCloud Private Relay 上——该漏洞已在 MacOS Monterey beta 中修复。_
IP 地址和在线隐私
如今,在线隐私是一个热门话题。互联网用户不喜欢在网上被跟踪;另一方面,广告商需要收集用户行为洞察,以展示最相关(和盈利)的广告。不幸的是,这需要访问用户可能不愿意分享的敏感和私人信息。
您的 IP 地址就是这样一条信息,用于跟踪您在网站上的活动。这些数字标签(例如1.2.3.4)即使不是专用的,也相对稳定和独特,可用于以建筑物级精度确定您的位置。
相关方可以跟踪您的在线活动的另一种方式是分析您的域名系统 (DNS) 请求。与用户及其设备一样,网站也由其 IP 地址标识。但是,访问者只需要在地址栏中输入相关的域名(例如 example.com),因为 DNS 将字母数字域名转换为数字 IP 地址以进行正确路由的困难部分。
这当然使互联网对用户更加友好,但也为感兴趣的各方创造了另一种跟踪您的在线行为的方式。 DNS 请求包含您访问的网站的名称,因此它们可用于查看您的浏览历史记录和您的兴趣。除非实施了 DNS-over-HTTPS,否则 DNS 请求是未加密的,允许您的 Internet 服务提供商和您与 DNS 服务器之间的其他方查看您未加密的 DNS 请求。
什么是 iCloud 私有中继
浏览器供应商(最著名的是 Apple)近年来齐心协力提高用户的安全性和隐私性。 iCloud Private Relay 是 Apple 用于保护用户免受这些在线跟踪技术侵害的最新功能。
根据苹果网站:
“iCloud Private Relay 是一项服务,可让您连接到几乎任何网络,并以更加安全和私密的方式使用 Safari 浏览。它确保离开您设备的流量被加密并使用两个独立的互联网中继,因此没有人可以使用您的 IP 地址、位置和浏览活动来创建有关您的详细配置文件。”
该服务通过代理来自 Safari 浏览器的网络/HTTP 流量(包括 DNS 请求)以及来自应用程序的未加密 HTTP 流量来工作。通过这样做,Apple 声称网络提供商无法再看到您的 DNS 请求和未加密的 HTTP 流量;同样,访问的网站只会看到您的 iCloud 分配的代理 IP 地址。该地址是从多个 iCloud Private Relay 用户共享的池中提取的,按其大致位置分组(Apple 提供了公共表的代理 IP/位置) .
Apple 的下图说明了 iCloud Private Relay 如何处理 HTTPS 请求以及各方看到的内容:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--YZwrrnMc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/uploads/articles/nthk4i475ihbgqt1bn48.png)
iCloud Private Relay 专为运行 iOS 15 或 macOS 12 Monterey 且带有 Safari 浏览器的 iCloud+ 订阅者提供。不幸的是,由于监管限制,它在几个国家不可用。
您可以在这个来自 Apple 的视频中了解有关 iCloud Private Relay 的更多信息。
如何获取使用iCloud Private Relay的客户端真实IP
如果您从服务器收到的 HTTP 请求中读取 IP 地址,您将获得出口代理的 IP 地址。不过,您可以通过 WebRTC 获取真实客户端的 IP。下面详细描述该过程。
如果您想直接了解泄漏说明,请跳过以下“是什么”部分。
什么是WebRTC
WebRTC(网络实时通信)是网站的浏览器 API,用于在网站访问者之间建立直接通信(即点对点)。该通信允许在浏览器之间发送和接收音频、视频和任意数据,而无需中间服务器。所有现代浏览器都原生支持 WebRTC;例如,Google Hangouts 是使用 WebRTC 的较受欢迎的应用程序之一——它适用于所有浏览器,只需单击/点击即可启动会议,无需安装插件。
WebRTC 是一个复杂的 API。更多信息可从这个 Google 指南获得;但是,我们将仅涵盖 IP 地址泄漏所需的方面。
为了让浏览器相互通信,它们首先需要连接。这听起来很简单,但实际上并非易事,因为与服务器不同,网站访问者的设备没有可连接的公共 IP。 ICE 协议的创建就是为了解决这个问题。
什么是冰
ICE(交互式连接建立)是 WebRTC 使用的框架。它让两个浏览器可以找到并相互连接以进行直接的点对点通信。当一个浏览器想要连接到另一个浏览器时,它会在一个称为“收集 ICE 候选者”的过程中收集所有可能的主机。 ICE 候选者是一段包含主机(IP 地址或域名)、端口、协议和其他信息的文本。浏览器会将 ICE 候选返回给浏览器应用程序。
以下是 ICE 候选的示例(请参阅RFC 文档中的完整格式描述):
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--ZU3oF9Fc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/uploads/articles/mcjs1v300tc9yn6kurik.png)
假设 Alice 想要连接到 Bob。 Alice 的浏览器将收集其所有 ICE 候选者,并通过网站的服务器将它们发送给 Bob。这是唯一需要服务器的时候,任何进一步的通信都将直接在 Alice 和 Bob 之间进行。当 Bob 从服务器接收到 Alice 的 ICE 候选者时,它将尝试使用列表中的地址和端口连接到 Alice,直到找到一个有效的。
存在不同类型的 ICE 候选者——在这个演示中,我们关注的是服务器反射候选者。您可以通过typ srflx子字符串识别它。它包含一个 IP 地址和一个来自 STUN 服务器的端口,允许 Bob 通过 Alice 的 NAT 连接。
什么是NAT和STUN
NAT(网络地址转换)是一种允许多个设备使用单个 Internet 连接和公共 IP 地址连接到 Internet 的协议。每个家庭路由器都实施了 NAT——事实上,您的设备现在很可能在 NAT 之后。
使用 NAT 的网络内的设备没有公共 IP 地址,因此无法直接从 Internet 访问它们。STUN(用于 NAT 的会话遍历实用程序)协议就是为了解决这个问题而创建的。
STUN 服务器执行一项小而关键的任务:它返回您的公共 IP 地址和端口号。我们不会深入介绍 NAT 遍历(您可以在这里了解更多信息);只要知道 Alice 得到一个 ICE 候选者,其中包含 STUN 服务器返回的她的公共 IP 地址和端口,Bob 可以使用这个 IP 地址和端口连接到她。
这是从 NAT 后面建立 WebRTC 连接时发生的情况:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--EZ4t3kOU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/uploads/articles/3sfn8tc7qyyxczk95rfd.png)
WebRTC 从 STUN 服务器请求两种类型的 IP 地址:IPv4 和 IPv6。如果 STUN 服务器和用户的网络支持 IPv6,WebRTC 将收到 2 个 ICE 候选者:一个带有 IPv4 地址,另一个带有 IPv6 地址。
泄漏
因为 Safari 不通过 iCloud Private Relay 代理 STUN 请求,所以 STUN 服务器知道你的真实 IP 地址。这本身不是问题,因为他们没有其他信息;但是,Safari 会将包含真实 IP 地址的 ICE 候选传递给 JavaScript 环境。然后,对您进行去匿名化就变成了从 ICE 候选人那里解析您的真实 IP 地址的问题——这可以通过 Web 应用程序轻松完成。
因此,为了获得真实的 IP 地址,您需要使用 STUN 服务器创建对等连接对象,收集 ICE 候选对象并解析值。此方法不需要用户权限,适用于 HTTP 和 HTTPS 页面。此外,它很快(几个并行网络请求所需的时间)并且在浏览器开发工具中没有留下任何痕迹。
首先,创建一个具有至少一个 STUN 服务器的对等连接对象。我们将使用 Google 的服务器,因为它在互联网上的示例中被广泛引用。
js
const peerConnection = new RTCPeerConnection({
iceServers: [{
urls: 'stun:stun.l.google.com:19302'
}]
})
进入全屏模式 退出全屏模式
订阅icecandidate活动以接收 ICE 候选人。会有 STUN 候选项和其他类型的候选项,因此您需要过滤 STUN 候选项并解析其 IP 地址。
const ips = []
function isSTUNCandidate(candidate) {
return candidate.includes(' typ srflx ')
}
function parseIP(candidate) {
return candidate.split(' ', 5)[4]
}
peerConnection.onicecandidate = event => {
if (event.candidate) {
const candidateString = event.candidate.candidate
if (isSTUNCandidate(candidateString)) {
ips.push(parseIP(candidateString))
}
} else {
// There will be no other ICE candidates
// Print the result
console.log('IPs', ips)
}
}
进入全屏模式 退出全屏模式
最后,创建一个数据通道和一个报价,让 WebRTC 开始收集 ICE 候选人。
peerConnection.createDataChannel('')
peerConnection.createOffer().then(description => {
peerConnection.setLocalDescription(description)
})
进入全屏模式 退出全屏模式
当您收到带有空候选的icecandidate事件时,该过程将完成。ips数组将包含您的真实 IP(IPv4 和 IPv6,具体取决于您的网络连接)。如需完整代码,请访问我们的 GitHub 存储库。
如何保护自己免受泄漏
使用真正的 VPN 而不是 iCloud Private Relay 将代理您的所有网络流量(包括 STUN 请求和其他浏览器流量),因此除了您和 VPN 提供商之外,没有人可以看到您的真实 IP 地址。 App Store 中提供了无数的 VPN 应用程序。
在您的 Safari 浏览器设置中禁用 JavaScript 将关闭 WebRTC 并提供针对此泄漏的保护。但是,许多网站需要 Javascript 才能正常运行。
要修复此漏洞,Apple 将需要修改 Safari,使其通过 iCloud Private Relay 路由所有流量。 FingerprintJS 团队已经向他们报告了这个问题。
取得联系
-
试试我们的开源浏览器指纹库
-
试试FingerprintJS Pro,它将浏览器指纹识别与其他识别技术和机器学习相结合,准确率达到 99.5%。 10 天免费,API 调用不受限制。
-
加入我们的团队,从事令人兴奋的在线隐私和网络安全研究:work@fingerprintjs.com
更多推荐


所有评论(0)