@1qaz
2017-04-12T13:56:50.000000Z
字数 1783
阅读 1112
TLS
Oliver Grubin, MS degree thesis,Imperial College London,2015 pdf
概述:对安卓平台app中TLS实现的安全性进行了实验分析,利用安卓VpnService接口实现了一个app来实时监控TLS流量。文章整体偏重于实验方法。
基本上都是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使用
自签名的证书在HttpsURLConnection默认的TrustManager中是不受信任的,出于各种原因开发者会实现定制的TrustManager,将其中的checkServerTrusted函数设为空函数,从而导致所有的证书都可以通过验证。
作者也提到了有些开发者的代码是来自stackoverflow上的不够安全的实现
[SP17: Stack Overflow Considered Harmful? The Impact of Copy&Paste on Android Application Security]
对于不同域名在同一IP上的网站,客户端 Server Name Indiction 可以指示服务器使用哪个域名的证书。开发者可能实现总是返回true的HostnameVerifier,导致SNI验证被绕过
整体原因:开发者遇到SSL相关的信任错误问题时,首先使用了最简单的方法来绕过这些问题,带来了安全隐患
作者开发一个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流量进行分析:协议版本,密钥套件
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%).
app中自带的keystore文件,res/raw/keystore.bks 密码需要在代码中提供。