LinuxのLinux KernelにおけるNULL ポインタデリファレンスに関する脆弱性
タイトル LinuxのLinux KernelにおけるNULL ポインタデリファレンスに関する脆弱性
概要

Linuxカーネルにおいて、以下の脆弱性が修正されました。perf/x86のx86_pmu_enable()関数内でイベントポインタの設定を早期に移動しました。AMD EPYC製品の環境において、PMUのNMIハンドラでNULLポインタ参照が発生し、システムクラッシュが起きていました。これは、x86_perf_event_update()内の「if (unlikely(!hwc-event_base))」条件判定部で、イベントがNULLの状態でアクセスされたことに起因します。vmcoreの検査により、cpuc-active_maskとcpuc-events[]の間に不整合が確認されました。具体的には、active_maskのビット2はセットされている一方でevents[2]はNULLでした。この原因は、コミット7e772a93eb61("perf/x86: Fix NULL event access and potential PEBS record loss")により、cpuc-events[idx]の割当てがx86_pmu_start()からx86_pmu_enable()のステップ2に移動され、PERF_HES_ARCHチェック後に行われるようになったためです。その結果、x86_pmu_enable()を経由せずにpmu-start()を呼び出すパス(特に非スロットル経路)がevents[]を適切に設定しなくなりました。競合シーケンスは、(1) perfイベントのグループスロットリング開始、(2) スロットル中のx86_pmu_enable()の実行によるイベントの再スケジューリング、(3) スロットル解除時のpmu-start()呼び出しによるevents[]未設定状態のままactive_mask更新、(4) PMCオーバーフローNMIの発生とハンドラにおけるNULLイベント参照という流れです。対策として、x86_pmu_enable()内でcpuc-events[hwc-idx]の割当てをPERF_HES_ARCHチェックより前に移動し、即時開始されないイベントでもevents[]が適切に設定されるようにしました。これにより、pmu-start()経由の非スロットル経路でも常に有効なイベントポインタが存在する状態となりました。

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

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

公表日 2026年4月3日0:00
登録日 2026年4月27日11:24
最終更新日 2026年4月27日11:24
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 6.17.13 以上 6.18 未満
Linux Kernel 6.18.2 以上 6.18.20 未満
Linux Kernel 6.19
Linux Kernel 6.19.1 以上 6.19.10 未満
Linux Kernel 7.0
CVE (情報セキュリティ 共通脆弱性識別子)
CWE (共通脆弱性タイプ一覧)
その他
変更履歴
No 変更内容 変更日
1 [2026年04月27日]
  掲載
2026年4月27日11:24

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

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

perf/x86: Move event pointer setup earlier in x86_pmu_enable()

A production AMD EPYC system crashed with a NULL pointer dereference
in the PMU NMI handler:

BUG: kernel NULL pointer dereference, address: 0000000000000198
RIP: x86_perf_event_update+0xc/0xa0
Call Trace:
<NMI>
amd_pmu_v2_handle_irq+0x1a6/0x390
perf_event_nmi_handler+0x24/0x40

The faulting instruction is `cmpq $0x0, 0x198(%rdi)` with RDI=0,
corresponding to the `if (unlikely(!hwc->event_base))` check in
x86_perf_event_update() where hwc = &event->hw and event is NULL.

drgn inspection of the vmcore on CPU 106 showed a mismatch between
cpuc->active_mask and cpuc->events[]:

active_mask: 0x1e (bits 1, 2, 3, 4)
events[1]: 0xff1100136cbd4f38 (valid)
events[2]: 0x0 (NULL, but active_mask bit 2 set)
events[3]: 0xff1100076fd2cf38 (valid)
events[4]: 0xff1100079e990a90 (valid)

The event that should occupy events[2] was found in event_list[2]
with hw.idx=2 and hw.state=0x0, confirming x86_pmu_start() had run
(which clears hw.state and sets active_mask) but events[2] was
never populated.

Another event (event_list[0]) had hw.state=0x7 (STOPPED|UPTODATE|ARCH),
showing it was stopped when the PMU rescheduled events, confirming the
throttle-then-reschedule sequence occurred.

The root cause is commit 7e772a93eb61 ("perf/x86: Fix NULL event access
and potential PEBS record loss") which moved the cpuc->events[idx]
assignment out of x86_pmu_start() and into step 2 of x86_pmu_enable(),
after the PERF_HES_ARCH check. This broke any path that calls
pmu->start() without going through x86_pmu_enable() -- specifically
the unthrottle path:

perf_adjust_freq_unthr_events()
-> perf_event_unthrottle_group()
-> perf_event_unthrottle()
-> event->pmu->start(event, 0)
-> x86_pmu_start() // sets active_mask but not events[]

The race sequence is:

1. A group of perf events overflows, triggering group throttle via
perf_event_throttle_group(). All events are stopped: active_mask
bits cleared, events[] preserved (x86_pmu_stop no longer clears
events[] after commit 7e772a93eb61).

2. While still throttled (PERF_HES_STOPPED), x86_pmu_enable() runs
due to other scheduling activity. Stopped events that need to
move counters get PERF_HES_ARCH set and events[old_idx] cleared.
In step 2 of x86_pmu_enable(), PERF_HES_ARCH causes these events
to be skipped -- events[new_idx] is never set.

3. The timer tick unthrottles the group via pmu->start(). Since
commit 7e772a93eb61 removed the events[] assignment from
x86_pmu_start(), active_mask[new_idx] is set but events[new_idx]
remains NULL.

4. A PMC overflow NMI fires. The handler iterates active counters,
finds active_mask[2] set, reads events[2] which is NULL, and
crashes dereferencing it.

Move the cpuc->events[hwc->idx] assignment in x86_pmu_enable() to
before the PERF_HES_ARCH check, so that events[] is populated even
for events that are not immediately started. This ensures the
unthrottle path via pmu->start() always finds a valid event pointer.

公表日 2026年4月4日1:16
登録日 2026年4月15日11:24
最終更新日 2026年4月24日5:59
影響を受けるソフトウェアの構成
構成1 以上 以下 より上 未満
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.17.13 6.18
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.18.2 6.18.20
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.19.1 6.19.10
cpe:2.3:o:linux:linux_kernel:6.19:-:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc1:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc2:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc3:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc4:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc5:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc6:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc7:*:*:*:*:*:*
関連情報、対策とツール
共通脆弱性一覧