Facebook,SnapChat或Gmail iOS应用程序如何防止Fiddler解密其httpsstream量?

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

Instagram没有使用https,所以我可以得到所有的stream量,看到我发送的cookie,但提琴手不能解密其他三个应用程序。 它只显示像这样的东西:

发现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:empty扩展名:server_name图。 facebook.com elliptic_curves

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

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

Fiddler可以为iOS生成证书以接受并安装到系统上,但是您首先需要遵循以下说明 :

  1. 安装CertMaker
  2. 从小提琴手生成证书,它应该在你的桌面上
  3. 从您的Safari浏览器访问证书(仅限Safari,其他人无法使用)
  4. 安装证书

从这里,你应该能够从这些应用程序嗅探stream量。

所以要再次回答这个问题,并不是说他们正在阻止,如果服务器提供不可信证书,SSL应用程序拒绝来自服务器的响应是很常见的。 Fiddler所做的是伪装证书的一部分,以便在通过SSL进行通信时,Fiddler可以使用其证书来解密stream量。

要回答你的问题的第二部分,请查看这个问题的细节 。 本质上,您可以强制用户使用特定的证书,从而防止用户使用已安装的证书。

但是,他们仍然可以解决这个问题 – 只是以更偷偷摸摸的方式,但引导,这是在客户端,什么都可以。

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

HTTPbuild立在称为TLS的安全传输协议的基础之上(在此之前,SSL)。 连接使用公钥和私钥在可信方之间进行encryption。 这就是事情往往出错的地方。 信任的概念是TLS和SSL之前的安全的核心。 您的应用程序连接到的服务器提供必须评估以build立信任的encryption凭证。

想想这个像护照或驾驶执照。 在大多数情况下,许可证签出。 然后你得到一个叫McLovin的名字。 如果你实际上没有看到姓名,出生date,号码,照片,全息图等,你可能会盲目地相信McLovin是他们自称的人。 然后你有麻烦

不要相信McLovin。

McLovin

大多数应用程序相信McLovin 🙁

为了保护您的应用程序免受这些types的攻击,您应该执行一套更严格的crendential和信任评估。 苹果有一个技术说明, Technote 2232:HTTPS信任评估 ,详细说明了这一点。

一个好的开始是实现SSL钉住 。 固定检查远程主机的凭证是否已知值 – 全部或部分证书。 iOS应用程序具有该证书的一些副本,并在连接到该主机时检查主机针对此“已知良好”证书提供的凭证。 一些应用程序只是检查元信息,另一些应用程序试图校validation书(AFNetworking是这样做的),而另一些应用程序使用已知的证书对证书进行完全信任评估。 Apple在2014年WWDC会议中为“企业和教育”构build应用程序详细介绍了此过程。 如果远程主机未使用预期的凭据,连接将中止。 攻击者没有交通堵截。 如果你的服务器的证书经常变化,这可能是一个问题 – 这是其首选检查服务器的公钥而不是元信息或散列的原因之一。 不幸的是,一些服务器pipe理员经常更换公钥。 有人认为这更安全。 不是。

现在,显然这需要iOS应用程序拥有“好”证书的副本,或者其中的一部分。 您可以在您的应用程序中包含证书,或实施您自己的密钥交换方法。 安全密钥交换一直是密码学研究的主题,不能掉以轻心。 在您的应用程序中包括证书是大多数人使用的解决scheme。 您可以决定将此证书从可能已经入侵或越狱的人身上取证。 你有很多不同的select。 显然你可以把它作为一个资源,并encryption。 您也可以直接将其包含在应用程序二进制文件中,这对攻击者来说可能更难以访问。 这可以通过将xxd 工具与Xcode一起使用 ,作为脚本构build阶段或构build规则来完成。 显然,你可以在其上实施额外的保护。

如果设备已经被盗用或者应用程序被篡改,那么“已知的”证书已经被改变。 这是iOS应用程序沙箱可以为您提供优势的地方。 您可以通过为您的应用程序实现收据validation来检测许多这些情况。 假设您的应用程序正在通过Apple App Store等Apple渠道进行分发,安装时会包含收据。 这可以被validation,并且可以用来为许多常见情况实施防篡改。

这些都是可以在客户端实施的方法,以保护通过HTMPS的MITM攻击通信。 服务器还可以以更多的方式暴露客户端,并定期对服务器进行审计。 只使用已知的强大密码algorithm,及时了解当前的公共漏洞等。

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

这只是保护iOS应用程序的一个小方面,但是您的问题是关于中间人攻击的人。

Interesting Posts