首页 > 其他分享 >Dirty Cred 学习记录

Dirty Cred 学习记录

时间:2023-02-07 18:56:24浏览次数:87  
标签:credential 记录 UAF 写入 指针 内核 权限 Cred Dirty

  • 简介

    基于 Dirty Pipe(见前篇)创建出来的新型漏洞利用方式,可以将其他 LInux 内核漏洞转化为逻辑漏洞,进而绕过当前所有的内核缓解机制(包括 CFI 控制流完整性保护)。

    核心思路是使用高权限 credential 对象来交换低权限 credential 对象。

  • 利用方式

    内核中对权限 / 身份的校验发生在具体操作之前,而校验身份的动作往往不会被锁限制,那么可以卡在身份验证和操作之间将目标结构替换掉以实现权限提升。这中间需要一些手段将非内核凭证 slab 的漏洞转换为内核凭证的 slab 区域的漏洞,以及一些演唱身份验证时间窗的手段。

  • CVE-2021-4154 & CVE-2022-2588

    image-20230205223946423

    在文件权限检查和写入数据之间进行竞争,实现 credential / file 结构体的替换(低权限 -> 高权限,可写 -> 不可写)。

    实现的难点在于将写入操作阻塞在权限校验和实际写入之间。

  • 漏洞原语转化

    越界写

    image-20230206084514047

    越界写下一个结构体的字段,将该结构体原先指向低权限的 credential 结构体指针修改为指向高权限的 credential 结构体指针,具体方式是往指针低 2 个字节写入 0(0x0000),这样做是希望将原指针修改当前页所在首部的 privileged credentials。攻击者可以通过频繁创建 privileged credentials 对象来占据新页面的首部位置,为后续修改指针做准备。

    UAF
    1. 如果 UAF 的地方在 credential dedicated cache(内核常用对象) 上,释放掉原先的 unprivileged credential 然后使用新创建的 privileged credential 对象来占据这里就可以完成置换。
    2. 如果 UAF 的地方在 generic cache(普通对象)上,需要这个 UAF 有 invalid-write 能力。先释放出一个内存空洞,然后用再有 credential pointer 的可利用对象来占据它,然后利用 UAF 来改这个 credential pointer。
    double free

    image-20230206092313021

    1. 在 vulnerable object 所在的 cache 中大量分配对,使得其至少占据一个页面的内存空间。为了使某个内存页面的被回收时机可控。
    2. 尝试触发两次 double free,使某个被释放内存块上有两个垂悬指针。
    3. 释放该页上所有对象,使得该页面被回收进分配器中,并被用于 credential 的内存分配,成为 dedicated cache。
    4. 在这块 credential 的页面上分配大量 credential 结构体,使其占据该页面的内存空间。
    5. 因为这两个垂悬指针可能不会与 credential object 对齐,因此需要用到一个来释放出一块 credential object 的空洞。
    6. 分配新的 credential object 占据这个空洞,使两个指针共同指向一个 credential object 后续就可以转化为一个 UAF 来使用了。
  • 延长竞争窗口

    userfaultfd

    经典的延长缺页中断的时间,但在 5.11 之后内核禁止了非特权用户的 userfaultfd 注册(但还是可以通过 fuse 文件系统来注册 userfaultfd)

    在 4.13 之前,系统调用 writev 的实现方式如下:

    image-20230206161535674

    先进行权限检查,然后在 import_iovec 时触发页错误,从而利用 userfaultfd 机制来暂停内核的执行。

    在 4.13 之后,import_iovec 函数的调用提前,

    image-20230206161655674

    这是需要找到更底层的 generic_perform_write 函数,该函数会主动触发一次 page fault,同样可以利用 userfaultfd 实现延时:

    image-20230206161758224

    文件系统 lock

    在 ext4 文件系统写入数据的过程中,在执行 generic_perform_write 写入之前都会对 inode 进行一次 lock 操作:

    image-20230206173110317

    那么一个进程先对某个文件进行大量数据写入,另一个进程对相同文件执行写入操作,就会一直等待 inode 锁的释放。

    类似 CVE-2022-2588 中的操作:

    image-20230206175924250

    FUSE

    用户层文件框架,允许用户实现自己的文件系统。用户可以在该框架中注册 handler 来指定对文件操作请求,进而暂停内核执行。

  • 分配特权对象

    在用户层中,有两种方式可以分配 privilege credential:

    1. 大量执行 set-uid 程序(sudo)或者频繁的创建特权级守护进程(sshd)。
    2. 使用 ReadOnly 的方式打开特权文件(/etc/passwd)

    在内核层中,当内核创建新的 kernel thread 时会 copy 当前的 thread 中的 privileged cred 结构,那么需要能稳定创建 kernel thread:

    1. 在 kernel workqueue 中填充大量任务
    2. 调用 username helper

    可利用的内核对象:

    image-20230206181923593

  • 参考文献

标签:credential,记录,UAF,写入,指针,内核,权限,Cred,Dirty
From: https://www.cnblogs.com/m00nflower/p/17099490.html

相关文章

  • CVE-2022-2588 学习记录
    简介netlink协议中的CLS_ROUTE4模块中存在doublefree。影响范围:linux5.19之前利用条件:linux用户有CAP_NET_ADMIN权限内核编译选项://下面三个可以触发po......
  • 自我介绍与学习记录
    这个作业属于哪个课程https://edu.cnblogs.com/campus/fzzcxy/2023learning这个作业要求在哪里https://edu.cnblogs.com/campus/fzzcxy/2023learning/homework/1......
  • 全局异常处理(容易忘在这里记录下)
    /***全局异常处理类,能够处理到controller、filter、interceptro所抛出的异常*不使用HandlerExceptionResolver、结合两者使用(ControllerAdvice|ErrorController)*/@Res......
  • Openssh升级记录
    执行升级前备份文件cp-r/etc/ssh /etc/ssh_bakcp/etc/init.d/sshd /etc/init.d/sshd_bakcp/usr/sbin/sshd /usr/sbin/sshd_bak一、查看openssl 1、查看opens......
  • P3203做题记录
    一种更简单的想法,只用用分块思想(或者根号分治?)不用分块。先考虑暴力怎么做:修改直接改,查询不停跳下一个点。但这样会被卡到\(O(n^2)\)。考虑分块思想优化:如果保证每次至少......
  • webrtc windows编译记录
    //cmdsetpath=D:\zzh\depot_tools;%path%setDEPOT_TOOLS_WIN_TOOLCHAIN0setvs2022_install=C:\ProgramFiles\MicrosoftVisualStudio\2022\Community//powershe......
  • 手机微信聊天记录怎么打印出来?
    微信是绝大多数人最常用的聊天工具软件之一,无论是家人、朋友、同事,还是老师和家长都会使用微信来沟通和交流。而有不少网友想要找某件事情的记录时,也会使用微信来搜索聊天......
  • 20230207 物料关联车型报表 问题记录
    1.写sql的时候,主次没分清楚,应该是从marc和t001w表中查数据,剩下的字段再从其他的表中查,但是我直接是把lips和这两张表内连接到一块了,然后遇到lips表中没有的数据,就直接没数......
  • 【踩坑记录】@Transactional注解回滚不生效问题
    @Transactional属于是Spring的常用事务处理注解了,最近在开发时偶然发现这个东西竟然不是100%生效的。问题重现:测试一个批处理方法,方法上加了@Transactional后执行,因为加......
  • 自实现linker加固so遇到的问题记录
    自定义linker加固so是主流的加壳方式,通过实现linker程序来加载,链接加固后的so文件。最后为了让加固后的so中的代码能与其他模块交互,需要修正壳(自定义linker)的soinfo为加固s......