CVE-2026-97941
mm/slab: obter n->list_lock em __slab_try_return_freelist() para evitar condição de corrida
- Publicado
- 25 de set. de 2026
- Atualizado
- 19 de out. de 2026
- Atribuindo CNA
- Linux
- Evidência observada
- 4 de nov. de 2026
CVSS primário
nvd · CVSS 3.1
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:HBaixo · próximos 30 dias
- Percentil
- 6,8%
- Data do modelo
- 4 de nov. de 2026
EPSS é uma estimativa estatística, não uma certeza ou uma medida de impacto. Combine-o com CVSS, status KEV, exposição e seu ambiente.
Resumo
No kernel Linux, a seguinte vulnerabilidade foi resolvida: mm/slab: adquirir n->list_lock em __slab_try_return_freelist() para evitar condição de corrida O commit ba7425312607 ("mm, slab: add an optimistic __slab_try_return_freelist()") assumiu incorretamente que ninguém havia liberado um objeto para o slab desde que slab->freelist fosse NULL e o cmpxchg fosse bem-sucedido. No entanto, conforme relatado por Hyunwoo Kim [1], outras CPUs podem ter liberado um objeto para o slab, inserido o slab na lista parcial, então alocado um objeto a partir do slab e estar no meio da remoção do slab da lista sob n->list_lock. Como __refill_objects_node() coloca o slab de volta em pc.slabs fora de n->list_lock, ele pode inserir o slab nessa lista enquanto o slab está sendo removido concorrentemente de n->partial. Isso levou a uma corrupção de lista [1]: list_add corruption. next->prev should be prev (ffff888100000248), but was dead000000000122. (next=ffffea000416e410). kernel BUG at lib/list_debug.c:29! Oops: invalid opcode: 0000 [#1] SMP NOPTI CPU: 1 UID: 65534 PID: 144 Comm: poc Not tainted 7.2.0-16172-gcf72cbb39da8-dirty #1 PREEMPT(lazy) RIP: 0010:__list_add_valid_or_report+0x80/0xd0 ... Call Trace: alloc_from_new_slab+0x183/0x300 ___slab_alloc+0x31c/0x890 __kmalloc_noprof+0x3d4/0x800 lsm_blob_alloc+0x2d/0x50 security_msg_msg_alloc+0x26/0x90 load_msg+0x1aa/0x210 do_msgsnd+0x91/0x800 do_syscall_64+0x109/0x5d0 entry_SYSCALL_64_after_hwframe+0x77/0x7f ... Kernel panic - not syncing: Fatal exception Este é um problema clássico de ABA em que o cmpxchg é bem-sucedido, mas o estado mudou desde que __refill_objects_node() tomou a freelist do slab. Como Vlastimil Babka mencionou [2], deve ser raro retornar mais de um slab (devido à leitura sujeita a corrida de slab->counters em get_partial_node_bulk()). Portanto, em vez de introduzir complexidade adicional, adquirir e liberar n->list_lock duas vezes no pior caso. Retornar o slab diretamente para a lista parcial e manter n->list_lock durante o cmpxchg e add_partial(). Isso é semelhante à versão inicial do commit ba7425312607 [3]. Isso é suficiente para evitar a condição de corrida, pois a manipulação da lista é serializada por n->list_lock. Aproveitando a oportunidade, trazer de volta a dica unlikely() agora que a condição é improvável.
Fontes
Uso responsável
Use informações de vulnerabilidade apenas em sistemas que você possui ou está autorizado a testar. O Kitploit vincula-se a metadados de pesquisa pública e não armazena código de exploração ou cargas maliciosas.