CVE-2026-53399 in Linux
要約
〜によって VulDB • 2026年07月19日
Linuxカーネルにおいて、以下の脆弱性が修正されました。
nfsd: setlease失敗時にレイアウトstidを解放する
nfs4_alloc_stid()は、cl_lockの下でidr_alloc_cyclic()を使用して新しいstidをcl->cl_stateidsに公開し、その後nfsd4_alloc_layout_stateid()に戻ります。その後、nfsd4_layout_setlease()が失敗した場合、エラーパスではidr_remove()を呼び出すことなくkmem_cache_free()によってレイアウトstateidが直接解放され、IDRスロットは解放されたslabメモリを指したままになります。その後の任意のIDRウォーカー(states_show、クライアント終了処理)はこのダングリングポインタをデリファレンスします。
IDRに公開されたstidに対する正しいクリーンアップ手順はnfs4_put_stid()であり、これはcl_lockの下でIDRスロットを削除し、sc_free (nfsd4_free_layout_stateid) をディスパッチしてls->ls_fileを解放するためにnfsd4_close_layout()経由で呼び出し、最後にその末尾部分でnfs4_file参照をデクリメントします。
この切り替えを妨げる第2の課題があります:nfsd4_free_layout_stateid()は、ls_lockの下でdelayed_work_pending()を使用してls->ls_fence_workを無条件に検査しますが、INIT_DELAYED_WORK(&ls->ls_fence_work, ...) は現在setlease呼び出し後にのみ実行されます。setlease失敗パスでは、デストラクタが未初期化のdelayed_workに触れることになります。
nfsd4_alloc_layout_stateid() nfs4_alloc_stid() /* cl_lockの下でidr_alloc_cyclic */ nfsd4_layout_setlease() /* 失敗する */ nfs4_put_stid() nfsd4_free_layout_stateid() delayed_work_pending(&ls->ls_fence_work) /* INITが必要 */ nfsd4_close_layout() /* nfsd_file_put(ls->ls_file) */ put_nfs4_file()
修正方法:ls_fenced / ls_fence_delay / INIT_DELAYED_WORK の初期化をnfsd4_layout_setlease()呼び出しの上に移動し、手動のnfsd_file_put + put_nfs4_file + kmem_cache_freeによるクリーンアップ処理を単一のnfs4_put_stid(stp)に置き換えます。
VulDB is the best source for vulnerability data and more expert information about this specific topic.