LinuxのLinux Kernelにおける不特定の脆弱性
タイトル LinuxのLinux Kernelにおける不特定の脆弱性
概要

Linuxカーネルにおいて、以下の脆弱性が修正されました。ksmbdのsmb_inherit_dacl()関数内におけるnum_acesの検証とACEwalkの強化が行われました。smb_inherit_dacl()では、親ディレクトリのDACL xattrからオンディスクのnum_aces値を信用し、それを元にヒープ割り当てのサイズを決定していました。num_acesはle16_to_cpu(parent_pdacl-num_aces)からu16として読み取られますが、宣言されているpdacl_sizeとの整合性を検証していませんでした。認証されたクライアントは、親ディレクトリのsecurity.NTACLが改竄されている場合(例えば、オフラインでのxattr破損やparse_dacl()をバイパスするパスの同時操作により)、最小限の実際のACEデータしかない状態でnum_aces=65535を提示できます。これにより約8MBの割り当てが発生し(kzallocではないため初期化されていません)、後続のループは部分的にしかデータを埋めません。また、32ビットカーネルでは三方向のsize_t乗算オーバーフローを引き起こす可能性もありました。さらに、ACEの走査ループはoffsetof(struct smb_ace, access_req)という弱い最小サイズチェックを使用しており、ACEサイズが最小値未満の場合も拒否していませんでした。この問題はUML + KASAN + LOCKDEP環境にて実際のksmbdコード経路で再現されました。正規のmount.cifsクライアントがSMB経由で親ディレクトリを作成するとksmbdが有効なsecurity.NTACL xattrを書き込みますが、バックエンドファイルシステム上のNTACLバイナリが書き換えられ、num_acesが0xFFFFに設定されたもののposix_acl_hashが維持されているためksmbd_vfs_get_sd_xattr()のハッシュ検証は通過しました。その後のSMB2 CREATEで親の下に子が作成されると(シェアに"vfs objects = acl_xattr"が設定されている場合)、smb2_open()がsmb_inherit_dacl()を呼び出し、ページアロケータ失敗を引き起こします。パッチ適用後は、追加されたガードによって大きな割り当ての実行前に改竄された値を-EINVALで拒否し、smb2_open()はsmb2_create_sd_buffer()へフォールバックして子をデフォルトのSDで作成します。その結果、警告やクラッシュは発生しません。修正点は以下の通りです。1.num_acesをparse_dacl()で使用するのと同じ計算式でpdacl_sizeと照合して検証しました。2.オーバーフロー安全な割り当てのため、生のkmalloc(sizeof * num_aces * 2)をkmalloc_array(num_aces * 2, sizeof(...))に置き換えました。3.各ACEループのガードを強化し、有効な最小ACEサイズ(offsetof(smb_ace, sid) + CIFS_SID_BASE_SIZE)を要求し、過小サイズのACEを拒否するようにしました。これによりsmb_check_perm_dacl()やparse_dacl()の強化と整合しました。v1からv2では、合成テストモジュールでの停止表示を実用的なUML + KASAN複製に置換し、mount.cifsとSMB2 CREATE経路での再現に変更しました。さらにNamjaeによるコードレビューに従い、コードコメントからコミットハッシュの記述を削除し、parse_dacl()の参照は保持しました。

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

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

公表日 2026年5月1日0:00
登録日 2026年5月8日12:06
最終更新日 2026年5月8日12:06
CVSS3.0 : 重要
スコア 8.8
ベクター CVSS:3.0/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
影響を受けるシステム
Linux
Linux Kernel 5.15 以上 6.12.84 未満
Linux Kernel 6.13 以上 6.18.25 未満
Linux Kernel 6.19 以上 7.0.2 未満
CVE (情報セキュリティ 共通脆弱性識別子)
CWE (共通脆弱性タイプ一覧)
その他
変更履歴
No 変更内容 変更日
1 [2026年05月08日]
  掲載
2026年5月8日12:06

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

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

ksmbd: validate num_aces and harden ACE walk in smb_inherit_dacl()

smb_inherit_dacl() trusts the on-disk num_aces value from the parent
directory's DACL xattr and uses it to size a heap allocation:

aces_base = kmalloc(sizeof(struct smb_ace) * num_aces * 2, ...);

num_aces is a u16 read from le16_to_cpu(parent_pdacl->num_aces)
without checking that it is consistent with the declared pdacl_size.
An authenticated client whose parent directory's security.NTACL is
tampered (e.g. via offline xattr corruption or a concurrent path that
bypasses parse_dacl()) can present num_aces = 65535 with minimal
actual ACE data. This causes a ~8 MB allocation (not kzalloc, so
uninitialized) that the subsequent loop only partially populates, and
may also overflow the three-way size_t multiply on 32-bit kernels.

Additionally, the ACE walk loop uses the weaker
offsetof(struct smb_ace, access_req) minimum size check rather than
the minimum valid on-wire ACE size, and does not reject ACEs whose
declared size is below the minimum.

Reproduced on UML + KASAN + LOCKDEP against the real ksmbd code path.
A legitimate mount.cifs client creates a parent directory over SMB
(ksmbd writes a valid security.NTACL xattr), then the NTACL blob on
the backing filesystem is rewritten to set num_aces = 0xFFFF while
keeping the posix_acl_hash bytes intact so ksmbd_vfs_get_sd_xattr()'s
hash check still passes. A subsequent SMB2 CREATE of a child under
that parent drives smb2_open() into smb_inherit_dacl() (share has
"vfs objects = acl_xattr" set), which fails the page allocator:

WARNING: mm/page_alloc.c:5226 at __alloc_frozen_pages_noprof+0x46c/0x9c0
Workqueue: ksmbd-io handle_ksmbd_work
__alloc_frozen_pages_noprof+0x46c/0x9c0
___kmalloc_large_node+0x68/0x130
__kmalloc_large_node_noprof+0x24/0x70
__kmalloc_noprof+0x4c9/0x690
smb_inherit_dacl+0x394/0x2430
smb2_open+0x595d/0xabe0
handle_ksmbd_work+0x3d3/0x1140

With the patch applied the added guard rejects the tampered value
with -EINVAL before any large allocation runs, smb2_open() falls back
to smb2_create_sd_buffer(), and the child is created with a default
SD. No warning, no splat.

Fix by:

1. Validating num_aces against pdacl_size using the same formula
applied in parse_dacl().

2. Replacing the raw kmalloc(sizeof * num_aces * 2) with
kmalloc_array(num_aces * 2, sizeof(...)) for overflow-safe
allocation.

3. Tightening the per-ACE loop guard to require the minimum valid
ACE size (offsetof(smb_ace, sid) + CIFS_SID_BASE_SIZE) and
rejecting under-sized ACEs, matching the hardening in
smb_check_perm_dacl() and parse_dacl().

v1 -> v2:
- Replace the synthetic test-module splat in the changelog with a
real-path UML + KASAN reproduction driven through mount.cifs and
SMB2 CREATE; Namjae flagged the kcifs3_test_inherit_dacl_old name
in v1 since it does not exist in ksmbd.
- Drop the commit-hash citation from the code comment per Namjae's
review; keep the parse_dacl() pointer.

公表日 2026年5月1日23:16
登録日 2026年5月2日4:06
最終更新日 2026年5月7日5:27
影響を受けるソフトウェアの構成
構成1 以上 以下 より上 未満
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 5.15 6.12.84
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.13 6.18.25
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.19 7.0.2
関連情報、対策とツール
共通脆弱性一覧