您如何验证应用程序是否使用安全通信?

信息安全 tls
2021-09-09 01:54:18

任何现代浏览器都会向最终用户提供反馈,确认您是否使用 HTTPS 和一些基本的证书验证。

使用移动应用程序时,最终用户似乎无法验证他们的通信是否安全。如果没有尝试使用 ARP 缓存中毒之类的 MiTM,我有什么方法可以验证移动应用程序是否使用 HTTPS?

如果应用程序使用 HTTPS,并且我使用 Fiddler 注入自签名证书,则操作系统似乎会介入并警告我。至少在这种情况下,如果应用程序使用 HTTPS 并且有人尝试 MiTM,我会收到警告。但是,如果应用程序使用 HTTP,那么 MiTM 可以整天坐在那里,作为最终用户,我只能假设它是安全的并且证书是好的,或者它不安全并希望最好......

就像用户可以在安装时验证的应用程序权限一样,我们可以使用“安全通信”标志来指示操作系统不会允许不安全的通信离开应用程序。有没有这样一种方法可以在移动应用程序中断言这种级别的安全性,而不仅仅是开发人员的断言,而是可以强制执行或证明的东西?

3个回答

如果您打算解密流量,您只需要安装 MitM 攻击。如果应用程序使用标准加密协议(SSL/TLS、SSH),那么您可以简单地记录连接(例如,使用 tcpdump),然后将结果提供给下降协议分析器(ig Wireshark),它会告诉您是否有一个安全的握手和使用什么选项。

我会回答关于Android的问题,因为我更熟悉它。

大多数应用程序将使用内置的 HTTP 客户端库,尽管对于花哨或高性能的应用程序不能保证这一点。这些 Android 库不如桌面 Java 丰富,因此不清楚这些库是否加载您可以更改的系统范围的设置(作为 root 用户)以及是否可以使用force-https选项。

在实践中,您需要找到或创建防火墙或转发代理应用程序来拦截所有传出应用程序流量并注入 HTTP 301(或 302)指令以重定向到 HTTPS大概检查服务器地址是否存在 HTTPS 套接字。并且根据使用的库,对于不希望使用 HTTPS 的应用程序,可能没有无缝的 SSL/TLS 证书验证。

或者,当应用程序向非白名单目标执行 HTTP 请求时,只需让自定义工具通知用户。

这种仅 HTTPS 的强制执行最好是操作系统的一个功能,或者至少是 CyanogenMod 等流行 ROM 中的一个功能。

如前所述Polynomial,如果您的手机通过您控制的网桥路由;您可以使用WireShark或类似工具来发现您的手机通过 WiFi 正在做什么。手机上的 Tcpdump 可以使用正确的工具和权限,可能导入到WireShark以便更好地查看。

其他移动平台我不太清楚,但是Android上能够进行HTTPS连接的权限是android.permission.INTERNET,其实很通用(可以打开任何连接)。

我没有尝试过,但是如果您事先知道确切的 URI,您也许可以使用URI Permissions我不清楚这些是否仅适用于内部内容 URI 或也适用于由 建立的连接URLConnection,这可能会给您想要的限制。

请注意,总体而言,这几乎不重要,因为您所问的问题显然不是从开发人员的角度来看的。我假设您的问题是关于能够验证第 3 方应用程序是否仅建立 HTTPS 连接,并且您不一定信任其开发人员。

  • 即使这些 URI 权限可用于强制执行 HTTPS-only URI,这也只有在开发人员考虑到这一点时才有效。就目前而言,用户无法覆盖应用程序请求的权限(尽管在Android 4.3 中似乎有这样的功能,或者如果您已经植根手机并安装了额外的应用程序)。在这种情况下,权限仍然不是正确的使用方式,因为开发人员有效地授予自己这些权限:如果操作系统不强制执行,自我断言的“我只建立安全连接”标志似乎毫无意义。

  • 如果您能够在路由器级别监听流量,您至少可以验证应用程序当时仅使用 HTTPS 流量。在给定的时间段内没有注意到纯文本连接并不能保证永远不会建立纯文本连接,但这应该给出合理的指示。

  • 您可以看到应用程序建立 HTTPS 连接这一事实并不意味着它正在正确使用 HTTPS不能使证书错误消失似乎是一个常见的要求(例如在 iOSAndroid 上。由于某些原因,不安全解决方案的答案似乎受到高度评价......)。虽然在 Fiddler 中使用自签名证书会捕获根本不验证证书的应用程序,但您还需要使用具有不同主机名的受信任证书来捕获忘记验证主机名的应用程序。