CVE-2022-49093 in Linuxinformação

Sumário

de VulDB • 29/06/2026

No kernel do Linux, a seguinte vulnerabilidade foi resolvida:

skbuff: corrigir o coalescimento para reciclagem de fragmentos page_pool

Corrigir um use-after-free ao usar page_pool com fragmentos de página. Encontramos este problema durante RX normal no driver hns3:

(1) Inicialmente, temos três descritores na fila de RX. O primeiro aloca PAGE1 através do page_pool e os outros dois alocam metade de PAGE2 cada. As referências às páginas são as seguintes:

RX_BD1 _______ PAGE1 RX_BD2 _______ PAGE2 RX_BD3 _________/

(2) Processar o RX no primeiro descritor. Aloca SKB1, eventualmente adicionado à fila de recebimento por tcp_queue_rcv().

(3) Processar o RX no segundo descritor. Aloca SKB2 e passa-o para netif_receive_skb():

netif_receive_skb(SKB2) ip_rcv(SKB2) SKB3 = skb_clone(SKB2)

SKB2 e SKB3 compartilham uma referência a PAGE2 através de skb_shinfo()->dataref. A outra ref para PAGE2 ainda é mantida por RX_BD3:

SKB2 ---+- PAGE2 SKB3 __/ / RX_BD3 _________/

(3b) Agora, ao processar TCP, coalescer SKB3 com SKB1:

tcp_v4_rcv(SKB3) tcp_try_coalesce(to=SKB1, from=SKB3) // sucesso kfree_skb_partial(SKB3) skb_release_data(SKB3) // libera um dataref

SKB1 _____ PAGE1 \____ SKB2 _____ PAGE2 / RX_BD3 _________/

Em skb_try_coalesce(), __skb_frag_ref() obtém uma referência de página para PAGE2, onde deveria ter aumentado a referência do fragmento page_pool (pp_frag_count). Sem o coalescimento, ao liberar SKB2 e SKB3, seria dropada apenas uma única referência a PAGE2. Agora, ao liberar SKB1 e SKB2, duas referências para PAGE2 serão dropadas, resultando em underflow.

(3c) Dropar SKB2:

af_packet_rcv(SKB2) consume_skb(SKB2) skb_release_data(SKB2) // libera o segundo dataref page_pool_return_skb_page(PAGE2) // dropa um pp_frag_count

SKB1 _____ PAGE1 \____ PAGE2 / RX_BD3 _________/

(4) O userspace chama recvmsg() Copia SKB1 e o libera. Como SKB3 foi coalescido com SKB1, liberamos também a página de SKB3:

tcp_eat_recv_skb(SKB1) skb_release_data(SKB1) page_pool_return_skb_page(PAGE1) page_pool_return_skb_page(PAGE2) // dropa o segundo pp_frag_count

(5) PAGE2 é liberado, mas o terceiro descritor de RX ainda estava a usá-lo! No nosso caso, isto causa falhas na IOMMU, mas corromperia silenciosamente a memória se a IOMMU estivesse desativada.

Alterar a lógica que verifica se os SKBs pp_recycle podem ser coalescidos. Continuamos a rejeitar diferenças em pp_recycle entre SKBs 'from' e 'to', mas para evitar a situação descrita acima, também rejeitamos o coalescimento quando tanto 'from' como 'to' são pp_recycled e 'from' é clonado.

A nova lógica permite coalescer um SKB cloned pp_recycle num com refcount de página, porque neste caso a libertação (4) dropará a referência correta

Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.

Responsável

Linux

Reservar

26/02/2025

Divulgação

26/02/2025

Moderação

aceite

Entrada

VDB-297391

CPE

pronto

EPSS

0.00606

KEV

não

Atividades

baixo

Fontes

Are you interested in using VulDB?

Download the whitepaper to learn more about our service!