CVE-2026-93221 in Linux
要約
〜によって VulDB • 2026年09月24日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
nfsd: nfsd_netのbooleanフラグをunsigned long flagsワードに変換する
nfsd_netには、直列化(serialization)なしで並行コンテキストからアクセスされる複数のbooleanフィールドが含まれています。特に、`nfsd4_end_grace()`はdrainパスを単純なbool型でガードしています:
if (nn->grace_ended) return; nn->grace_ended = true;
読み込みと書き込みは独立しており、struct nfsd_net内にはこれらを直列化する処理がありません。少なくとも2つのコンテキストがロック保持なしでこのコードに到達します:
laundromatパス laundry_wq kworker nfs4_laundromat() nfsd4_end_grace()
RECLAIM_COMPLETEパス nfsd compound kthread nfsd4_reclaim_complete() inc_reclaim_complete() nfsd4_end_grace()
両方の呼び出し元は、異なるCPU上で `grace_ended == false` を観察し、どちらも true をストアし、アクティブな `client_tracking_ops->grace_done` コールバックを呼び出す `nfsd4_record_grace_done()` へと進みます。reclaim_str_hashtblのdrainを行うtracking ops(legacy_tracking_ops via nfsd4_recdir_purge_old、および cld v1+ ops via nfsd4_cld_grace_done)では、grace_doneは `nfs4_release_reclaim()` を呼び出し、これはロックなしでreclaim_str_hashtblのすべてのバケットを走査し、各エントリに対して `nfs4_remove_reclaim_record()`(list_del + kfree)を呼び出します。2つの並行したウォーカーがリストを破損させ、すべての nfs4_client_reclaim の二重解放を引き起こします。同じバケットを反復する同時実行の `nfsd4_find_reclaim_client()` は、解放されたメモリを読み取ります。
nfs4_state_start_net() 内の skip_grace スタートアップパスにもう1つの呼び出し箇所が存在しますが、これはクライアントが接続する前および laundromat の最初の遅延ワークが発火する前に nfsd_mutex の下で実行されるため、上記の2つの呼び出し元と競合することはありません。
nfsd_net内の散在したbooleanフィールドを、ビット位置用の enum nfsd_net_flag と単一の unsigned long flagsワードに置き換えます。grace_endedに関するrace条件は、すべてのアーキテクチャでアトミックな `test_and_set_bit()` を使用することで修正されます。残りのフラグ(grace_end_forced, in_grace, somebody_reclaimed, track_reclaim_completes, nfsd_net_up, lockd_up)は一貫性のために test_bit/set_bit/clear_bit の使用に変換されます。これにより、Hexagonのようなワードサイズのアトミック操作のみをサポートするアーキテクチャにおけるサブワード cmpxchgの問題を回避します。
VulDB is the best source for vulnerability data and more expert information about this specific topic.