保护函数返回的利器——Linux Shadow Call Stack

news2024/11/24 14:10:26

写在前面

提到内核栈溢出的漏洞缓解,许多朋友首先想到的是栈内金丝雀(Stack Canary)。今天向大家介绍一项在近年,于Android设备中新增,且默默生效的安全机制——影子调用栈:SCS(Shadow Call Stack)。

功能介绍

在通常的函数调用中,被调用函数的返回地址存储在栈上,攻击者可以通过篡改栈上返回地址劫持程序的执行流,常见的攻击方式如通过溢出覆盖返回地址、ROP(Return Oriented Programming)攻击等。

SCS是一项基于LLVM(Low Level Virtual Machine)的安全功能,它通过在函数调用时使用一种安全栈帧来解决这个问题。SCS开启后,这个安全栈帧上存储了函数调用的返回地址,而不是直接存储在常规栈上。函数在使用返回地址时,将直接从安全栈帧中读取。从而避免了传统的、针对栈上返回地址的攻击方法。

Google要求

自Android R开始,AOSP(Android Open Source Project)的CDD(Compatibility Definition Document)要求中,就已强烈建议使能CFI, SCS, IntSan。而在kernel 5.4的版本AOSP的kernel版本默认开启。

依赖条件

SCS需要硬件支持,目前只在特定处理器架构上受到支持,如x86_64架构中的Intel CET或aarch64架构中的Pointer Authentication。这些硬件提供了必要的指令和功能来支持SCS的运行。

SCS目前仅支持aarch64架构,有数据表明在X86_64架构上具有严重性能和安全缺陷,LLVM 在9.0中已将其删除。

开启方法

根据Google介绍,可以为整个内核或者单独为某个用户空间的进程、服务开启SCS,开启方法请参考:

或在编译时将-fsanitize=shadow-call-stack 标志传递给链接命令行。如果当前代码不需要应用SCS,可以使用__attribute__((no_sanitize("shadow-call-stack")))对函数声明。

 资料直通车:Linux内核源码技术学习路线+视频教程内核源码

学习直通车:Linux内核源码内存调优文件系统进程管理设备驱动/网络协议栈

安全原理

SCS旨在补充 -fstack-protector,以构建安全纵深防御的目标,防止非线性溢出等任意攻击栈上返回地址的手段。

在 Aarch64 架构上,SCS使用 X18 寄存器来引用影子调用栈,这意味着不必再将 SCS的引用存储在内存中。以此避免将影子调用堆栈的地址暴露给可以读取任意内存的攻击者。SCS不需要错误处理,因为它无条件地信任、使用影子堆栈里的返回地址。

以下面这段demo为例:

Int foo () { Return bar()+1;}

Demo转换成汇编:

push %raxcallq baradd $0x1,%eaxpop %rcxRetq

当这段代码在开启SCS后,汇编代码变化为:

str x30, [x18], #8 stp x29, x30, [sp, #-16]!mov x29, spbl baradd w0, w0, #1ldp x29, x30, [sp], #16ldr x30, [x18, #-8]!Ret

在Aarch64架构上通用寄存器如下,X18目前被大多数ARM预置且未使用。而X30是LR,用于存放函数返回值。

上述代码框中标红指令就是SCS的核心逻辑,分段解释:

str x30, [x18], #8

首先将寄存器 X30 中的数据存储到 X18 指向的内存地址处,然后将 X18 中的地址值增加 8 字节。

ldr x30, [x18, #-8]!

将 X18 寄存器中存储的地址值减去 8 字节,然后将存储在该地址处的数据加载到 X30 寄存器中,同时更新 X18 的值。

功能风险

SCS需要使用Aarch64的X18寄存器来存储影子调用栈的地址,需要默认该寄存器不会用于任何其他目的。虽然当前所有系统库都编译为预留 X18 寄存器,但如果存在第三方库、早期库时,需要确定第三方应用没有使用X18寄存器。

并且OPPO在2020年已率先同Qualcomm和MediTeK两大芯片厂商沟通,率先开通SCS,能有效缓解劫持函数返回地址的危害,无兼容性,功能性上的风险。

功能结果

在OPPO FIND X3项目上,使用IDA逆向bootimage,检测任意内核地址的返回值,确认具备SCS的明显特征,如下截图。

需要注意的是,虽然SCS是一种有效提升设备安全性的漏洞缓解技术,但并不能防御所有的攻击。因此,在Android开发时,还应该采取其他安全措施,如输入验证、内存安全编程、权限管理等来全面保护应用程序的安全性。

原文作者:OPPO安珀实验室

 

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

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

相关文章

GEE/PIE遥感大数据处理与典型案例

随着航空、航天、近地空间等多个遥感平台的不断发展,近年来遥感技术突飞猛进。由此,遥感数据的空间、时间、光谱分辨率不断提高,数据量也大幅增长,使其越来越具有大数据特征。对于相关研究而言,遥感大数据的出现为其提…

亚马逊前台又更新了?这个功能有点意思!

亚马逊最近动作频频,之前听说过,亚马逊的IT团队换了一批新人,目前界面也在进行迭代改版。只不过各项新功能的改版,让卖家们应接不暇。由于新功能的改变都会对卖家们的业务产生影响,这直接关系到卖家的切身利益&#xf…

leetcode1109. 航班预订统计(java)

差分数组 leetcode1109. 航班预订统计差分数组解题代码演示 上期经典 leetcode1109. 航班预订统计 难度 - 中等 原题链接 - 1109. 航班预订统计 这里有 n 个航班,它们分别从 1 到 n 进行编号。 有一份航班预订表 bookings ,表中第 i 条预订记录 bookings…

查询速度最高提升50倍!火山引擎ByteHouse在广告投放领域实践分享

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 据QuestMobile报告显示,移动互联网已经进入了下半场,在使用人数和使用时长方面已经没有明显增长,互联网已经流量趋于饱和。 作为…

【升职加薪秘籍】我在服务监控方面的实践(6)-业务维度的mysql监控

大家好,我是蓝胖子,关于性能分析的视频和文章我也大大小小出了有一二十篇了,算是已经有了一个系列,之前的代码已经上传到github.com/HobbyBear/performance-analyze,接下来这段时间我将在之前内容的基础上,结合自己在公…

电脑出现msvcp120.dll丢失的解决方法,教你三招快速解决

msvcp120.dll丢失是一件很常见的问题,出现msvcp120.dll丢失会导致电脑无法在正常运行,那么应该怎么解决这个问题呢,有什么办法可以快速的解决呢,今天教你三招快速解决msvcp120.dll丢失的方法。 一.msvcp120.dll文件丢失可能导致的…

深度学习入门(五):经典网络Alexnet实现

介绍 AlexNet是一个深度卷积神经网络架构,于2010年代初在深度学习重新引起人们关注时发挥了重要作用。它因在2012年的ImageNet大规模视觉识别挑战(ILSVRC)中获胜而闻名。 实现 创建了一个AlexNet网络的实例,并将一个随机生成的…

云服务之PaaS:PaaS怎么帮助企业走向云

一、前言 企业想要平滑地向云迁移,需要选择一个适合自己的云基础框架。PaaS(平台即服务)作为云计算的重要组成部分,可以为用户提供完整的应用生命周期管理和相关资源服务。开发人员可以在PaaS框架构建和自定义应用程序,这为企业大大地节省了金…

金桥跨越相伴岁月 桂冠加冕爱意时光 GP芝柏表铭刻相爱传奇 演绎浪漫七夕

两个多世纪以前,康士坦特芝勒德 (Constant Girard) 与玛莉亚柏雷戈 (Marie Perregaux) 喜结连理,两颗心灵在爱意中交织,二人将姓氏结合,创立“Girard-Perregaux”芝柏表,成为数百年来瑞士高级制表中仅有的以夫妻双人姓…

龙迅LT7911UX TYPE-C/DP转MIPI/LVDS,内有HDCP

1. 描述 LT7911UX是一种高性能的Type-C/DP1.4a到MIPI或LVDS芯片。HDCP RX作为HDCP中继器的上游端,可以与其他芯片的HDCP TX协同工作,实现中继器的功能。 对于DP1.4a输入,LT7911UX可以配置为1/2/4车道。自适应均衡使其适用于长电缆应用&#…

设计模式(9)建造者模式

一、 1、概念:将一个复杂对象的构造与它的表示分离,使得同样的构造过程可以创建不同的表示。建造者模式主要用于创建一些复杂的对象,这些对象内部构建间的顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化;建造…

FUSE简单了解

FUSE是什么? FUSE(filesystem in userspace)是一个用户态文件系统框架。由内核模块(fuse.ko)、用户态库(libfuse.*)和挂载工具组成(fusermount) fuse最重要的特性是fuse可以允许安全、非特权挂…

设计师私藏的5个设计网站,你一定要知道。

这5个网站设计师都在用,找素材、找灵感一步到位,赶紧收藏~ 菜鸟图库 https://www.sucai999.com/?vNTYxMjky 菜鸟图库是一个非常大的素材库,站内包含设计、办公、自媒体、图片、电商等各行业素材。网站还为新手设计师提供免费的素材&#xf…

【C语言进阶(4)】指针和数组笔试题

文章目录 Ⅰ 一维数组Ⅱ 字符数组题型 1题型 2题型 3 Ⅲ 二维数组 数组名的意义 sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。&数组名,这里的数组名表示的是整个数组,取出的是整个数组的地址。除了上述…

*****独立看门狗总结实验

1、看门狗定时计算 看门狗的喂狗时间(也就是看门狗溢 出时间)的计算方式为: Tout((42^prer) rlr) /32 其中 Tout 为看门狗溢出时间(单位为 ms)。 prer 为看门狗时钟预分频值(IWDG_PR 值)&#…

OpenGL —— 2.3、绘制第一个三角形(附源码,glfw+glad)(更新!)

源码效果 C源码 vertexShader.glsl #version 330 corelayout(location 0) in vec3 aPos; layout(location 1) in vec3 aColor;out vec4 outColor;void main() {gl_Position vec4(aPos.x, aPos.y, aPos.z, 1.0);outColor vec4(aColor, 1.0); };fragmentShader.glsl #versi…

离散Fourier变换的一种理解方法

1. 离散Fourier变换的定义 一个信号 x 的离散Fourier变换(Discrete Fourier Transform,简记为DFT)定义为 , 其逆(inverse) Fourier变换(简记为 IDFT)定义为 。 (译注:符号“≜”表示“根据定义,左边等于右边”。) 其中&#x…

电脑连接手机热点无法访问 GitHub

电脑连接手机热点无法访问 GitHub 解决方案 修改本地请求配置 修改 Windows 中 hosts 文件,路径: C:\Windows\System32\drivers\etc 添加内容: 140.82.112.4 www.github.com 140.82.112.4 github.com 提示:Windows 有权限限制&am…

智慧班牌云平台源码 (人脸识别、信息发布、校园风采、家校互通、教务管理、考勤管理)

电子班牌是一款智慧校园的管理工具,也是校园的多媒体展示平台,智慧电子班牌系统是专为学校智慧教育设计的一款智慧校园的管理工具,融合了多媒体信息发布、校园风采、家校互通、教务管理、考勤管理、日常办公等一系列应用。具备智慧教育功能和…

Mybatis的动态SQL及关键属性和标识的区别(对SQL更灵活的使用)

( 虽然文章中有大多文本内容,想了解更深需要耐心看完,必定大有受益 ) 目录 一、动态SQL ( 1 ) 是什么 ( 2 ) 作用 ( 3 ) 优点 ( 4 ) 特殊标签 ( 5 ) 演示 二、#和$的区别 2.1 #使用 ( 1 ) #占位符语法 ( 2 ) #优点 2.…