【问题标题】:iOS app sandbox for accepting connections on TCP sockets用于接受 TCP 套接字上的连接的 iOS 应用程序沙箱
【发布时间】:2017-11-29 22:47:36
【问题描述】:

我正在我的一个项目中使用库 GCDWebServer(https://github.com/swisspol/GCDWebServer),出于安全原因,这要求我接受仅来自我的应用程序进程的连接。我希望这是 iOS 应用程序沙箱开箱即用的东西,但事实并非如此。沙盒似乎是通过文件系统权限对 UNIX 域套接字 (AF_UNIX) 实施的。但是对于 GCDWebServer 使用的 TCP/IP 套接字(AF_INET),似乎没有沙盒。

我能够编写两个示例应用程序 - 一个客户端和一个服务器(使用不同的开发人员证书签名),并且可以让它们相互通信,没有任何问题。

我想知道是否有某种方法可以在 iOS 上执行相同的操作,本质上是在 TCP 套接字上启动 HTTP 服务器,但只接受来自同一进程的连接。我不能使用 UNIX 域套接字,因为要从 HTTP 服务器请求内容的客户端是 AVPlayer,它不知道如何连接到我的应用程序的 UNIX 域套接字。

【问题讨论】:

  • 也许你可以详细说明你为什么要这样做,也许有一个更合适的替代方案可以推荐......
  • 我也是这么想的。这个想法是在磁盘上预先缓存 HLS(HTTP Live Streaming)视频的片段,如果缓存则让本地代理服务器为它们提供服务,否则重定向到远程 URL。因此,我们将提供给 AVPlayer 的是一个类似于 localhost:8080/MyVideo/playlist.m3u8 的 URL。这是我们正在尝试进行的优化,以减少视频加载时间。希望能解释用例。

标签: ios iphone sockets tcpsocket gcdwebserver


【解决方案1】:

我有大约 99% 的把握,你所要求的是不可能的。我什至认为在 OS X 中不编写网络内核扩展是不可能的(即使那样,这也很有挑战性)。

当一个网络请求到达另一个进程时,它已经通过了网络堆栈,并且已经失去了关于哪个进程发起连接的任何概念(除非最近有所改善)。

实际上,您可以获得的最接近的方法是绑定到 localhost 界面上的随机端口,并在您的应用进入后台后立即将其拆除。

迂腐地,如果你设法以某种方式说服 Apple 你计划构建一个 VPN,理论上可以滥用 VPN API,让你提供一个只在你的应用程序中工作的专用网络。但是,它永远不会被允许在应用商店中使用。

但是你为什么要这样做呢? AVPlayer 不仅能够从文件 URL 播放。

【讨论】:

  • 我也是这么想的。这个想法是在磁盘上预先缓存 HLS(HTTP Live Streaming)视频的片段,如果缓存则让本地代理服务器为它们提供服务,否则重定向到远程 URL。所以我们将提供给 AVPlayer 的是一个看起来像 localhost:8080/MyVideo/playlist.m3u8 的 URL。这是我们正在尝试进行的优化,以减少视频加载时间。希望能解释用例。
  • 此外,GCDWebServer 似乎已经负责在应用程序后台运行时拆除网络服务器。我更关心的是恶意应用程序使用 iOS 上的一项后台功能尝试连接到由我的应用程序启动的本地代理服务器的用例。如果服务器的源代码中存在任何允许任意代码执行的漏洞(例如:rapid7.com/db/modules/exploit/windows/http/sws_connection_bof),那么其他应用程序就可以控制我的应用程序的资源。
【解决方案2】:

您可以通过多种方式做到这一点:您可以检查 GCDWebServer 中的传入请求并决定是要响应它还是返回错误。

您可以添加其他应用不知道的秘密标头,使用密钥对整个请求进行签名等...

【讨论】:

    最近更新 更多