首页 > 系统相关 >RowHammer 攻击:内存的隐形威胁

RowHammer 攻击:内存的隐形威胁

时间:2024-03-27 16:25:14浏览次数:30  
标签:电容 RowHammer 攻击 隐形 DRAM 内存 存储单元

今天看了一篇 IT 之家关于 AMD 处理器受 RowHammer 内存攻击影响的报道,心血来潮了解了一下 RowHammer 攻击的原理,把了解到的知识记录下来。

RowHammer 攻击是一种相对较新的攻击方式,它利用了现代动态随机存取存储器(DRAM)的物理缺陷,这种攻击方式不同于传统的软件漏洞利用,它直接针对硬件的弱点。这种攻击利用了 DRAM 在运行过程中产生的意外电荷泄漏效应,可能导致存储器单元泄露电荷并造成比特翻转。这个问题主要是由于现在 DRAM 存储单元高密度排列造成的。通过在一定模式下的高频率反复内存访问,攻击者可以在其原本无权访问的内存区域引发存储值的变化。这种攻击可以导致权限提升、数据泄漏和拒绝服务等安全问题。

要理解 RowHammer 攻击,首先需要了解 DRAM 的工作原理。DRAM 通过存储电荷在电容中来保存信息,每个电容与一个访问晶体管相连,共同构成一个存储单元(Cell,如下图所示)。电容充满电,存储单元就是 1,电容放完电,存储单元就是 0,晶体管用来控制电容充放电。

这些存储单元被组织成多行多列,形成一个二维阵列(Bank,如下图所示)。当读取或写入内存数据时,一个存储单元行会被激活,整行的数据会被加载到行缓冲器(row-buffer)中,同时存储单元中的电容放电,在行缓冲器内完成数据的读写操作。在操作完成后,行缓冲器内的数据会写入原来的存储单元行之中,同时存储单元中的电容充电。所以,不论是读还是写数据,存储单元都会充放电。

在内存如“白菜”价的今天,不改变内存电路板面积大小的前提下,为了能存储更多的数据,只能将存储单元排列的越来越近,密度大幅度增加。虽然芯片的制程有所提升,但每个电容之间的隔离不是完全的。当一个行被频繁激活时,相邻行的电容可能会受到电磁干扰,导致存储的比特从 1 翻转为 0,或者相反。这种比特翻转可以被恶意利用,攻击者可以通过精心设计的内存访问模式来控制比特翻转的位置和结果。通过高频率地读取 DRAM 中的某一行,可以影响到相邻行中的数据,这种现象被称为 RowHammer,因为它就像用锤子反复敲击内存行一样。如下图所示,第 1、3 行是攻击行,这两行中间是被攻击行,攻击行不停地充放电,中间行大概率会出现比特翻转。

即使理解了 RowHammer 攻击的原理,如果不知道哪些存储单元里隐藏着关键数据,毫无目的的去攻击也没有意义。更何况程序在访问内存数据时,并不会直接使用内存中的真实地址,而是使用虚拟地址映射的方式进行访问。这使得找到数据的真实地址变得更加困难,所以很长时间以来,对于 RowHammer 攻击的研究只停留在理论阶段,解决这个问题的关键在于如何实现逆向 DRAM 地址映射。由百度安全所研究设计的逆向工具 DRAMDig 能够在平均 7 ~ 8 分钟时间,快速、可靠地逆向出 DRAM 地址映射,解决了这一复杂的问题。感兴趣的朋友可以阅读这篇论文《DRAMDig: A Knowledge-assisted Tool to Uncover DRAM Address Mapping》(DOI: 10.1109/DAC18072.2020.9218599)

尽管 RowHammer 攻击非常强大,但也不是无法防御的。从硬件层面,新的 DRAM 芯片中实现了各种缓解措施,如目标行刷新(Target Row Refresh, TRR),或者使用支持 ECC 的 DRAM 内存。软件层面的解决方案包括增加内存访问的随机性,以减少连续访问同一行的可能性。

标签:电容,RowHammer,攻击,隐形,DRAM,内存,存储单元
From: https://www.cnblogs.com/zhanggaoxing/p/18099550

相关文章

  • 关于内存函数的介绍
    1.memcpy2.memmove3.memset4.memcmp其中,重点讲解memcpy以及memmove。1.C库函数: void*memcpy(void*str1,constvoid*str2,size_tn) 函数作用:在 str2 复制 n 个字节到 str1。其中,str1用于指向存储复制内容的目标数组     str2指向要复制的......
  • 京东二面:Redis为什么快?我说Redis是纯内存访问的,然后他对我笑了笑。。。。。。
    引言Redis是一个高性能的开源内存数据库,以其快速的读写速度和丰富的数据结构支持而闻名。作为一个轻量级、灵活的键值存储系统,Redis在各种应用场景下都展现出了惊人的性能优势。无论是作为缓存工具、会话管理组件、消息传递媒介,还是在实时数据处理任务和复杂的分布式系统架构中,Re......
  • C# winform窗口打开关闭后不释放内存问题
    问题解决一:如果是窗体属性加载了背景图导致的内存占用,在关闭窗体前,释放掉背景图资源即可释放占用的内存privateImagebackgroundImage;publicForm2(){InitializeComponent();backgroundImage=Image.FromFile(@"D:\XX......
  • 高性能内存池
    目录高并发下的传统方式的弊端弊端一--高并发时较小内存块使用导致系统调用频繁,降低了系统的执行效率......
  • jvm指针压缩和内存对齐的学习
    jvm指针压缩和内存对齐的学习背景最近要搞一个测试工作.想着能够提高一下在国产服务器上面的性能.想到一个办法是,提高JVM的内存配置.减少GC数量来提高性能.但是同时觉得jvm开启指针压缩的大小其实是32G内存.这里其实一直有一个疑惑.一般的网上说法都是需要低于......
  • [转帖]JVM之指针压缩&内存如何设置
    https://www.cnblogs.com/liang1101/p/12727754.html 在32位到64位的转变中,人们最大的获益是内存容量。在一个32位的系统中,内存地址的宽度就是32位,这就意味着,我们最大能获取的内存空间是2^32(也就是4G)字节。这个容量明显不够用!在一个64位的机器中,理论上,我们能获取到的内......
  • c++栈内存溢出问题
    问题说明实验课测量快排时间时,用intar[MAXSIZE+1];来创建数组,数据规模从1000-10000,而MAXSIZE的设置不能超过600000,超过了程序就无法运行直接中断,理论上这是不应该。程序中用rand()生成随机数据,但若对数据求模rand()%100,则程序运行到中途会异常中断。问题原因intar[M......
  • C语言中整数和浮点数在内存中的存储
    一、整数在内存中的存储我们知道整数的二进制表示形式有三种,原码、反码、补码。三种表示方法均由符号位和数值位两部分构成,符号位用0表示正,用1表示负,最高一位被当作符号位,其余位被当作数值位。其中,正整数的原码、反码、补码三种表示相同负整数的原码:对应10进制数直接转换过......
  • C语言-内存函数
    文章目录1.memcpy1.1.memcpy语法形式1.2.memcpy的模拟实现2.memmove2.1.memmove的语法形式2.2.memmove的模拟实现3.memset3.1.memset的语法形式4.memcmp4.1.memcmp的语法形式1.memcpy1.1.memcpy语法形式void*memcpy(void*destinotion,const*source,size_tnu......
  • C++动态内存管理
    目录C/C++内存分配C++内存管理C++内存管理介绍C++内存管理使用C++内存管理基本语法operatornew和operatordelete函数定位new表达式(placement-new)基本语法使用场景malloc/free和new/delete相同点不同点C/C++内存分配在C语言动态内存管理章节已经了解到内......