linux内核消减kptr,Andorid平台的kptr_restrict绕过

Andorid平台的kptr_restrict绕过

2015-08-26 17:34:56

阅读:0次

1b684a5dc2e144f8d072ab006963a67d.png

最近几天我一直在努力尝试绕过安卓的kptr_restrict。在这篇文章中,我将给大家介绍一下我在研究过程中所发现的一些东西。如果能够绕过kptr_restrict,那么攻击者就可以更加容易地利用安卓平台的漏洞了,但这需要你有一些内核虚拟地址的相关知识。但是首先,考虑到有很多人并不是非常熟悉“kptr_restrict”的保护机制,让我来带领你快速地进入这一主题吧!

kptr_restrict是什么?

正如我们在之前的文章中所看到的那样,有时在利用漏洞的过程中,需要用到一些关于内核内部指针的知识-无论是为了劫持它们,或者是使系统崩溃。

这一事实是众所周知的。Linux内核有一个功能,这个功能可以让它过滤掉一些地址,以此来避免将内核地址泄漏给潜在的攻击者。这个可配置的功能就是“kptr_restrict”,而且该功能已经被添加进了安卓内核源码树中了,距今已经有至少两年的时间了。

与其他所有可配置的内核参数一样,系统会给用户提供一个专门的文件,当用户需要过滤内核地址的时候,他们可以通过这个文件来修改该功能的实现形式。就“kptr_restrict”来说,配置文件位于“/proc/sys/kernel/kptr_restrict”目录下,但是该目录的权限则显得不是那么的友好了:

8e5da7fbeb147fef7c80c7f027fb2aa6.png

由此看来,只有root用户可以修改这个文件的内容,但是任何一个用户都可以读取这个文件。

那么,kptr_restrict是如何工作的呢?首先,内核开发人员需要一个标记内核指针的方法。他们可以使用一个新的格式说明符("%pK")来实现。

系统在控制kptr_restrict的保护机制时,使用了三个不同的值:

0-完全禁用该功能;

1-隐藏使用“%pk”的内核指针,直到用户得到了CAP_SYSLOG,而且不能修改他们的UID或GID(为了防止文件在打开的时候泄漏指针信息);

2-隐藏所有使用“%pk”的内核指针

当我们通过CONFIG_SECURITY_KPTR_RESTRICT来构建内核的时候,需要为该配置选项指定其初始的默认值,但是在所有我所遇到过的安卓设备中,这个值永远都被设置为了“2”。

然而,有多少的内核开发人员真正地了解“%pK”是如何保护内核指针的呢?答案正如我们所预料的那样,并不是个好消息:

918cfc6ea6294e0353fbbb4447dbf1a1.png

在整个内核源代码中,结果仅仅只是(35 in 23 files)。所以一切都很明显了,系统在使用内核指针时通常使用的都是“正常”的指针格式说明符-“%p”。

那么现在,我们已经配置好了实验环境,接下来就让我们来看一看为什么kptr_restrict所提供的保护机制并没有达到预期的效果。

内核打印的所有日志信息都会被写入一个内核内存的循环缓冲区之中。用户可以调用“dmesg”命令(系统使用该命令来显示log数据),并从这个缓冲区中读取数据。实际上,这个命令会调用syslog系统命令来访问缓冲区中的数据。下图显示的是相关的输出数据:

6820e713b88b3191d9a84273212dfa4b.png

syslog函数是UNIX操作系统的函数,它可以向日志文件中写入事件消息。然而,syslog系统调用并不是任何一个用户都可以访问到的。调用者要么就要拥有极其强大的CAP_SYS_ADMIN权限,要么就得有CAP_SYSLOG权限。实际上,大多数的安卓进程都不符合上述的任意一种情况。

在安卓平台中,“init”进程包含有一系列的“服务”,这些服务可以根据用户的需要开启或停止。init”进程会在系统启动的时候,根据配置文件中的硬编码列表来加载这些服务,这一配置文件会一直存储在系统的root分区(只读)中,因此该文件是一个只读文件。

这个文件的编写采用的是安卓的专用语言,我们称之为“安卓初始化语言(Android Init Language)”。Android初始化语言包含了四种类型的声明:Actions(行动)、Commands(命令)、Services(服务)和Options(选项)。这个编程语言非常的简单,而且易于使用,用户可以使用这个语言来编写相应的配置文件,然后就可以得到启动服务的完整控制权限,除此之外还可以修改服务的参数和类型(如果需要了解更多关于这个语言的信息,请点击上面的超链接)。

大多数属性的访问权限采用的都是硬编码(直到安卓4.4为止。从安卓5.0开始,系统使用SELinux标签来处理用户的访问权限):

6dad28d5e8c4a7a8c1bd3046ac6c2884.png

但是,有的属性需要特殊处理,例如系统属性“ctl.start”以及”ctl.stop”,系统通过这两个属性用来启用或停止相关的系统服务。

系统会通过SELinux标签来对这些属性进行严格的检查,以此来确保修改系统服务状态的权限严格地分配给正确的用户。

但是,当我们使用“adb”( Android Debug Bridge)来连接设备时,奇怪的事情出现了,我们得到了“shell”用户的执行权限。实际上,“adb”命令行工具可以允许开发人员根据设备的完整信息来创建bug报告。

3afb67ea20342db23679fd8d36955520.png

使用命令行参数来运行“adb”,实际上就是通过设置“ctl.start”系统属性来启用“dumpstate”服务:

f29c184900e9c329fb998eea1d308e2f.png

那么,让我们来看一看“dumpstate”服务的配置信息:

306ee490b12b27fa8ff5ff8f5881e9d8.png

这个服务没有“user”或“group”配置选项,它实际上会使用root user-ID或group-ID来执行,这样就会给系统带来非常大的安全风险。

幸运地是,服务的开发人员十分地了解这一潜在的安全风险,因此在服务启动之后,服务会立刻修改它的user-ID,group-ID等等:

b4d7844a169d3ac2b4190f8fdef8de54.png

简而言之,服务设置用户id和组的shell用户,确保它保持CAP_SYSLOG功能明确。

总结

与其他的漏洞缓解方案类似,kptr_restrict为系统添加了一个防御层,这一机制有的时候确实可以延缓攻击者的脚步,但是它一般都无法阻止一个下决心要对你发动攻击的人。无论如何,不同于其他的漏洞缓解方案,kptr_restrict需要内核开发人员的协同工作,才能发挥其最大的用处。就目前的情况而言,一切并不是那么的尽如人意。希望这一现状在未来能够得到改变。

由于篇幅有限,如果需要了解有关本文主题的详细信息,请阅读原文。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值