LinuxのLinux Kernelにおける初期化されていないリソースの使用に関する脆弱性
タイトル LinuxのLinux Kernelにおける初期化されていないリソースの使用に関する脆弱性
概要

Linuxカーネルにおいて、以下の脆弱性が修正されました。hfsplusのカタログレコードサイズの検証を強化し、未初期化値の問題に対処しました。Syzbotはhfsplus_strcasecmp()内でKMSAN未初期化値の問題を報告しました。根本原因は、hfs_brec_read()がオンディスクのレコードサイズと読み取ろうとしているレコードタイプの想定サイズが一致しているかを検証していなかったことにあります。破損したファイルシステムをマウントする際、hfs_brec_read()は期待よりも少ないデータを読み取る場合がありました。例えば、カタログスレッドレコードを読むとき、デバッグ出力は次のように示されました: HFSPLUS_BREC_READ: rec_len=520, fd-entrylength=26 HFSPLUS_BREC_READ: WARNING - entrylength (26) rec_len (520) - PARTIAL READ! hfs_brec_read()はentrylengthがバッファサイズを超えていないことのみ検証し、期待値より小さいかはチェックしていませんでした。その結果、520バイトの構造体に26バイトのみを正常に読み込み成功を返し、494バイトが未初期化のまま残りました。このtmp.thread.nodeName内の未初期化データはhfsplus_cat_build_key_uni()でコピーされ、hfsplus_strcasecmp()で使用されました。これにより、case_fold()内で未初期化バイトが配列インデックスとして使用された際にKMSAN警告が発生しました。修正ではhfsplus_brec_read_cat()ラッパーを導入し、1. hfs_brec_read()を呼び出してデータを読み込む 2. typeフィールドに基づきレコードサイズを検証(フォルダ・ファイルレコードは固定サイズ、スレッドレコードは文字列長に依存する可変サイズ) 3. サイズが期待と異なる場合は-EIOを返す、という手順を実装しました。スレッドレコードについては、nodeName.lengthを読む前にHFSPLUS_MIN_THREAD_SZと照合し、entry構造体をゼロ初期化していない呼び出し箇所での未初期化データ読み取りを回避しました。また、防御的プログラミングとしてhfsplus_find_cat()内のtmp変数も初期化し、検証がバイパスされた場合でも未初期化データが残らないようにしています。

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

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

公表日 2026年5月28日0:00
登録日 2026年6月12日14:49
最終更新日 2026年6月12日14:49
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 2.6.12
Linux Kernel 2.6.12.1 以上 6.6.140 未満
Linux Kernel 6.13 以上 6.18.30 未満
Linux Kernel 6.19 以上 7.0.7 未満
Linux Kernel 6.7 以上 6.12.88 未満
CVE (情報セキュリティ 共通脆弱性識別子)
CWE (共通脆弱性タイプ一覧)
その他
変更履歴
No 変更内容 変更日
1 [2026年06月12日]
  掲載
2026年6月12日14:49

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

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

hfsplus: fix uninit-value by validating catalog record size

Syzbot reported a KMSAN uninit-value issue in hfsplus_strcasecmp(). The
root cause is that hfs_brec_read() doesn't validate that the on-disk
record size matches the expected size for the record type being read.

When mounting a corrupted filesystem, hfs_brec_read() may read less data
than expected. For example, when reading a catalog thread record, the
debug output showed:

HFSPLUS_BREC_READ: rec_len=520, fd->entrylength=26
HFSPLUS_BREC_READ: WARNING - entrylength (26) < rec_len (520) - PARTIAL READ!

hfs_brec_read() only validates that entrylength is not greater than the
buffer size, but doesn't check if it's less than expected. It successfully
reads 26 bytes into a 520-byte structure and returns success, leaving 494
bytes uninitialized.

This uninitialized data in tmp.thread.nodeName then gets copied by
hfsplus_cat_build_key_uni() and used by hfsplus_strcasecmp(), triggering
the KMSAN warning when the uninitialized bytes are used as array indices
in case_fold().

Fix by introducing hfsplus_brec_read_cat() wrapper that:
1. Calls hfs_brec_read() to read the data
2. Validates the record size based on the type field:
- Fixed size for folder and file records
- Variable size for thread records (depends on string length)
3. Returns -EIO if size doesn't match expected

For thread records, check against HFSPLUS_MIN_THREAD_SZ before reading
nodeName.length to avoid reading uninitialized data at call sites that
don't zero-initialize the entry structure.

Also initialize the tmp variable in hfsplus_find_cat() as defensive
programming to ensure no uninitialized data even if validation is
bypassed.

公表日 2026年5月28日19:16
登録日 2026年5月29日4:13
最終更新日 2026年5月28日22:44
関連情報、対策とツール
共通脆弱性一覧