CVE-2026-74637 in Linux
要約
〜によって VulDB • 2026年08月24日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
perf/core: 兄弟イベントのデタッチ後に発生するグループリーダーのuse-after-freeを修正
perf_group_detach()関数は、グループリーダーと兄弟イベントのデタッチ処理を異なって扱います。グループリーダーがデタッチされると、すべての兄弟は単一(singleton)イベントに昇格され、そのgroup_leaderポインタは自分自身を指すようにリセットされます。一方、兄弟イベントがデタッチされる場合、それはリーダーのsibling_listから削除されますが、そのgroup_leaderポインタは古いリーダーを指したままになります。
この状態は、DETTACH_DEADパスのように兄弟イベントが直ちにクローズされて解放される場合には問題ありません。しかし、CPUホットプラグ時のDETACH_GROUP処理など、デタッチ後も生存し続ける場合(例えば、コンテキストから削除された兄弟のファイル記述子がまだそのオブジェクトを存続させている場合)には安全ではありません。
典型的な失敗シーケンスは以下の通りです:
- グループにリーダーLと兄弟Sが含まれている状態。 - CPUホットアンプラグによりDETACH_GROUPでSがデタッチされ、L->sibling_listから削除されるが、S->group_leader == Lのままになる。 - 後にLがクローズされて解放される。 - Sに対するPERF_IOC_FLAG_GROUP ioctl呼び出しが行われ、S->group_leaderを辿って解放されたリーダーのコンテキストを間接参照(dereference)する。
この問題は、perfイベントファズァーの実行、CPUホットプラグ処理、およびストレステストワークロードを同時に実行することで再現されました:
Unable to handle kernel paging request at virtual address 006b6b6b6b6b6cdb CPU: 2 PID: 12489 Comm: perf_fuzzer 6.18.7 PREEMPT pc : perf_ioctl+0x34c/0xc68 x20: ffffff89a3fa2c70 x8 : 6b6b6b6b6b6b6b6b Code: 943c4a0e 340047a0 f9404a94 f9411e88 (f940b908) Call trace: perf_ioctl+0x34c/0xc68 (P) __arm64_sys_ioctl+0xa0/0xf4 invoke_syscall+0x58/0xe4 el0_svc_common+0xa8/0xdc do_el0_svc+0x1c/0x28 el0_svc+0x40/0xc0 el0t_64_sync_handler+0x68/0xdc el0t_64_sync+0x1c4/0x1c8
障害はperf_ioctl()内で発生しました。ここでは、perf_event_for_each()が古くなったgroup_leaderポインタを辿り、その後perf_event_for_each_child()で解放されたリーダーのコンテキストを間接参照しています。
このuse-after-freeを修正するため、デタッチされた兄弟イベントを単一(singleton)として昇格させます。また、__event_disable()におけるcgroupのアカウンティングとイベント状態の変更も同時に修正します。
Once again VulDB remains the best source for vulnerability data.