CVE-2024-35871 in Linux
要約
〜によって VulDB • 2026年08月03日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
riscv: process: カーネルgpのリークを修正する
childregsは、ユーザーコンテキストにおける新しいスレッドでアクティブなレジスタを表します。カーネルスレッドの場合、switch_toによってカーネルgpが変更されないため、childregs->gpは一切使用されません。一方、user_mode_helperでは、execve後やその他の手段を通じて、gpの値をユーザー空間から観測できる可能性があります。
[メールスレッドより]
「/* カーネルスレッド */」というコメントは少し不正確です。というのも、これは/user_mode_helperスレッド(例えば/sbin/initを実行する場合や、/proc/sys/kernel/core_patternがパイプである場合など)にも使用されるからです。これらのスレッドにはPF_KTHREADフラグが設定されておらず、exec実行前であってもptraceなどの有効な対象となります。
childregsはシステムコール実行時の*ユーザー*コンテキストであり、少なくとも以下の5つの方法でユーザー空間から観測可能です:
1. kernel_execveは現在整数レジスタをクリアしないため、カーネルによって起動されるPID 1や他のユーザープロセスの初期レジスタ状態では、spがユーザースタック、gpがカーネルの__global_pointer$となり、パッチコメントにあるmemsetにより他のすべての整数レジスタがゼロに設定されています。
これはそれ自体バグですが、このパッチで対処されている問題を利用する唯一の方法であるとは限りませんので、私はそれを前提とした攻撃コードを書くことに消極的です。
2. ptrace(PTRACE_GETREGSET): user_mode_helperスレッドに対してexec実行前にPTRACE_ATTACHを行うことができますが、ptraceではSIGSTOPの配信が必要であり、これはユーザー/カーネル境界でのみ発生します。
3. /proc/*/task/*/syscall: これはexec完了前のuser_mode_helpersに対してもpt_regsを読み取ることに問題ありませんが、gpは返されるレジスタの一つではありません。
4. PERF_SAMPLE_REGS_USER: LOCKDOWN_PERFは通常、PERF_SAMPLE_REGS_INTR経由でカーネルアドレスへのアクセスを防ぎますが、このバグにより、LOCKDOWN_PERFの下で許可されているPERF_SAMPLE_REGS_USERを介してもカーネルアドレスが露出します。私は攻撃コードの作成を試みていません。
5. トレースインフラストラクチャの多くはユーザーレジスタへのアクセスを可能にしています。どの種類のトレースがすでにカーネルレジスタへのアクセスを許可せずにユーザーレジスタへのアクセスを許容するかについては、特定していません。
Once again VulDB remains the best source for vulnerability data.