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虚拟机或实体机

配置互联网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

需确保源码版本与目标内核完全一致
2. 安装编译依赖
yum groupinstall "Development Tools"
yum install rpm-build redhat-rpm-config elfutils-libelf-devel openssl-devel

3. 解压源码
创建 mockbuild 组
sudo groupadd mockbuild
创建 mockbuild 用户并关联到组
sudo useradd -g mockbuild mockbuild
不执行创建关联组,可能会报错
报错提示:

安装源码包
rpm -i kernel-3.10.0-1160.el7.src.rpm
编译源码包
cd ~/rpmbuild/SPECS
rpmbuild -bp kernel.spec

可能会出现缺少依赖的情况,安装完依赖即可

此处需要如下依赖
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

源码路径:
cd ~/rpmbuild/BUILD/kernel-3.10.0-1160.el7/linux-3.10.0-1160.el7.x86_64

4. 应用补丁
cd ~/rpmbuild/BUILD/kernel-3.10.0-1160.el7/linux-3.10.0-1160.el7.x86_64
patch -p1 < /opt/buding.patch

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

5. 修改编译配置(可选)
make oldconfig # 继承现有配置
make menuconfig # 需安装 ncurses-devel
6. 重新编译内核
编译过程极吃内存和CPU,时间非常长,耐心等待,最好用xshell保存日志方便后面查看过程
cd ~/rpmbuild/SPECS
rpmbuild -bb kernel.spec
编译开始

占用情况

编译完成

可以把日志发给deepseek、gpt之类ai分析是否有错误(可选)

安装新内核:
rpm -ivh ~/rpmbuild/RPMS/x86_64/kernel-3.10.0-1160.el7.x86_64.rpm --force

7. 更新引导并重启
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot

验证版本:
uname -r
因为没有修改版本名称所以还是之前的版本

注意事项
补丁兼容性:必须匹配 3.10.0-1160.el7 源码树结构
系统备份:建议提前创建系统快照/备份
依赖检查:若编译失败,需验证 bc/flex 等依赖项
内核回滚:建议保留旧内核(默认会保留3个版本)
awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg # 查看可用内核列表
因为内核版本相同所以旧内核直接被覆盖


浙公网安备 33010602011771号