欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

如何有效绕过Android kptr_restrict

来源:本站整理 作者:佚名 时间:2015-09-22 TAG: 我要投稿

本文中,我会介绍一些可以绕过Android kptr_restrict的方法,绕过Android kptr_restrict之后,我们可以更加容易地利用安卓的漏洞。
首先,让我们先从快速了解一下kptr_restrict这方面的东西。
kptr_restrict是什么?
从前文中我们知道,利用漏洞的时候往往需要知道内核内部指针的信息:不论是为了劫持他们,还是以一种受控的方式来打断它们。
众所周知:Linux内核有一个功能可以让它过滤掉一些地址,以此来避免将内核地址泄漏给潜在的攻击者。这个可配置的特性被称为“kptr_restrict”,这一功能在Android 内核的源码树中至少已经出现了2年了。
对于所有可配置的内核参数,有一个特殊的文件能设置该特性如何过滤这些内核地址。对于kptr_restrict而言,这个特殊的文件在“proc/sys/kernel/kptr_restrict”下,但有一些很高的权限设置。

事实上:只有root用户才能对它进行读写,其它的用户只能对它进行读取操作。
那么kptr_restrict是如何工作的了?首先,在输出的时候内核开发者需要一种方式来标记内核指针。这通过使用一种特殊的格式标识“%pk”来实现,它表示写到该处的值是内核指针,因此需要进行这些指针进行保护。
一共有三种值可以控制kptr_restrict提供的保护:
0.-该特性被完全禁止;
1-那些使用“%pk”打印出来的内核指针被隐藏(会以一长串0替换掉),除非用户有CAP_SYSLOG权限,并且没有改变他们的UID/GID(防止在撤销权限之前打开的文件泄露指针信息);
2.所有内核指使用“%pk”打印的都被隐藏。
该配置的默认值是通过CONFIG_SECURITY_KPTR_RESTRICT创建内核时提供的,但是所有我遇到的现代的Android设备,该值都被设置为了2。
然而,有多少内核开发者知道需要用”%pK”来保护内核指针了?通过grep正则在内核中查找这种格式的字符串就能容易的知道了。不言而喻,结果和预期的一样遭。

在内核源代码中,在23个文件中一共发现了35次。不用说,内核指针常常使用普通指针格式标识”%p”来打印-简单的搜寻就能发现成百上千处用“%p”显示指针的地方。
既然都已经说到这了,那我们就来讨论下为什么kptr_restrict本身提供的保护就不够。
Method #1 – 通过shell获得dmesg
所有通过内核打印的log消息都被写到一个环形缓冲区中,它位于内核内存中。用户可以通过调用””dmesg”(display message)命令来读取该缓冲区。该命令实际上通过调用sysylog系统调用,来访问该缓冲区,我们可以从如下strace输出中看到。

然而,syslog系统调用并不是所有用户访问到的-实际上,调用者要么有CAP_SYS_ADMIN权限,要么有比前者弱一些的CAP_SYSLOG权限。
不管哪种方式,大多数Android进程都不具备这样的能力,因此也就不能访问到内核日志了。事实上真是这样吗?
在Android上,“init”进程维护了一个“service”列表,它们可以按照需要进行启动或终止。这些服务在启动的时候由“init”进程从一个硬编码的列表配置文件加载,该文件通常被保存在root分区(只读),因此他们是只读的。
这些配置文件以Android特有的语言进行编写,即”Android Init Language”.该语言简单易用,它允许对权限进行完全的控制,能限定哪个服务能够被启动(UID/GID),以及他们的参数以及其类型。
Android的另一个特性是”系统属性”—他们是一些由“属性服务”维护的键值对,它也是init进程内的一个线程。该服务允许在各种敏感的系统属性上的基本的访问控制,这能阻止用户随意的更改他们想改的属性。
大多数属性的访问权限通常都是在属性服务中硬编码的(Android 4.4以前的都是,Android 5是由通过使用SELinux标签处理的)。

然而,也有一些属性例外— “ctl.stat”,”ctl.stop”系统属性,前者用于启动系统服务,后者用于终止系统服务(使用“Android Init Language”进行定义)。
这些属性用SELinux标签进行了严格的检查,以确保只有一些特定的用户能够有权限修改系统服务的状态。
让人意外的是,当使用“adb”(android Debug Bridge)本地连接设备时,我们获得的是“shell”用户执行权限。该用户通常被允许启动和终止 “dumpstate”服务。实际上,这是adb命令行工具提供的一个特性,它允许开发者建立包含设备完整信息的出错报告。

以上图所示方式运行adb(或者从adb shell执行”bugreport”),实际上设置了“ctl.start”系统属性启动了dumpstate服务。

让我们看一下dumpstate服务的配置。

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载