论坛首页 蓝队防御建设区 阅读主题

[原创]Linux内核攻击 USMA 解析

188 浏览 0 回复
#1 楼主 2026-06-01 21:09:19
USMA : USER SPEACE MAPPING ATTACK (用户空间映射攻击)本文关于 Linux 源码的版本均为:6.12.32USMA 利用的是 socket 的 pgv 数组,所以我们在这里先深入了解一下 PacketSocket 的数据结构,在这里我们还是主要关注 pgv 的创建和映射,关于Socket其他板块的详细解析可以看我其他的文章。我们这里主要关注 rx_ring/tx_ing,这是我们后续利用的关键数据结构。所以相当于除去 struct socket 以外其他均为 packetsocket 独有的结构.正常 Linux Socket 的传输数据需要进行用户层到内核层的拷贝,然后发送后又需要内核层到用户层的拷贝,比较消耗性能。所以类似于 zerocopy 的设计思想,Linux 在 PacketSocket 中设计了共享环形结构,让用户态可以直接将数据写入环形结构避免了拷贝操作。当然如果设置了 ring_buffer ,但是不使用mmap是没有使用到 zerocopy 的。ring_buffer 是 packet_socket 独有的数据结构。当没有设置 PACKET_RX_RING 或 PACKET_TX_RING 时,Packet_socket 和正常的 socket 一样都使用标准的 sk_receive_queue/sk_write_queue。 用户通过 setsockopt 设置 PACKET_RX_RING 或 PACKET_TX_RING,最终调用 packet_set_ring,设置环形缓冲区。pg_vec 是 kcalloc 分配Pgv 的 buffer 是通过 alloc_one_pg_vec_page 分配所以我们知道正常情况下 block 对应一个或者多个连续的page获取 buffer 对应的 page,然后将 page 加入页表中,这样用户态访问对应虚拟地址就会去访问对应的page内容。攻击的主要是 packet_mmap 映射这个过程。仔细研究 packet_mmap 我们可以发现,如果我们能够修改 pg_vec ,那么就可以任意将内核的 page 映射到用户态。比如最常见的利用方式,就是将内核代码段的page映射出来,实现任意代码修改。并且通过上文我们知道由于 pg_vec 是根据 kcalloc(block_nr, sizeof(struct pgv), GFP_KERNEL | __GFP_NOWARN); 获取的。sizeof(struct pgv)为 8字节,然后我们可以控制 block_nr 的数量,那么我们就可以控制 pgv 为任意大小的 object,非常有利于我们的堆喷。当然在利用过程中,我们得仔细看看是否对 page 有什么检查 根据 enum pagetype 定义,以下类型的页会被 page_has_type() 检测到由于 PacketSocket 需要 root 权限,所以正常用户权限下无法使用,需要用用户命名空间来实现伪root来成功调用 PacketSocket.但是也有些环境下Linux不支持用户命名空间。(用户命名空间依赖于 CONFIG_USER_NS 开启,这个选项是默认关闭)检查的是在用户命名空间中的 CAP_NET_RAW。struct packet_sock {

---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-289330.htm

暂无回复,快来抢沙发吧!

请登录后参与讨论

立即登录 注册账号