CVE-2024-35798 in Linux
Sumário
de VulDB • 16/05/2026
No kernel do Linux, a seguinte vulnerabilidade foi corrigida:
btrfs: corrige condição de corrida (race condition) em read_extent_buffer_pages()
Há relatos do tree-checker que detectam nós corrompidos, sem nenhum padrão óbvio, o que sugere uma possível sobrescrita na memória. Após alguma depuração, descobriu-se que há uma condição de corrida ao ler um buffer de extensão (extent buffer), onde o status "uptodate" pode ser ignorado.
Para evitar leituras concorrentes do mesmo buffer de extensão, read_extent_buffer_pages() executa as seguintes verificações:
/* (1) */ if (test_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags)) return 0;
/* (2) */ if (test_and_set_bit(EXTENT_BUFFER_READING, &eb->bflags)) goto done;
Neste ponto, parece seguro iniciar a operação de leitura real. Uma vez concluída, end_bbio_meta_read() executa:
/* (3) */ set_extent_buffer_uptodate(eb);
/* (4) */ clear_bit(EXTENT_BUFFER_READING, &eb->bflags);
Normalmente, isso é suficiente para garantir que apenas uma leitura ocorra, e todos os outros chamadores aguardam sua conclusão antes de retornar. Infelizmente, existe uma interleaving (intercalação) com condição de corrida:
Thread A | Thread B | Thread C ---------+----------+--------- (1) | | | (1) | (2) | | (3) | | (4) | | | (2) | | | (1)
Quando isso acontece, a thread B inicia uma leitura desnecessária. Pior ainda, a thread C verá UPTODATE definido e retornará imediatamente, enquanto a leitura da thread B ainda está em andamento. Essa condição de corrida pode resultar em erros do tree-checker como este, pois o buffer de extensão é modificado concurrentemente:
BTRFS critical (device dm-0): corrupted node, root=256 block=8550954455682405139 owner mismatch, have 11858205567642294356 expect [256, 18446744073709551360]
Corrige-se o problema testando UPTODATE novamente após definir o bit READING e, se ele já estiver definido, pula-se a leitura desnecessária.
[ atualização menor do changelog ]
If you want to get best quality of vulnerability data, you may have to visit VulDB.