本文介绍阿里云ECS官方Linux镜像受CVE-2024-57843(virtio-net驱动内存溢出)漏洞的影响范围、镜像修复状态,以及存量实例的修复方法和临时缓解措施。
漏洞概述
CVE-2024-57843是Linux内核virtio-net驱动在处理mergeable RX缓冲区时存在的一个内存溢出缺陷,由上游commit 295525e29a5b(virtio_net: merge dma operations when filling mergeable buffers)引入,并由commit 6aacd1484468(virtio-net: fix overflow inside virtnet_rq_alloc)修复。
Red Hat对该漏洞的评级为Moderate,Ubuntu的评级为Medium。
问题现象
受影响实例在特定条件下可能出现以下现象:
实例无预警崩溃(kernel panic),dmesg中出现
general protection fault或pagealloc: memory corruption相关日志。大文件传输失败,例如通过scp传输约100 MB及以上文件时中断。
内核数据结构静默损坏,表现为页表页、slab对象、
buffer_head等被意外覆盖,最终导致不可预测的系统行为。
根因分析
该漏洞的本质是virtio-net驱动在向mergeable RX缓冲区填充数据时发生了16字节跨页溢出。
在premapped DMA模式(do_dma=true)下,每个frag页需要在页首预留16字节用于存放映射信息。当以下条件同时满足时,驱动会分配一个4096字节(order-0)的页,但实际需要写入16 + 4096 = 4112字节,导致最后16字节写入到物理相邻的下一页,造成内存静默损坏:
序号 | 触发条件 | 说明 |
1 | premapped DMA已激活 | 页首需预留16字节头部。 |
2 | mergeable RX缓冲区且未启用XDP | 决定缓冲区长度的计算路径。 |
3 | MTU >= 4084且流量包长EWMA > 4020 | 使len饱和到4096。 |
4 | frag页从order-3回退到order-0(瞬态内存压力) | order-3页(32 KB)可容纳,order-0(4 KB)不可容纳。 |
影响范围
发行版 | 受影响版本 | 受影响原因 | ECS镜像修复状态 |
Ubuntu | 24.04 LTS | 首版发布即引入(6.8内核基线包含6.6 patch),修复版本为6.8.0-58.60。 | 2025年5月发布的镜像已修复(6.8.0-60-generic)。 |
CentOS Stream | 9 | 跟随RHEL上游,修复版本为5.14.0-570.12.1.el9_6。 | 2025年3月修复版镜像已修复。 |
Fedora | 40(已EOL) | 引入版本为kernel-6.6.2-201.fc40,修复版本为6.12.5-200。 | 已EOL,暂无更新计划。 |
存量实例修复方案
各发行版的修复方案均需要升级内核相关软件包,并重启系统后才能生效。
临时缓解措施
无。建议升级到修复版本的内核。
注意事项
请勿在生产环境设置
net.core.high_order_alloc_disable=1。该参数会在存在漏洞的内核版本大幅增加漏洞触发概率,但在没有漏洞的版本不受影响。新建实例时,请优先选用已修复版本的官方镜像。
如果升级内核后仍出现类似崩溃现象,请收集vmcore并提交工单协助排查。