Group of Software Security In Progress

GoSSIP @ LoCCS.Shanghai Jiao Tong University

To Pin or Not to Pin: Helping App Developers Bullet Proof Their TLS Connections

论文下载:https://www.usenix.org/system/files/conference/usenixsecurity15/sec15-paper-oltrogge.pdf

Abstract & Introduction

  • 本文分析了639,283个app以了解非浏览器应用中pinning的使用情况,保守估计其中11,547(1.8%)的应用pinning是可行的。考虑到第三方库的使用情况,乐观地估计,这个数值可以达到58,817(9.1%)。这表明pinning在非浏览器应用并不是一种广泛部署的策略。(事实上,仅45个app实现了pinning)
  • 对45个开发者进行调查,仅四分之一能理解pinning的概念,但仍不知道pinning如何使用。
  • 基于开发者的反馈,作者开发了一个易用的web应用来指导开发者正确部署pinning,并给出具体建议和样例代码来帮助判断是否适合pinning。
  • 提出了一种静态代码分析和程序切片的方法,能够自动化分析app中pinning的使用情况。
  • 分析了871,911个不同用户的更新app行为,发现只有50%的用户在新app发布第一周进行更新。
  • To pin or not to pin的问题在于:pinning可以提高安全性,但是pinning策略的维护依赖于软件的更新。

BackGround

  • Pinning:public key & whole cert
    • Leaf pinning & CA pinning
  • Trust on first use(TOFU):可以看作pinning的一种。SSH中常用。
  • app不使用系统的实现,而选择自己实现证书校验代码的原因:系统实现完全依赖PKI,没有进一步配置
    • 使用自签名证书;
    • root CA不在系统信任列表里;
    • 减少对PKI体系的依赖;
    • 可能要自己实现leaf or CA pinning。

Classification Strategy

pinning是否适合部署取决于多个因素。 当不能识别TLS链接端点的源字符串时,不能评估pinning是否是一种合适的策略,因此分两个场景讨论:

  • Conservative:当我们不能识别TLS链接端点的源字符串(identify the origin string for a TLS connection endpoint)时,就认为pinning不可行
  • Optimistic:当源字符串不能识别时,pinning在某些场景下也可用。这些场景分别对待,后文再描述。

以下是判断是否适合pinning的3个标准:

  • Prior Knowledge of the Target Origin: target origin不能依赖于用户或外部输入,不能是在运行时获得的。(比如TOFU)
  • Ownership of Relevant API Calls: 不能在第三方库代码里建立TLS链接
  • TLS Certificate Configuration Responsibility: 不能是访问公共host,即开发者要有TLS证书的配置权。

Fig

Implementation Details

pinning是否适合部署取决于多个因素。

Fig

Evaluation

Library code

  • 大部分的网络连接都是由第三方库的代码实现的。
  • 分析发现只有AndroidPinning这个库支持pinning作为安全特性,但是仅14个app使用了这个库。

Fig Fig

Custom code

  • 2,878,454个链接中145,243个事TLS链接,48,755个app实现了硬编码TLS源。有1,973,040个链接不能识别出硬编码源。
  • 145,243个是HTTPS,760,171个是HTTP。这145,243个TLS链接指向11,203个不同的TLS源。
  • 检查pinning是否适用于一个app就看TLS源是否在多个app中共享。
    • 1,301个源被多个app共享。
    • 6,012个源只在一个app中出现;3,890个源在属于同一开发者的多个app中出现。
  • 为了判断适合leaf pinning还是CA pinning,从这些源收集了7,941个不同的证书链。(为什么会减少了?)
    • 使用Android内置的root CA证书和证书校验策略发现7,177个是合法的,764个不合法。
    • 这764个中,182个是自签名证书,170个由某不知名CA签发;335个已经过期;160个证书hostname验证失败。
    • 建议自签名证书使用leaf pinning;其他的都用CA pinning。

FigFig

FigFig

Dynamic Origins

  • 自定义代码中的链接涉及到的大部分origin都没有在编译的时候硬编码到app里。这些源依赖于外部因素如Intent、UI组件等。为分析这些origin设置了两个场景:
    • Conservative:认为动态源的都不适合使用pinning。实际分析发现1,062,810个链接里只有45,247个适合pinning,4.25%。
    • Optimistic:认为部分链接可以pinning。
      • 共1,973,040个动态源链接,排除从公共Intent、Parcel和UI组件等获得输入的,还剩1,921,446个链接。
      • 硬编码origin中,16%的链接是HTTPS的,其中31.1%的适合pinning。如果动态origin中情况类似,那么可以得到95,611个链接适合pinning,结合Conservative里剩下的,在Optimistic中共有140,858个链接可行。

FigFig

Update Frequencies

  • pinning的有效性依赖于开发者能快速把证书pin推送到用户设备上。
  • 和一个杀毒软件商(Android设备上安装数达500万)合作,收集从2014年1月到2014年12月的用户数据。
  • 收集到784,721个不同的app,871,911个不同的用户的数据。

Fig