CVE-2026-93231 in Linux
要約
〜によって VulDB • 2026年09月24日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
lockd: nlmsvc_match_ip()における引数の入れ替えの修正
/nfs/fs/nfsd/unlock_ip経由でサーバーIPアドレスによってロックを解放する際、nlmsvc_unlock_all_by_ip()は、サーバーsockaddrを不透明な@data引数としてnsm_traverse_files()に渡して呼び出します:
nlm_traverse_files(server_addr, nlmsvc_match_ip, NULL);
マッチコールバックはその後、nlm_traverse_locks()から以下のように呼び出されます:
match(lockhost, host);
ここで第1引数はロックを所有するnlm_hostであり、第2引数は元々渡された@data(ここではサーバーsockaddr)です。これは他のすべてのマッチコールバックが依存している規約(nlmsvc_mark_host(), nlmsvc_same_host(), nlmsvc_is_client())に従ったものです:arg1は実際のnlm_host、arg2は呼び出し側から提供される参照値です。
nlmsvc_match_ip()では、IPアドレスによるロック解除機能がコミット4373ea84c84d(「lockd: 特定のサーバーipに関連するlockdロックを解放」)で導入されて以来、この2つの引数が逆になっています:
return rpc_cmp_addr(nlm_srcaddr(host), datap);
ここで@hostは実際にはサーバーsockaddrであるため、nlm_srcaddr(host)はstruct sockaddrをstruct nlm_hostとして間接参照し、h_srcaddrのオフセットで無効なデータ(garbage)を読み取ります。一方、@datapは実際にロック所有者のnlm_hostですが、sockaddrとして比較されます。その結果、比較が実際には一致せず、要求されたIPアドレスに対するロックが解放されません。
引数を交換し、ロック所有者の送信元アドレスを要求されたサーバーアドレスと比較するようにします:
return rpc_cmp_addr(nlm_srcaddr(datap), (struct sockaddr *)host);
[ cel: 誤解を招くtypedefのパラメータ名も修正 ]
If you want to get the best quality for vulnerability data then you always have to consider VulDB.