Linux本地内核提权漏洞(CVE-2017-7184)
字数 1745 2025-08-18 11:37:12
Linux内核提权漏洞CVE-2017-7184分析与利用
漏洞概述
CVE-2017-7184是Linux内核IPSec框架中的一个内存越界漏洞,存在于2.6及更高版本的内核中。该漏洞允许本地攻击者通过精心构造的数据包触发内核内存越界写入,最终可能导致权限提升。
背景知识
IPSec协议简介
IPSec是一个协议组合,包含以下组件:
- SA(Security Association):由SPI、IP地址和安全协议标识(AH或ESP)唯一确定,定义了通信双方的IP地址、IPSec协议、加密算法、密钥、模式等参数
- AH(Authentication Header):提供数据完整性校验和身份认证功能,具备抗重放能力
- ESP(Encapsulating Security Payload):提供完整性检查、认证和加密功能
相关结构体
漏洞涉及的关键结构体xfrm_replay_state_esn定义如下:
struct xfrm_replay_state_esn {
unsigned int bmp_len;
__u32 oseq;
__u32 seq;
__u32 oseq_hi;
__u32 seq_hi;
__u32 replay_window;
__u32 bmp[0];
};
bmp_len:决定整个结构体的具体大小replay_window:决定bmp数组的索引范围
漏洞分析
补丁分析
补丁添加了对replay_window和bmp_len的大小检测:
static inline int xfrm_replay_verify_len(struct xfrm_replay_state_esn *replay_esn) {
if (nla_len(rp) < ulen || xfrm_replay_state_esn_len(replay_esn) != ulen)
return -EINVAL;
if (up->replay_window > up->bmp_len * sizeof(__u32) * 8) // 新增的检测
return -EINVAL;
return 0;
}
漏洞成因
问题出在xfrm_replay_state_esn结构体的replay_window和bmp_len上。当发送XFRM_MSG_NEWAE类型的消息时,会调用xfrm_new_ae函数更新已存在的SA。检测函数xfrm_replay_verify_len没有对replay_window做任何检测,导致可以控制replay_window超过bmp_len,从而在后续操作中触发越界。
触发越界的函数
有两个函数可能触发越界:
xfrm_replay_checkxfrm_replay_advance(包含越界写操作)
关键函数xfrm_replay_advance_esn的调用链:
xfrm4_ah_rcv -> xfrm4_rcv -> xfrm4_rcv_spi -> xfrm_input
漏洞利用
利用思路
- 通过控制
net_seq、replay_esn->seq、replay_esn->replay_window和replay_esn->seq_hi等变量,使程序执行到特定流程 - 通过越界写操作修改内核关键数据结构(如cred结构体),实现权限提升
利用步骤
-
准备套接字:
// 用于向内核发送信息,生成/更新xfrm_state结构体 xfrm_state_fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_XFRM); // 用于接收IPPROTO_AH信息,触发xfrm_input recvfd = socket(AF_INET, SOCK_RAW, IPPROTO_AH); // 用于发送自定义数据包 sendfd = socket(AF_INET, SOCK_RAW, IPPROTO_AH); -
触发漏洞:
trigger_oob(...); -
调试分析:
- 在关键函数设置断点:
b xfrm_alloc_replay_state_esn b xfrm_init_replay b xfrm_replay_verify_len b xfrm_replay_advance_esn - 观察
replay_window和bmp_len的值变化 - 确认越界写操作的发生
- 在关键函数设置断点:
-
权限提升:
- 通过喷射技术使cred结构体位于
xfrm_replay_state_esn结构体之后 - 利用越界写操作清零关键字段,使线程获得root权限
- 修改主进程权限实现提权
- 通过喷射技术使cred结构体位于
实验环境搭建
工具准备
- QEMU:用于运行目标内核的虚拟机
- GDB:用于内核调试
- 漏洞利用代码(exp)
环境配置步骤
-
启动QEMU虚拟机:
qemu-system-x86_64 -kernel bzImage -hda wheezy.img -m 512M -nographic \ -append "console=ttyS0 root=/dev/sda" -net user,hostfwd=tcp::10011-:22 -net nic -s -
上传工具:
./upload setcap ./upload exp -
设置权限:
./setcap cap_net_raw,cap_net_admin=eip ./exp su nobody -
启动GDB调试:
gdb vmlinux target remote:1234
关键问题思考
-
造成漏洞的点在哪儿?
- 漏洞点在
xfrm_replay_verify_len函数缺少对replay_window和bmp_len的大小检测
- 漏洞点在
-
造成越界访问的参数是哪些,如何控制?
- 可控参数:
net_seq、replay_esn->seq、replay_esn->replay_window和replay_esn->seq_hi - 通过构造特定的网络数据包来控制这些参数
- 可控参数:
-
其他利用思路?
- 除了修改cred结构体,还可以考虑修改其他内核关键数据结构
- 可以结合其他漏洞实现更稳定的利用
- 可以尝试绕过SMAP/SMEP等防护机制
防护措施
- 及时更新内核,应用补丁
- 限制普通用户使用raw socket的权限
- 启用内核防护机制如KASLR、SMEP、SMAP等
- 监控异常的内核内存访问行为
总结
CVE-2017-7184是一个典型的内核内存越界漏洞,通过精心构造IPSec协议数据包,可以触发内核越界写操作。理解该漏洞需要对Linux内核网络协议栈、内存管理机制有深入认识。漏洞利用过程涉及多个关键步骤,包括SA结构体操作、内存喷射和权限修改等。该漏洞的分析和利用过程为研究内核漏洞提供了很好的案例。