LinuxのLinux Kernelにおける解放済みメモリの使用に関する脆弱性
タイトル LinuxのLinux Kernelにおける解放済みメモリの使用に関する脆弱性
概要

Linuxカーネルにおいて、以下の脆弱性を修正しました: ksmbdのsmb_grant_oplock()におけるuse-after-freeおよびNULL参照の問題です。smb_grant_oplock()はオープンロック公開シーケンスで2つの問題がありました。1) opinfoはadd_lease_global_list()が呼ばれる前にci-m_op_listに(opinfo_addを介して)リンクされます。もしadd_lease_global_list()が失敗した場合(kmallocがNULLを返す場合)、エラーパスでopinfoは__free_opinfo()を介してci-m_op_listにリンクされたまま解放されます。このため、m_op_listの同時読取者(opinfo_get_listやsmb_break_all_levII_oplockによる直接反復)が解放済みノードを参照してしまいます。2) opinfo-o_fpはadd_lease_global_list()がopinfoをグローバルリースリストに公開した後に割り当てられます。同時にfind_same_lease_key()がリースリストを巡回すると、o_fpがまだNULLの間にopinfo-o_fp-f_ciを参照してしまう可能性があります。この公開後の失敗を排除するために公開シークエンスを再構成して修正しました。具体的には、NULL参照を修正するためにリスト公開前にopinfo-o_fpを設定し、opinfo_add()の前にalloc_lease_table()でlease_tableを事前に確保してadd_lease_global_list()が公開後に失敗しないようにしました。また、もとのm_op_list公開順序(opinfo_addが先、リースリストが後)を維持して、same_client_has_lease()やopinfo_get_list()による同時オープンが進行中のグラントを認識できるようにしました。さらに、エラーパスでは__free_opinfo()の代わりにopinfo_put()を使用し、RCU遅延解放パスを利用するようにしました。これにはadd_lease_global_list()の分割と、事前確保済みlease_tableの受け取り、および失敗しなくなったことで戻り値をintからvoidに変更することも含まれます。

想定される影響 当該ソフトウェアが扱う全ての情報が外部に漏れる可能性があります。 また、当該ソフトウェアが扱う全ての情報が書き換えられる可能性があります。 さらに、当該ソフトウェアが完全に停止する可能性があります。 そして、この脆弱性を悪用した攻撃の影響は、他のソフトウェアには及びません。 
対策

リリース情報、またはパッチ情報が公開されています。参考情報を参照して適切な対策を実施してください。

公表日 2026年4月22日0:00
登録日 2026年5月11日11:01
最終更新日 2026年5月11日11:01
CVSS3.0 : 緊急
スコア 9.8
ベクター CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
影響を受けるシステム
Linux
Linux Kernel 6.12.78 以上 6.12.80 未満
Linux Kernel 6.18.19 以上 6.18.21 未満
Linux Kernel 6.19.9 以上 6.19.11 未満
Linux Kernel 6.6.130
Linux Kernel 7.0
CVE (情報セキュリティ 共通脆弱性識別子)
CWE (共通脆弱性タイプ一覧)
その他
変更履歴
No 変更内容 変更日
1 [2026年05月11日]
  掲載
2026年5月11日11:01

NVD脆弱性情報
CVE-2026-31444
概要

In the Linux kernel, the following vulnerability has been resolved:

ksmbd: fix use-after-free and NULL deref in smb_grant_oplock()

smb_grant_oplock() has two issues in the oplock publication sequence:

1) opinfo is linked into ci->m_op_list (via opinfo_add) before
add_lease_global_list() is called. If add_lease_global_list()
fails (kmalloc returns NULL), the error path frees the opinfo
via __free_opinfo() while it is still linked in ci->m_op_list.
Concurrent m_op_list readers (opinfo_get_list, or direct iteration
in smb_break_all_levII_oplock) dereference the freed node.

2) opinfo->o_fp is assigned after add_lease_global_list() publishes
the opinfo on the global lease list. A concurrent
find_same_lease_key() can walk the lease list and dereference
opinfo->o_fp->f_ci while o_fp is still NULL.

Fix by restructuring the publication sequence to eliminate post-publish
failure:

- Set opinfo->o_fp before any list publication (fixes NULL deref).
- Preallocate lease_table via alloc_lease_table() before opinfo_add()
so add_lease_global_list() becomes infallible after publication.
- Keep the original m_op_list publication order (opinfo_add before
lease list) so concurrent opens via same_client_has_lease() and
opinfo_get_list() still see the in-flight grant.
- Use opinfo_put() instead of __free_opinfo() on err_out so that
the RCU-deferred free path is used.

This also requires splitting add_lease_global_list() to take a
preallocated lease_table and changing its return type from int to void,
since it can no longer fail.

公表日 2026年4月22日23:16
登録日 2026年4月25日4:05
最終更新日 2026年4月27日23:16
関連情報、対策とツール
共通脆弱性一覧