[关闭]
@1qaz 2017-04-12T13:56:50.000000Z 字数 1783 阅读 1112

Encryption is Hard: Android's TLS Misadventures

TLS


Oliver Grubin, MS degree thesis,Imperial College London,2015 pdf

概述:对安卓平台app中TLS实现的安全性进行了实验分析,利用安卓VpnService接口实现了一个app来实时监控TLS流量。文章整体偏重于实验方法。

TLS on Android

基本上都是Why eve and mallory love android这篇中的问题

老版本接口 Apache HTTP Client,从API 22开始不赞成使用
推荐接口 HttpURLConnection,HttpsURLConnection

Java中SSL相关类和流程:
1. 从证书文件开始,经过CertificateFactory 生成证书类,证书可以被加入到keystore中;
2. Keystore经过TrustManagerFactory 生成TrustManager,建立起针对证书的信任库;
3. TrustManager 经过SSLContext 生成SSLSocketFactory,该工厂类可以生成SSLSocket供HttpsURLConnection使用

自制的TrustManager

自签名的证书在HttpsURLConnection默认的TrustManager中是不受信任的,出于各种原因开发者会实现定制的TrustManager,将其中的checkServerTrusted函数设为空函数,从而导致所有的证书都可以通过验证。
作者也提到了有些开发者的代码是来自stackoverflow上的不够安全的实现
[SP17: Stack Overflow Considered Harmful? The Impact of Copy&Paste on Android Application Security]

自制的HostnameVerifier

对于不同域名在同一IP上的网站,客户端 Server Name Indiction 可以指示服务器使用哪个域名的证书。开发者可能实现总是返回true的HostnameVerifier,导致SNI验证被绕过

onReceivedSslError: Webview中TLS验证的处理函数

整体原因:开发者遇到SSL相关的信任错误问题时,首先使用了最简单的方法来绕过这些问题,带来了安全隐患

Implementing and Testing

作者开发一个app作为中间人,对安卓设备的SSL通信中的证书进行验证,从而可以提高那些缺少验证的app的安全性
作者比较了安卓上的获取流量的三种方案的优缺点:
1. 本地代理:易于架设,但是需要在连接Wifi时手动选择,不能在移动网络下使用,app可以选择绕过代理。使用这个方法的类似app有Adblock Plus
2. 本地VPN:VpnService接口,可以让普通app在用户同意后获得一个tun接口,读写这个接口就可以截获/发送整个设备上的IP数据包;缺点是需要app自己实现TCP/IP栈,任意时刻只能有一个app获得这个接口。 类似app有AdGuard,NoRoot Firewall,Packet Capture
(Packet Capture 可以区分出不同app的流量,是通过nflog实现的;如何获得具体的URL?DNS?; iptables uid-owner )
3.直接在内核层获取流量
需要root权限,使用libpcap,iptables等。 AdAway 使用了该方法

最后作者使用了VpnService方案,通过一个app来对SSL流量进行分析:协议版本,密钥套件

Results and Evaluation

app 搜集:Google Play中25类的top 100 free app
,安全性分析通过Wifi中间人和逆向

top 100 free app
928 ClientHellos , and 919 ServerHello
证书签名:128 (7.8%)sha384-RSA,595(36.4%) sha256-RSA,911(55.8%) sha-RSA
SNI: offered by 583 of client connections(63%), accepted by 318 of servers (35%).
1
1
1

app中自带的keystore文件,res/raw/keystore.bks 密码需要在代码中提供。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注