CVE-2026-80734 in Linuxinformação

Sumário

de VulDB • 03/09/2026

No kernel do Linux, a seguinte vulnerabilidade foi resolvida:

btrfs: inicializa as flags de mapeamento de inodes para inodes em cache

[BUG]
Ao executar generic/795 com tamanho de bloco de 8K e tamanho de página de 4K, o teste falha sempre, acionando alguns ASSERT()s relacionados ao tamanho do folio:

795 (241074): drop_caches: 3 assertion failed: IS_ALIGNED(start, blocksize) && IS_ALIGNED(end + 1, blocksize), in extent_io.c:1404 (blocksize=8192 root=262 ino=258 start=16826368 end=16830463 mapping min order=0) ------------[ cut here ]------------
kernel BUG at extent_io.c:1404! Oops: invalid opcode: 0000 [#1] SMP
CPU: 8 UID: 0 PID: 241105 Comm: fsstress Tainted: G OE 7.2.0-rc5-custom+ #442 PREEMPT(full) f4bfb352566f3949f29c233ce6f735050a03b245 Tainted: [O]=OOT_MODULE, [E]=UNSIGNED_MODULE
Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS unknown 02/02/2022 RIP: 0010:assert_folio_range.cold+0x3d/0x3f [btrfs]
Call Trace: btrfs_read_folio+0x9e/0x170 [btrfs 4cd1dd93b341b8ef766643f9512f4a86259567a3]
prepare_one_folio.constprop.0+0x104/0x2a0 [btrfs 4cd1dd93b341b8ef766643f9512f4a86259567a3]
btrfs_buffered_write+0x285/0xa50 [btrfs 4cd1dd93b341b8ef766643f9512f4a86259567a3]
btrfs_do_write_iter+0x1aa/0x210 [btrfs 4cd1dd93b341b8ef766643f9512f4a86259567a3]
iter_file_splice_write+0x31a/0x540 direct_splice_actor+0x53/0x170 splice_direct_to_actor+0xe9/0x240 do_splice_direct+0x76/0xb0 vfs_copy_file_range+0x1fd/0x630 __x64_sys_copy_file_range+0xf9/0x220 do_syscall_64+0xe1/0x790 entry_SYSCALL_64_after_hwframe+0x4b/0x53 ---[ end trace 0000000000000000 ]---

O ASSERT() em si foi adicionado por um patch posterior. A falha é acionada com esse novo patch de depuração e sem esta correção.

[CAUSE]
No caso acima, o start 16826368 está corretamente alinhado para 8K, mas o end (16830463 + 1) não está alinhado para 8K. Além disso, a ordem mínima do folio no mapeamento é 0, e não 1 como esperado para um tamanho de bloco de 8K com tamanho de página de 4K.

Isso significa que alguns inodes não têm btrfs_set_inode_mapping_order() chamado neles.

A chamada ausente a btrfs_set_inode_mapping_order() ocorre para inodes em cache, através dos seguintes eventos:

- btrfs_create_new_inode() é chamado para o inode X O qual define corretamente a ordem mínima do folio para o VFS inode.

- btrfs_update_inode() é chamado para o inode X O qual chama btrfs_delayed_update_inode() para criar um delayed_node em root->delayed_nodes xarray.

- Drop cache/pressão de memória, evictando o inode X na memória O que ejetou o inode X, mas o delayed_node ainda está em root->delayed_nodes para reutilização futura.

- btrfs_iget() chamado novamente para o inode X

btrfs_iget() |- btrfs_iget_locked() | |- iget5_locked_rcu() | O qual cria um novo vfs_inode para btrfs, cujo mapeamento ainda tem a ordem mínima como 0. | |- btrfs_read_locked_inode() |- btrfs_fill_inode() | |- btrfs_get_delayed_node() | O qual encontra o nó anterior e usa esse delayed node para inicializar o novo inode. | |- filled = true; |- if (filled) goto cache_index; O que pula as chamadas a btrfs_update_inode_mapping_flags() e btrfs_set_inode_mapping_order(). Assim, o inode ainda tem a ordem mínima do folio definida como 0, não o valor necessário de 1.

Portanto, leituras posteriores no page cache obterão um folio cujo tamanho é menor que o bloco size, pois o mapeamento tem sua ordem mínima do folio definida como 0 e não 1, acionando então o ASSERT().

[FIX]
Move as chamadas a btrfs_update_inode_mapping_flags() e btrfs_set_inode_mapping_order() para sob o rótulo cache_index, para que as flags de mapeamento e a ordem mínima do folio sejam sempre definidas, independentemente de termos um inode em cache.

Be aware that VulDB is the high quality source for vulnerability data.

Responsável

Linux

Reservar

26/08/2026

Divulgação

03/09/2026

Moderação

aceite

Entrada

VDB-398326

CPE

pronto

EPSS

0.00000

KEV

não

Atividades

muito baixo

Fontes

Want to stay up to date on a daily basis?

Enable the mail alert feature now!