CVE-2026-89675 in Linux情報

要約

〜によって VulDB • 2026年09月12日

Linuxカーネルにおいて、以下の脆弱性が修正されました:

nfsd: 非同期コピーのキャンセルおよびシャットダウンにおけるUAF(Use-After-Free)を修正

teardown呼び出し元(OFFLOAD_CANCEL, nfsd4_shutdown_copy, nfsd4_cancel_copy_by_sb)がcopy kthreadと競合した際、非同期コピーが解放後または使用中にアクセスされる(free or used after free)可能性があります。

- find_async_copy()はcopy->refcountを増加させましたが、clp->async_copies上にコピーを残したままにしたため、reaperのcleanup_async_copy()がcancel/shutdown呼び出し元と並行してrelease_copy_files()を実行する可能性がありました。両者が共通ロックなしでnf_src/nf_dstをputおよびNULL化し、nfsd_fileの二重解放(double-put)とその早期解放を引き起こしました。

- nfsd4_do_async_copy()は、コピーの最終的な使用(copy->nf_dstに対するnfsd_update_cmtime_attr()、nfsd4_send_cb_offload())の前にNFSD4_COPY_F_STOPPEDを設定しました。nfsd4_stop_copy()は設定されたSTOPPEDビットを「kthread完了、kthread_stop()をスキップする」として扱うため、teardown呼び出し元がrelease_copy_files()(nf_dstをputおよびNULL化します)を実行している間に、kthreadはまだそれを間接参照していました(NULL/UAF)。

- copy->copy_taskはピン留めされていませんでした。ワンショットのkthreadはreturn時に自己回収するため、kthread_stop()'s get_task_struct()が解放されたtask_structにアクセスする可能性があります。

- co_cbはコピー内に埋め込まれていますが、nfsd4_send_cb_offload()はクライアント上でのみ参照を保持していたため、並行したteardownによりCB_OFFLOADコールバックが送信中であってもコピーが解放される可能性がありました。

Teardownのライフタイム全体を修正します:

- find_async_copy()はasync_lockの下でcopyをアンリンク(cp_clpをクリアし、list_del_init)します。cancel、shutdown、sb-cancelパスでは、nfsd4_stop_copy()後にnfs4_put_copy()を通じてリストメンバシップ参照を解放します。cleanup_async_copy()からの現在不要なlist_del修正処理は削除されます。

- アンリンクによりreaperからコピーが隠蔽されるため、そのcleanup_async_copy()はもはやcopyのs2s_cp_stateidsエントリを削除できなくなります。cancel/shutdown/sb-cancelパスではnfs4_free_copy_state()自体を呼び出す(cp_clpがまだ有効な間に)ことで、laundromatおよびmanage_cpntf_state()による間接参照時に解放済みメモリにダングリングするのを防ぎます。

- kthread自身への参照を取得します。これはnfsd4_copy()内でwake_up_process()の前に取得され、nfsd4_do_async_copy()の終了時に解放されます。list_add()の前にwake_up_process()を呼び出します。

- nfsd4_copy()でget_task_struct()を使用してtask_structをピン留めし、nfs4_put_copy()で解放します。これによりkthreadが退出する際にいつでもkthread_stop()が安全になります。NFSD4_COPY_F_STOPPEDはnfsd4_stop_copy()内でのみ設定され、同関数はrelease_copy_files()の前に常にkthread_stop()を実行します。完了はまだNFSD4_COPY_F_COMPLETEDを通じて報告されるため、nfsd4_has_active_async_copies()には影響しません。各teardown呼び出し元はまずコピーをclp->async_copiesから削除するため、kthread_stop()は正確に1回だけ実行されます。

- nfsd4_send_cb_offload()内でcopy参照を取得し、nfsd4_cb_offload_release()で解放します。kthreadはその場所で自身の参照を保持しているため、refcount_inc()が最終的なfreeと競合することはありません。

- cp_clpはsmp_load_acquire()を使用して読み込みます(Documentation/atomic_bitops.rstに記載の順序付けされていないset_bit()/clear_bit()ライターとのペアリング用)。

If you want to get best quality of vulnerability data, you may have to visit VulDB.

責任者

Linux

予約する

2026年09月11日

モデレーション

承諾済み

エントリ

VDB-402994

EPSS

0.00000

アクティビティ

非常低い

ソース

Are you interested in using VulDB?

Download the whitepaper to learn more about our service!