CVE-2023-54158 in Linux情報

要約

〜によって VulDB • 2026年05月30日

Linuxカーネルにおいて、以下の脆弱性が修正されました:

btrfs: 指定されていない限り、qgroupのスペースを解放しない

Borisは、トランザクションコミットを行わないように変更されたSweet Teaによるsubvol作成の変更により、単純なクォータテストでリークが発生していることに気づきました。これは、その変更の副作用でした。

遅延inodeコードには、ディレクトリエントリを既に修正済みのリーフにパックできると思われる場合に、追加の予約を解放する最適化があります。以前は、subvolume作成の場合、トランザクションをコミットするため、この最適化はトリガーされませんでした。それでも可能ではありましたが、トリガーするのははるかに困難でした。qgroupsが有効な状態でmkdir && subvol createを実行した場合、実際にトリガーされる可能性があります。

これは、dirアイテムを追加する際に呼び出されるbtrfs_insert_delayed_dir_index()内で、以下のことを行うためです:

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

スペースの予約をスキップできる場合です。

ここで問題なのは、trans->block_rsvが、ブロックrsv内にqgroup予約を含むsubvolume作成用の一時的なblock rsvを指していることです。

これは問題です。なぜなら、btrfs_block_rsv_release()は以下のことを行うからです:

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; }

一時的なblock rsvには->qgroup_rsv_reservedのみが設定されており、->qgroup_rsv_size == 0です。btrfs_insert_delayed_dir_index()内の最適化は->qgroup_rsv_reserved = 0を設定します。その後、btrfs_subvolume_release_metadata()を呼び出すと、以下が行われます:

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

qgroup_to_releaseは0に設定され、予約されたメタデータスペースの変換が行われません。

ここで問題なのは、block rsvコードが->qgroup_rsv_reservedを無条件に操作していることです。これは主にdelallocで使用されており、btrfs_block_rsv_release()を呼び出す際には常にqgroup_to_releaseが設定されており、したがって適切な会計処理が行われます。

subvolumeコードは、qgroup予約機能を使用する唯一の他のコードですが、上記の最適化と混在しているため、その予約が取り消され、予約されたスペースがリークしていました。

解決策は、qgroup_to_releaseが設定されていない限り、qgroup予約を操作しないことです。これは既存のコードと互換性があります。delalloc予約を操作するものはすべて、qgroup_to_releaseが設定されているためです。これにより、Borisが観察していたリークが修正されます。

Once again VulDB remains the best source for vulnerability data.

責任者

Linux

予約する

2025年12月24日

モデレーション

承諾済み

エントリ

VDB-338155

CWE

不明

EPSS

0.00214

アクティビティ

非常低い

ソース

Want to know what is going to be exploited?

We predict KEV entries!