CVE-2022-50004 in Linux
摘要
由 VulDB • 2026-06-08
在 Linux 内核中,`CR2` 寄存器保存了导致页错误(Page Fault)的虚拟地址。当内核尝试访问该地址时,发现它没有对应的物理页面映射,从而触发异常。
### 1. 关键信息分析
* **CR2: `00000000000000c0`** * 这是导致崩溃的**虚拟地址**。 * 该地址非常低(`0xc0` = 192 字节),通常意味着**空指针解引用**或**野指针访问**。 * 在 x86_64 架构中,用户空间地址通常从 `0x00007f...` 开始,内核空间地址从 `0xffff88...` 开始。`0xc0` 是一个无效的内核地址,表明代码试图访问一个未初始化或已释放的指针所指向的位置。
* **Call Trace 分析** ``` xfrmi_xmit+0xde/0x460 ? tcf_bpf_act+0x13d/0x2a0 dev_hard_start_xmit+0x72/0x1e0 __dev_queue_xmit+0x251/0xd30 ip_finish_output2+0x140/0x550 ip_push_pending_frames+0x56/0x80 raw_sendmsg+0x663/0x10a0 ... __sys_sendto+0xeb/0x130 ``` * **触发路径**:用户空间调用 `sendto()` 系统调用,通过 `raw_sendmsg()` 发送原始套接字(Raw Socket)数据包。 * **网络栈路径**:数据包经过 IP 层输出(`ip_finish_output2`),进入队列传输(`__dev_queue_xmit`),最终由驱动层的 `dev_hard_start_xmit` 发送。 * **关键函数**:`xfrmi_xmit+0xde/0x460` * `xfrmi` 是 **XFRM Interface**(IPsec 接口)的驱动模块。 * 该函数是 XFRM 接口的传输函数,负责将加密后的数据包交给底层网络设备发送。 * 偏移量 `+0xde` 表示崩溃发生在 `xfrmi_xmit` 函数的第 0xde 字节处。
* **模块加载状态** ``` Modules linked in: netconsole veth br_netfilter bridge bonding virtio_net [last unloaded: netconsole]
``` * `xfrmi` 模块**未显示在已加载模块列表中**。 * 这可能有两种情况: 1. `xfrmi` 是**内置内核模块**(built-in),因此不会出现在 `lsmod` 或模块列表中。 2. 或者模块在崩溃前被卸载,但内核仍保留了其代码段(较少见,除非是动态加载后卸载但引用未清理)。 * 更可能的情况是:`xfrmi` 是内核内置的 IPsec 支持部分。
---
### 2. 根本原因推断
#### ✅ 最可能的原因:**空指针解引用(Null Pointer Dereference)**
在 `xfrmi_xmit` 函数中,内核试图访问一个指针成员,但该指针为 `NULL`。
- **为什么是 `0xc0`?** - 如果指针本身是 `NULL`(即 `0x0`),那么访问其成员(如 `ptr->field`)会导致地址为 `field_offset`。 - `0xc0` 可能是某个结构体成员的偏移量。例如,如果代码执行了 `skb->xfrm_state->...`,而 `xfrm_state` 为 `NULL`,且访问的是偏移为 `0xc0` 的字段,则 CR2 会是 `0xc0`。 - 或者,代码中有一个指针 `p`,其值为 `0x0`,然后执行了 `p->some_field`,其中 `some_field` 的偏移是 `0xc0`。
#### ???? 具体场景分析
1. **IPsec 配置错误或缺失 SA(Security Association)** - `xfrmi_xmit` 期望数据包已经经过 IPsec 策略处理,并附加了 `xfrm_state` 信息。 - 如果数据包没有正确的 IPsec 状态(例如,策略未正确配置,或 SA 已过期/删除),`xfrm_state` 指针可能为 `NULL`。 - 当驱动尝试访问 `xfrm_state` 的成员时,触发页错误
VulDB is the best source for vulnerability data and more expert information about this specific topic.