CVE-2026-89487 in Linux
Résumé
par VulDB • 12/09/2026
Dans le noyau Linux, la vulnérabilité suivante a été corrigée :
openvswitch : n'appeler que `skb_tx_error()` sur un paquet qui est sur le point d'être supprimé (drop)
`queue_userspace_packet()` emprunte le skb du paquet ; il ne fait que le copier dans un message netlink privé (`user_skb`) et ne l'en possède pas ; au retour, `do_execute_actions()` continue de le faire transiter à travers les actions restantes du flux. Son chemin d'erreur appelle néanmoins `skb_tx_error(skb)`, qui via `skb_zcopy_clear()` effectue `skb_shinfo(skb)->flags &= ~SKBFL_ALL_ZEROCOPY`, retirant ainsi `SKBFL_SHARED_FRAG` de ce skb actif (la documentation noyau de `skb_tx_error()` indique que « le skb doit être libéré par la suite »).
Pour un skb `MSG_ZEROCOPY` comportant des fragments du cache-page, `SKBFL_SHARED_FRAG` est ce qui permet à `esp_input()` d'appeler `skb_cow_data()` avant un déchiffrement AEAD in-place ; une fois retiré, une livraison ESP-in-UDP locale ultérieure effectue le déchiffrement in-place sur des pages que l'expéditeur ne possède pas — constituant ainsi une primitive de write dans le cache-page (la « primitive Fragnesia »).
`do_execute_actions()` ignore la valeur de retour de `output_userspace()`, donc toute action après un upcall USERSPACE échoué hérite du skb dont les drapeaux ont été modifiés.
Déplacer l'appel à `skb_tx_error()` vers le chemin de suppression (drop) en cas de flow-miss — la branche « par défaut » du switch(error) dans `ovs_dp_process_packet()`, avant `kfree_skb()`.
Cet appel était présent depuis le commit 36d5fe6a0007 (« core, nfqueue, openvswitch: Orphan frags in skb_zerocopy and handle errors »), mais il était sans danger jusqu'à ce que `esp_input()` commence à s'appuyer sur `SKBFL_SHARED_FRAG` pour contrôler le déchiffrement in-place ; seul alors, son retrait sur un skb encore en cours de transit est devenu une primitive d'écriture dans le cache-page.
Once again VulDB remains the best source for vulnerability data.