阿里90后工程师利用ARM硬件特性开启安卓8终端“上帝模式”

摘要: 本文以安卓8终端为载体,介绍阿里安全潘多拉实验室成员研究并提出的内核空间镜像攻击利用技巧。

文/图 阿里安全潘多拉实验室 团控

编者按:团控,阿里安全潘多拉实验室研究人员,该实验室主要聚焦于移动安全领域,包括对iOS和Android系统安全的攻击和防御技术研究。团控的主攻方向为安卓系统级漏洞的攻防研究。在今年3月的BlackHat Asia和4月份的HITB上,团控受邀做了主题为《内核空间镜像攻击》的演讲。以下为团控该研究主题的技术分析文章。

一、前言

在现代操作系统中,系统运行的内核空间和应用程序的用户空间相互隔离,以保证操作系统的稳定性。以运行Linux内核的ARM终端为例,内核空间和用户空间拥有不同的页表信息,并保存于不同的硬件寄存器。另外,内核运行时的特权等级高于用户态程序,无论何时内核空间对普通程序是不可见的。然而,ARM处理器的某些特殊硬件特性能够打破这种保护,使得普通程序在用户态能够直接访问内核空间,直接打破内核空间与用户空间的隔离,修改内核代码,开启上帝模式。下文以安卓8终端为载体,介绍阿里安全潘多拉实验室成员研究并提出的内核空间镜像攻击利用技巧。

二、正文

  1. 背景

2017年下,Google发布了Android 8(奥利奥)系统。新系统在安全方面引入了多种内核安全加固特性,以对抗漏洞程序获取手机的最高权限。其中,最为重要的安全特性就是PAN(Privileged Access Never)和KASLR(Kernel Address Space Layout Randomization)。可见,利用一个漏洞来获取众多最新手机系统的最高权限是非常有挑战性的。

在详述内核空间镜像攻击之前,首先简单介绍ReVent通用ROOT方案。该方案基于@林雷雷(Aliaba Group)发现的一个linux内核BUG。

这个BUG存在与notification内核系统调用:

[1]处计算文件名的长度,并根据长度在[2]分配相应的存储buffer,在[3]拷贝文件名字符串。这个BUG在于,从[1]到[3]的代码路径上,此文件能够被重命名,导致[3]发生内核堆越界覆盖。

通过巧妙的堆布局并覆盖适合的内核对象(eg: iovs),能够将其转化为在条件竞争下,几乎任意内核地址的一次写操作。堆布局实例如下:

为了向普通应用程序提供服务,用户程序的地址空间对操作系统内核是可见的。为了防止内核直接执行用户程序提供的恶意代码,早些年ARM处理器就引入了PXN(Privileged Execute Never)安全特性来缓解漏洞利用。虽然内核不能直接执行用户态代码,但可以直接访问用户态数据。利用一次写内核地址的机会,劫持内核数据指针。在Android 7及以下的安卓终端上,一种常见的绕过PXN防御机制的方法如图所示。

Android 8引入了PAN防御机制,使得内核无法直接访问用户态数据,上述绕过PXN防御机制的方法立即失效。

虽然多次触发上述条件竞争漏洞将payload数据写入内核可以用于绕过PAN,但exploit代码执行成功率急剧下降。另外,借助其他内核漏洞(eg: CVE-2017-13164)可以将数据稳定写入内核,但在漏洞急剧减少的情况下,能否通过新的利用技巧同时绕过PXN和PAN防御机制,并获取系统最高权限?借助ARM处理器的MMU硬件特性,答案是肯定的。

  1. 内核空间镜像攻击

Linux内核经典的三级页表(PGDPMDPTE)布局和遍历关系如下图所示。

绝大多数的现代处理器已带有地址管理单元MMU,上述虚拟地址转换关系实际由其自动完成。ARM处理器也不例外,其通用的的地址转换关系如图所示。安卓系统采用三级页表,Level 0页表并未使用。

各级页表中的描述符不仅包含了下一级起始物理地址,还包含了对这段内存的访问属性。ARM有两种描述符block和table。

最后一级页表单独表示。

上述页表描述符中output address保存物理地址,两端比特位保存内存属性信息。

内存的执行属性由XN比特决定,PXN比特决定该内存的代码能否在内核态执行。而AP[2:1]两比特的组合决定了内存的读写权限。

其中,'01'组合比较奇怪。按照此种设计,该内存能够被用户态和内核态同时访问,对应的虚拟地址既可以是用户地址,也可是内核地址。如果某个内核虚拟地址的访问权限被设定为此组合,所有的普通应用程序都能够直接此内核地址。显然这个地址已超出任何普通应用程序自身的地址范围。由于虚拟地址空间的相互隔离,内核地址对应用程序本就不可见。而这个组合直接违反了二者隔离的安全设计,且操作系统内核对此是无法感知的。

按照上述页表遍历的方式,修改任意内核虚地址的访问属性需要内核任意地址读写原语(Arbitray R/W Primitive),这个条件是非常强的。如果攻击者已经拥有了这种原语,可直接获取系统最高权限。上述漏洞给予一次几乎任意内核地址写入的机会,在此条件下,常规的页表攻击方式基本失效。

假设某台安卓终端拥有3GB内存。在没有开启内核地址随机化防御机制时,常见的一级页表布局如下。

以"0xFFFFFFC000000000"起始的1GB内核虚地址空间为例,内核Image被加载到此范围。内核代码段的访问属性是R-X,而内核数据段的访问属性是RW-。因此,一级页表描述符一定是TABLE类型。

64位内核空间的虚拟地址绝大多数是无效的,比如"[0xFFFFFFC200000000, 0xFFFFFFC23FFFFFFF]"范围的地址都是无效的,其对应的一级页表项为空。假设此页表项不为空,存在一个BLOCK类型的页表项。其AP组合为'01',output address指向第一块1GB的物理内存,如图所示。

通常情况下,“0xFFFFFFC03000200”内核地址只能够被内核访问。而此时,“0xFFFFFFC230002000”内核地址能够被用户态和内核态同时访问。上述内核虚地址访问是同一块物理内存,二者的访问权限可完全不同。即可实现代码段在原有的虚拟地址范围是R-X权限,而在镜像虚拟地址范围是RW-权限且能够被所有的应用程序所访问。换句话说,内核所运行代码都能被直接篡改,内核层面的检测根本无从谈起。此时,根本不需要去获取系统的最高权限,因为系统内核代码已经完全可控,开启真正的上帝模式。

结合上述漏洞,攻击者已经可以将一个用于开启上帝模式的一级页表项写入到指定的位置,这个指定位置是需要精确计算的。Linux内核一级页表的起始地址保存在内核数据段的swapper_pg_dir,那么页表项的地址可以通过简单公式计算。对于开启内核地址随机化的系统,只需修正swapper_pg_dir的真实地址即可。

swapper_pg_dir + (Kernel_Mirroring_Base / 1G) * 8

至此,上帝模式已经开启。攻击者可以运行如下的攻击代码。这段攻击代码直接修改内核数据,patch内核代码。而对于普通C开发程序员或者Linux内核开发人员来说,已经违背了现代操作系统的常识,绝对是无稽之谈。然而在上帝模式下,这段代码就能真实的运行。

14

在上帝模式下,攻击者已经可以在用户态直接操作内核,上述代码的攻击演示视频(http://v.youku.com/v_show/id_XMzY0NjU3MTA1Mg==.html?spm=a2hzp.8244740.0.0),此时Android 8终端的PXN和PAN内核防御机制已对攻击者完全无效。完整地获取Pixel 2XL手机的最高权限攻击的视频链接](http://v.youku.com/v_show/id_XMzU0MjA0NjY5Mg==.html?spm=a2h3j.8428770.3416059.1)。

  1. 结尾
    内核空间镜像攻击除了能够直接攻破安卓8重要的防御机制外,还能够将一些看似不能被利用,危害评级较低的漏洞赋予重生的能力,典型的例子CVE-2017-0583。


同时,这个漏洞被Google作为有效防御的案例在zer0conf2017(Your Move: Vulnerability Exploitation and Mitigation in Android)上举例。关于如何100%成功率的利用这个漏洞的相关内容参看BlackHatAisa2018(KSMA: Breaking Android kernel isolation and Rooting with ARM MMU features)的后部分内容。

硬件设计的不合理危害性远高于软件层面,且修补更新更为困难。在设计之初就将安全性作为一项重要的指标是最佳的选择。

原文链接

本文为云栖社区原创内容,未经允许不得转载。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521667.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

神龙X-Dragon,这技术“范儿”如何?

戳蓝字“CSDN云计算”关注我们哦!在CSDN总部会议室,阿晶首次见到了阿里云智能研究员、弹性计算技术负责人张献涛——这位不仅仅在阿里云智能内部,在业内也是响当当的虚拟化技术大牛。现在回想起来,当时聊了没两句,阿晶…

python 如何判断一个函数执行完成_三步搞定 Python 中的文件操作

当程序运行时,变量是保存数据的好方法,但变量、序列以及对象中存储的数据是暂时的,程序结束后就会丢失,如果希望程序结束后数据仍然保持,就需要将数据保存到文件中。Python 提供了内置的文件对象,以及对文件…

一位资深程序员大牛给予Java初学者的学习路线建议

摘要: java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议?今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了&#x…

Vue + Spring Boot 项目实战(七):前端路由与登录拦截器

文章目录前言一、前端路由二、使用 History 模式三、后端登录拦截器3.1. LoginController3.2. LoginInterceptor3.3. WebConfigurer3.4. 效果检验四、Vuex 与前端登录拦截器4.1. 引入 Vuex4.2. 修改路由配置4.3. 使用钩子函数判断是否拦截4.4. 修改 Login.vue4.5. 效果检验前言…

高手如何实践HBase?不容错过的滴滴内部技巧

摘要: HBase和Phoenix的优势大家众所周知,想要落地实践却问题一堆?replication的随机发送、Connection的管理是否让你头痛不已?本次分享中,滴滴以典型的应用场景带大家深入探究HBase和Phoenix,并分享内核改…

JS 打印 data数据_数据表格 Data Table - 复杂内容的15个设计点

表格是桌面应用中常见的内容型组件,它包含大量的信息和丰富的交互形式,表格具有极高的空间利用率,结构化的展示保证了数据可读性。高效、清晰且易用是进行表格设计的原则性要求。本文将从表格的内容组织到交互作一次汇总,作为数据…

神龙X-Dragon,这技术“范儿”如何?| 问底中国IT技术演进

在CSDN总部会议室,阿晶首次见到了阿里云智能研究员、弹性计算技术负责人张献涛——这位不仅仅在阿里云智能内部,在业内也是响当当的虚拟化技术大牛。现在回想起来,当时聊了没两句,阿晶就问了这样一个问题,“阿里云这款…

干货 | 蚂蚁金服是如何实现经典服务化架构往 Service Mesh 方向的演进的?

摘要: 小蚂蚁说: 蚂蚁金服在服务化上面已经经过多年的沉淀,支撑了每年双十一的高峰峰值。Service Mesh 作为微服务的一个新方向,在最近两年成为领域的一个大热点,但是如何从经典服务化架构往 Service Mesh 的方向上演进…

Vue + Spring Boot 项目实战(八):导航栏与图书页面设计

文章目录前言一、导航栏的实现1.路由配置2.使用 NavMenu 组件二、图书管理页面2.1. LibraryIndex.vue2.SideMenu.vue3.Books.vue前言 之前讲过使用 Element 辅助前端页面的开发,但是只用到了比较少的内容,这一篇我们来做一下系统的核心页面——图书管理…

pmsm simulink foc 仿真_仿真软件教程

很多朋友都建议我做个视频的整理,方便没看过之前内容的朋友方便查找,我觉得这个确实很有必要。下面内容是关于仿真软件方面:仿真环境:Simlpis 8.0类型简介VMC和CMC的LLC控制器仿真对比 第一节图文电压模式和电流模式LLC控制器的简…

日志采集中的关键技术分析

摘要: 从日志投递的方式来看,日志采集又可以分为推模式和拉模式,本文主要分析的是推模式的日志采集。概述日志从最初面向人类演变到现在的面向机器发生了巨大的变化。最初的日志主要的消费者是软件工程师,他们通过读取日志来排查问…

限时早鸟票 | 2019 中国大数据技术大会(BDTC)超豪华盛宴抢先看!

2019 年12月5-7 日,由中国计算机学会主办,CCF 大数据专家委员会承办,CSDN、中科天玑数据科技股份有限公司协办的 2019 中国大数据技术大会,将于北京长城饭店隆重举行。届时,超过百位技术专家及行业领袖将齐聚于此&…

机器学习和数据科学领域必读的10本免费书籍

摘要: 暑期来了,别出去溜达了,看书学习一波~在这个暑假,有兴趣的可以阅读一下这些免费的有关机器学习和数据科学的书籍,他们能给你打开一扇看清机器学习和数据科学的窗。如果在阅读完这一文章后想知晓更多免…

microsoft账号登陆一直在加载_英雄联盟手游下载,附带拳头账号注册教程

欢迎关注【花卷来了】公众号。如果喜欢本期节目请点赞、再看、分享给朋友吧~软件资源请回复文章底部今日关键词获取/排版:萌萌哒花卷/来源:采集自网络今日主题:最新英雄联盟手游下载,附带拳头账号注册教程英雄联盟手游今天正式公测…

机器学习者都应该知道的五种损失函数!

摘要: 还不知道这五种损失函数?你怎么在机器学习这个圈子里面混?在机器学习中,所有的机器学习算法都或多或少的依赖于对目标函数最大化或者最小化的过程,我们常常把最小化的函数称为损失函数,它主要用于衡量…

linux服务器监控zabbix,Linux监控之--使用ZABBIX监控web服务器

使用ZABBIX监控web服务器实验拓扑图:实验思路:nginx添加状态统计模块,编写nginx对应的状态统计脚本。zabbix-server导入nginx模板,并对主机实现监控。实验环境角色IP地址操作系统版本软件包Zabbix_server192.168.0.158/24Centos6.…

Facebook 约十亿美元收购脑机技术公司,助攻AR研发;苹果宣布新款 Mac Pro 在美国生产;谷歌称已实现量子霸权…...

关注并标星星CSDN云计算极客头条:速递、最新、绝对有料。这里有企业新动、这里有业界要闻,打起十二分精神,紧跟fashion你可以的!每周三次,打卡即read更快、更全了解泛云圈精彩newsgo go go 小米MIX Alpha手机官方概念图…

知道这些用于数据科学和机器学习的GitHub存储库和Reddit主题吗?

摘要: 5月最热门的GitHub存储库和顶级Reddit讨论,戳进来~GitHub和Reddit都是比较有趣的平台,在这里,我不仅学习了数据科学的一些最佳应用,而且还了解数据科学家们是如何编程的。一直以来,GitHub都是开发人员…

l2-008 最长对称子串 (25分)_小学数学关于时间认识(时、分、秒)的几点总结

本文将通过对照学习一个个知识点,延伸出各种知识点的常用题型。一、时、分、秒之间的换算:1时60分 1分60秒这类题型考的是时间单位之间的换算,一种是大单位换小单位,一种是小单位换大单位。在之前的一篇文章里有关于换算的计算方法…

如何在阿里云上构建一个合适的Kubernetes集群

摘要: 声明 本文主要介绍如何在阿里云上构建一个K8S集群的实践,只是作为参考,大家可以根据实际情况做出调整。 集群规划 在实际案例中发现,有不少同学使用了很多的小规格的ECS来构建K8S集群,这样其实即没有达到省钱的目…