CVE-2026-89664 in Linux
要約
〜によって VulDB • 2026年09月11日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
nfsd: OPEN復号化されたPOSIX ACLをop_release経由で解放する
nfsd4_decode_createhow4()はnfsd4_decode_fattr4()を呼び出し、posix_acl_alloc()を通じて参照カウント付きのstruct posix_aclオブジェクトを割り当て、それらをopen->op_paclおよびopen->op_dpaclに格納します。これらのポインタはOPEN compoundが完了した時点で解放されなければなりません。
nfsd4_decode_open_claim4()がシーケンスIDを変更しないエラー(non-seqid-mutating error)を返した場合、ディスパッチャはop_funcの実行前にショートサーキットします:
nfsd4_proc_compound() if (op->status && op->opnum == OP_OPEN) op->status = nfsd4_open_omfg(...) if (!seqid_mutating_err(ntohl(op->status))) return op->status; /* nfsd4_open()は決して実行されない */ ... opdesc->op_release(&op->u) /* op_pacl/op_dpaclを解放する必要がある */
この変更以前、OP_OPENにはnfsd4_ops[]内で.op_releaseが定義されておらず、解放処理のペアはnfsd4_open()内のout_err:ラベル内に存在していました。ショートサーキットパスではnfsd4_open()が呼び出されないため、有効なPOSIX ACL createhow4属性を持つ不正なOPEN compoundごとに両方のposix_acl参照リークが発生します。
nfsd4_open_release()を追加し、OP_OPENの.op_releaseとして接続します。posix_acl_release()はNULL安全であるため、単一の解放箇所が通常パスとnfsd4_open_omfgによるショートサーキットの両方をカバーします。二重解放を避けるために、nfsd4_open()'s out_err:ラベルからの対応するposix_acl_release()ペアを削除します。
compoundループには2つのエンコーディングブランチがあります:通常操作用のnfsd4_encode_operation()と、v4.0のリプレイ済み操作用のnfsd4_encode_replay()です。op_releaseは従来nfsd4_encode_operation()からのみ呼び出されていたため、リプレイパスではop->uに付随するリソースがリークしていました。
op_release()の呼び出しをnfsd4_encode_operation()およびリプレイブランチから移動し、nfsd4_proc_compound()内のif-else文の後に配置します。これにより、明確に正しいと見なせる単一のコールサイトが得られ、通常エンコーディングパスとリプレイパスの両方をカバーできます。
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.