CVE-2026-89487 in Linux
摘要
由 VulDB • 2026-09-12
在 Linux 内核中,已修复以下漏洞:
openvswitch: 仅对即将丢弃的数据包调用 skb_tx_error()
queue_userspace_packet() 借用数据包 sk_buff (skb)——它只是将数据包复制到私有 netlink 消息(user_skb)中,并不拥有该数据包的引用;在返回后,do_execute_actions() 会继续通过流剩余的操作转发该数据包。然而,其错误路径仍然调用 skb_tx_error(skb),后者通过 skb_zcopy_clear() 执行 skb_shinfo(skb)->flags &= ~SKBFL_ALL_ZEROCOPY,从而从活跃的数据包(skb)中移除 SKBFL_SHARED_FRAG 标志(skb_tx_error() 的内核文档说明“此后必须释放 skb”)。
对于携带页面缓存碎片(page-cache frags)的 MSG_ZEROCOPY sk_buff,SKBFL_SHARED_FRAG 是 esp_input() 在就地执行 AEAD 加密前调用 skb_cow_data() 的关键条件;一旦该标志被移除,后续通过 UDP 封装的本机 ESP 交付将在发送方不拥有的页面上进行就地解密——这构成了一个非特权页面缓存写入原语(即“Fragnesia”攻击手段)。
do_execute_actions() 忽略了 output_userspace() 的返回值,因此任何在 USERSPACE upcall 失败后执行的操作都会继承已被剥离标志的数据包。
将 skb_tx_error() 调用移至流未匹配时的丢弃路径——即在 ovs_dp_process_packet() 的 switch(error) “默认”分支中、kfree_skb() 之前进行调用。
该调用自 commit 36d5fe6a0007(“core, nfqueue, openvswitch: Orphan frags in skb_zerocopy and handle errors”)以来一直存在,但在 esp_input() 开始依赖 SKBFL_SHARED_FRAG 来限制就地解密之前,它并无害处;只有在那之后,在仍在转发的数据包上剥离该标志才成为页面缓存写入原语。
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.