0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是内存标签扩展?

jf_78858299 来源:老秦谈芯 作者:老秦谈芯 2023-02-01 16:07 次阅读

内存标签扩展(Memory Tagging Extension,MTE)是Armv8.5-A中添加的新功能。

目前对计算机系统的攻击,大部分是对内存的攻击。内存安全问题又可以分为两类:空间安全(spatial safety)和时间安全(temporal safety)。

当试图访问安全区域以外的数据,即违反了空间安全性,比如缓冲区溢出(Buffer Overflow)攻击。缓冲区溢出是指在存在缓存溢出安全漏洞的计算机中,攻击者可以用超出常规长度的字符数来填满一个域,通常是内存区地址。

缓存区溢出存在于各种电脑程序中,特别是广泛存在于用C、C++等这些本身不提供内存越界检测功能的语言编写的程序中,例如Debian中就存在5亿行C/C++代码。

当试图访问已超出正常时间范围的内存资源时,即违反了时间安全性,比如释放后再使用(Use After Free)攻击。顾名思义,就是当一个内存块被释放之后再次被访问。

攻击程序可以先申请一块内存,然后释放内存,但是不清空该内存指针,等待一段时间后再次通过指针对内存进行访问。如果恰好在访问操作之前这块内存被分配给了其它的程序,那么攻击程序可以通过内存对此程序发起攻击。

内存攻击不只以上提到的两种。我不是安全专家,就不在这里啰嗦了。

可以通过软件机制来检测内存访问违例,但代价是运行效率低。

MTE提供一种硬件机制来检测这两类内存违例的情况,这种机制类似于锁和钥匙的关系。在分配内存的时候加上一把锁,访问的时候需要提供一把钥匙,如果钥匙和锁不匹配,即阻止访问,并报告错误。

具体来说,通过向物理内存的每个16字节添加四-bit元数据(Metadata)来做内存标记;指针和虚拟地址被修改为包含钥匙。16字节被定义为一个“标签颗粒(Tag Granule)”。为了在不需要较大指针的情况下实现钥匙,Armv8-A架构中使用“顶部字节忽略(Top Byte Ignore,TBI)”功能。

启用TBI后,在做地址转换时,虚拟地址的顶部字节会被忽略。这样就可以使用顶部字节来存储元数据,实现内存标签的钥匙。当前,仅使用顶部字节的4-bit。

来看一个例子,下图上半部分,显示的是缓冲区溢出情况。通过new()函数分配一个16-byte的内存给ptr指针。当程序通过ptr指针来访问随后的地址空间,会产生内存违例,这是因为后面的内存的锁与ptr的钥匙不相符。下图下半部分,显示的是UAF情况。当内存被再次分配时,产生了一个新锁,如果攻击程序用旧的指针去访问,钥匙和锁不相符。

MTE支持标签的随机产生,或基于种子的伪随机产生。如果一个程序的执行次数足够,则至少其中一个程序检测到违规的概率趋于100%。

或许你已经注意到了一个细节,那就是4-bit的元数据最多只能标记16种不同的锁。也就是说还有1/16的可能性,错误的钥匙适配到了锁。为了避免这类错误,需要软件通过其它方式增加标签的不同可能性。

MTE增加了一种新的内存类型,普通标签内存(Normal Tagged Memory)。

地址中的标签和内存中的标签之间的不匹配可以配置为导致同步异常(synchronous exception)或异步报告(asynchronous report)。

同步异常是精确的,因为可以精确地确定哪个加载或存储指令导致了标记不匹配。相反,异步报告是不精确的,因为它只能将不匹配隔离到特定的执行线程。

MTE为Armv8-A体系结构添加了三类指令:

  1. 适用于堆栈(stack)和堆(heap)标记的标签操作指令
  • IRG(insert random tag),此指令在第一个源寄存器的地址中插入一个随机逻辑地址标记,并将结果写入目标寄存器。IRG在硬件层面支持为一个寄存器中的地址插入随机tag,这个tag随后可以为其它指令使用。
  • GMI(tag mask insert),将第一源寄存器中的标记插入第二源寄存器中指定的排除集,将新的排除集写入目标寄存器。此指令用于操作与IRG指令一起使用的排除标记集,适用于软件为特殊目的使用特定标记值,同时为正常分配保留随机标记行为的情况。
  • LDG(load allocation tag),此指令从内存地址加载分配标记(allocation tag),从分配标记生成逻辑地址标记,并将其合并到目标寄存器中。
  • STG(store allocation tag),此指令存储分配标记到内存
  • STZG(store allocation tag, zeroing),此指令将分配标记存储到内存,将相关数据位置归零
  • ST2G,此指令将分配标记存储到内存的两个标记颗粒
  • STZ2G,此指令将分配标记存储到内存的两个标记颗粒,将相关数据位置归零
  • STGP(store allocation tag and pair of registers),此指令从两个寄存器向内存存储一个分配标记和两个64位双字
  1. 用于指针运算和堆栈标记的指令
  • ADDG(add with tag),此指令将由标记颗粒缩放的立即数加到源寄存器中的地址,使用立即值修改地址的逻辑地址标记,并将结果写入目标寄存器。
  • SUBG(subtract with tag),此指令从源寄存器中的地址减去由标记颗粒缩放的立即数,使用立即数修改地址的逻辑地址标记,并将结果写入目标寄存器。
  • SUBP(subtract pointer),此指令从第一源寄存器中保存的56位地址减去第二源寄存器中保留的56位的地址,符号扩展结果到64位,并将结果写入目标寄存器。
  1. 用于系统的指令
  • LDGM(load tag multiple),此指令读取N个分配标记的自然对齐块
  • STGM(store tag multiple),此指令存储N个分配标记的自然对齐块
  • STZGM(store tag and zero multiple),此指令存储N个分配标记的自然对齐块,并将零存储到相关数据位置

为了在后续产品种加入MTE,ARM将开发新版本的CHI协议,以支持MTE的传输和一致性要求。

为了支持MTE,还需要对软件进行部署。ARM正在进行相关的工作。

MTE无需更改程序源代码。然而,MTE必然会导致开销,因为标签必须从内存系统中提取并存储到内存系统中。这种开销与内存分配的大小和生命周期以及标记和数据是一起操作还是单独操作有关。开销可以通过以下方式最小化:

  • 同时写入标签和初始化内存
  • 避免过度分配从未写入数据的地址空间
  • 避免过度的释放和重新分配
  • 避免在堆栈上分配大块固定大小内存
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 计算机
    +关注

    关注

    19

    文章

    7409

    浏览量

    87691
  • C++
    C++
    +关注

    关注

    22

    文章

    2104

    浏览量

    73480
  • ARMv8
    +关注

    关注

    1

    文章

    35

    浏览量

    14141
收藏 人收藏

    评论

    相关推荐

    Armv9引入的MTE已成内存安全的新防线

    小核Cortex-A520,都是基于Armv9.2-A的。   而在发布的新闻中,Arm重点强调了内存标签扩展(MTE)这一安全特性。其实MTE已经不是什么新特性了,早在Armv8.5推出之际就已经
    的头像 发表于 06-01 00:11 1770次阅读

    如何为STM32扩展内存

    为什么使用SDRAM?如何为STM32扩展内存呢?
    发表于 10-18 09:32

    Armv8.5-A中添加的新功能—内存标签扩展MTE

    内存标签扩展(Memory Tagging Extension,MTE)是Armv8.5-A中添加的新功能。目前对计算机系统的攻击,大部分是对内存的攻击。
    发表于 02-16 14:19

    打印机的最大可扩展内存

    打印机的最大可扩展内存              打印
    发表于 12-29 10:17 857次阅读

    基于8051的Proteus仿真-6264扩展内存

    基于8051的Proteus仿真-6264扩展内存
    发表于 05-12 10:11 55次下载

    UCOS扩展例程-UCOSIII内存管理

    UCOS扩展例程 -UCOSIII内存管理
    发表于 12-14 17:24 25次下载

    手机自带内存扩展内存有什么区别 哪个更好

    前个月,无意中看到某手机的营销文案,运存4GB,总内存可达256GB。明眼人自然可以看到,这不过是通过TF卡扩展内存得到总256GB。因为还没有见过那个机器用4+256的组合的,常见都是4+32,4+64,4+128而已。
    的头像 发表于 06-27 14:29 4.4w次阅读

    6264芯片扩展内存的原理图免费下载

    本文档的主要内容详细介绍的是6264芯片扩展内存的原理图免费下载。
    发表于 04-22 17:24 18次下载
    6264芯片<b class='flag-5'>扩展</b><b class='flag-5'>内存</b>的原理图免费下载

    如何给手机扩展内存

    经常会有很多朋友和小编说,手机内存不够了什么的,那么手机内存不够的话应该怎么办呢?不用担心,今天小编就来告诉大家,如何给手机内存扩展的方法,一起来看看吧!
    发表于 05-26 10:55 5178次阅读

    最新消息:华为推出全新的内存扩展技术

    安卓卡顿不卡顿,内存是关键,频繁清理后台的话又会导致常驻APP减少,所以在Mate40系列手机上,华为推出了全新的内存扩展技术,可以让内存的等效容量变大四分之一,8GB等效10GB,1
    的头像 发表于 10-30 15:55 7545次阅读

    EE-32:语言扩展内存存储类型、ASM和内联构造

    EE-32:语言扩展内存存储类型、ASM和内联构造
    发表于 04-25 09:32 7次下载
    EE-32:语言<b class='flag-5'>扩展</b>:<b class='flag-5'>内存</b>存储类型、ASM和内联构造

    基于51单片机6264扩展内存仿真设计(proteus仿真+程序)

    基于51单片机6264扩展内存仿真设计(proteus仿真+程序)(单片机原理及应用)-基于51单片机6264扩展内存仿真设计(proteus仿真+程序)
    发表于 07-22 11:45 82次下载
    基于51单片机6264<b class='flag-5'>扩展</b><b class='flag-5'>内存</b>仿真设计(proteus仿真+程序)

    澜起科技发布全球首款CXL™内存扩展控制器芯片

    澜起科技今日发布全球首款CXL™(Compute Express Link™)内存扩展控制器芯片(MXC)。该MXC芯片专为内存AIC扩展卡、背板及EDSFF
    的头像 发表于 05-06 10:40 1523次阅读

    SBC 85扩展内存板开源案例

    电子发烧友网站提供《SBC 85扩展内存板开源案例.zip》资料免费下载
    发表于 08-11 11:34 2次下载
    SBC 85<b class='flag-5'>扩展</b><b class='flag-5'>内存</b>板开源案例

    UM1800_STM32Nucleo的动态NFC、RFID标签芯片扩展板入门

    UM1800_STM32Nucleo的动态NFC、RFID标签芯片扩展板入门
    发表于 11-22 19:25 0次下载
    UM1800_STM32Nucleo的动态NFC、RFID<b class='flag-5'>标签</b>芯片<b class='flag-5'>扩展</b>板入门