其他信息: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏_内存标签技术的安全性分析...

本文探讨了内存标签技术在保护系统免受读写保护内存错误方面的作用,分析了该技术对特定类型原语和漏洞利用原语的影响,旨在增强系统的安全性。
摘要由CSDN通过智能技术生成

f789e6b6f32b5c8b5845beabf1c964ed.png

094f77b94678e4781b08292d78482b5b.png

一、概述

094f77b94678e4781b08292d78482b5b.png 内存标签是一种可以帮助发现软件中存在的漏洞,同时也能帮助缓解漏洞和漏洞利用的关键技术。在本篇文章中,我们重点探讨内存标签技术与漏洞和漏洞利用缓解技术相关的安全性问题。
概括来说,ARM的内存标签扩展(MTE)工作原理如下:
1、每个16字节对齐的内存区域中,都有一个与之关联的4位标签,即“内存标签”。
2、指针具有一个存储在指针保留位的4位标签,即“地址标签”。
3、在跟踪指针时,会将地址标签与正在访问的内存地址相关联的内存标签进行比较。如果标签不匹配,将会引发异常,这通常会导致崩溃。
下面将详细说明内存标签技术的关键价值所在,我们着眼于分析该技术对近几年流行漏洞缓解所造成的影响:
1、堆超过运行/超过读取(相邻部分)。该类型漏洞占Microsoft所有内存安全CVE漏洞的约13%。缓解方式为对相邻堆内存访问的持久保护。
2、释放后使用(UAF)。该类型漏洞占Microsoft所有内存安全CVE漏洞的约26%。如果所有标签位都被堆分配器所使用,除非攻击者与未初始化的内存或类型混淆漏洞结合利用,否则攻击者的预计成功概率为6%。如果没有内存标签这样的技术,那么其实无法从整体上缓解这一类的漏洞。
3、堆越界读取/越界写入(不相邻部分)。该类型漏洞占Microsoft所有内存安全CVE漏洞的约27%。如果所有标签位都被堆分配器所使用,除非攻击者与未初始化的内存或类型混淆漏洞结合利用,否则攻击者的预计成功概率为6%。如果没有内存标签这样的技术,该类型的漏洞可能会被部分缓解。作为替代方案,需要使用更加安全的语言(例如Rust)或使用更加安全的C++编码时间(例如GSL span)来重写代码。
基于上述的这些数据,似乎内存标签具有比较大的价值。该技术可以提供动态发现软件漏洞的能力,并能针对近年来向微软报告的内存安全漏洞中的13%提供可靠和持久的保护,并且可以为其他具有挑战性的漏洞提供一定程度的缓解,有助于以更低的成本来检测漏洞。我们将对这一点进行更详细的分析。   094f77b94678e4781b08292d78482b5b.png

二、影响类别

094f77b94678e4781b08292d78482b5b.png 在本章中,我们将探讨内存标签预期会产生的影响,通常会与特定类型的原语和漏洞利用的原语相关。

2.1 特定类型的原语

我们要考虑的第一个影响类别与初始内存安全冲突相关,而这通常是由特定类型的漏洞所导致。因此,我们将其称为特定类型的原语。举例来说,堆缓冲区溢出会导致攻击者可以访问相邻内存(越界)。每种类型的内存安全漏洞都会映射到一组初始原语。如果可以可靠地阻止这些初始原语,那么就能够针对这种特定的漏洞类型实现完全的缓解。
下面列出了可以借助内存安全漏洞实现的原始原语。需要注意的是,某些类型的漏洞(例如类型混淆)可能会取决于可实现的特定原语(例如相邻内存访问和非相邻内存访问)而有所不同。此外,例如竞争条件这样的临时问题可能会影响到初始原语。
空间类
1、相邻的内存访问
最开始的不安全内存访问,是针对于与被访问对象相邻的部分。当攻击者可能会将不安全的内存访问移动到紧邻的对象时,往往会发生这种情况。例如,传统的缓冲区溢出。
2、不相邻的内存访问
不安全的内存访问,也可以是针对于不与被访问对象相邻的部分。当攻击者可以影响不安全的内存访问的初始位置(例如:引用了不相邻的对象)时,就会发生这种情况。例如:通过索引控制的数组访问。
3、任意内存访问
最初的不安全内存访问可以引用内存中的任何地址。因此我们大多不会将其视为漏洞导致的第一个原语。但是,如果从不受信任的来源读取值,并将其用作内存访问的基址的话,可能会发生这种情况。
4、对象内的内存访问
最初的不安全内存访问始终存在与要访问的最高级对象中。当攻击者可能导致不安全的内存访问的初始位移引用最高级对象内的另一个字段时,可能会发生这样的情况。例如,通过传统的溢出方式就可以实现,其中的数组是结构的成员字段,而其他字段与数组字段相邻。另一个例子是类型混淆漏洞,其中一种类型的对象被错误地解释为另一个号总不兼容类型的对象,允许错误地访问和使用对象字段。
临时类
1、未初始化的内存使用
最初的不安全内存访问是针对尚未初始化的内存。
2、释放后使用(释放状态)
最初的不安全内存访问是对已经释放但尚未重新分配的内存的访问。
3、释放后使用(重新分配状态)
最初的不安全内存访问是对已经释放并已经重新分配(可能会分配为其他类型)的内存的访问。

2.2 漏洞利用原语

我们要考虑的第二个影响类别,与攻击者在使用针对特定类型的原语之后可以实现的后续漏洞利用原语有关。可以根据攻击者能够通过这类原语的组合序列以实现的不同控制状态转换来对这些原语进行建模,最终得到其最终状态。对于每个漏洞利用原语来说,都有5个属性:
1、内存访问方法:这里是指读取、写入或执行的内存访问类型。
2、基址:这里是指用于内存访问的基址。
3、偏移量:这里是指相对于内存访问基址的偏移量。
4、范围:这里是指相对于基址和偏移量而言的,要访问的字节数。
5、内容:这里是指读取、写入或执行的内容。
内存访问的基址、偏移量、范围和内容,可能会使下面四种状态之一:受控值(被攻击者控制)、固定(使用常数,攻击者无法直接修改)、未初始化、未知。为了简单起见,这一节中将原语简化为相对(基址不受控制)内存访问与任意(基址受攻击者控制)内存访问之间的转换。如果攻击者可以通过受控制的偏移量的方式来实现对内存的完全寻址,就认为是存在任意内存访问漏洞。
1、从相对地址写入转换到相对地址读取:损坏的内存用于后续读取的偏移量或范围。
2、从相对地址写入转换为任意地址读取:损坏的内存用于后续读取的基址。
3、从相对地址写入转换为任意地址写入:损坏的内存用于后续写入的基址。
4、从任意地址写入转换为相对地址读取:损坏的内存用于后续读取的偏移量或范围。
5、从任意地址写入转换为任意地址读取:损坏的内存用于后续读取的基址。
6、从相对地址读取转换为相对地址写入:读取值用于后续写入的偏移量或范围。
7、从相对地址读取转换为任意地址读取:读取值用于后续读取的基址。
8、从相对地址读取转换为任意地址写入:读取值用于后续写入的基址。
9、从相对地址读取转换为任意地址执行:读取值用于后续执行的基址。
10、从任意地址读取转换为任意地址执行:读取值用于后续执行的基址。
因此,初始漏洞导致的特定类型原语与漏洞利用原语的关联性如下:
1、相邻的内存访问:相对地址写入、相对地址读取
2、非相邻的内存访问:相对地址写入、相对地址读取
3、任意内存访问:任意地址读取、任意地址写入
4、对象内内存访问:相对地址写入、相对地址读取
5、未初始化的内存使用/泄露:相对地址读取、相对地址写入、任意地址读取、任意地址写入
6、释放后使用(释放状态):相对地址读取、相对地址写入、任意地址读取、任意地址写入
7、释放后使用(已分配状态):相对地址读取、相对地址写入、任意地址读取、任意地址写入
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值