CFI技术新探索,struct_san今日登场

news2024/9/25 7:13:13

一、背景

C/C++开发的应用程序,长久以来存在内存破坏类的安全问题。当攻击者掌握了目标程序的漏洞后,就可以开发漏洞利用程序劫持目标程序的控制流。早期的漏洞利用是采用代码注入的方式,通过在缓冲区置入一段代码(shellcode),然后控制pc寄存器跳入到缓冲执行这段代码。为了阻止此类攻击,后来计算机系统部署了DEP(Data
Execution
Prevention)机制,通过配置内存页属性,将缓冲区设置成不可执行,起到了很好的防御效果。为了绕过DEP,攻击者探索出了代码重用技术,在目标程序中搜索出一些攻击者期望的操作的代码片段,通过组织这些片段最终完成实现对目标机器的控制。这类攻击技术有Return-
to-libc、ROP(Return OrientedProgramming)、JOP(Jump
OrientedProgramming)等。如下图所示,代码有两条动态路径,在路径1存一个含有漏洞的节点。当攻击者通过漏洞修改这个节点的跳转逻辑,如果没有可靠的合法性验证机制,那么攻击者最终可以完全控制目标机器。

为了抵御上面的代码复用攻击,加州大学和微软公司于2005年提出了控制流完整性(Control-Flow-Integrity,
CFI)的防御机制。Control-Flow-Integrity (CFI)
是一种确保软件必须在先前确定的控制流图上执行的安全策略。其核心思想就是在函数在发生不确定的跳转时,验证跳转的合法性。

CFI分为Forward Edges CFI和Backward Edges
CFI。前者是在间接调用前验证控制流,而后者是在函数返回时验证返回地址是否属于调用者。下面罗列了Linux下相关实现,如下:

目前还有硬件实现的Backward CFI

  • Intel CET 基于硬件的只读影子调用栈

  • ARM V8.3a Pointer Authentication(“signed return address”)

##二、struct sanitizer

我们通过分析一些常见的内核漏洞POC,发现这些POC对控制流的修改都集中在几种结构体内置函数指针的修改上。而上面的CFI的方案需要对所有代码进行插桩验证控制流,这样势必会带来明显的性能下降问题。所以我们提出了struct-
sanitizer(struct_san)这种新的控制流完整性检测机制。

struct_san与上面的CFI方案相比,struct_san在对结构体指针的验证要比已有的CFI技术更严苛。当前主流的CFI技术主要是验证函数指针的类型,而struct_san在此基础上还要验证此函数指针是否还属于当前结构体实例。struct_san还可以做到非全量插桩,以减少一些非不必要的性能损耗。

##三、实现原理

struct_san工作原理如下:

struct san
通过对在结构体里的函数调用前加入校验函数__sanitizer_struct_guard__(),来验证此函数指针是否属于当前结构体实例,如果验证合法则继续运行下面的间接调用函数,否则抛出ud2。

##四、使用方法

struct_san为了避免非全量插桩,新增一个GNU Attributes attribute ((sanitize_struct)) 。

使用方法是在想要保护的结构体类型声明处和调用此结构体的函数指针的函数前加入此关键字,例如想要保护内核中的pipe_buf_release()代码中的pipe_buf_operations->release()函数。

1.在结构体类型声明时加入此关键字

在类型声明完成以后,struct_san会将此类型的所有结构体实例保存到.sanitize_struct段内。

2.在需要保护的函数中也要加入上面的关键字。例如在pipe_buf_release()函数的声明和定义处加关键字,加入关键字后会在调用pipe_buf_operations->release()前插入校验函函数__sanitizer_struct_guard__()

下面是插桩前后在gcc的gimple IR中的不同表示:

插桩前

插桩后

##五、检测算法

struct_san目前只在内核中完成了相关实现。其算法是在内核中开辟一个128M大小shadow
memory用来保存结构体和结构指针的对应关系。sanitizer_struct_guard()在调用时会检测传入的struct和函数指针是否在shadow
memory中,如果不在则抛出一个ud2异常,否则返回函数指针。实现方案如下:

这个算法参考了AddressSanitizer的实现,兼顾了效果和效率。

##六、效果

以漏洞CVE-2021-22555的攻击代码为例,在启用struct_san的情况下,CFI阻断了攻击代码的执行,起到了有效的防御。

最后

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:


当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

因篇幅有限,仅展示部分资料,有需要的小伙伴,可以【点下方卡片】免费领取:

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

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

相关文章

在 Tinkercad 中加快设计的 22 个技巧

在 Tinkercad 中加快设计的 22 个技巧 原文 Everyone knows that Tinkercad is the easiest way to get started in 3D design. Once you get the hang of it, you realize that it’s one of the fastest design tools available. With no software to launch or complex me…

Pytest学习教程_测试报告生成pytest-html(三)

前言 pytest-html 是一个用于生成漂亮的 HTML 测试报告的 pytest 插件。它可以方便地将 pytest 运行的测试结果转换为易于阅读和理解的 HTML 报告,提供了丰富的测试结果展示功能和交互性。 一、安装 # 版本查看命令 pytest版本: pytest --version pyte…

PHP代码审计--理论

提供资料: php 基础 : https://www.runoob.com/php/php-tutorial.html php是什么? PHP 是服务器端脚本语言。 首先在学习PHP前需要对HTML 和CSS有一定的认识 PHP 能做什么? PHP 可以生成动态页面内容PHP 可以创建、打开、读取、写入、关…

InnoDB引擎底层逻辑讲解——架构之磁盘架构

1. System Tablespaces区域 系统表空间是change buffer(更改缓冲区)的存放区域,这是在8.0之后重新规划的,在5.x版本的时候,系统表空间还会存放innodb的数据字典undolog日志等信息,在8.0之后主要主要存放更…

【程序猿周末如何才能获得充分的休息】

工作以后常常容易感到疲于奔命,即使在周末也没有得到高质量的休息。打工人/学生党如何过周末?你有哪些延长周末和下班时间的好方法吗?你可以选择从以下几个方向谈谈你的想法和观点。 一:周末的时间规划 周末双休 二:提…

springboot 自定义starter项目Unable to read meta-data for class

springboot 自定义starter包,在项目中引用,启动报错。 org.springframework.boot.SpringApplication [SpringApplication.java:843] Application run failed java.lang.IllegalStateException: Unable to read meta-data for class com.hxg.mail.spring…

找好听的配乐、BGM就上这6个网站,免费商用。

推荐几个音乐素材网站给你,各种类似、风格的都有,而且免费下载,还可以商用,建议收藏起来~ 菜鸟图库 https://www.sucai999.com/audio.html?vNTYxMjky 站内有上千首音效素材,网络流行的音效素材这里都能找到&#xf…

一起学算法(双指针篇)

概念: 通过两个指针,不断的调整区间,从而求出问题最优解的算法就叫“尺取法”,由于利用的是两个双指针,所以也叫作“双指针”算法,这里的“尺”的含义,主要是因为这类问题,最终要求解…

刷题笔记 day2

力扣 1089 复写零 思路:双指针 第一步:利用指针 cur 去记录最后一位要复写的数 , 利用指针 dest 指向最后一位数所要复写的位置; 实现过程:最开始 cur 指向0,dest 指向 -1 , 当arr[cur] ! …

高并发与性能优化的神奇之旅

作为公司的架构师或者程序员,你是否曾经为公司的系统在面对高并发和性能瓶颈时感到手足无措或者焦头烂额呢?笔者在出道那会为此是吃尽了苦头的,不过也得感谢这段苦,让笔者从头到尾去探索,找寻解决之法。 目录 第一站&…

深入理解设计模式之模板方法模式

深入理解设计模式之模板方法模式 什么是模板方法模式? 模板方法模式是一种行为型设计模式,它定义了一个算法的骨架,将一些步骤的具体实现延迟到子类中。模板方法模式通过将算法的通用部分抽象出来,以模板方法的形式提供给子类&am…

express学习笔记7 - docker跟mysql篇

安装Docker和Navicat Docker 进官⽹https://docs.docker.com/get-docker/ 选择机型安装即可。 Navicat(也可以在网上找个破解版本) 进官⽹https://www.navicat.com/en/products/navicat-premium 安装完之后连接新建⼀个数据库连接 然后再⾥⾯新建⼀个数…

【编程语言 · C语言 · 通讯录管理系统】

【编程语言 C语言 通讯录管理系统】https://mp.weixin.qq.com/s?__bizMzg4NTE5MDAzOA&mid2247491539&idx1&sn02173f15bbff6d5f01a3426a1ecf7120&chksmcfade32af8da6a3cb187ecde99fe0519c4d67ef05488754ab2196fab0915262c260ccc68b304&payreadticketHEsQ…

MacOS使用brew如何下载Nginx

首先,第一步切换源: 切换 brew.git 仓库地址: cd "$(brew --repo)" git remote set-url origin https://mirrors.aliyun.com/homebrew/brew.git 替换 homebrew-core.git 仓库地址: cd "$(brew --repo)/Library/Taps/home…

无线蓝牙耳机有什么值得耳机买的?几款值得买的口碑品牌盘点

蓝牙耳机是一种无线耳机,其通过蓝牙技术与其他设备进行连接,例如手机、电脑、平板电脑等。蓝牙耳机使得用户可以在不受线缆限制的情况下享受音频体验,而且还可以方便地进行通话,目前市场上有许多不同种类和品牌的蓝牙耳机&#xf…

大厂原来都这么使用IDEA远程调试的!

远程调试是一项重要的技术,特别是对于使用IDEA开发的开发者来说。在本篇技术博客中,我们将探讨如何使用IDEA进行远程调试。 1 IDEA 配置 首先,我们需要确保我们的开发环境已经准备就绪。我们需要在远程服务器上安装并配置好调试器&#xff…

【福建事业单位-语言理解】02 细节判断-标题填入-词句理解

【福建事业单位-语言理解】02 细节判断-标题填入-词句理解 一、细节判断题细节判断优先验证原则总结 二、标题填入题总结 三、词句理解题3.1 代词指代实词理解句子理解总结 一、细节判断题 如果文段长难怪绕,就先看选项,反之一样。 面对温和的可能性表述…

java集成短信服务 测试版 qq邮箱简单思路

java集成短信服务 注册一个帐号 使用的是容联云,百度搜一下官网 用手机注册一个帐号就行,免费体验不需要认证 注册后会有八块钱送,可以使用免费的给自己设置三个固定手机号发送短信,不需要认证。 此页面的 三个信息需要在代码中…

免驱触摸屏为啥在我的Linux上驱动不起来

背景: 某宝上买了个HDMI接口的触摸屏,用树莓派驱动没啥问题,但是用在我自己定制的Linux系统上,咋都不好使,咨询商家,商家说触摸屏的芯片是GT911,芯片是I2c协议,触摸屏上是usb接口的…

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(19)-Fiddler精选插件扩展安装,将你的Fiddler武装到牙齿

1.简介 Fiddler本身的功能其实也已经很强大了,但是Fiddler官方还有很多其他扩展插件功能,可以更好地辅助Fiddler去帮助用户去开发、测试和管理项目上的任务。Fiddler已有的功能已经够我们日常工作中使用了,为了更好的扩展Fiddler&#xff0c…