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

2023-08-22 20:30:57 来源:哔哩哔哩

写在前面


(资料图片仅供参考)

提到内核栈溢出的漏洞缓解,许多朋友首先想到的是栈内金丝雀(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 的版本AOSP的kernel版本默认开启。

依赖条件

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

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

开启方法

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

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

【文章福利】小编推荐自己的Linux内核技术交流群:【749907784】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!(含视频教程、电子书、实战项目及代码)   

安全原理

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

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

以下面这段demo为例:

Int  foo () {

Return bar()+1;

}

Demo转换成汇编:

push   %rax

callq  bar

add    $0x1,%eax

pop    %rcx

Retq

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

str     x30, [x18], #8 

stp     x29, x30, [sp, #-16]!

mov     x29, sp

bl      bar

add     w0, w0, #1

ldp     x29, x30, [sp], #16

ldr     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安珀实验室

标签:

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

2023-08-22

摩尔线程发布显卡 Windows 驱动 v230.40:正式支持 DirectX 11

2023-08-22

联影医疗上半年会务费及业务招待费劲增162% 股价重挫后抛回购计划

2023-08-22

现代化进程中,西藏传统文化被“落下”了吗?

2023-08-22

欧股涨幅扩大欧洲斯托克50指数、法国CAC40指数、德国DAX30指数涨超1%

2023-08-22

那女孩对我说歌词背后的故事_那女孩对我说歌词寓意

2023-08-22

炒股手机哪款手机好用(炒股用哪款手机好,适于炒股的手机)

2023-08-22

许俊松调研花溪区国有企业党建工作和经营管理工作并召开专题会

2023-08-22

福建大田:讲好“开学第一课” 法治护航开学季

2023-08-22

铁建重工:8月21日融资买入569.51万元,融资融券余额2.66亿元

2023-08-22

纯碱期货再次“大面积”涨停,单日流入资金超5.1亿,现货市场重金“求碱”

2023-08-22

义乌商报头版 | 外商进场忙采购

2023-08-22

睿智医药08月21日获深股通增持21.23万股

2023-08-22

新诺威(300765):8月21日北向资金增持119.93万股

2023-08-22

移动4g无线上网卡(移动3g无线上网卡)

2023-08-22

诺普信:旗下的产业基金暂无投资农业无人机、机器人项目

2023-08-21

创新新材计划在墨西哥开展汽车轻量化铝合金材料等项目 项目投资总额1.97亿美元

2023-08-21

天源迪科:公司为银行提供数字人民币钱包的研发和推广,也提供如公积金、房产等数字人民币应用场景

2023-08-21

工银瑞信基金5000万元自购旗下权益类基金

2023-08-21

日播时尚:子公司股权内部转让

2023-08-21

鲁班传说|鲁班造磨

2023-08-21

关于时间的谜语导入(关于时间的谜语)

2023-08-21

北京大力促进商品消费全面提档升级

2023-08-21

莱万妻子安娜晒照,巴萨太太团现场观赛

2023-08-21

湖南绥宁卫健局回应“女卫生院长被举报婚内出轨”:属实,将立案审查

2023-08-21

安卓mmi是什么软件(安卓mmi是什么)

2023-08-21

特斯拉100GB数据泄露原因查明:内部不法行为,影响逾7.5万人

2023-08-21

全屋定制家具品牌排名大全(全屋定制家具品牌排名)

2023-08-21

雨刮器胶条怎么拆装视频教程(雨刮器如何拆除胶条)

2023-08-21

北京市外事学校(关于北京市外事学校的基本详情介绍)

2023-08-20

Copyright ©  2015-2022 每日频道网版权所有  备案号:浙ICP备2022016517号-15   联系邮箱:5 146 761 13 @qq.com