LWN: arm64架构上最新的安全机制!

从零实现跨arm64 x64平台的ABI适配层示例 手把手带你从零构建兼容arm64和x64架构的ABI适配层,深入解析调用约定、寄存器映射与栈帧布局差异,解决跨平台二进制互操作痛点。通过真实代码示例演示如何桥接两种指令集的函数调用,让同一套接口在arm64 x64双平台上无缝运行。 阅读详情

点击上方蓝色“Linux News搬运工”关注我们~

Some near-term arm64 hardening patches

By Jonathan Corbet
November 18, 2019

原文来自:https://lwn.net/Articles/804982/

arm64架构是非常多的(可能是绝大多数)移动设备(mobile device)的核心,也就意味着arm64设备会成为全球攻击者的一个关注目标。因此,大家越来越关注于一些对arm64系统进行加固(harden)的技术。目前已经有几种技术可以实现了,都是基于软硬件结合的方式,可供arm64 kernel合入了。下面我们逐个来过一下。

E0PD

Meltdown漏洞可以让user space的攻击者能通过一些预测执行机制(speculative execution)和一些cache based side channels组合起来读到一些kernel里的数据。kernel针对Meltdown进行的防御方式就是做kernel page-table isolation——把kernel的page table从user-space的mapping里面彻底拿掉。这样确实有效,不过会导致性能明显下降,并且也会影响处理器的其他一些功能。不过,近来大家已经广泛赞同地址空间隔离是对系统进行保护的一个重要方案了。

不过这里还有一个其他选择:修复硬件本身。E0PD功能就是其中一个尝试,是在Arm v8.5扩展里面新加入的功能。关于E0PD的文档目前很难看到,甚至Mark Brown提交的支持此功能的patch里面都没有描述清楚它的工作机制,以及这个名词的含义。目前对E0PD最主要的描述信息只能找到下面这一段:“E0PD,是ARM v8.5扩展中引入的新功能,[...]它确保每次在userspace对kernel这一半memory map进行访问的时候,fault错误都是在固定耗时之后返回的,从而可以避免时序攻击(timing attach),而不需要频繁地进行unmap和remap操作,也不需要阻止正当的访问。”

因此E0PD其实没有阻止speculative execution来进入user space不该能访问的memory,不过确实能够阻止side channel attach通过利用那些不正确地预测操作而暴露出来的数据。支持E0PD的系统就不需要再打开kernel page-table isolation功能了,这样就不会遭受相关的性能损失。不过patch set并没有附上性能数据。E0PD在kernel里应该很快会合入了,不过相应的具有E0PD功能的处理器还需要很长时间才会上市。

Return-address signing

Arm pointer authentication机制,是对执行中的代码里用到的指针进行签名验证。有一个特殊指令会利用一个秘钥对指定的指针值进行签名,签名会存在指针的高几位本来没有用处的bit内。还有另一个指令会用秘钥来验证这个签名。这个机制可以用来防止攻击者骗过kernel去访问一个篡改过的指针。

Amit Daniel Kachhap的return-address signing patch set就利用了这个机制,专门用来保护存放在stack里的函数的返回地址。GCC 7新增了一个-msign-return-address flag,利用这个flag来编译kernel就可以打开保护。调用函数的时候会把返回地址进行签名,等到要从函数返回回去的时候就验证这个签名。如果验证失败,kerel会报告oops信息,当前进程则会被kill掉。

这么做的目的,很显然是希望保护kernel不受缓冲区溢出等类似针对stack的攻击影响。攻击者可能会破坏堆栈,不过他们没法让返回地址指针通过签名验证。这样就能阻止多种潜在的攻击方式,因为太多攻击都是通过在stack上篡改返回地址来进行的。

Shadow call stacks

Sami Tolvanen还提了一个shadow call stack support patch set,也是用来保护返回地址的。这个方案没有对返回地址进行签名验证,而是利用了Clang的-fsanitize=shadow-call-stack option,来确保返回地址是存在内存中另一个位置的"shadow" stack(影子堆栈)内。在函数返回之前,会把返回地址从shadow stack里面恢复出来。

目前call stack对于攻击者来说非常容易破坏,只要对一个变量进行缓冲区溢出攻击就可以。使用shadow call stack之后,这种缓冲区破坏的做法就很难对系统带来重大损害了,因为返回地址不放在这个stack里面。shadow stack对于攻击者来说通常很难破坏了,甚至都不会让他们知道位于哪里。效果一样,系统会更加不害怕缓冲区溢出攻击。

返回地址签名,还有shadow call stack,是针对同一个问题的两种不同解决方案。人们通常不用把两个都打开。Tolvanen在patch开头就介绍了应该选择哪个来用:“shadow call stack的性能损失较小,不过分配shadow stack内存空间会浪费一些kernel memory。因此这个功能对那些缺乏PAC指令的硬件来说会很有用。”

换句话说,拥有指针验证功能的处理器就直接用这个功能好了。shadow call stack则适用于没有这个机制的硬件。这个patch本身也已经准备好了,预计会在5.6 merge window内合入。

Branch target identification

目前最后一项还在考虑中的arm64功能就是branch-target identification (BTI),这个功能是用来捕捉wild jump(野跳转)的。理念很简单:打开BTI的情况下,每一个间接跳转(indirect jump)之后碰到的第一条指令必须是一个特殊的BTI指令。这个指令在不具备BTI的系统上就是no-op(什么都不做的指令);在具有BTI机制的硬件上,BTI指令可以不报出fault。如果跳过去的代码开头不是BTI指令,则会马上把当前进程杀死。

BTI其实就是标记出这一段代码是一个间接跳转的目标,这样如果攻击者用什么方法骗过kernel跳转到某个位置的是偶,就可以阻止后续攻击。很多类型的攻击都可以被这种方式阻止,例如,篡改了kernel中一个存放了很多函数指针的结构的情况。有意思的是,BTI在从函数末尾返回的时候并不会检查,因此还是需要用专门的返回地址签名机制来保护函数返回。GCC 9版本包含了BTI支持。

在arm64系统上,每种技术都解决了一类问题。合在一起,应该能够让系统成为一个更加难于攻破的目标。arm架构还在不断扩展,攻击者肯定还会找到一些方法来绕过这些技术。不过,我们乐于见到的是,攻击者们今后一定会对这些技术感到抓狂。

全文完

LWN文章遵循CC BY-SA 4.0许可协议。

极度欢迎将文章分享到朋友圈 
热烈欢迎转载以及基于现有协议修改再创作~

长按下面二维码关注:Linux News搬运工,希望每周的深度文章以及开源社区的各种新近言论,能够让大家满意~

BTI的架构细节 BTI的架构细节?硬件原理?间接分支类型?指令集? 阅读详情

相关推荐

Delta并联机械手-Codesys实现以及正解逆解研究

由于Codesys的Robotics模块有Delta并联机械手的运动模型,因此借助Codesys的机械手运动模型,研究自己的正解逆解算法。

weixin_42386991的博客 5561

Shadow Call Stack and Branch Target Identification for improved security on ARM64

Shadow Call Stack and Branch Target Identification for improved security on ARM64

小立仔 1734

Codex智能体从零搭建:环境配置、代码管理与MCP扩展实战

AI智能体(Agent)作为连接大语言模型与实际应用的关键技术,通过感知、决策与执行框架,将AI能力融入具体工作流。其核心原理在于利用提示工程、上下文管理与工具调用,将自然语言指令转化为可执行操作。在软件开发领域,AI智能体能够显著提升代码生成、项目管理和自动化任务的效率。通过Model Context Protocol(MCP)等标准化协议,智能体可以安全、结构化地集成外部工具与服务,实现能力扩展。本文聚焦于Codex这一AI驱动的代码助手平台,详细解析其环境配置、代码索引、记忆系统等核心模块,并深入探讨

weixin_34220179的博客 589

防止stack buffer overflows攻击的方法 : ShadowCallStack

1、介绍 ShadowCallStack 是一个检测通道,目前只为 aarch64 实现,它可以保护程序免受返回地址覆盖(例如堆栈缓冲区溢出 : stack buffer overflows)。它的工作原理是将函数的返回地址保存到函数序言中单独分配的“shadow call stack”,子函数并从函数结语中的shadow call stack加载返回地址。 2、用法 要启用 ShadowCallStack,只需将-fsanitize=shadow-call-stack 标志传递给编译和链接命令行。在 aa

baron-周贺贺-代码改变世界ctw 1422

手把手教你搭建日本亚马逊CVV钓鱼系统(含自动验证功能)

本文详细介绍了电商平台安全防护的关键实践,重点讲解了如何构建自动化风控系统。内容包括基础架构设计、用户行为分析、交易风险评估模型构建、验证机制实现以及系统部署优化,帮助电商平台有效识别和防范安全威胁,同时提升用户体验。

weixin_30952535的博客 815

UE5Could not be compiled. Try rebuilding from source manually.

UE5Could not be compiled. Try rebuilding from source manually.

weixin_45417260的博客 2770

Linux阅码场 - Linux内核月报(2020年07月)

关于Linux内核月报Linux阅码场Linux阅码场内核月报栏目,是汇总当月Linux内核社区最重要的一线开发动态,方便读者们更容易跟踪Linux内核的最前沿发展动向。限于篇幅,只会对...

宋宝华 2612

STM32F103C8T6实战:手把手教你搭建智能火灾报警系统(附MQ-2传感器调试技巧)

本文详细介绍了基于STM32F103C8T6单片机和MQ-2烟雾传感器的智能火灾报警系统搭建过程。从硬件选型、电路设计到软件开发,提供全面的实战指导,特别包含MQ-2传感器调试技巧,帮助开发者快速实现稳定可靠的智能火灾监控系统。

year5的博客 213

安全防护机制

应用层安全防护 ASLR (Address space layout randomization,地址空间布局随机化) 在windows上ASLR主要包括堆栈随机化、PEB与TEB随机化、映像随机化,windows系统上虽然xp时代就提出来了,但是从vista开始ASLR才真正发挥作用。 在linux上ASLR主要包括栈地址随机化、LIBS/MMAP随机化、EXEC随机化、BRK随机化、VDSO随...

我多么希望明天有太阳,来灼烧我腐烂的梦想 1795

优化NEXYS A7开发板(Xilinx Artix-7)Microblaze核的FLASH读写性能实战

本文针对NEXYS A7开发板(Xilinx Artix-7)上Microblaze核读写FLASH速度慢的问题,提供了系统性的优化实战指南。通过深入分析SPI控制器配置、Flash指令模式选择、Microblaze核的Cache与硬件加速器优化,以及程序运行位置(BRAM vs DDR)的调整,有效将FLASH读写性能从“龟速”提升至接近理论峰值。文章结合实测数据,为FPGA嵌入式开发者提供了清晰的性能瓶颈分析与解决方案。

carrot的博客 256

华为MetaERP在财务模块(GL/AP/AR/FA)及子账模块效率优化、月末关账加速、与外部系统对账方面,已形成一套**“并行+实时+智能化”**的完整技术方案

华为MetaERP推出"并行+实时+智能化"技术方案,显著提升财务模块效率:1)采用三级并行策略和内存计算,使子账模块单任务处理时间从142分钟降至9分钟;2)通过并行关账架构将月末关账时间从68小时压缩至7.2小时;3)运用AI智能对账提升效率50%,并支持异步流程和区块链审计。典型场景测试显示月结耗时下降89%,CPU利用率提升116%。方案建议分阶段实施,注意依赖分析、任务粒度设计和性能监控,避免过度并行。该方案已有效解决大型集团财务处理效率低、关账慢、对账难等痛点。

金牌架构师 557

LWN:Arm64的内存标记扩展功能!

关注了就能看到更多这么棒的文章哦~The Arm64 memory tagging extension in LinuxBy Jonathan CorbetOctober 15, 202...

Linux News搬运工 1939

[QMT量化交易小白入门]-八十九、深度学习训练多维特征进行金融价格行情预测

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 218

LWN:NUMA系统上对内核代码段复制多份!

关注了就能看到更多这么棒的文章哦~Kernel-text replication on NUMA systemsBy Jonathan CorbetJanuary 5, 2024ChatGPT translationhttps://lwn.net/Articles/956900/内核开发人员通常会想方设法减少内核本身使用的内存;这部分内存对人们实际想在其系统上运行的工作负载来说是无法利用的。这类内...

Linux News搬运工 835

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

LWN:Arm Linux 内核的第一次Linaro 论坛!

关注了就能看到更多这么棒的文章哦~The first Linaro Forum for Arm Linux kernel topicsApril 9, 2024This article was contributed by Tom Gall, Bill Fletcher, and Arnd BergmannChatGLM translationhttps://lwn.net/Articles/96...

Linux News搬运工 1101

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

LWN: 更加不对称的Arm系统上如何调度?

关注了就能看到更多这么棒的文章哦~Scheduling for asymmetric Arm systemsBy Jonathan CorbetNovember 30, 2020Deep...

Linux News搬运工 201

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

LWN:32位Linux的未来!

关注了就能看到更多这么棒的文章哦~The future of 32-bit LinuxDecember 4, 2020This article was contributed by Ar...

Linux News搬运工 1767

LWN:内核里硬件CFI的支持!

关注了就能看到更多这么棒的文章哦~Kernel support for hardware-based control-flow integrityJuly 11, 2022This article was contributed by Mike RapoportDeepL assisted translationhttps://lwn.net/Articles/90009...

Linux News搬运工 1125

LWN:Linux 5.11 合并窗口第一部分!

关注了就能看到更多这么棒的文章哦~5.11 Merge window, part 1By Jonathan CorbetDecember 18, 2020DeepL assisted t...

Linux News搬运工 735

LWN: FreeBSD已经26周年啦!

点击上方蓝色字关注我们~FreeBSD turns 26June 21, 2019This article was contributed bySean KernerF...

Linux News搬运工 548

LWN:5.15 合并周期后半部分!

关注了就能看到更多这么棒的文章哦~The rest of the 5.15 merge windowBy Jonathan CorbetSeptember 13, 2021DeepL as...

Linux News搬运工 448

LWN:6.11 合并窗口第一部分!

关注了就能看到更多这么棒的文章哦~The first half of the 6.11 merge windowBy Jonathan CorbetJuly 18, 2024Gemini-1.5-flash translationhttps://lwn.net/Articles/982034/6.11 内核发布的合并窗口于 7 月 14 日打开;截至撰写本文时,自那时起已有 4,072 个非合并变...

Linux News搬运工 2653

LWN:5.9合并窗口,第二部分!

关注了就能看到更多这么棒的文章哦~5.9 Merge window, part2By Jonathan CorbetAugust 17, 2020https://lwn.net/Arti...

Linux News搬运工 297

LWN:Linux 5.10合并窗口,第一部分!

关注了就能看到更多这么棒的文章哦~5.10 Merge window, part 1By Jonathan CorbetOctober 16, 2020https://lwn.net/A...

Linux News搬运工 1087

LWN:6.2合并窗口,第一部分!

关注了就能看到更多这么棒的文章哦~6.2 Merge window, part 1By Jonathan CorbetDecember 15, 2022DeepL assisted translationhttps://lwn.net/Articles/917733/曾几何时,Linus Torvalds 试图在合并窗口的早期能够平均每天向 mainline 合入大约 1000 个 changes...

Linux News搬运工 793

LWN:5.18合并窗口第一部分!

关注了就能看到更多这么棒的文章哦~5.18 Merge window, part 1By Jonathan CorbetMarch 25, 2022DeepL assisted translationhttps://lwn.net/Articles/888736/截至目前,在 5.18 开发周期中已有 4127 个 non-merging changeset 进入了 ma...

Linux News搬运工 502
上一篇: LWN: 如何更好地支持在内存中存放秘密信息?
下一篇: LWN:改进KVM来增强guest系统保护和安全!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值