Linux kernel内存泄露漏洞(CNVD-2025-02099)解决方案

Linux kernel 内存泄露漏洞(CNVD-2025-02099)

基本信息

  • CNVD-ID: CNVD-2025-02099
  • CVE ID: CVE-2024-27388
  • 公开日期: 2025-01-22
  • 危害级别: 中 (CVSS:3.1/AV:L/AC:L/Au:S/C:N/I:N/A:C)
  • 漏洞类型: 通用型漏洞

影响版本

受影响的内核版本范围:

Linux kernel >=6.7,<6.7.11
Linux kernel >=6.8,<6.8.2
Linux kernel >=4.20,<5.4.273
Linux kernel >=5.5,<5.10.214
Linux kernel >=5.11,<5.15.153
Linux kernel >=5.16,<6.1.83
Linux kernel >=6.2,<6.6.23
Linux kernel >=3.10,<4.19.311

漏洞描述

Linux kernel 是美国 Linux 基金会的开源操作系统内核。
漏洞根源:gssx_dec_option_array 函数存在内存泄漏问题,导致未正确释放分配的内存。
风险影响:可能引发系统资源耗尽,进而影响服务稳定性(如触发 OOM-Killer 终止进程)。
当前状态:暂无公开漏洞利用细节。

修复方案

升级内核版本:
通过官方补丁修复(提交哈希 dd292e884c649f9b1c18af0ec75ca90b390cd044)Linux官方补丁
临时缓解措施(若无法立即升级):
监控系统内存使用情况,及时重启受影响服务。

影响内核范围常见系统

内核版本 >=6.7,<6.7.11:
openSUSE Leap 15.5:
openSUSE Leap 15.5 是基于 SUSE Linux Enterprise 15 SP5 的社区版本,通常使用较新的内核版本。

内核版本 >=6.8,<6.8.2:
openSUSE Leap 15.6:
openSUSE Leap 15.6 是 openSUSE 的下一个版本,预计将使用内核版本 6.8。
内核版本 >=4.20,<5.4.273:
Debian 10 "Buster":
Debian 10 "Buster" 默认使用内核版本 4.19,但用户可以选择安装更新的内核版本。
Ubuntu 20.04 LTS "Focal Fossa":
Ubuntu 20.04 LTS 默认使用内核版本 5.4,但用户可以选择安装更新的内核版本。

内核版本 >=5.5,<5.10.214:
Debian 11 "Bullseye":
Debian 11 "Bullseye" 默认使用内核版本 5.10。
Ubuntu 21.04 "Hirsute Hippo":
Ubuntu 21.04 默认使用内核版本 5.11。

内核版本 >=5.11,<5.15.153:
Debian 11 "Bullseye":
Debian 11 "Bullseye" 默认使用内核版本 5.10,但用户可以选择安装更新的内核版本。
Ubuntu 21.10 "Impish Indri":
Ubuntu 21.10 默认使用内核版本 5.13。

内核版本 >=5.16,<6.1.83:
Debian 12 "Bookworm":
Debian 12 "Bookworm" 预计将使用内核版本 5.16 或更高版本。
Ubuntu 22.04 LTS "Jammy Jellyfish":
Ubuntu 22.04 LTS 默认使用内核版本 5.15,但用户可以选择安装更新的内核版本。

内核版本 >=6.2,<6.6.23:
openSUSE Leap 15.6:
openSUSE Leap 15.6 预计将使用内核版本 6.2 或更高版本。

内核版本 >=3.10,<4.19.311:
CentOS 7 默认使用内核版本 3.10。
RHEL 7 默认使用内核版本 3.10。

前置

准备centos7虚拟机或实体机
image
配置互联网yum源

sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https://repo.huaweicloud.com/repository/conf/CentOS-7-reg.repo

准备补丁包

vi /opt/buding.path

写入补丁

--- a/net/sunrpc/auth_gss/gss_rpc_xdr.c
+++ b/net/sunrpc/auth_gss/gss_rpc_xdr.c
@@ -250,8 +250,8 @@ static int gssx_dec_option_array(struct xdr_stream *xdr,
 
 	creds = kzalloc(sizeof(struct svc_cred), GFP_KERNEL);
 	if (!creds) {
-		kfree(oa->data);
-		return -ENOMEM;
+		err = -ENOMEM;
+		goto free_oa;
 	}
 
 	oa->data[0].option.data = CREDS_VALUE;
@@ -265,29 +265,40 @@ static int gssx_dec_option_array(struct xdr_stream *xdr,
 
 		/* option buffer */
 		p = xdr_inline_decode(xdr, 4);
-		if (unlikely(p == NULL))
-			return -ENOSPC;
+		if (unlikely(p == NULL)) {
+			err = -ENOSPC;
+			goto free_creds;
+		}
 
 		length = be32_to_cpup(p);
 		p = xdr_inline_decode(xdr, length);
-		if (unlikely(p == NULL))
-			return -ENOSPC;
+		if (unlikely(p == NULL)) {
+			err = -ENOSPC;
+			goto free_creds;
+		}
 
 		if (length == sizeof(CREDS_VALUE) &&
 		    memcmp(p, CREDS_VALUE, sizeof(CREDS_VALUE)) == 0) {
 			/* We have creds here. parse them */
 			err = gssx_dec_linux_creds(xdr, creds);
 			if (err)
-				return err;
+				goto free_creds;
 			oa->data[0].value.len = 1; /* presence */
 		} else {
 			/* consume uninteresting buffer */
 			err = gssx_dec_buffer(xdr, &dummy);
 			if (err)
-				return err;
+				goto free_creds;
 		}
 	}
 	return 0;
+
+free_creds:
+	kfree(creds);
+free_oa:
+	kfree(oa->data);
+	oa->data = NULL;
+	return err;
 }
 
 static int gssx_dec_status(struct xdr_stream *xdr,

CentOS 7 内核补丁编译指南(3.10.0-1160.el7.x86_64)

对内核进行修改有风险,若要在生产环境使用后果自行承担
其他Linux系统可以参考此文章

1. 获取内核源码包

从 CentOS 官方存档下载对应版本的源码包(SRPM):

wget https://vault.centos.org/7.9.2009/updates/Source/SPackages/kernel-3.10.0-1160.el7.src.rpm

image
需确保源码版本与目标内核完全一致

2. 安装编译依赖

yum groupinstall "Development Tools"
yum install rpm-build redhat-rpm-config elfutils-libelf-devel openssl-devel

image

3. 解压源码

创建 mockbuild 组

sudo groupadd mockbuild

创建 mockbuild 用户并关联到组

sudo useradd -g mockbuild mockbuild

不执行创建关联组,可能会报错
报错提示:
image
安装源码包

rpm -i kernel-3.10.0-1160.el7.src.rpm

编译源码包

cd ~/rpmbuild/SPECS
rpmbuild -bp kernel.spec

image
可能会出现缺少依赖的情况,安装完依赖即可
image
此处需要如下依赖

yum install net-tools xmlto asciidoc hmaccalc python-devel newt-devel \
perl-ExtUtils-Embed pesign elfutils-devel binutils-devel audit-libs-devel \
java-devel numactl-devel pciutils-devel ncurses-devel python-docutils

image

源码路径:

cd ~/rpmbuild/BUILD/kernel-3.10.0-1160.el7/linux-3.10.0-1160.el7.x86_64

image

4. 应用补丁

cd ~/rpmbuild/BUILD/kernel-3.10.0-1160.el7/linux-3.10.0-1160.el7.x86_64
patch -p1 < /opt/buding.patch

image
结果对比发现及时源文件的行数不对依然可以正确修改文件
image

5. 修改编译配置(可选)

make oldconfig    # 继承现有配置
make menuconfig   # 需安装 ncurses-devel

6. 重新编译内核

编译过程极吃内存和CPU,时间非常长,耐心等待,最好用xshell保存日志方便后面查看过程

cd ~/rpmbuild/SPECS
rpmbuild -bb kernel.spec

编译开始
image
占用情况
image
编译完成
image
可以把日志发给deepseek、gpt之类ai分析是否有错误(可选)
image

安装新内核:

rpm -ivh ~/rpmbuild/RPMS/x86_64/kernel-3.10.0-1160.el7.x86_64.rpm --force

image

7. 更新引导并重启

grub2-mkconfig -o /boot/grub2/grub.cfg
reboot

image

验证版本:

uname -r

因为没有修改版本名称所以还是之前的版本
image

注意事项

补丁兼容性:必须匹配 3.10.0-1160.el7 源码树结构
系统备份:建议提前创建系统快照/备份
依赖检查:若编译失败,需验证 bc/flex 等依赖项
内核回滚:建议保留旧内核(默认会保留3个版本)

awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg  # 查看可用内核列表
因为内核版本相同所以旧内核直接被覆盖

image

posted @ 2025-02-18 12:38  MiyauchiRenge  阅读(315)  评论(0)    收藏  举报