LinuxのLinux Kernelにおける不特定の脆弱性
タイトル LinuxのLinux Kernelにおける不特定の脆弱性
概要

Linuxカーネルにおいて、以下の脆弱性が修正されました。ext4においてI/Oを送信する前に分割する際に、EXT4_GET_BLOCKS_CONVERTを設定しないようにしました。EOF内DIOおよびdioread_nolockが有効なwriteback時のブロック割り当てでは、既存の大きな未書き込みエクステントを分割するためにEXT4_GET_BLOCKS_PRE_IOが設定されていました。しかし、ext4_split_convert_extents()呼び出し時にEXT4_GET_BLOCKS_CONVERTが設定されており、これにより古いデータの問題が発生する可能性がありました。未書き込みエクステントがあり、DIOが後半を書き込むケースを考えます。 「[UUUUUUUUUUUUUUUU]」はon-diskエクステントを表し、「U」は未書き込みエクステントを示します。エクステント状態ツリーは「[UUUUUUUUUUUUUUUU]」です。dioはこの範囲を書き込みます。まず、ext4_iomap_alloc()はEXT4_GET_BLOCKS_PRE_IO、EXT4_GET_BLOCKS_UNWRIT_EXT、およびEXT4_GET_BLOCKS_CREATEフラグを設定してext4_map_blocks()を呼び出します。ext4_map_blocks()はこのエクステントを見つけ、EXT4_GET_BLOCKS_CONVERTを含むフラグと共にext4_split_convert_extents()を呼び出します。次に、ext4_split_convert_extents()はEXT4_EXT_MAY_ZEROOUT、EXT4_EXT_MARK_UNWRIT2、EXT4_EXT_DATA_VALID2フラグを設定してext4_split_extent()を呼び出し、さらにEXT4_EXT_DATA_VALID2、EXT4_EXT_MARK_UNWRIT1、EXT4_EXT_MAY_ZEROOUT、EXT4_EXT_MARK_UNWRIT2フラグを設定して後半を分割するためにext4_split_extent_at()を呼び出します。しかし、ext4_split_extent_at()は一時的な-ENOSPC不足のためエクステントを挿入できずに失敗します。先頭半分をゼロクリアしますが、EXT4_EXT_DATA_VALID2フラグが設定されているため、on-diskのエクステント全体がライト済みに変換されます。一方で、エクステント状態ツリーの後半は未書き込みのまま残ります。 「[0000000000SSSSSS]」はデータを表し、「S」は古いデータ、「0」はゼロクリア済みを示します。また、「[WWWWWWWWWWWWWWWW]」はon-diskエクステントを表し、「W」は書き込み済みエクステントを示します。エクステント状態ツリーは「[WWWWWWWWWWUUUUUU]」となります。最終的に、DIOがディスクへの書き込みに失敗した場合、キャッシュされたエクステントエントリがなくなると後半の古いデータが露出します。この問題は、I/Oを送信する前に未書き込みエクステントを分割する際にEXT4_GET_BLOCKS_CONVERTを渡さないようにし、ext4_split_convert_extents()においてこのケースではエクステント全体をゼロクリアし、一貫性を保つためにエクステント状態ツリーでもマークすることで修正されました。

想定される影響 ・当該ソフトウェアが扱う情報について、外部への漏えいは発生しません。 ・当該ソフトウェアが扱う情報について、書き換えは発生しません。 ・当該ソフトウェアが完全に停止する可能性があります。 
対策

リリース情報、またはパッチ情報が公開されています。参考情報を参照して適切な対策を実施してください。

公表日 2026年5月27日0:00
登録日 2026年6月17日15:43
最終更新日 2026年6月17日15:43
CVSS3.0 : 警告
スコア 5.5
ベクター CVSS:3.0/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H
影響を受けるシステム
Linux
Linux Kernel 3.15 以上 5.10.253 未満
Linux Kernel 5.11 以上 5.15.203 未満
Linux Kernel 5.16 以上 6.6.130 未満
Linux Kernel 6.13 以上 6.18.17 未満
Linux Kernel 6.19 以上 6.19.4 未満
Linux Kernel 6.7 以上 6.12.77 未満
CVE (情報セキュリティ 共通脆弱性識別子)
CWE (共通脆弱性タイプ一覧)
その他
変更履歴
No 変更内容 変更日
1 [2026年06月17日]
  掲載
2026年6月17日15:43

NVD脆弱性情報
CVE-2026-45985
概要

In the Linux kernel, the following vulnerability has been resolved:

ext4: don't set EXT4_GET_BLOCKS_CONVERT when splitting before submitting I/O

When allocating blocks during within-EOF DIO and writeback with
dioread_nolock enabled, EXT4_GET_BLOCKS_PRE_IO was set to split an
existing large unwritten extent. However, EXT4_GET_BLOCKS_CONVERT was
set when calling ext4_split_convert_extents(), which may potentially
result in stale data issues.

Assume we have an unwritten extent, and then DIO writes the second half.

[UUUUUUUUUUUUUUUU] on-disk extent U: unwritten extent
[UUUUUUUUUUUUUUUU] extent status tree
|<- ->| ----> dio write this range

First, ext4_iomap_alloc() call ext4_map_blocks() with
EXT4_GET_BLOCKS_PRE_IO, EXT4_GET_BLOCKS_UNWRIT_EXT and
EXT4_GET_BLOCKS_CREATE flags set. ext4_map_blocks() find this extent and
call ext4_split_convert_extents() with EXT4_GET_BLOCKS_CONVERT and the
above flags set.

Then, ext4_split_convert_extents() calls ext4_split_extent() with
EXT4_EXT_MAY_ZEROOUT, EXT4_EXT_MARK_UNWRIT2 and EXT4_EXT_DATA_VALID2
flags set, and it calls ext4_split_extent_at() to split the second half
with EXT4_EXT_DATA_VALID2, EXT4_EXT_MARK_UNWRIT1, EXT4_EXT_MAY_ZEROOUT
and EXT4_EXT_MARK_UNWRIT2 flags set. However, ext4_split_extent_at()
failed to insert extent since a temporary lack -ENOSPC. It zeroes out
the first half but convert the entire on-disk extent to written since
the EXT4_EXT_DATA_VALID2 flag set, but left the second half as unwritten
in the extent status tree.

[0000000000SSSSSS] data S: stale data, 0: zeroed
[WWWWWWWWWWWWWWWW] on-disk extent W: written extent
[WWWWWWWWWWUUUUUU] extent status tree

Finally, if the DIO failed to write data to the disk, the stale data in
the second half will be exposed once the cached extent entry is gone.

Fix this issue by not passing EXT4_GET_BLOCKS_CONVERT when splitting
an unwritten extent before submitting I/O, and make
ext4_split_convert_extents() to zero out the entire extent range
to zero for this case, and also mark the extent in the extent status
tree for consistency.

公表日 2026年5月27日23:17
登録日 2026年5月28日4:12
最終更新日 2026年5月27日23:48
関連情報、対策とツール
共通脆弱性一覧