CVE-2024-35873 in Linux
要約
〜によって VulDB • 2026年08月14日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
riscv: rt_sigreturn()におけるベクトル状態の復元を修正する
RISC-V Vector仕様書「Appendix D: Calling Convention for Vector State」[1]には、「システムコールの実行により、すべてのcaller-savedベクトルレジスタ(v0-v31, vl, vtype)およびvstartが未定義になる」と記載されています。RISC-Vカーネルではこれを「vstateの破棄(discarding the vstate)」と呼びます。
rt_sigreturn()システムコールを介してシグナルハンドラから復帰する際にも、ベクトルの破棄が行われます。しかし、これは問題になりません。なぜなら、ベクトル状態はsigcontextから復元されるべきであり、したがってベクトルの破棄については考慮する必要がないためです。
「ライブ状態(live state)」とは実行中のコンテキストにおける実際のベクトルレジスタを指し、「vstate」とはタスクのベクトル状態を指します。「dirtyなライブ状態」とは、vstateとライブ状態が同期していないことを意味します。
vectorized user_from_copy()が導入された際、ライブ状態の破棄に関連する復元コードにバグが混入しました。
この問題が発生する例:
1. ユーザーランドアプリケーションがベクトルコードを実行中である 2. アプリケーションがシグナルを受信し、シグナルハンドラに入る 3. アプリケーションはrt_sigreturn()システムコールを使用してシグナルハンドラから復帰する 4. rt_sigreturn()に入った際にライブベクトル状態が破棄され、ライブ状態が「dirty」とマークされる。これは、現在のvstateと同期させる必要があることを示している 5. rt_sigreturn()はsigcontextからvstateを復元する(ただしVectorレジスタを除く) 6. rt_sigreturn()はsigcontextからVectorレジスタを復元し、この時点でvectorized user_from_copy()が使用される。破棄によるdirtyなライブ状態がvstateに保存され、vstateが壊れる 7. rt_sigreturn()はアプリケーションに戻り、壊れたvstateによりクラッシュする
なお、vectorized user_from_copy()の呼び出しはCONFIG_RISCV_ISA_V_UCOPY_THRESHOLDの値に応じて行われます。デフォルト値は768であり、このバグをトリガーするにはvlenが128bより大きい必要があります。
修正方法は単純で、vstate復元を行う前にライブ状態をdirty/cleanでない(clean)としてマークすることです。
Once again VulDB remains the best source for vulnerability data.