首页
社区
课程
招聘
[分享] KSMA -- Android 通用 Root 技术
发表于: 2018-12-16 17:21 15006

[分享] KSMA -- Android 通用 Root 技术

2018-12-16 17:21
15006

2018 马上过去,给大家拜个早年啦。祝大家新的一年里事事顺心,早日成为技术大咖。这一年里,陆续看到一些朋友不再从事 Android 漏洞方面的工作,笔者也已在年初弃坑,不禁感慨 Android 平台的漏洞研究可能只属于那些 geeker 了。

2018 年 blackhat asia 会议上,阿里巴巴的安全研究员 ThomasKing 做了 Android Root 方面的主题演讲,题为《KSMA-Breaking-Android-kernel-isolation-and-Rooting-with-ARM-MMU-features》。笔者对这样的通用 Root 方式是比较感兴趣的,便着手复现了一下。

ThomasKing 为这种通用 root 方式起了个不错的名字 KSMA(Kernel Space Mirroring Attack),意为内核空间镜像攻击。简单的说,在内核的一级页表中伪造一个 d_block 类型的 descriptor (内存描述符),将内核镜像所在的 PA (物理地址) 映射到 descriptor 所对应的 VA (虚拟地址) 处。通过修改 d_block 中的一些内存属性,就可以做到对 VA 处映射的内核镜像做读写操作,从而可以任意修改内核代码。

linux 内核采用分页机制管理 VA,并使用 MMU(内存管理单元) 完成 VA 到 PA 的转换。page (内存页) 大小一般为 4KB 16KB 或者 64 KB,为了更有效率的管理 page,内核使用 page table(页表)来组织所有page。页表是分级的,pc 系统一般使用4级页表,现阶段 android 系统采用3级页表,页大小 4KB。以下均以 4KB 3级页表作为讨论基础。

下面图表搭配着看比较好理解一些,下图位于 armv8 手册 D4-1744 处,下表位于内核 Documentation/arm64/memory.txt 处。

image

对于3级页表,Level 0 table 并未采用,通过 Level 1 table 可以获取 Level 2 table 的内存位置,通过 Level 2 table 可以获取 Level 3 table 的内存位置,Level 3 table 又可以获取具体 page 所在的内存位置。

比如 0xffffffc000080030 这个 VA 按照上述翻译表的计算方式,可获知

ttbr1 表明这是一个内核地址,poffseet 表明内存在页内偏移为 0x30,L0页表没采用,数值没意义,是一级页表(pgd)的第 0x100 项,二级页表(pmd)的第0项,三级页表(pte)的第0x80项。

需要说明的是内核与用户态进程使用的不是同一份页表,内核拥有自己单独的页表,内核线程共享,用户态进程分别拥有自己的页表。

内核页表在内核初始化时静态创建,如下 init_mm。pgd 指向 swapper_pg_dir,在没有 KASLR 的情况下,该全局变量是一个固定值 0xffffffc00007d000,所以内核一级页表位于固定内存位置

用户程序页表是在创建用户态程序时动态分配在内核堆中,这一点,可以从 execve 的内核实现中看出,调用关系如下:

一级页表有两种描述符(64bit),table类型和 block 类型,如下图所示,block 类型指向指定的 1GB 内存区域,table 类型描述下一级页表的起始地址。对于伪造页表攻击,我们关心的是一级页表中 block 类型的页表
项。

image

image

关键在于要理解 d_block 描述符各 bit 意义,各 bit 详情参见 arm 手册,D4-1796,需要说明 AP[2:1]output address

理解上述页表的过程,伪造 d_block 页表就很简单了,前提是拥有至少一次内核地址写操作。所以,这种利用方法需要搭配某些地址写的漏洞使用。

拥有一次写地址权限后,在特定位置上写上 d_block 即可。

特定位置也就是伪造的 d_block 描述符应该在内存什么位置。该内存位置是可以计算出来的。内核 VA 中有很多的地址空间是没有被使用的,准确的说,没有被映射过。这些内存空洞就可以用来重新映射内核镜像 PA。不考虑 KASLR 的情形,内核镜像加载的起始地址一般为 0xffffffc000000000,镜像大小 1Gb
(0x40000000 Byte) 左右。0xffffffc200000000 开始的区域通常为内存空洞区域,我们可以将该地址开始的 1Gb 空间,作为再次映射内核 PA 的 VA。当然也是可以采用其他区域的,比如 0xffffffc300000000 开始的 VA,这里以 0xffffffc200000000 作为示例

计算 0xffffffc200000000(vaddr) 对应的一级页表 d_block 描述符位置的过程如下:

确定好位置后,按照上述 d_block 各 bit 意义构造好fake_d_block,用地址写漏洞写入指定位置。

之后,内核 PA 就会被映射到 vaddr 处,直接使用指针操作 vaddr 内存即可。

image

image

 
 
 
 

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 11
支持
分享
最新回复 (28)
雪    币: 219
活跃值: (52)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
支持热爱学习的GeneBlue同学~
2018-12-16 17:25
1
雪    币: 175
活跃值: (54)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
小白一脸懵逼,膜拜大佬
能考虑出个工具破解那些杂牌机就好了
家里有些杂牌机,闲置的不知道搞什么,想破解root,试了各种一键root的工具都不成功。
2018-12-16 22:51
1
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
2018-12-17 03:16
1
雪    币: 53
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
楼主不从事Android漏洞挖掘现在在做什么方面的工作呢
2018-12-17 10:29
1
雪    币: 1149
活跃值: (888)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
6
跟踪学习
2018-12-17 11:09
2
雪    币: 4005
活跃值: (2193)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
在楼主博客学到了很多,同样好奇楼主不搞漏洞以后去研究什么方向来着
2018-12-17 18:20
2
雪    币: 6112
活跃值: (1212)
能力值: (RANK:30 )
在线值:
发帖
回帖
粉丝
8
感谢分享!
2018-12-17 18:27
1
雪    币: 73
活跃值: (923)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
MARK
2018-12-18 09:56
0
雪    币: 547
活跃值: (534)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
10
????,关键不是一次在内核里写的权限么,所以这片文章是在担心拿到了写Kernel内存的权限之后不知道怎么进一步提权么?
2018-12-18 10:32
0
雪    币: 47
活跃值: (418)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
11
zeif ????,关键不是一次在内核里写的权限么,所以这片文章是在担心拿到了写Kernel内存的权限之后不知道怎么进一步提权么?
只是介绍这种方式可以在 root 时避免掉硬编码
2018-12-18 12:53
0
雪    币: 47
活跃值: (418)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
12
Umiade 在楼主博客学到了很多,同样好奇楼主不搞漏洞以后去研究什么方向来着
目前在做代码保护,android 上的 vmp
2018-12-18 12:55
0
雪    币: 4366
活跃值: (353)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
13
小双老师太强啦!!收藏学习!
2018-12-18 20:28
0
雪    币: 2719
活跃值: (1595)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
先收藏吧     看不懂
2018-12-19 09:34
0
雪    币: 381
活跃值: (177)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
15
给小双老师点赞
2018-12-19 13:39
0
雪    币: 370
活跃值: (1180)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
16
很不错,之前有很多人问过我,都没有实践理解到这个地步。
2018-12-24 16:02
0
雪    币: 2714
活跃值: (1611)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
谢谢分享。。。
2018-12-24 19:42
0
雪    币: 81
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
想知道博主的博客地址
2018-12-24 20:21
0
雪    币: 275
活跃值: (254)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
19
单看改页表属性,应该并不是新的技术了,ksma的创新点到底在哪里?
2018-12-25 22:17
0
雪    币: 2754
活跃值: (346)
能力值: ( LV15,RANK:828 )
在线值:
发帖
回帖
粉丝
20
android 漏洞挖掘的是什么情况呀?刚准备入坑
2018-12-26 10:11
0
雪    币: 47
活跃值: (418)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
21
wule 单看改页表属性,应该并不是新的技术了,ksma的创新点到底在哪里?[em_1]
可以看看  利用ARM MMU硬件特性开启安卓8终端的上帝模式 https://bbs.pediy.com/thread-228453.htm 这篇文章下大家的讨论
2018-12-26 10:36
0
雪    币: 3561
活跃值: (541)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
good
2018-12-26 10:41
0
雪    币: 47
活跃值: (418)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
23
aqs android 漏洞挖掘的是什么情况呀?刚准备入坑[em_2]
bat 专做漏洞研究的组应该还是可以去的
2018-12-26 10:48
0
雪    币: 4
活跃值: (521)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
膜拜大佬
2018-12-26 15:01
0
雪    币: 574
活跃值: (405)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
看起来很牛叉的样子,明白大概思路了,膜拜一下
2018-12-27 17:35
0
游客
登录 | 注册 方可回帖
返回
//