Facebook,SnapChat或Gmail iOS应用如何阻止Fiddler解密其https流量?

时间:2014-10-16 04:43:02

标签: ios facebook fiddler

我尝试使用Fiddler捕获一些iOS应用流量,例如:Facebook,SnapChat,Gmail和Instagram。

Instagram没有使用https,所以我可以获得所有流量并查看我发送的cookie,但Fiddler无法解密其他三个应用程序。它只显示如下:

  

找到了兼容SSLv3的ClientHello握手。提琴手提取   以下参数。版本:3.3(TLS / 1.2)随机:54 3F 49 C4 20 08   09 BC A8 84 24 92 08 BF B4 38 39 C9 BB 1C B2 7B 95 6A 39 34 E7 AC FE   0F 62 67 SessionID:空扩展:server_name graph.facebook.com     elliptic_curves

任何人都可以帮助我了解他们是如何做到这一点所以我可以使用相同的技术来保护我的应用程序。

2 个答案:

答案 0 :(得分:9)

您的问题围绕防止针对iOS应用程序的HTTPS中间人(MITM)攻击。使用Fiddler或其他HTTPS代理是一种天真的MITM攻击形式,不幸的是,这种攻击经常发挥作用。

HTTP建立在称为TLS(之前是SSL)的安全传输协议之上。使用受信任方之间的公钥和私钥对连接进行加密。这就是事情往往会出错的地方。信任的概念对于TLS和SSL的安全性至关重要。应用程序连接的服务器提供必须进行评估以建立信任的加密凭据。

将此视为护照或驾驶执照。在大多数情况下,许可证会签出。然后你得到一个名为McLovin的人。如果你实际上没有的姓名,出生日期,数字,照片,全息图等,你可能会盲目相信McLovin就是他们所说的人。然后你就麻烦了。

不要相信麦克劳文。

McLovin

大多数应用程序信任McLovin :(

为了保护您的应用程序免受这类攻击,您应该实施更严格的一系列crendential和trust评估。 Apple有一个技术说明,Technote 2232: HTTPS Trust Evaluation详细说明了这一点。

一个良好的开端是实施SSL Pinning。固定根据已知值检查远程主机的凭据 - 全部或部分证书。 iOS应用程序具有该证书的一些副本,并且当连接到该主机时,检查主机提供的凭据是否符合此“已知良好”证书。一些应用程序只检查元信息,其他应用程序尝试校验证书(AFNetworking执行此操作),而其他应用程序使用针对凭证的已知良好证书执行完全信任评估。 Apple在2014年WWDC会议Building Apps for Enterprise and Education中详述了此过程。如果远程主机未使用预期的凭据,则中止连接。攻击者没有拦截拦截的流量。如果您的服务器证书经常更改,这可能是一个问题 - 这是其首选检查服务器的公钥而不是元信息或哈希的几个原因之一。不幸的是,一些服务器管理员经常更改公钥。有些人认为这更安全。不是。

现在,显然这需要iOS应用程序拥有“好”证书的副本,或者它的某些部分。您可以在您的应用程序中包含证书,或者实现您自己的密钥交换方法。安全密钥交换长期以来一直是加密研究的主题,并不是一件容易接受的事情。 在您的应用程序中包含证书是大多数人使用的解决方案。您可能认为从可能已泄露或越狱设备的人那里获得此证书非常重要。这样做有很多不同的选择。显然,您可以将其作为资源包含,并对其进行加密。您还可以将其直接包含在应用程序二进制文件中,这对攻击者来说可能要困难得多。这可以通过使用xxd tool with Xcode,脚本构建阶段或构建规则来完成。显然,您可以在此基础上实现额外的保护。

如果设备遭到入侵或应用程序被篡改,则“已知良好”凭证可能已被更改。这是iOS应用程序沙箱可以为您带来优势的地方。您可以通过implementing receipt validation for your application检测其中的许多方案。假设您的应用程序是通过Apple App Store等Apple渠道分发的,那么当它安装时,它包含一张收据。这可以被验证,并且可以用于实现许多常见场景的防篡改。

这些都是可以在客户端实现的方法,以保护通过HTTPS的通信免受MITM攻击。服务器还可以以更多方式公开客户端,并且应定期对服务器进行漏洞审计。仅使用已知的强加密算法,及时了解当前的公共漏洞等。

当然,如果您的应用程序可以连接到随机 HTTPS服务,那么您无法控制,例如Web浏览器,您的选项会受到更多限制。在这些情况下,当远程主机的凭据存在疑问时,您可以做的最好的事情是让用户选择信任或不信任凭证。在iOS上,没有由系统框架提供的UI,这将是您的应用程序必须实现的。

这只是保护iOS应用程序的一小部分,但您的问题是关于中间人攻击的具体问题。

答案 1 :(得分:5)

Fiddler解密HTTPS流量的方式是使用自己的证书。但是,当Facebook / Snapchat / Gmail检测到证书不受系统信任时(并且在更严格的情况下会限制受信任的证书,因此可能会拒绝第三方受信任的证书),它将拒绝连接与证书。

Fiddler可以为iOS生成证书以接受并安装到系统上,但您首先需要关注these instructions

  1. 安装CertMaker
  2. 从fiddler生成证书,它应该在您的桌面上
  3. 从Safari浏览器访问证书(仅限Safari,其他人无法使用)
  4. 安装证书
  5. 然后,您应该能够从这些应用程序中嗅探流量。

    所以要再次回答这个问题,并不是因为他们正在阻止,如果服务器提供不受信任的证书,SSL应用程序拒绝来自服务器的响应是很常见的。 Fiddler所做的是欺骗证书的一部分,这样当您通过SSL进行通信时,Fiddler就可以使用其证书来解密您的流量。

    要回答问题的第二部分,请查看this question for details。实际上,您可以强制用户使用特定的证书,从而阻止用户使用已安装的证书。

    然而,他们仍然可以解决这个问题 - 只是以一种更偷偷摸摸的方式,但引导,这是在客户端,任何事情都有。