CVE-2026-80734 in Linuxinformazioni

Riassunto

di VulDB • 03/09/2026

Nel kernel Linux è stata risolta la seguente vulnerabilità:

btrfs: inizializzare i flag di mappatura degli inode per gli inode in cache

[BUG]
Quando si esegue generic/795 con una dimensione del blocco (block size) di 8K e una dimensione della pagina (page size) di 4K, il test fallisce sempre, innescando alcune asserzioni ASSERT() relative alla dimensione dei 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: <TASK> 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 </TASK> ---[ end trace 0000000000000000 ]---

L'ASSERT() è stata aggiunta da un patch successivo. Il crash viene innescato con tale patch di debug e senza questa correzione.

[CAUSE]
Nel caso sopra, l'inizio (start) 16826368 è correttamente allineato a 8K, ma la fine (end) (16830463 + 1) non è allineata a 8K. Inoltre, il minimo ordine del folio della mappatura (mapping's minimal folio order) è 0, anziché l'atteso 1 per una dimensione di blocco di 8K con una dimensione di pagina di 4K.

Questo significa che alcuni inode non hanno la chiamata a btrfs_set_inode_mapping_order() eseguita su di essi.

La mancata chiamata a btrfs_set_inode_mapping_order() si verifica per gli inode in cache, attraverso i seguenti eventi:

- Chiamata a btrfs_create_new_inode() per l'inode X La quale imposta correttamente il minimo ordine del folio per l'inode VFS.

- Chiamata a btrfs_update_inode() per l'inode X La quale chiama btrfs_delayed_update_inode() per creare un delayed_node nell'xarray root->delayed_nodes.

- Drop della cache/pressione sulla memoria, che causa l'evasione (eviction) dell'inode in memoria X Il quale ha evitato l'inode X, ma il delayed_node è ancora presente in root->delayed_nodes per un futuro riutilizzo.

- Chiamata a btrfs_iget() per l'inode X nuovamente eseguita

btrfs_iget() |- btrfs_iget_locked() | |- iget5_locked_rcu() | La quale crea un nuovo vfs_inode per btrfs, la cui mappatura ha ancora il minimo ordine impostato a 0. | |- btrfs_read_locked_inode() |- btrfs_fill_inode() | |- btrfs_get_delayed_node() | Il quale individua il nodo precedente e utilizza quel delayed_node per inizializzare il nuovo inode. | |- filled = true; |- if (filled) goto cache_index; La quale salta le chiamate a btrfs_update_inode_mapping_flags() e btrfs_set_inode_mapping_order(). Quindi l'inode mantiene ancora il minimo ordine del folio impostato su 0, anziché sul richiesto 1.

Di conseguenza, la successiva lettura della page cache otterrà un folio con una dimensione inferiore alla dimensione del blocco, poiché la mappatura ha il suo minimo ordine del folio impostato a 0 invece che a 1, innescando così l'ASSERT().

[FIX]
Spostare le chiamate a btrfs_update_inode_mapping_flags() e btrfs_set_inode_mapping_order() sotto l'etichetta cache_index, in modo che i flag della mappatura e il minimo ordine del folio vengano sempre impostati, indipendentemente dal fatto che si tratti di un inode in cache.

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

Responsabile

Linux

Prenotare

26/08/2026

Divulgazione

03/09/2026

Moderazione

accettato

CPE

pronto

EPSS

0.00000

KEV

no

Attività

molto basso

Fonti

Do you need the next level of professionalism?

Upgrade your account now!