记录黑客技术中优秀的内容, 传播黑客文化,分享黑客技术精华

Drammer漏洞源码分析

2016-10-29 08:25
  • 引言

25日Drammer神洞横空出世,为全称Droid and rowhammer的缩写。它针对android系统实现rowhammer攻击,号称补无可补。好奇心驱使研究下形成如下的科普分析报告。

rowhammer攻击针对内存硬件芯片设计缺陷,基本原理为反复读写DRAM的cell中两个地址会使相邻地址内存电子泄漏(量子理论?)造成的byte位反转问题(0->1或者1->0)。该攻击最早由卡内基梅隆大学的Yoongu Kim在2014年发表,之后google project zero研究小组在PC上实现了linux提权验证,此次Drammer公布的POC中仅做了有效的位反转检测,并未实现提权验证。

  • DRAM内存基础

实现反复读写涉及内存本身实现问题,如下为内存cell组合略缩图及电气原理图:dammer_row_cell上图的灰点为一个cell(对应一个bit),一系列的cell组成一个bank,同一bank中除了一行行(row)组成的存储单元外,还包含一个row buffer。内存读写单位为row,每次cell的访问分为如下三个过程:

激活:wordline被选中(拉高),将本row的数据从bitline传入row-buffer。

访问:包括读/写。针对row-buffer进行操作。

关闭:拉低wordline,row-buffer数据从bitline写入row,同时清空row-buffer。

但是,如果针对同一row进行读写,就会总停留在步骤2。除非,对不同的row进行循环操作,才会不断触发如上的三个步骤,造成邻近row发生位反转现象。这种反复高频率的激活关闭row的操作被形象的称为“捶打”,次为rowhammer攻击的命名由来。

  • POC源码分析

POC源码地址:https://github.com/vusec/drammer

论文地址:https://vvdveen.com/publications/drammer.pdf

整个POC源码流程图如下:drammer_prog

整个流程思路清晰,目的明确。以下仅针对几个要的做具体分析:

1. ION

ION是google在Android4.0 ICS为了解决内存碎片管理而引入的通用内存管理器,它会更加融合kernel。目前QCOM MSM, NVDIA Tegra, TI OMAP, MRVL PXA都用ION替换PMEM。Drammer主要通过ION对内存进行底层分配映射释放等操作,应用层使用方便,通过文件打开操作就可创建ION Client客户端:dammer_create_ION_Client之后,通过如下6种ioctl接口就可以应用交互了:

  • ION_IOC_ALLOC: 分配内存
  • ION_IOC_FREE: 释放内存
  • ION_IOC_MAP: 获取文件描述符进行mmap
  • ION_IOC_SHARE: 创建文件描述符来实现共享内存
  • ION_IOC_IMPORT: 获取文件描述符
  • ION_IOC_CUSTOM: 调用用户自定义的ioctl

2. chipset 与 heap_id_mask

芯片与内存堆分配掩码是硬件指标,通过“/proc/cpuinfo”特征关键字确定芯片并硬编码指定heap_id_mask:dammer_heap_id_maskdammer_heap_id_mask2

3. cc RS_autodetect()

rowsize获取至关重要,它是每次分配访问的基本单位。首先,通过getprop系统命令获取系统model,然后通过硬编码models表查找对应的rowsize:dammer_rowsize2

如果,使用的芯片不在models表内,则采用一次”捶打”测试计算rowsize:dammer_rowsize1dammer_rowsize3

4.数据模版及hammer攻击

在Drammer中,采用连续三行(row)的方式进行rowhammer攻击测试。所以定义如下的row数据:

第一行为above行,依次设置为:全0、全1、随机值;

第二行为victim行即反转测试行,也依次设置为:全0、全1、随机值;

第三行为below行,设置同上。

如在命令行选项中未设置“-a”选项,则只使用p101和p010两中数据模版。dammer_hammer_temp

即反复循环访问above及below行,测试victim行是否发生反转:dammer_hammer

整个hammer攻击最后编译为arm汇编,仅如下5行:dammer_hammer2

5. exploit测试

当检测到中间的受害行发生反转后,首先在记录中查找地址是否已经存在;否则,对其进行记录并判断该地址是否能引起exploit:dammer_EX_Test1

templating.cc handle_flip函数主要对虚拟地址进行一系列的物理地址、Byte值、Word值、反转位索引、PTE、等进行一系列计算,并形成一个templates结构记录,该结构体注释如下:dammer_template

最后,根据这些计算值判断该地址是否符合exploit:

  1. 反转word中,反转位数是否是1位(可能与root等关键标志相关);
  2. 反转word所有页表的索引小于零(不合理值);
  3. 反转位所在的反转word地址中的下标索引,在低12位PTE状态位(不可能是变量);
  4. 物理偏移页的row索引值小于零和大于chunk的row值(不合理值);
  5. 具体反转值影响的虚拟页索引和物理页索引的冲突。

虽然未直接进行root权限判断,但过滤了很多不影响root等关键标准变量的位反转地址。

  • 漏洞修复

再回到内存基本原理,根据cell电气图真正实现的内存访问及数据存储(电容会衰减,需要不断的充电,即内存刷新)其实是使用两个非门及时序控制实现的,如下:

dammer_cell1

即R端和S端使用如下的时序脉冲就可实现对内存的刷新及访问操作:dammer_cell2

所以,再如此简单又高集成的数字电路情况下,要检测中间某个cell点是否发生反转,真不是件能简单或低成本解决的事情。当然,这些都留给硬件工程师啦。

【参考资料】

  1. 《内存(DRAM)的工作原理及时序介绍》http://blog.csdn.net/wangshouchao/article/details/48606639
  2. 《通杀所有系统的漏洞? – 聊一聊Drammer,Android上的RowHammer攻击》http://weibo.com/ttarticle/p/show?id=2309404034511389214467
  3. 《Drammer: Deterministic Rowhammer Attacks on Mobile Platforms》https://vvdveen.com/publications/drammer.pdf
  4. POC源码 https://github.com/vusec/drammer
  5. 《android之ION内存管理器》http://blog.csdn.net/crazyjiang/article/details/7927260
  6. ion.h定义 http://lxr.free-electrons.com/source/drivers/staging/android/uapi/ion.h
知识来源: seclab.dbappsecurity.com.cn/?p=1491

阅读:137936 | 评论:0 | 标签:漏洞分析 漏洞

想收藏或者和大家分享这篇好文章→复制链接地址

“Drammer漏洞源码分析”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

九层之台,起于累土;黑客之术,始于阅读

推广

工具

标签云