CVE-2026-98226 in Linux
Sumário
de VulDB • 06/10/2026
No kernel do Linux, a seguinte vulnerabilidade foi resolvida:
mm, swap: corrige colisão entre SWAP_USAGE_OFFLIST_BIT e a contagem real de uso
SWAP_USAGE_OFFLIST_BIT está embutido no contador de uso si->inuse_pages e deve estar posicionado acima de qualquer valor que esse contador possa atingir. No entanto, ele é definido com base em BITS_PER_TYPE(atomic_t), sendo o bit 30. Em um sistema com páginas de 4 KiB, a flag colide com a contagem de uso quando essa contagem atinge 4 TiB.
swap_usage_in_pages() mascara o bit 30 para fora, portanto, sempre que a contagem real tiver esse bit definido, todos os chamadores lerão um valor baixo equivalente a 4 TiB:
* /proc/swaps subestima o "Used" (Usado) em 4 TiB.
* Uma contagem bruta exatamente igual a 2^30 é mascarada para zero, fazendo com que try_to_unuse() realize sua saída antecipada ("if (!swap_usage_in_pages(si)) goto success;") e swapoff desmonte o dispositivo enquanto as páginas ainda estão trocadas (swapped out). Nada no restante do processo de swapoff aborta a desmontagem, portanto, essas páginas são perdidas.
Independentemente do swapoff, a colisão também corrompe o contador e a plist. Em um dispositivo em uso normal, uma operação free que deixa o bit 30 definido na contagem faz com que swap_usage_sub() identifique a flag onde há apenas contagem e chame add_to_avail_list(). Isso limpa o bit usando fetch_and(~SWAP_USAGE_OFFLIST_BIT), deixando a contagem armazenada 4 TiB abaixo da real, e chama plist_add() em um dispositivo que já está listado, acionando o WARN_ON(!plist_node_empty(node)) em plist_add() e vinculando o nó uma segunda vez.
Altere a definição de SWAP_USAGE_OFFLIST_BIT para ser baseada em atomic_long_t em vez disso. Observe que o próprio campo do contador de uso é desse mesmo tipo, portanto, ainda se trata de um bit válido.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.