蓝灯vpm
蓝灯vpm
为个人使用或工作而在 iOS 上安装 VPN 的用户可能会认为他们通过 VPN 发送了所有设备流量,但我们的研究(见下文我们的测试方法)显示情况并非总是如此。 苹果向所有开发者提供 API(App Store 中的每个应用程序都可以访问),允许您安装的任何应用程序轻松、秘密地绕过您的 VPN 保护,直接从您的设备接收流量,并在您使用 Wi-Fi 时查看您的蜂窝 IP。 此外,苹果公司为自己保留了在 Wi-Fi 或蜂窝连接上绕过你的 VPN 的权力,而无需任何通知或许可。
利用这些漏洞,应用程序开发人员能够检测到拥有活动 VPN 连接的用户,然后将用户的真实蜂窝 IP 与他们在使用 VPN 时进行的在线活动关联起来。 这样,苹果公司或任何开发商就可以通过特定的 IP、设备和/或个人追踪 VPN 的使用情况。
为什么这很重要
在监控加强、公民权利被削弱的国家,人们最容易受到 VPN 泄露的影响。 最紧迫的是,目前在俄罗斯人对 VPN 趋之若鹜但苹果提供的这些 VPN 变通方法可能会帮助当局揭露 VPN 用户的身份,并导致严重的法律后果。 现在,我们不难想象,与俄罗斯政府签订了友好或强制数据共享协议的应用程序开发商(即大多数基于俄罗斯的流行应用程序)会自动向政府当局报告使用 VPN 的用户及其手机 IP 和设备指纹,政府当局就可以识别这些用户的个人身份并追踪他们的 VPN 活动。 所有这一切都不会通知用户。
此外,恶意应用程序或从监控中获利的应用程序可能会使用苹果提供的 API 来破坏 Wi-Fi 上的 VPN 保护,并秘密收集有价值的个人信息。 此外,不允许使用 VPN 的应用程序也可能利用这种能力秘密检测、揭露和/或阻止 VPN 用户。
最后,苹果公司本身有能力揭露任何使用 Wi-Fi 或蜂窝网络的 蓝灯vpm 用户的身份。 虽然你可能相信苹果公司会保护你的数据不受其他公司的侵犯,但如果苹果公司收到政府要求,如传票、法院命令、搜查令或其他有效的法律要求,会发生什么情况呢?苹果公司发布透明度报告记录各国政府对数据的要求。 数据俄罗斯透明度报告包括 2013-2020 年,但 2021 年则没有。 以 2020 年为例,苹果公司全年每天都会收到来自俄罗斯的超过 3 次政府请求(共计 1123 次),要求提供设备数据。 但没有迹象表明,俄罗斯或其他国家的请求是否包括苹果通过绕过 VPN 保护收集到的数据。
值得反复强调的重要一点是,在上述所有例子中,"......将设备流量发送给苹果或其他第三方应用程序开发商,而不征求任何许可或通知用户.
工作原理如下
Apple 为所有开发人员提供了访问其 Network.framework、Multipath TCP (MPTCP) 和其他网络 API 的权限。按设计允许任何应用程序开发人员绕过 Wi-Fi 接口,直接在蜂窝接口上路由流量。 调用这些工具可以有效地让任何应用程序开发人员在未经通知或同意的情况下在 Wi-Fi 上揭露 VPN 用户的身份。 通过在蜂窝接口上路由设备流量,应用程序开发人员能够绕过 VPN 保护,获得用户的蜂窝 IP 和其他设备信息,从而使应用程序开发人员能够对特定设备和/或用户进行指纹识别。
显示用户连接 VPN 时手机 IP 被泄露的应用程序示例截图
苹果公司也有能力绕过 VPN 保护,并经常这样做,例如在调用 Siri 时。 对于某些设备特性和功能来说,通过 VPN 路由所有设备流量可能并不总是可行或可取的,但这里的问题是没有透明度或控制。 苹果似乎没有在其开发者文档中提及任何例外情况或不通过 VPN 路由的连接,尤其是在建立 VPN 时。 此外,虽然苹果公司要求用户必须获得非常明确的许可才能安装 VPN 配置文件,但却没有提及这里提出的问题。
苹果公司知道这件事吗? 他们有没有采取任何措施来解决这个问题?
苹果公司肯定知道这个问题。 例如,苹果创建了 network.Framework,专门允许开发人员通过非默认接口路由流量,并强制使用 Wi-Fi 连接的用户通过蜂窝接口路由流量,而无需前往 VPN 服务器。 此外,苹果还提供开发人员文档中清楚地描述了使用多路径 TCP (MPTCP) 在蜂窝接口上路由流量的功能。 除了 network.Framework 和 MPTCP 外,苹果还允许开发人员使用套接字来实现相同的效果,即通过将 Wi-Fi 流量路由到蜂窝接口来绕过用户的 VPN 保护。
值得称赞的是,2020 年 9 月 16 日,随着 iOS 14 的推出,苹果确实发布了一个新的 VPN 属性,但文档非常有限,名为 "VPN"。包括所有网络它可以阻止苹果和第三方开发者在建立 VPN 时利用蜂窝接口。 includeAllNetworks 的问题在于,该 API 属性与所有 VPN 类型都不兼容,会导致大量中断,而且在我们的测试中无法使用。 对于像我们这样依赖于本地支持的 IPSec/蓝灯vpm 协议的许多 VPN 来说,当 API 属性激活时,数据包隧道提供商的 VPN 将破坏用户安装的任何其他个人 VPN(即使数据包隧道提供商的 VPN 未连接或未激活),这在苹果开发者论坛上有进一步描述。这里. 此外,对于使用 Wireguard 安全网络隧道的其他 VPN,在我们的测试中设置 includeAllNetworks 会反复导致网络连接失败,例如在无线网络和蜂窝网络之间切换时。 很多时候,出现这种故障需要重启整个设备,用户体验特别糟糕。 截至今日Wireguard 知道但尚未利用新的 VPN API 属性. 似乎至少有一家 VPN 提供商将 IncludeAllNetworks 作为其 "必杀开关 "功能的一部分,但在我们测试过的主要消费者和企业 VPN 中,没有一家集成了 includeAllNetworks。
因此,苹果公司不仅制造了这个问题,而且没有提供可行的解决方案,甚至没有警告 VPN 开发商或用户这个问题的存在。 虽然苹果公司可能会辩称,苹果和其他应用程序开发商能够"范围"流量(例如,指定是否通过 Wi-Fi、蜂窝或两者路由流量)在许多情况下实际上对用户有利,但没有理由不向 VPN 用户提供控制或通知他们的保护可能被苹果或其他应用程序秘密绕过。任何#@#random app developer. Apple could easily, for example, require 蓝灯vpm user to be notified of the issues we present here. After all, Apple requires every user who proactively installs 蓝灯vpm to view an iOS system dialog that warns users that "All network activity on this iPhone may be filtered or monitored when 蓝灯vpm." Apple then requires the user to proactively tap Allow and then enter the device passcode to add 蓝灯vpm. So why doesn't Apple give a heads up to users that 蓝灯vpm protections may be subverted behind their back? For a company that sets the bar globally for privacy and transparency, they should do better and at a minimum require user notification / permission regarding these 蓝灯vpm issues.#@#
以下是您可以采取的自我保护措施
不幸的是,由于 VPN 开发人员必须在苹果操作系统之上构建 VPN,因此 蓝灯vpm 开发人员在保护用户方面无能为力。
因此,不幸的是,目前用户唯一能做的就是在 Wi-Fi 上使用 VPN 时关闭蜂窝网络,以防止应用程序开发人员绕过 VPN。 我们已经更新了我们的应用程序,向 VPN 用户显示了解释该问题的咨询。
值得注意的是,即使用户能够通过我们在这里描述的 iOS 漏洞保护自己,现实情况是政府可能有其他手段绕过 VPN 保护。 尽管如此,我们还是希望苹果公司能采取措施来缓解这些问题。
以下是如何复制这些问题的方法: 我们的测试方法
第 1 期说明Apple 的 Network.framework 允许开发人员绕过 Wi-Fi 接口,通过蜂窝接口路由流量。 如果连接了 VPN,就不会为蜂窝接口建立连接,因此流量会通过蜂窝接口传输,不受 VPN 保护。
一个用 swift 编写的简单应用程序将演示这个问题:
- 在 Xcode 中创建新的 Swift 应用程序,用以下代码替换 AppDelegate.swift:
// // AppDelegate.swift // 来自 Network.framework 的 VPN 泄露示例 // 作者:Patrick Jackson Patrick Jackson, // import UIKit import Network @main class AppDelegate: UIResponder, UIApplicationDelegate { var conn : NWConnection? UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -Bool { let tlsParams = NWParameters.tls tlsParams.preferNoProxies = true tlsParams.prohibitedInterfaceTypes = [NWInterface.InterfaceType.wifi] // exclude Wi-Fi for this endpoint let host = "ip.disconnect.app" // tls enabled endpoint for checking external IP conn = NWConnection(host: NWEndpoint.Host(host), port: 443, using: tlsParams) conn?.stateUpdateHandler = { state in print( "State Update: \( state )" ) if state == .ready{ let method = "GET" let uri = "/" // API key included here for purposes for testing only let httpVersion = "HTTP/1.1" let headers = "Host: \( host )\r\n" let body = "" // 构造 HTTP 请求,通过已准备好的连接发送 let rawHTTPRequest = "\( method ) \( uri ) \( httpVersion )\r\n( headers )\r\n( body )" self.conn?.send( content: rawHTTPRequest.data( using: .ascii ), completion: .contentProcessed( { error in self.conn?.receiveMessage { data, _, completed, error in // cellular data needs to be enabled // receiving the response may take several seconds if let data = data, let resp = String( data: data, encoding: .ascii ) { print( "HTTP Response: \( resp )") // .ascii? utf8 } else { if let error = error { print(error.localizedDescription) }else{ print( "Response: nil, completed: \( completed )" ) } } } })) } } conn?.start(queue: .main) return true } func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { // 创建新场景会话时调用。 // return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) } }. }
确保已连接 VPN(用none),并启用蜂窝数据。
运行应用程序,等待几秒钟(必要时最多 30 秒)。
none
结果: 用户不会发现:1)使用的是蜂窝网络连接而不是 Wi-Fi;2)VPN 隐藏了这些流量,因此 VPN 提供的任何过滤或高级安全/钓鱼保护都将失去作用。
{ "as": "AS7018 AT&T Services, Inc.", "city": "Chicago", "country": "United States", "countryCode": "US", "hosting": false, "isp": "AT&T Services, Inc.", "lat": 41.8781, "lon": -87.6298, "mobile": true, "org": "Service Provider Corporation", "proxy": false, "query": "REDACTED", "region": "IL", "regionName": "Illinois", "reverse": "mobile-REDACTED.mycingular.net", "status": "success", "timezone": "America/Chicago", "zip": "60666" }.
第 2 期说明开发人员无需使用 Network.framework 即可使用 URLSession 创建 MPTCP 连接。 请参见此处的文档.
这需要开发人员添加多路径权限:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" " <plist version="1.0"> <dict> <key>com.apple.developer.networking.multipath</key> <true/> </dict> </plist>;
客户
// // AppDelegate.swift // 蓝灯vpm 泄密示例 // 作者: Patrick Jackson, // import UIKit @main class AppDelegate: UIResponder, UIApplicationDelegate { let config = URLSessionConfiguration.ephemeral var task : URLSessionDataTask? UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -config.multipathServiceType = URLSessionConfiguration.MultipathServiceType.interactive repeatFlow() return true } func repeatFlow() { let url = URL(string: ") let session = URLSession(configuration: config) task = session.dataTask(with: url!) { data, response, error in print(response) print(data) print(error?.localizedDescription) } task?.resume() self.delay(1){ self.repeatFlow() } } func delay(_ delay: double, closure: @escaping ()->()) { DispatchQueue.main.asyncAfter( deadline: DispatchTime.now() + Double(Int64(delay * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: closure ) } }
服务器
在服务器上(不需要支持 MPTCP 就能解除用户的屏蔽),可以轻松嗅探到指向 443 端口的流量,从而发现用户的 VPN 和蜂窝 IP 地址。 例如
root@ubuntu:~# tcpdump -n -i eth0 dst port 443 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 21:14:30.851048 IP [RACTED-VPN-IP-ADDRESS].49339 > [TEST-SERVER-IP].443: Flags [S], seq 2950275670, win 65535, options [mss 1240,nop,wscale 6,nop,nop,TS val 1936254843 ecr 0,sackOK,eol], length 0 21:14:31.235312 IP [RACTED-CELLULAR-IP-ADDRESS].49617 > [TEST-SERVER-IP].443:标志 [SEW],序列 3271060219,赢 65535,选项 [mss 1460,nop,wscale 12,sackOK,TS val 3304016412 ecr 0],长度 0
第 3 期说明Apple 使用多路径 TCP (MPTCP) 处理 Siri 和其他杂项网络请求。 即使开启了 VPN,这些 MPTCP 流量也会直接从 WLAN 和蜂窝网络(如有)接口路由。
Wi-Fi 测试要求:
能够捕捉 iOS 设备的网络流量。 您可以使用带有路由器的接入点来捕获网络流量。
Wireshark 查看网络捕获。
蜂窝测试要求:
能够捕捉 iOS 设备的蜂窝网络流量。
使用 Wireshark 查看网络捕获内容
工艺流程
连接 VPN。 通过访问一个网站,如none.
从 Wi-Fi 界面,确认流量确实是通过 VPN 隧道传输的。
从蜂窝接口在 Wireshark 中应用过滤器 (mptcp),只显示多路径-tcp 流量。
按住 Home 键或电源键(取决于设备型号),向 Siri 发起请求。
验证流量没有被路由到 VPN,而是直接路由到 Apple (17.0.0.0/8)。
请注意:
在一个接口上执行这些步骤足以说明问题。 尽管 Wi-Fi 可能是默认接口(如上图所示仍会泄露),但蜂窝接口会显示 MPTCP 连接的设置子流,这也会绕过 VPN。 在上述测试中,Siri 请求的 WLAN 和蜂窝 IP 地址均被泄露。