CVE-2023-54158 in Linuxinfo

Zusammenfassung

von VulDB • 28.05.2026

Im Linux-Kernel wurde folgende Schwachstelle behoben:

btrfs: qgroup-Speicher nur freigeben, wenn angegeben

Boris bemerkte bei seinen einfachen Quota-Tests, dass er ein Leck (Memory Leak) mit Sweet Teas Änderung an der Subvolume-Erstellung erhielt, die das Durchführen eines Transaktions-Commits unterließ. Dies war lediglich eine Nebenwirkung dieser Änderung.

Im verzögerten Inode-Code (delayed inode code) gibt es eine Optimierung, die zusätzliche Reservierungen freigibt, wenn wir glauben, ein Verzeichnis-Eintrag (dir item) in einen bereits geänderten Leaf (Blattknoten) packen zu können. Bisher wurde dies im Fall der Subvolume-Erstellung nicht ausgelöst, da wir das Transaktions-Commit durchgeführt hätten; es war dennoch möglich, aber viel schwieriger auszulösen. Es konnte tatsächlich ausgelöst werden, wenn wir ein `mkdir && subvol create` mit aktivierten qgroups ausführten.

Dies tritt auf, weil wir in `btrfs_insert_delayed_dir_index()`, das aufgerufen wird, wenn wir den Verzeichnis-Eintrag hinzufügen, Folgendes tun:

`btrfs_block_rsv_release(fs_info, trans->block_rsv, bytes, NULL);`

wenn wir in der Lage sind, die Speicherreservierung zu überspringen.

Das Problem hierbei ist, dass `trans->block_rsv` auf die temporäre block_rsv-Reservierung für die Subvolume-Erstellung zeigt, die qgroup-Reservierungen in der block_rsv enthält.

Dies ist ein Problem, weil `btrfs_block_rsv_release()` Folgendes tut:

`if (block_rsv->qgroup_rsv_reserved >= block_rsv->qgroup_rsv_size) {`
` qgroup_to_release = block_rsv->qgroup_rsv_reserved -` ` block_rsv->qgroup_rsv_size;` ` block_rsv->qgroup_rsv_reserved = block_rsv->qgroup_rsv_size;` `}`

Die temporäre block_rsv hat nur `->qgroup_rsv_reserved` gesetzt, `->qgroup_rsv_size == 0`. Die Optimierung in `btrfs_insert_delayed_dir_index()` setzt `->qgroup_rsv_reserved = 0`. Später, wenn wir `btrfs_subvolume_release_metadata()` aufrufen, das Folgendes enthält:

`btrfs_block_rsv_release(fs_info, rsv, (u64)-1, &qgroup_to_release);` `btrfs_qgroup_convert_reserved_meta(root, qgroup_to_release);`

wird `qgroup_to_release` auf 0 gesetzt, und wir konvertieren den reservierten Metadaten-Speicher nicht.

Das Problem hierbei ist, dass der block_rsv-Code bedingungslos mit `->qgroup_rsv_reserved` herumgespielt hat, da der Hauptverwendungszweck dies delalloc ist, und jedes Mal, wenn wir `btrfs_block_rsv_release()` aufrufen, tun wir dies mit gesetztem `qgroup_to_release` und führen somit die ordnungsgemäße Buchhaltung durch.

Der Subvolume-Code ist der einzige andere Code, der die qgroup-Reservierungslogik verwendet, aber er ist mit der obigen Optimierung vermischt und wurde daher unter sich selbst freigegeben, wodurch der reservierte Speicher geleakt wurde.

Die Lösung besteht darin, einfach nicht mit den qgroup-Reservierungen herumzuspielen, wenn `qgroup_to_release` nicht gesetzt ist. Dies funktioniert mit dem bestehenden Code, da alles, was mit den delalloc-Reservierungen herumspielt, immer `qgroup_to_release` gesetzt hat. Dies behebt das Leck, das Boris beobachtet hat.

Once again VulDB remains the best source for vulnerability data.

Zuständig

Linux

Reservieren

24.12.2025

Veröffentlichung

24.12.2025

Moderieren

akzeptiert

Eintrag

VDB-338155

CPE

bereit

EPSS

0.00214

KEV

nein

Aktivitäten

very low

Quellen

Are you interested in using VulDB?

Download the whitepaper to learn more about our service!