LinuxのLinux Kernelにおける解放済みメモリの使用に関する脆弱性
タイトル LinuxのLinux Kernelにおける解放済みメモリの使用に関する脆弱性
概要

Linuxカーネルでは、以下の脆弱性が修正されました。kthreadに関しては、use-after-freeを防ぐためにkthreadの終了パスを統合しました。Guillaume氏はKUnitテスト中に、破損したRCUコールバック関数ポインタによりクラッシュが発生したことを報告しました。そのクラッシュはpidfsのrhashtable変換に起因しており、24バイトのrb_nodeが構造体pid内で8バイトのrhash_headに置き換えられたため、160バイトから144バイトにサイズが縮小されました。CONFIG_BLK_CGROUPなしのstruct kthreadも144バイトになります。CONFIG_SLAB_MERGE_DEFAULTとSLAB_HWCACHE_ALIGNの設定により、両方とも192バイトに切り上げられ、同じスラブキャッシュを共有しています。struct pid.rcu.funcとstruct kthread.affinity_nodeは共にオフセット0x78に位置しています。kthreadがmake_task_dead()経由で終了するとkthread_exit()をバイパスし、affinity_nodeのクリーンアップを逃します。free_kthread_struct()はメモリを解放しますが、このノードはまだグローバルなkthread_affinity_listにリンクされたままになっています。別のkthreadによる後続のlist_del()が、解放され再利用されたメモリに対してダングリングリストポインタを書き込み、pidのrcu.funcポインタを破損させることがあります。free_kthread_struct()のパッチは未処理のクリーンアップに対応するものではなく、すべてのkthread終了パスを統合しました。kthread_exit()をdo_exit()を呼び出すマクロに変更し、PF_KTHREADフラグが設定されたタスクのdo_exit()から呼び出されるkthread_do_exit()を新たに追加しました。これにより、make_task_dead()、直接do_exit()、kthread_exit()のいずれの終了パスでもkthread固有のクリーンアップが必ず行われます。公開ヘッダでは__to_kthread()を新しいtsk_is_kthread()アクセサに置き換え、kthread_exit()マクロを使用するモジュールコードが必要とするため、do_exit()関数をエクスポートしています。

想定される影響 当該ソフトウェアが扱う全ての情報が外部に漏れる可能性があります。 また、当該ソフトウェアが扱う全ての情報が書き換えられる可能性があります。 さらに、当該ソフトウェアが完全に停止する可能性があります。 そして、この脆弱性を悪用した攻撃の影響は、他のソフトウェアには及びません。 
対策

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

公表日 2026年5月8日0:00
登録日 2026年5月25日10:22
最終更新日 2026年5月25日10:22
CVSS3.0 : 緊急
スコア 9.8
ベクター CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
影響を受けるシステム
Linux
Linux Kernel 6.14 以上 6.18.19 未満
Linux Kernel 6.19 以上 6.19.9 未満
Linux Kernel 7.0
CVE (情報セキュリティ 共通脆弱性識別子)
CWE (共通脆弱性タイプ一覧)
その他
変更履歴
No 変更内容 変更日
1 [2026年05月25日]
  掲載
2026年5月25日10:22

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

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

kthread: consolidate kthread exit paths to prevent use-after-free

Guillaume reported crashes via corrupted RCU callback function pointers
during KUnit testing. The crash was traced back to the pidfs rhashtable
conversion which replaced the 24-byte rb_node with an 8-byte rhash_head
in struct pid, shrinking it from 160 to 144 bytes.

struct kthread (without CONFIG_BLK_CGROUP) is also 144 bytes. With
CONFIG_SLAB_MERGE_DEFAULT and SLAB_HWCACHE_ALIGN both round up to
192 bytes and share the same slab cache. struct pid.rcu.func and
struct kthread.affinity_node both sit at offset 0x78.

When a kthread exits via make_task_dead() it bypasses kthread_exit() and
misses the affinity_node cleanup. free_kthread_struct() frees the memory
while the node is still linked into the global kthread_affinity_list. A
subsequent list_del() by another kthread writes through dangling list
pointers into the freed and reused memory, corrupting the pid's
rcu.func pointer.

Instead of patching free_kthread_struct() to handle the missed cleanup,
consolidate all kthread exit paths. Turn kthread_exit() into a macro
that calls do_exit() and add kthread_do_exit() which is called from
do_exit() for any task with PF_KTHREAD set. This guarantees that
kthread-specific cleanup always happens regardless of the exit path -
make_task_dead(), direct do_exit(), or kthread_exit().

Replace __to_kthread() with a new tsk_is_kthread() accessor in the
public header. Export do_exit() since module code using the
kthread_exit() macro now needs it directly.

公表日 2026年5月9日0:16
登録日 2026年5月9日4:14
最終更新日 2026年5月12日23:10
関連情報、対策とツール
共通脆弱性一覧