CVE-2017-13156漏洞分析(中)

承接上篇,本篇主要介绍一下Android的签名机制,并从原理上分析一下为什么使用APK Signature Scheme v2签名的应用在Android 7.0以上不受漏洞影响。Android提供了两种签名方式,一种是v1的基于JAR签名的方式,另一种就是APK Signature Scheme v2。 签名验证时机 首先看一下PackageManagerService的代码,看看是什么时候进行签名验证的。 PMS的installPackageLI方法会构造一个PackageParser对象,并调用collectCertificates方法来验证签名。 这里可以看到,首先要对apk文件的entry做遍历,如果遇到entry是目录,或者是META-INF文件名,或者是AndroidManifest.xml则跳过,否则把entry加入一个List, »

CVE-2017-13156漏洞分析(上)

前言 CVE-2017-13156是今年Android爆出的最为严重的一个漏洞,这个漏洞允许攻击者绕过Android系统V1的签名,用篡改过的apk覆盖原有的应用,攻击者的代码可以访问原应用所有的数据。影响范围是Android 5.0+。这个漏洞的本质原因是ART允许直接运行一个dex,同时也允许运行一个里面包含dex的zip文件。而因为dex文件格式和zip文件格式的问题,一个文件可以同时是合法的zip文件和合法的dex文件。正是因为这种二义性,这个漏洞也被称作Janus漏洞,Janus是罗马神话中的双面神,具有前后两个面孔。对于特殊修改过的apk文件,PackageManagerService把它当作合法的apk安装,而ART把它视作合法的dex执行,这就是一个文件的两个视角。github上已经有人放出了这个漏洞的PoC,代码虽然很简单,但是看懂需要一点背景知识,下面就从zip和dex的文件结构上来解释这段代码。 Zip文件结构 Zip文件最重要的一个部分就是末尾的Central »

SharedPreferences源码分析

前言 SharedPreferences作为Android应用配置项的存储,给上层提供了非常方便的接口,这篇Post将从源码层面分析SharedPreferences实现的细节。 获取SharedPreferences 获取SharedPreferences实例是通过ContextImpl.getSharedPreferences(String name, int mode)方法来完成的。 这里的sSharedPrefs是ContextImpl的静态成员,类型为ArrayMap<String, ArrayMap<String, SharedPreferencesImpl>>,从这个ArrayMap里,我们可以通过包名获取另一个ArrayMap packagePrefs,其中包含文件名到SharedPreferencesImpl的映射。 »

LeetCode题解

最近开始刷LeetCode了,这里整理一下部分题解,方便自己复习。这篇Post会随着时间持续更新。 Two Sum 这题很简单,最naive的方法就是两层循环,O(n2)的时间复杂度,但是这显然不是最优解,所以这里用了一个HashMap来把查找的时间复杂度降到O(1),key为nums[i],value为数组下标i,所以只要遍历两次数组即可得到结果。 Longest Substring Without Repeating Characters 比较简单的动态规划,用一个HashMap记录每个字符上次出现的位置,用一个变量记录当前字符串的起点位置, »

TLS握手过程

最近和朋友吃饭的时候,聊到了HTTPS,HTTPS其实就是基于TLS建立了安全信道的HTTP协议。所以可以说,HTTPS最重要的就是TLS的握手过程。这篇post整理了一下TLS的握手过程。 前置知识 这里要先讲几个概念,在后面对于TLS握手过程的描述中会用到这几个概念。 HTTPS TLS和SSL的关系 SSL是90年代Netscape弄出来的一套东西,为的是解决HTTP协议明文传输数据的问题。后来SSL慢慢成了事实上的标准,于是IETF就把SSL标准化了,名字叫做TLS,TLS 1.0其实就是SSL 3.1。所以SSL和TLS经常被放在一起写成SSL/TLS,因为这两个名词在现在其实就是同一个东西。HTTPS是使用TLS的HTTP协议。 证书及信任链 »