CVE-2023-53635CVE-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标志设置之后再设置超时值。