Android MTE技术详解

1.MTE概念

        MTE(内存标记扩展)是ARM v8.5-A新增的一项缓解内存安全的机制。在Android Linux现有的安全机制中,类似的机制有ASAN、HWSAN。但两者因为性能开销代价昂,不适用于广泛部署(仅调试使用)。MTE当前带来了一种高性能、可扩展的硬件解决方案,可降低以不安全语言编写的代码中可能存在的内存安全违规风险。

注:MTE不仅可用在研发自测、内存问题调试,也可以用于Fuzz。

2.MTE支持条件

ARM解释: v8.5及以上

Qcom平台解释:ARM v9(MSM8450)以上

Android解释:Android对MTE的支持将在2021年/2022年初发布带有MTE的芯片时完成。截至于2023年底,最新的旗舰设备(Pixel、OPPO)开发者选项中已具备MTE功能。

3.MTE的开关

        内核层CONFIG_ARM64_MTE=y时开启,此Kconfig由平台根据环境自行控制,无需工程师手动开关。依赖情况如下:

1687config ARM64_MTE1688 bool "Memory Tagging Extension support"1689 default y1690 depends on ARM64_AS_HAS_MTE && ARM64_TAGGED_ADDR_ABI1691 depends on AS_HAS_ARMV8_51692 # Required for tag checking in the uaccess routines1693 depends on ARM64_PAN1694 depends on AS_HAS_LSE_ATOMICS1695 select ARCH_USES_HIGH_VMA_FLAGS1696 help

        Google Play中也提供了APP(Sanitizer Test APP[外网,需要科学上网])可用于测试MTE,例如:

4.MTE检测目标

MTE认为内存安全违规主要分2种:空间安全、时间安全。

  • 空间安全:

对象在真实边界之外被访问,例如溢出、越界等。可被利用来改变函数指针、保存寄存器等目标地址。

  • 时间安全:

在对象引用的内存释放、过期后使用。例如UAF等,攻击者可以放置一个新的恶意对象来代替预期目标。

下图是两类内存违规的代码表视图:

5.MTE的检测原理

  • 总体思路

        MTE实现了对内存的锁和密钥的验证关系,通过在指针上增加密钥,在内存中加入锁。在指针访问内存时,密钥与锁进行验证。如果匹配,则允许内存访问;否则访问会被记录、拦截。通过这种方式来检测、捕捉内存安全问题。整体逻辑如下图:

  • 技术实现

        ARM64 架构使用64位指针来寻址内存。其中通常有48~52位被硬件实际使用(如果由开启large-address-space,则是52位)。所以理论上有12-16位是预留的。ARM架构一直有“TOP BYTE IGNORE”高字节忽略的功能,允许软件在虚拟地址的最高字节中存储任意数据,但直到MTE前,这些位依然是没有使用。

        MTE允许在虚拟地址的59-56位(即最上层字节的低4位)存储一个key作为密钥。也会将这个密钥与一个或多个16字节的内存范围关联(单独存储作为“锁”)。当一个指针简介访问此内存区域时,存储在指针中的密钥会与指针引用内存的关联密钥进行校验。

  • 密钥来源

        密钥可以由应用程序管理(keymaster)产生,也可以由CPU随机生成。

6.MTE的实际效果

        以2020年修复libjpeg-trubo库漏洞CVE-2020-13790为例。此漏洞是JPEG图像编解码器,在加载格式错误的img文件时导致的堆缓冲区溢出。以下是MTE开启时,漏洞触发的情景:

可以看到,在漏洞复现时,MTE轻松的捕获到,进程会因为分段错误导致中止。故障的存储会通过logcat打印。从图中可以看到:

  • 奔溃的原因:MTE
  • 崩溃的类型:Buffer Overflow
  • 堆的大小以及溢出的大小:104 bytes right of a 16151-byte
  • 问题地址:pc指针(00000056d2240ddc)
  • 进程id:pid=187,tid=187
  • CPU寄存器信息
  • 堆栈的回溯信息

通过addr2line解析pc指针,可以找到问题出现的地址:

7.MTE的处理措施

        当PROT_MTE(相关特性:页表允许MTE分配标签)已开启,并且检测出异常时,有三种不同的选项:

  • Ignore模式(PR_MTE_TCF_NONE):这是默认模式。CPU和内核将忽略MTE检测错误;如果未设置,也默认此选项。
  • 同步模式(PR_MTE_TCF_SYNC):内核引发SIGSEGV同步,并且引发SEGV_MTESERR和si_code=fauly-address。并且内存访问会被拦截,如果SIGSEGV被阻塞或忽略,则包含的进程将通过coredump中止。
  • 异步模式(PR_MTE_TCF_ASYNC):在一个或多个线程检测错误后内核引发SIGSEGV,并设置SEGV_MTAERR和si_code=0;

8.MTE的性能开销

以上是官方给出的性能开销结论:

同步模式:能够识别精确指令和地址,但对性能开销较大;

异步模式:成本更低,再测试工作负载和基准测试中,性能开销估计为:1%~2%,但异步检测提供是失败信息可能不太准确,但它可以提供一些缓解错误信息并用于分析,以便缩小排查范围

9.上手实效

        据2023年8月,Google Project Zero发布的一篇博文《Fitst handset with MTE on market》呈现,博主在Pixel 8上开启了MTE,正常日常使用中未发现任何异常,也没有感受到性能受到影响。

        作为世界顶级安全团队的Zero,自然也编写了一个具备OOB的Poc进行测试,源码如下:

extern "C" JNIEXPORT jstring JNICALLJava_com_example_mtetestapplication_MainActivity_stringFromJNI(JNIEnv* env,jobject /* this */) {char* ptr = strdup("test string");free(ptr);// Use-after-free when ptr is accessed below.return env->NewStringUTF(ptr);}

测试的结果如下(视频请参考原始地址),以下仅为logcat打印,可以明显看到崩溃原因是testapplication程序发生了UAF。

EBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***DEBUG   : Build fingerprint: 'google/shiba/shiba:14/UD1A.230803.041/10808477:user/release-keys'DEBUG   : Revision: 'MP1.0'DEBUG   : ABI: 'arm64'DEBUG   : Timestamp: 2023-10-24 16:56:32.092532886+0200DEBUG   : Process uptime: 2sDEBUG   : Cmdline: com.example.mtetestapplicationDEBUG   : pid: 24147, tid: 24147, name: testapplication  >>> com.example.mtetestapplication <<<DEBUG   : uid: 10292DEBUG   : tagged_addr_ctrl: 000000000007fff3 (PR_TAGGED_ADDR_ENABLE, PR_MTE_TCF_SYNC, mask 0xfffe)DEBUG   : pac_enabled_keys: 000000000000000f (PR_PAC_APIAKEY, PR_PAC_APIBKEY, PR_PAC_APDAKEY, PR_PAC_APDBKEY)DEBUG   : signal 11 (SIGSEGV), code 9 (SEGV_MTESERR), fault addr 0x0b000072afa9f790DEBUG   :     x0  0000000000000001  x1  0000007fe384c2e0  x2  0000000000000075  x3  00000072aae969acDEBUG   :     x4  0000007fe384c308  x5  0000000000000004  x6  7274732074736574  x7  00676e6972747320DEBUG   :     x8  0000000000000020  x9  00000072ab1867e0  x10 000000000000050c  x11 00000072aaed0af4DEBUG   :     x12 00000072aaed0ca8  x13 31106e3dee7fb177  x14 ffffffffffffffff  x15 00000000ebad6a89DEBUG   :     x16 0000000000000001  x17 000000722ff047b8  x18 00000075740fe000  x19 0000007fe384c2d0DEBUG   :     x20 0000007fe384c308  x21 00000072aae969ac  x22 0000007fe384c2e0  x23 070000741fa897b0DEBUG   :     x24 0b000072afa9f790  x25 00000072aaed0c18  x26 0000000000000001  x27 000000754a5fae40DEBUG   :     x28 0000007573c00000  x29 0000007fe384c260DEBUG   :     lr  00000072ab35e7ac  sp  0000007fe384be30  pc  00000072ab1867ec  pst 0000000080001000DEBUG   : 98 total framesDEBUG   : backtrace:DEBUG   :       #00 pc 00000000003867ec  /apex/com.android.art/lib64/libart.so (art::(anonymous namespace)::ScopedCheck::Check(art::ScopedObjectAccess&, bool, char const*, art::(anonymous namespace)::JniValueType*) (.__uniq.99033978352804627313491551960229047428)+1636) (BuildId: a5fcf27f4a71b07dff05c648ad58e3cd)DEBUG   :       #01 pc 000000000055e7a8  /apex/com.android.art/lib64/libart.so (art::(anonymous namespace)::CheckJNI::NewStringUTF(_JNIEnv*, char const*) (.__uniq.99033978352804627313491551960229047428.llvm.6178811259984417487)+160) (BuildId: a5fcf27f4a71b07dff05c648ad58e3cd)DEBUG   :       #02 pc 00000000000017dc  /data/app/~~lgGoAt3gB6oojf3IWXi-KQ==/com.example.mtetestapplication-k4Yl4oMx9PEbfuvTEkjqFg==/base.apk!libmtetestapplication.so (offset 0x1000) (_JNIEnv::NewStringUTF(char const*)+36) (BuildId: f60a9970a8a46ff7949a5c8e41d0ece51e47d82c)...DEBUG   : Note: multiple potential causes for this crash were detected, listing them in decreasing order of likelihood.DEBUG   : Cause: [MTE]: Use After Free, 0 bytes into a 12-byte allocation at 0x72afa9f790DEBUG   : deallocated by thread 24147:DEBUG   :       #00 pc 000000000005e800  /apex/com.android.runtime/lib64/bionic/libc.so (scudo::Allocator<scudo::AndroidConfig, &(scudo_malloc_postinit)>::quarantineOrDeallocateChunk(scudo::Options, void*, scudo::Chunk::UnpackedHeader*, unsigned long)+496) (BuildId: a017f07431ff6692304a0cae225962fb)DEBUG   :       #01 pc 0000000000057ba4  /apex/com.android.runtime/lib64/bionic/libc.so (scudo::Allocator<scudo::AndroidConfig, &(scudo_malloc_postinit)>::deallocate(void*, scudo::Chunk::Origin, unsigned long, unsigned long)+212) (BuildId: a017f07431ff6692304a0cae225962fb)DEBUG   :       #02 pc 000000000000179c  /data/app/~~lgGoAt3gB6oojf3IWXi-KQ==/com.example.mtetestapplication-k4Yl4oMx9PEbfuvTEkjqFg==/base.apk!libmtetestapplication.so (offset 0x1000) (Java_com_example_mtetestapplication_MainActivity_stringFromJNI+40) (BuildId: f60a9970a8a46ff7949a5c8e41d0ece51e47d82c)

  10.结论

        从目前看来,启用MTE在性能、续航上的削弱并不明显,但在安全上的提升十分显著。是这些年来继CFI后最重要的商用安全特性(小编自己评的,如果不准确,请不要喷我)。许多0-click的攻击面都会涉及大量C/C++的安全问题。当前MTE也不是内存安全的最终答案,开启后能够提高安全性,但不意味着安全万无一失,

11.参考资料

参考资料链接
Kernel 5.15.0-rcl MTEhttps://www.kernel.org/doc/html/latest/arm64/memory-tagging-extension.html
Tools and SoftwareTools and Software
ARM Developer MTELWN:Arm64的内存标记扩展功能!-CSDN博客
CSDN LWN:ARM64的内存标记扩展功能https://developer.arm.com/architectures/cpu-architecture/a-profile?&_ga=2.256687755.1292256680.1566735535-2019613222.1563850500#mte
ARM MTE白皮书https://www.wwwbuild.net/androidperf/74222.html

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

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

相关文章

语义分割 | 基于 VGG16 预训练网络和 Segnet 架构实现迁移学习

Hi&#xff0c;大家好&#xff0c;我是源于花海。本文主要使用数据标注工具 Labelme 对猫&#xff08;cat&#xff09;和狗&#xff08;dog&#xff09;这两种训练样本进行标注&#xff0c;使用预训练模型 VGG16 作为卷积基&#xff0c;并在其之上添加了全连接层。基于标注样本…

【算法专题】动态规划综合篇

动态规划7.0 1. 最长公共子序列2. 不相交的线3. 不同的子序列4. 通配符匹配5. 正则表达式匹配6. 交错字符串7. 两个字符串的最小ASCII删除和8. 最长重复子数组 1. 最长公共子序列 题目链接 -> Leetcode -1143.最长公共子序列 Leetcode -1143.最长公共子序列 题目&#xf…

单张图像三维重建RealFusion 360◦ Reconstruction of Any Object from a Single Image

Luke Melas-Kyriazi&#xff0c; Iro Laina&#xff0c; Christian Rupprecht&#xff0c; Andrea Vedaldi.RealFusion 360◦ Reconstruction of Any Object from a Single Image。RealFusion: 360 Reconstruction of Any Object from a Single Image Abstract We consider th…

升降机SEW MOVIDRIVE变频器设置

SEW变频器Startup 安装好MOVITOOL软件 打开项目开始配置通信连接 以太网连接为例 在此栏输入需要连接的SEW变频器的IP地址,例如:172.25.20.120 设置完成单击“OK” 当设置完成后,请一路OK回到软件管理画面 通信配置正确的软件界面状态 单击红色刷新图标 一切准备就绪后…

DjangoURL调度器(一)

一、介绍 当一个用户请求 Django 站点的一个页面&#xff0c;下面是 Django 系统决定执行哪个 Python 代码使用的算法&#xff1a; Django确定要使用的根URLconf模块&#xff0c;一般是在settings中的ROOT_URLCONF设置的值&#xff0c;但是如果传入 HttpRequest 对象具有一个ur…

Pytest 识别case规则

一、Python测试框架&#xff0c;主要特点有以下几点&#xff1a; 简单灵活&#xff0c;容易上手&#xff1b;支持参数化&#xff1b;能够支持简单的单元测试和复杂的功能测试&#xff0c;还可以用来做selenium/appnium等自动化测试、接口自动化测试&#xff08;pytestrequests…

C#简单使用Yolov5的Onnx格式模型进行目标检测

背景 最近要离职了&#xff0c;同事需要了解一下C#如何使用yolov5系列onnx格式模型进行目标检测&#xff0c;由于其对C#不熟练&#xff0c;可能会影响公司后续的开发进度&#xff0c;所以趁着还在&#xff0c;赶紧把手尾搞好。 方案 1、创建一个C# DotNet 8 控制台项目[可千…

LabVIEW动态数据交换实现数据通信

LabVIEW动态数据交换实现数据通信 介绍了LabVIEW软件在驱动一般多功能接口卡中的应用。LabVIEW作为一种图形化编程平台&#xff0c;被广泛应用于自动测量系统、工业过程自动化等领域。利用LabVIEW驱动实验室中常用的多功能接口卡&#xff0c;以实现数据采集和分析。 系统主要…

bxCAN 主要特性

bxCAN 主要特性 ● 支持 2.0 A 及 2.0 B Active 版本 CAN 协议 ● 比特率高达 1 Mb/s ● 支持时间触发通信方案 发送 ● 三个发送邮箱 ● 可配置的发送优先级 ● SOF 发送时间戳 接收 ● 两个具有三级深度的接收 FIFO ● 可调整的筛选器组&#xff1a; — CAN1 和…

Go语言的100个错误使用场景(一)|代码和项目组织

前言 大家好&#xff0c;这里是白泽。 《Go语言的100个错误以及如何避免》 是最近朋友推荐我阅读的书籍&#xff0c;我初步浏览之后&#xff0c;大为惊喜。就像这书中第一章的标题说到的&#xff1a;“Go: Simple to learn but hard to master”&#xff0c;整本书通过分析100…

ASP .NET Core Api 使用过滤器

过滤器说明 过滤器与中间件很相似&#xff0c;过滤器&#xff08;Filters&#xff09;可在管道&#xff08;pipeline&#xff09;特定阶段&#xff08;particular stage&#xff09;前后执行操作。可以将过滤器视为拦截器&#xff08;interceptors&#xff09;。 过滤器级别范围…

MATLAB环境下一种音频降噪优化方法—基于时频正则化重叠群收缩

语音增强是语音信号处理领域中的一个重大分支&#xff0c;这一分支已经得到国内外学者的广泛研究。当今时代&#xff0c;随着近六十年来的不断发展&#xff0c;己经产生了许多有效的语音增强算法。根据语音增强过程中是否利用语音和噪声的先验信息&#xff0c;语音增强算法一般…

基于springboot游戏分享网站源码和论文

网络的广泛应用给生活带来了十分的便利。所以把游戏分享管理与现在网络相结合&#xff0c;利用java技术建设游戏分享网站&#xff0c;实现游戏分享的信息化。则对于进一步提高游戏分享管理发展&#xff0c;丰富游戏分享管理经验能起到不少的促进作用。 游戏分享网站能够通过互…

快手社招一面算法原题

快手面试 最近收到一位读者的留言&#xff0c;是跟我吐槽「快手社招面试」的。 但是由于交谈内容太多东西需要脱敏&#xff0c;我打完马赛克之后&#xff0c;发现上下文都不连贯了。 遂罢。 但一转念&#xff0c;我想如果这真的是这个公司的普遍性问题&#xff0c;而非独立个例…

【极数系列】Flink环境搭建Linux版本 (03)

文章目录 引言01 Linux部署JDK11版本1.下载Linux版本的JDK112.创建目录3.上传并解压4.配置环境变量5.刷新环境变量6.检查jdk安装是否成功 02 Linux部署Flink1.18.0版本1.下载Flink1.18.0版本包2.上传压缩包到服务器3.修改flink-config.yaml配置4.启动服务5.浏览器访问6.停止服务…

verdaccio搭建npm私服

一、安装verdaccio 注&#xff1a;加上–unsafe-perm的原因是防止报grywarn权限的错 npm install -g verdaccio --unsafe-perm 二、启动verdaccio verdaccio 三、配置文件 找到config.yml一般情况下都在用户下的这个文件夹下面 注&#xff1a;首次启动后才会生成 C:\Users\h…

Idea上操作Git回退本地版本,怎么样保留已修改的文件,回退本地版本的四种方式代表什么?

Git的基本概念:Git是一个版本控制系统,用于管理代码的变更历史记录。核心概念包括仓库、分支、提交和合并。 1、可以帮助开发者合并开发的代码 2、如果出现冲突代码的合并,会提示后提交合并代码的开发者,让其解决冲突 3、代码文件版本管理 问题描述 当我们使用git提交代码…

深入了解低代码开发:多角度分类

引言 随着数字化时代的到来&#xff0c;应用程序的需求不断增长&#xff0c;企业和开发者们面临着更多的挑战&#xff0c;包括开发周期的压力、技术复杂性的增加以及对高效协作的需求。在这一背景下&#xff0c;低代码开发应运而生&#xff0c;成为解决这些挑战的一种强大工具…

算法基础课-数据结构

单链表 题目链接&#xff1a;826. 单链表 - AcWing题库 思路&#xff1a;AcWing 826. 单链表---图解 - AcWing 需要注意的点在于理解ne[idx] head&#xff0c;idx表示当前的点&#xff0c;意思是将当前的点链到头结点的后面&#xff0c;再将头结点链在当前idx的前面。 #inc…

JVM系列——垃圾收集器

对象存活判断 引用计数法 在对象中添加一个引用计数器&#xff0c;每当有一个地方引用它时&#xff0c;计数器值就加一&#xff1b;当引用失效时&#xff0c;计数器值就减一&#xff1b;任何时刻计数器为零的对象就是不可能再被使用的。 可达性分析算法 通过一系列称为“GC …