製品・ソフトウェアに関する情報
LinuxのLinux Kernelにおける不特定の脆弱性
Title LinuxのLinux Kernelにおける不特定の脆弱性
Summary

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()においてこのケースではエクステント全体をゼロクリアし、一貫性を保つためにエクステント状態ツリーでもマークすることで修正されました。

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

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

Publication Date May 27, 2026, midnight
Registration Date June 17, 2026, 3:43 p.m.
Last Update June 17, 2026, 3:43 p.m.
CVSS3.0 : 警告
Score 5.5
Vector CVSS:3.0/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H
Affected System
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 (共通脆弱性タイプ一覧)
その他
Change Log
No Changed Details Date of change
1 [2026年06月17日]
  掲載
June 17, 2026, 3:43 p.m.

NVD Vulnerability Information
CVE-2026-45985
Summary

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.

Publication Date May 27, 2026, 11:17 p.m.
Registration Date May 28, 2026, 4:12 a.m.
Last Update May 27, 2026, 11:48 p.m.
Related information, measures and tools
Common Vulnerabilities List