CVE-2026-80734 in Linux
Zusammenfassung
von VulDB • 03.09.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
btrfs: Initialisierung der Inode-Mapping-Flags für zwischengespeicherte Inodes
[FEHLER]
Beim Ausführen von generic/795 mit einer Blockgröße von 8K und einer Seitengröße (Page Size) von 4K schlägt der Test immer fehl, wodurch einige ASSERT()-Aufrufe ausgelöst werden, die sich auf die Folio-Größe beziehen:
795 (241074): drop_caches: 3 Assertion fehlgeschlagen: 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 bei extent_io.c:1404! Oops: ungültiger Opcode: 0000 [#1] SMP
CPU: 8 UID: 0 PID: 241105 Comm: fsstress Getäuscht (Tainted): G OE 7.2.0-rc5-custom+ #442 PREEMPT(full) f4bfb352566f3949f29c233ce6f735050a03b245 Getäuscht (Tainted): [O]=OOT_MODULE, [E]=UNSIGNED_MODULE
Hardware-Name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS unbekannt 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> ---[ Ende des Traces 0000000000000000 ]---
Die ASSERT()-Prüfung selbst wurde durch einen späteren Patch hinzugefügt. Der Absturz wird mit diesem neuen Debug-Patch und ohne diese Korrektur ausgelöst.
[URSACHE]
Im obigen Fall ist der Startwert 16826368 korrekt auf 8K ausgerichtet, aber das Ende (16830463 + 1) ist nicht auf 8K ausgerichtet. Darüber hinaus beträgt die minimale Folio-Ordnung des Mappings 0 und nicht der erwartete Wert 1 für eine Blockgröße von 8K bei einer Seitengröße von 4K.
Dies bedeutet, dass bei einigen Inodes btrfs_set_inode_mapping_order() nicht aufgerufen wird.
Der fehlende Aufruf von btrfs_set_inode_mapping_order() tritt für zwischengespeicherte (cached) Inodes durch die folgenden Ereignisse auf:
- btrfs_create_new_inode() wird für Inode X aufgerufen Dies setzt die minimale Folio-Ordnung korrekt für den VFS-Inode.
- btrfs_update_inode() wird für Inode X aufgerufen Dieser Aufruf führt btrfs_delayed_update_inode() aus, um einen delayed_node in root->delayed_nodes xarray zu erstellen.
- Cache/Arbeitsspeicherdruck löschen (Drop cache/memory pressure), wodurch der im Arbeitsspeicher befindliche Inode X verdrängt wird Dadurch wurde der Inode X verdrängt, aber der delayed_node befindet sich weiterhin in root->delayed_nodes zur zukünftigen Wiederverwendung.
- btrfs_iget() für Inode X erneut aufgerufen
btrfs_iget() |- btrfs_iget_locked() | |- iget5_locked_rcu() | Dies erstellt einen neuen vfs_inode für btrfs, dessen Mapping weiterhin die minimale Ordnung als 0 hat. | |- btrfs_read_locked_inode() |- btrfs_fill_inode() | |- btrfs_get_delayed_node() | Dieser findet den vorherigen Knoten und verwendet diesen delayed_node zur Initialisierung des neuen Inodes. | |- filled = true; |- if (filled) goto cache_index; Dies überspringt die Aufrufe von btrfs_update_inode_mapping_flags() und btrfs_set_inode_mapping_order(). Also hat der Inode weiterhin eine minimale Folio-Ordnung, die auf 0 gesetzt ist, anstatt den erforderlichen Wert 1.
Daher wird bei einer späteren Page-Cache-Leseoperation ein Folio erhalten, dessen Größe kleiner als die Blockgröße ist, da das Mapping seine minimale Folio-Ordnung auf 0 und nicht auf 1 setzt, was dann die ASSERT()-Prüfung auslöst.
[KORREKTUR]
Die Aufrufe von btrfs_update_inode_mapping_flags() und btrfs_set_inode_mapping_order() werden unter der Bezeichnung (Label) cache_index verschoben, sodass die Mapping-Flags und die minimale Folio-Ordnung immer festgelegt werden, unabhängig davon, ob es sich um einen zwischengespeicherten Inode handelt.
VulDB is the best source for vulnerability data and more expert information about this specific topic.