【bsauce读论文】2023-SP-内核Use-After-Cleanup漏洞挖掘与利用

news2024/11/24 3:02:23

本文参考G.O.S.S.I.P 阅读推荐 2023-01-06 UACatcher做一些补充。

1. UAC漏洞介绍

UAC漏洞介绍:Use-After-Cleanup (UAC)漏洞类似UAF,本文主要检测Linux内核中UAC漏洞。UAC基本原理参见图Fig-1。首先,UAC漏洞和系统中特定的设备(device)的卸载(例如一个USB设备被用户拔出)相关,当一个特定的设备释放后,原来和这个设备相关的内存对象应该就不再有效了。然而,如果攻击者能抓住特定的时间窗口(race window),在设备释放前就开始启动相关内存对象访问,并能让这个操作“慢一点”,在设备释放后(相关内存对象也不再有效)再执行内存访问,就会产生和UAF漏洞攻击类似的效果。(根本原因是,内核没有正确实现同步机制,所以syscall路径没有意识到对象已经被释放,这是一种特殊的并发UAF漏洞

请添加图片描述

注意到设备的卸载是从硬件层自底向上通知直至用户层,而用户态代码对设备资源的访问则需要透过syscall从上往下访问(这种访问模型见下图)。这两类(并发)事件如果撞到一起,就很容易产生concurrency bug,从而导致UAC相关问题的发生。

请添加图片描述

1-1. 设备移除处理函数示例

请添加图片描述

函数指针device_driver->remove

当设备从主机移除时调用 *remove 函数,实际会调用特定设备相关的函数 *disconnect (以USB为例),负责清理USB相关的资源。结构包含的关系为 usb_driver -> usbdrv_wrap -> device_driver,所以设备通常会device_driver 这样一个基类型,可以通过这个特点来找到目标驱动和 unreg-entry 函数。

1-2. 分层模型

UAC分层模型(Layered Model)详见Fig-3。

deallocation site:bottom-up cleanup routine 释放内核对象的地方

dereference site: top-down syscall routine 使用该内核对象的地方

dPair:针对同一内核对象的一对 deallocation sitedereference site

层边界函数(layer-boundary functions):包含 unreg-entry 函数(cleanup例程的入口函数)和 interface 函数(syscall例程的入口函数)

2. UAC漏洞挖掘

2-1. 漏洞案例

本文实现了一个名为UACatcher的分析工具,用它自动化寻找代码(特别是Linux内核代码)中的UAC问题。下图中就是作者利用UACatcher发现的一个真实的UAC bug:

该漏洞在 Linux 2.6.22-rc2 中(于2007年5月引入),在2021年5月才修复,存在了近14年。hci_unregister_dev()函数就是HCI顶层的 unreg-entry 函数,在利用hci_sock_dev_event()通知所有socket来回收目标对象hdev->workqueue之后,在3899行调用destroy_workqueue()释放目标对象;而 hci_sock_sendmsg() (通过调用 sendmsg 触发)在1829行会用到该对象。

请添加图片描述

2-2. UACatcher介绍

UACatcher工作机制:首先,UACatcher要借助Linux内核驱动的一些领域知识帮忙,分析和收集那些与设备相关的代码(下图中的Layer Preparing);然后,UACatcher会寻找那些和特定设备相关的内存对象,并确定一个对象的 deallocation site 和 dereference site (作者称其为dPair),而定位这种dPair(下图中的dPairs Locating)对于寻找UAC bug是至关重要的;最后就是利用静态分析算法来确认某个dPair是否会导致UAC行为的发生。这部分工作的细节非常丰富,读者可以在论文的第四章中找到更多的有意思的内容。

请添加图片描述

UACacher实现:代码采用Python和CodeQL实现,参见 https://github.com/uacatcher/uacatcher-repo

2-3. 真假UAC

请添加图片描述

真UAC:见 Fig-6 左边,漏洞对象是 req_workqueue ,syscall例程的检查语句 test_bit(HCI_UP, &hdev->flags) 位于hci_req_sync_lock锁原语外面,所以有可能syscall例程先通过了test_bit检查然后等待hci_req_sync_lock锁,而cleanup例程正占用该锁进行释放工作,导致UAC。本质原因就是没有对 hdev->flags 访问进行正确的锁保护。

假UAC:该示例的 dereference site 不可能在 deallocation site 之后发生,因为对 ndev->flags 的读写进行了正确的 req_lock 锁保护,在释放时就将 ndev->flags 清零了。

因此,在检测UAC漏洞时,要进行正确的 lock-set 分析和 happen-before 关系分析。

3. 挖掘结果

UACatcher在现实中针对Linux 5.11 (git commit 7289e26f395b) 内核版本进行了分析,发现了346个UAC bug,其中有277个得到了社区确认和修复,并拿到了15个CVE。

请添加图片描述

3-1. 漏洞可利用性

评估标准:竞争窗口是否足够大或者是否可控;是否可通过伪终端来利用。

结果:在4个模块中找到13个可利用的漏洞,见Fig-10。作者开发了第6个漏洞的提权EXP,具体两次使用了userfaultfd,第一次是使syscall例程暂停,开始cleanup例程,另一个错误处理线程使用 setxattr 来堆喷布置恶意数据。

请添加图片描述

4. UAC漏洞利用

4-1. 竞争窗口识别与评估

识别 time-consuming 函数(内存分配/释放、日志记录、IO操作等函数)和 time-controllable 函数(内核与用户数据交互,例如 copy_{from/to}_user)。

4-2. 用户设备模拟

由于UAC漏洞的触发需要系统设备的卸载和释放作为前提,那么对于攻击者来说,这种利用条件是否就很苛刻呢?作者在第五章回答了这类疑问——通过一个真实的用户态可构造的“pseudoterminal device”,攻击者可以在无需真实物理设备且无需高权限的情况下,触发设备的释放(从而可能触发UAC bug)!

请添加图片描述

伪终端 pseudo-terminal(简称pty)是虚拟字符设备端点,一端叫作master(通常由网络应用所使用,例如 ssh),另一端叫作slave(通常由终端程序所使用,例如 bash)。Linux系统中,用户程序A可以打开/dev/ptmx 获得 master 端描述符,内核PTY驱动就会在 /dev/pts 目录下分配一个slave端文件,来模拟硬件端设备(支持System V API,/dev/ptyX 用作master,/dev/ttyX 用作slave)。

行规则Line Discipline,内核TTY驱动负责将数据格式化,便于硬件与用户之间的数据交互。用户可以选取不同的行规则,来规定TTY的数据格式。例如,基于串口的蓝牙控制器,为了根据HCI协议转换来格式化数据,用户需打开并设置HCI行规则,这样该控制器才能被内核识别为 Bluetooth HCI dongle。

模拟示例:Fig-8展示了模拟蓝牙设备的示例。

  • (1)攻击者打开 /dev/ptmx 创建伪终端设备,获得文件描述符f1和f2分别指向master和slave端;
  • (2)调用ioctl(fd2)来为slave设备注册蓝牙行规则(N_HCI),如果不设置的话默认会注册TTY行规则(N_TTY);
  • (3)切换行规则之后,在attach到特定蓝牙控制器时,攻击者需处理数据,也即从fd1读取数据请求并将回复数据写入fd1;
  • (4)为了触发cleanup例程,只需关闭fd2,PTY驱动就会kill模拟设备,并向行规则层发送信号。

伪终端和虚拟设备(eg,vhci)的区别

  • (1)伪终端代码一直在内核中,而虚拟设备需要配置和安装(需要root权限);
  • (2)对虚拟设备的某些操作(例如 open/ioctl)也需要root权限,而伪终端权限较低,例如,蓝牙栈只需CAP_NET_ADMIN 权限,Amateur Radio 和 Controller Area Network 在切换行规则时需要 CAP_NET_ADMIN 权限,NFC不需要任何权限

参考

G.O.S.S.I.P 阅读推荐 2023-01-06 UACatcher

https://github.com/uacatcher/uacatcher-repo.

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

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

相关文章

众多行业适用的这款Lighthouse Apex Z便携粒子计数器有什么优势

Lighthouse Apex Z粒子计数器围绕易用性和可靠性进行构建。是建立在Lighthouse洁净室行业 40 多年的基于问题的学习基础上的解决方案。 采样设置 ApexZ易于使用的样品设置,可以匹配当前的sop,减少丢失位置或采样错误参数的风险。 用户管理 为了提高效…

ES6:var 、const、let的使用和区别

前言 本文主要介绍了ES6中var、const、let的使用和区别 基本介绍 let let声明变量 const const :声明常量const声明的常量可以修改,但不能重新赋值 如:以下代码是正确的: //引用数据类型 const info {name:Candy }; info.nameJune;而下面的代码是…

GPT-4国内有免费平替吗?

免费/平替永远是最贵的 就如同我们生活中买口红一样,总想找到平替,但永远比不上看中的那只! 但在寻找平替过程中 花出去的时间、金钱成本都是翻倍的。 那么GPT-4呢? GPT-4优于GPT-3.5闪光点,想必大家都十分清楚 不…

基于springboot自动排课系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SpringBoot 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:…

云计算安全

前言 什么是云计算? 云计算就是一种新兴的计算资源利用方式,云计算的服务商通过对硬件资源的虚拟化,将基础IT资源变成了可以自由调度的资源池,从而实现IT资源的按需分配,向客户提供按使用付费的云计算服务。用户可以…

帽子设计作品——蒸汽朋克的乌托邦,机械配件的幻想世界!

蒸汽朋克是由蒸汽steam和朋克punk两个词组成, 蒸汽代表着以蒸汽机作为动力的大型机械,而朋克则代表一种反抗、叛逆的精神。 蒸汽朋克的作品通常以蒸汽时代为背景,通过如新能源、新机械、新材料、新交通工具等新技术,使画面充满想…

基于OpenCV和PyQt5的跳远成果展示程序

基于OpenCV和PyQt5的跳远成果展示程序 近年来,体育运动越来越受到人们的关注,其中跳远是一项备受瞩目的运动项目。为了更好地展示运动员的跳远成果,本文将介绍一种基于OpenCV和PyQt5的跳远成果展示程序实现方法。 本文的跳远成果展示程序主…

基于SSM的校园办公管理系统的设计与实现(源码完整)

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据你想解决的问题,今天给…

【TES641】基于VU13P FPGA的4路FMC接口基带信号处理平台

板卡概述 TES641是一款基于Virtex UltraScale系列FPGA的高性能4路FMC接口基带信号处理平台,该平台采用1片Xilinx的Virtex UltraScale系列FPGA XCVU13P作为信号实时处理单元,该板卡具有4个FMC子卡接口(其中有2个为FMC接口)&#xf…

Sui如何进行独立审计

Sui及其生态项目的第三方审计对于网络的安全至关重要。 类似于Sui这样的L1区块链必须使用多重有效的措施,来确保项目保持尽可能高的安全级别。Sui流程中的一个关键环节就是使用第三方安全审计。了解Sui的安全状态及其维护方式对整个社区来说很重要,因此…

【JavaSE】Java基础语法(二)

文章目录 1. ⛄类型转换1.1 🪂🪂隐式转换1.2 🪂🪂强制转换 2. ⛄运算符2.1 🪂🪂算术运算符2.1.1 算术运算符2.1.2 字符的“”操作2.1.3 字符串的“”操作2.1.4 数值拆分 2.2 🪂🪂自增…

SQL注入 - Part 2

SQL注入 - Part 2 1.sql注入自动化工具--sqlmap配置环境变量/快捷方式一些sqlmap的常用语句前置SQL知识batch批量注入 2.sql注入靶场——sqlilabs3.布尔盲注4.基于时间的盲注5.基于报错的注入总结 1.sql注入自动化工具–sqlmap 配置环境变量/快捷方式 最终效果: …

数据高效转储,生产轻松支撑

在使用WINDOWS或智能手机的时候,经常会遇到存储空间不足的问题,鲜有人会打开文件管理系统自己逐个清理,不仅因为底层的系统文件繁多操作耗时,更有其操作专业度高、风险高的问题。这时我们往往会求助各种各样的清理大师&#xff0c…

2个月拿到华为offer,身为00后的我拿30K没问题吧?

背景介绍 美本计算机专业,代码能力一般,之前有过两段实习以及一个学校项目经历。第一份实习是大二暑期在深圳的一家互联网公司做前端开发,第二份实习由于大三回国的时间比较短,于是找的实习是在一家初创公司里面做全栈。 本人面…

网络安全CTF工具合集

各种在线工具以及工具整合 CTF资源库|CTF工具下载|CTF工具包|CTF工具集合 逆向工程: GDB – http://www.gnu.org/software/gdb/download/ IDA Pro – Download center Immunity Debugger – http://debugger.immunityinc.com/ OllyDbg – OllyDbg v1.10 radare2 – radare Hop…

MySQL基于成本的优化

MySQL的成本是什么?MySQL在执行一个查询的时候,其实是有多种不同的方案的,但是最终会选择一种成本比较低的方案,那么这个成本都体现在什么地方?如何计算? MySQL的成本 I/O成本 : 把数据从磁盘…

Python 萌新 - 花10分钟学爬虫

前言 Python 新手入门很多时候都会写个爬虫练手,本教程使用 Scrapy 框架,帮你简单快速实现爬虫,并将数据保存至数据库。在机器学习中数据挖掘也是十分重要的,我的数据科学老师曾经说过,好算法不如好数据。 Python助学…

理光打印机连接电脑后不打印的原因及解决方法

理光打印机在使用时,可能会出现正常连接上理光打印机却没有反应的情况,出现无法打印的情况,下面,驱动人生为大家带来理光打印机连接后不打印的解决方案。 驱动人生分析,一般遇到理光打印机连接后不打印的情况&#xf…

第一行代码 第十一章 基于位置的服务

第11章 基于位置的服务 在本章中,我们将要学习一些全新的Android技术,这些技术有别于传统的PC或Web领域的应用技术,是只有在移动设备上才能实现的。 基于位置的服务(Location Based Service)。由于移动设备相比于电脑…

Prompt Engineering | 编写prompt的原则与策略

😄 为了更好地与大模型(e.g. chatgpt)更好的交流,一起来学习如何写prompt吧!😄 文章目录 1、简介2、编写prompt的原则与策略2.1、编写清晰、具体的指令2.1.1、策略一:使用分隔符清晰地表示输入的…