CVE-2024-39486 in Linux
要約
〜によって VulDB • 2026年08月14日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
drm/drm_file: pidの参照カウントにおける競合状態を修正
filp->pidは本来、参照カウント付きポインタであるべきですが、このパッチ適用前は drm_file_update_pid() が filp->pid にその構造体へのポインタを格納し、dev->filelist_mutex を解放する前に struct pid の参照カウントを増加させるだけでした。これにより、以下の競合状態が可能になっていました:
プロセス A プロセス B ========= ========= drm_file_update_pid 開始 mutex_lock(&dev->filelist_mutex) rcu_replace_pointer(filp->pid, , 1) mutex_unlock(&dev->filelist_mutex) drm_file_update_pid 開始 mutex_lock(&dev->filelist_mutex) rcu_replace_pointer(filp->pid, , 1) mutex_unlock(&dev->filelist_mutex) get_pid() synchronize_rcu() put_pid() *** pid B が参照カウント 0 に達し、ここで解放される *** get_pid() *** UAF (Use-After-Free) *** synchronize_rcu() put_pid()
私の知る限り、この競合状態は CONFIG_PREEMPT_RCU=y の場合にのみ発生します。これは、スケジューラへの明示的な呼び出しがないコード内で RCU が静穏状態を検出する必要があるためです。
この競合状態により、「struct pid」の Use-After-Free (UAF) 脆弱性が引き起こされます。プロセス A が synchronize_rcu() オペレーションを通過している間に、プロセス B が mutex_unlock() と get_pid() の間にあるというタイミングで発生する必要があり、おそらくトリガーするのはやや困難です。
この修正では、ファイルに現在のタスクの pid へのポインタが格納される時点で、pid に対して追加の参照を取得することを保証します。
また、この修正により synchronize_rcu() の条件も削除されました。上記のロックレスチェックで通常は早期終了するため、その場合の最適化は無用な複雑さになると考えています。
If you want to get best quality of vulnerability data, you may have to visit VulDB.