首页
社区
课程
招聘
[讨论]LBE免root的分析
发表于: 2013-10-14 15:03 20195

[讨论]LBE免root的分析

2013-10-14 15:03
20195
LBE 5.1公测版宣称利用了Master Key漏洞实现免ROOT开启主动防御,这两天进行了一下分析。

Master Key漏洞目前我已知有三种利用方法:
1、修改原始APK文件中的DEX或其他文件,然后利用文件名重复导致签名绕过
2、利用整数溢出导致的DEX计算区间被覆盖导致签名绕过
3、在system分区写入apk,保持XML来导致签名被绕过

预期LBE应该是用的第一个,但是所谓LBE的解释貌似又是第二个。唯一能确定的就是,LBE是替换系统的SettingProvider。

首先排除3,因为要写system分区就会破坏所谓了保修协议(这也是LBE的宣传标语之一)

然后剩下就是1和2,这两种都需要修改dex文件。不幸的是,我的HTC手机的settingprovider.apk根本就不包含dex文件。这样一来,LBE怎么触发MaseterKey漏洞呢。

进一步通过packages.xml获得了LBE安装的补丁APK,一看根本就没有重名文件,说明肯定不是方法1。

再回首,难道真的用的方法2,但是方法2也需要DEX代码...难道MasterKey还有第四种?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 14278
活跃值: (5301)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
据说LBE公开之后
250+110成了第一个免root的
2013-10-14 16:47
0
雪    币: 341
活跃值: (153)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
3
这么碉堡啊 我更新去。。
2013-10-14 19:15
0
雪    币: 77
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
LBE公开?它是开源的吗?
2013-10-15 09:29
0
雪    币: 158
活跃值: (216)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
修改原始APK文件中的DEX或其他文件,然后利用文件名重复导致签名绕过 文件名重复这个在对新版本的系统没啥影响了都修复了
2013-10-16 09:22
0
雪    币: 115
活跃值: (45)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
没有人分析过吗?还是没弄出来LBE是怎么利用master-key漏洞的
2013-10-16 11:23
0
雪    币: 293
活跃值: (225)
能力值: (RANK:250 )
在线值:
发帖
回帖
粉丝
7
LBE应该用的是 944K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4y4S2N6i4u0A6K9#2)9J5k6h3y4G2L8g2)9J5c8X3W2V1i4K6u0r3x3e0S2Q4x3V1j5`. 这篇所说的方法。
我获得lbe_patch里确实没有重复的文件,但是这个lbe_patch的zip格式是有问题的:
CERT.RSA的Central Directory结构里,其file comment length为32768,根据cc0K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4y4S2N6i4u0A6K9#2)9J5k6h3y4G2L8g2)9J5c8X3W2V1i4K6u0r3x3e0S2Q4x3V1j5`.所说,java用的是readShort(),这样读的长度是0,但是C++里读的仍然是32768。
所以java层的签名校验是,解析Central Directory的时候,会直接读取接下来的那个Central Directory, 接下来两个Central Directory结构的file name都是以"/"结尾的,如下图:


而在PackageParser.java
(/frameworks/base/core/java/android/content/pm/PackageParser.java)中:


isDirectory()函数如下:


所以遇到文件名以"/"结尾的就直接pass了。

这样LBE就在java层的校验上通过了,同时在C++层面,解析完CERT.RSA Central Directory 后是正确的AndroidManifest.xml和classes.dex, 46 + filename_length + filecomment_length(32768) + extra_field_length会正好跳到AndroidManifest.xml,这样代码加载没有问题,同时又绕过了签名校验。

不知道讲清楚没。
上传的附件:
2013-10-16 14:53
0
雪    币: 293
活跃值: (225)
能力值: (RANK:250 )
在线值:
发帖
回帖
粉丝
8
LBE应该用的是 699K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4y4S2N6i4u0A6K9#2)9J5k6h3y4G2L8g2)9J5c8X3W2V1i4K6u0r3x3e0S2Q4x3V1j5`. 这篇所说的方法。
我获得lbe_patch里确实没有重复的文件,但是这个lbe_patch的zip格式是有问题的:
CERT.RSA的Central Directory结构里,其file comment length为32768,根据7e5K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4y4S2N6i4u0A6K9#2)9J5k6h3y4G2L8g2)9J5c8X3W2V1i4K6u0r3x3e0S2Q4x3V1j5`.所说,java用的是readShort(),这样读的长度是0,但是C++里读的仍然是32768。
所以java层的签名校验是,解析Central Directory的时候,会直接读取接下来的那个Central Directory, 接下来两个Central Directory结构的file name都是以"/"结尾的,如下图:


而在PackageParser.java
(/frameworks/base/core/java/android/content/pm/PackageParser.java)中:


isDirectory()函数如下:


所以遇到文件名以"/"结尾的就直接pass了。

这样LBE就在java层的校验上通过了,同时在C++层面,解析完CERT.RSA Central Directory 后是正确的AndroidManifest.xml和classes.dex, 46 + filename_length + filecomment_length(32768) + extra_field_length会正好跳到AndroidManifest.xml,这样代码加载没有问题,同时又绕过了签名校验。

不知道讲清楚没。
上传的附件:
2013-10-16 14:55
0
雪    币: 213
活跃值: (147)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
漏洞的原理,可以参考我的文章:
f4dK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3y4G2L8r3!0J5k6r3q4F1j5$3g2J5i4K6u0W2L8X3g2@1i4K6u0r3j5X3I4G2k6#2)9J5c8U0t1H3x3e0y4Q4x3V1j5H3z5q4)9J5c8U0t1$3i4K6u0r3j5h3&6V1M7X3!0A6k6q4)9J5k6q4)9J5y4f1f1%4i4K6t1#2b7f1y4Q4x3U0g2m8b7#2)9J5y4f1f1@1i4K6t1#2b7V1q4Q4x3U0f1^5b7#2)9J5y4f1f1@1i4K6t1#2b7U0S2Q4x3U0g2m8b7g2)9J5y4f1f1%4i4K6t1#2b7f1c8Q4x3U0g2n7c8g2)9J5y4f1f1#2i4K6t1#2z5e0m8Q4x3U0f1^5c8q4)9J5y4f1f1$3i4K6t1#2b7V1y4Q4x3U0f1^5c8W2)9J5y4f1f1$3i4K6t1#2b7U0c8Q4x3U0f1&6c8g2)9J5k6o6V1$3z5e0f1^5y4U0m8Q4x3X3c8Q4x3U0g2q4y4W2)9J5y4e0S2r3i4K6t1#2b7f1c8Q4x3U0g2q4y4#2)9J5y4f1p5%4i4K6t1#2z5e0S2Q4x3V1j5`.

leb怎么利用这个漏洞的,提示一下:patch
2013-10-16 15:18
0
雪    币: 77
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
看了博主的文章,还有一些不明白的地方,求博主修改index绕过 签名的apk
2013-10-24 00:20
0
游客
登录 | 注册 方可回帖
返回