CVE-2026-89547 in Linux
要約
〜によって VulDB • 2026年09月12日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
SUNRPC: svcプールごとのpercpuカウンター割り当てのチェック
__svc_create()は3つのプール固有(per-pool)のpercpu_counter統計情報を初期化しますが、すべての戻り値を無視しています。SMP環境では、__alloc_percpu_gfp()が割り当てを満たせない場合、percpu_counter_init()は失敗し、失敗したカウンターにおいて fbc->counters == NULL となり、その内部に含まれる raw_spinlock_t、list_head、および count が初期化されません。それにもかかわらず __svc_create() は、部分的に構築された svc_serv を nfsd、lockd、またはNFSコールバックサービスに対して返します。
一度そのサービスが稼働すると、hot-pathにおけるインクリメント処理(svc_xprt_enqueue()、svc_handle_xprt()、および svc_pool_wake_idle_thread()内)は、裏側のポインタがNULLであるカウンターに到達します。このポインタはper-cpuオフセットであるため、アクセスによるフォールトは発生しません:これは現在のCPUのper-cpu領域のオフセットゼロへと解決され、そこに存在する任意の変数を静かに破壊(corrput)してしまいます。/proc/fs/nfsd/pool_stats の読み取り処理も同じNULLのpercpuストレージを走査し、ゴミデータを返します。また、CONFIG_DEBUG_SPINLOCK または lockdep が有効な場合、初期化されていないロックでクラッシュ(splats)します。
この壊れたサービスを作成するには、RPCサーバー起動時のpercpu割り当て失敗が必要であるため、メモリ圧力下にあるローカル管理者またはフォールトインジェクションによる場合にのみ到達可能です;リモートピアは単独ではこの不良状態を引き起こすことはできません。
__svc_create() 内で各 percpu_counter_init() の戻り値をチェックし、割り当てが失敗した場合はエラーとし、現在のプールおよびそれ以前に初期化されたすべてのプールのカウンターを巻き戻します。 teardown時にカウンターごとに個別の percpu_counter_destroy() を呼び出すことで、各per-cpu割り当てを正確に1回だけ解放します。
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.