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

Linuxカーネルにおいて、以下の脆弱性が修正されました。bpfにおける不十分な推測的ストアバイパス緩和によるポインタリークを修正しています。Spectre v4を緩和するために、2039f26f3aca(「bpf: 不十分な推測的ストアバイパス緩和によるリーケージの修正」)により、1) スタックスロットの初期化後および2) ポインタをスタックに退避する際にlfence命令が挿入されました。しかしこれは、スタックスロットが最初にポインタで初期化され(サニタイズ対象)、その後スカラーで上書きされる場合(スロットが既に初期化されているためサニタイズ対象外)をカバーしていません。この場合、2回目の書き込みは推測的ストアバイパス(SSB)の対象となり、推測的なポインタをスカラーとして扱う型混乱を引き起こします。これにより、プログラムは例えば分岐に基づくキャッシュサイドチャネルを用いて、その数値としてのポインタ値を漏洩させる可能性があります。これを修正するために、以前にポインタを含んでいたスタックスロットにスカラーを書き込む場合もサニタイズを行うようにしました。LLVMがレジスタプレッシャー時にのみポインタ退避を生成すると仮定すると、多くの実際のBPFプログラムへのパフォーマンス影響は小さいと考えられます。以下の特権なしBPFバイトコードは最小限のエクスプロイトと緩和策の草案です。[...] // r6 = 0または1(スカラー、不明なユーザー入力) // r7 = サイドチャネル用アクセス可能ポインタ // r10 = フレームポインタ(fp)、漏洩対象 // r9 = r10 #ssbを促すためのfpエイリアス *(u64 *)(r9 - 8) = r10 // fp[-8] = ポインタ、漏洩対象 // ポインタのスタックスピルのためここにlfenceが追加される。 // // 省略:alias predictorを訓練するためのダミーbpf_ringbuf_output()(r9-r10依存なし) // *(u64 *)(r10 - 8) = r6 // fp[-8] = スカラーでポインタを上書き // 2039f26f3acaにより、stack slotがSTACK_INVALIDでなかったためlfenceは追加されず、 // ストアはSSBの対象となる可能性があります。 // // 修正として、スロットにポインタが含まれていた場合にもlfenceを追加しました。 // r8 = *(u64 *)(r9 - 8) // r8はアーキテクチャ的にはスカラーですが推測的にはポインタです。 // // 分岐に基づくキャッシュサイドチャネルを用いてポインタを漏洩します。 r8 &= 1 // 漏洩するビットを選択 if r8 == 0 goto SLOW // ミス予測なし // 入力r6が0の場合はアーキテクチャ的に実行されないコードであり、 // ポインタビットが1の場合にのみ推測的に実行されます。 r8 = *(u64 *)(r7 + 0) #ビットをキャッシュにエンコード(0:遅い、1:速い) SLOW: [...]この処理の後、プログラムは*(r7 + 0)へのアクセス時間を測定し、選択されたポインタビットが0か1かを判定します。これを64回繰り返すことでamd64上のアドレス全体を復元できます。まとめると、サニタイズはスカラーが別のスカラーで上書きされる場合にのみ省略可能です。推測的ストアバイパスによるスカラー混乱は、検証中に導出されるポインタ境界が分岐なしの論理で強制されるため、不正アクセスには繋がりません。詳細については979d63d50c0c(「bpf: pointer arithmeticの範囲外推測を防止」)を参照してください。緩和策を!env-allow_{uninit_stack,ptr_leaks}に依存させてはいけません。なぜなら、これらが有効化されている場合、推測的なリークは予期しない可能性が高いためです。例えば、保護されたログファイルのアドレスリークは許容されても、緩和を無効化すると無権限プロセスがアクセス可能なマップのキャッシュ状態にアドレスが意図せず漏洩する恐れがあります。

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

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

Publication Date March 27, 2025, midnight
Registration Date Jan. 27, 2026, 5:39 p.m.
Last Update Jan. 27, 2026, 5:39 p.m.
CVSS3.0 : 重要
Score 7.1
Vector CVSS:3.0/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:H
Affected System
Linux
Linux Kernel 4.19.207 以上 4.19.272 未満
Linux Kernel 5.10.56 以上 5.10.166 未満
Linux Kernel 5.13.8 以上 5.14 未満
Linux Kernel 5.14
Linux Kernel 5.14.1 以上 5.15.91 未満
Linux Kernel 5.16 以上 6.1.9 未満
Linux Kernel 5.4.146 以上 5.4.231 未満
Linux Kernel 6.2
CVE (情報セキュリティ 共通脆弱性識別子)
CWE (共通脆弱性タイプ一覧)
その他
Change Log
No Changed Details Date of change
1 [2026年01月27日]
  掲載
Jan. 27, 2026, 5:39 p.m.

NVD Vulnerability Information
CVE-2023-53024
Summary

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

bpf: Fix pointer-leak due to insufficient speculative store bypass mitigation

To mitigate Spectre v4, 2039f26f3aca ("bpf: Fix leakage due to
insufficient speculative store bypass mitigation") inserts lfence
instructions after 1) initializing a stack slot and 2) spilling a
pointer to the stack.

However, this does not cover cases where a stack slot is first
initialized with a pointer (subject to sanitization) but then
overwritten with a scalar (not subject to sanitization because
the slot was already initialized). In this case, the second write
may be subject to speculative store bypass (SSB) creating a
speculative pointer-as-scalar type confusion. This allows the
program to subsequently leak the numerical pointer value using,
for example, a branch-based cache side channel.

To fix this, also sanitize scalars if they write a stack slot
that previously contained a pointer. Assuming that pointer-spills
are only generated by LLVM on register-pressure, the performance
impact on most real-world BPF programs should be small.

The following unprivileged BPF bytecode drafts a minimal exploit
and the mitigation:

[...]
// r6 = 0 or 1 (skalar, unknown user input)
// r7 = accessible ptr for side channel
// r10 = frame pointer (fp), to be leaked
//
r9 = r10 # fp alias to encourage ssb
*(u64 *)(r9 - 8) = r10 // fp[-8] = ptr, to be leaked
// lfence added here because of pointer spill to stack.
//
// Ommitted: Dummy bpf_ringbuf_output() here to train alias predictor
// for no r9-r10 dependency.
//
*(u64 *)(r10 - 8) = r6 // fp[-8] = scalar, overwrites ptr
// 2039f26f3aca: no lfence added because stack slot was not STACK_INVALID,
// store may be subject to SSB
//
// fix: also add an lfence when the slot contained a ptr
//
r8 = *(u64 *)(r9 - 8)
// r8 = architecturally a scalar, speculatively a ptr
//
// leak ptr using branch-based cache side channel:
r8 &= 1 // choose bit to leak
if r8 == 0 goto SLOW // no mispredict
// architecturally dead code if input r6 is 0,
// only executes speculatively iff ptr bit is 1
r8 = *(u64 *)(r7 + 0) # encode bit in cache (0: slow, 1: fast)
SLOW:
[...]

After running this, the program can time the access to *(r7 + 0) to
determine whether the chosen pointer bit was 0 or 1. Repeat this 64
times to recover the whole address on amd64.

In summary, sanitization can only be skipped if one scalar is
overwritten with another scalar. Scalar-confusion due to speculative
store bypass can not lead to invalid accesses because the pointer
bounds deducted during verification are enforced using branchless
logic. See 979d63d50c0c ("bpf: prevent out of bounds speculation on
pointer arithmetic") for details.

Do not make the mitigation depend on !env->allow_{uninit_stack,ptr_leaks}
because speculative leaks are likely unexpected if these were enabled.
For example, leaking the address to a protected log file may be acceptable
while disabling the mitigation might unintentionally leak the address
into the cached-state of a map that is accessible to unprivileged
processes.

Publication Date March 28, 2025, 2:15 a.m.
Registration Date March 28, 2025, 4 a.m.
Last Update March 29, 2025, 3:11 a.m.
Related information, measures and tools
Common Vulnerabilities List