| Title | LinuxのLinux Kernelにおける不特定の脆弱性 |
|---|---|
| Summary | 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()の参照は保持しました。 |
| Possible impacts | 当該ソフトウェアが扱う全ての情報が外部に漏れる可能性があります。 また、当該ソフトウェアが扱う全ての情報が書き換えられる可能性があります。 さらに、当該ソフトウェアが完全に停止する可能性があります。 そして、この脆弱性を悪用した攻撃の影響は、他のソフトウェアには及びません。 |
| Solution | リリース情報、またはパッチ情報が公開されています。参考情報を参照して適切な対策を実施してください。 |
| Publication Date | May 1, 2026, midnight |
| Registration Date | May 8, 2026, 12:06 p.m. |
| Last Update | May 8, 2026, 12:06 p.m. |
| CVSS3.0 : 重要 | |
| Score | 8.8 |
|---|---|
| Vector | 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 未満 |
| No | Changed Details | Date of change |
|---|---|---|
| 1 | [2026年05月08日] 掲載 |
May 8, 2026, 12:06 p.m. |
| Summary | 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 aces_base = kmalloc(sizeof(struct smb_ace) * num_aces * 2, ...); num_aces is a u16 read from le16_to_cpu(parent_pdacl->num_aces) Additionally, the ACE walk loop uses the weaker Reproduced on UML + KASAN + LOCKDEP against the real ksmbd code path. WARNING: mm/page_alloc.c:5226 at __alloc_frozen_pages_noprof+0x46c/0x9c0 With the patch applied the added guard rejects the tampered value Fix by: 1. Validating num_aces against pdacl_size using the same formula 2. Replacing the raw kmalloc(sizeof * num_aces * 2) with 3. Tightening the per-ACE loop guard to require the minimum valid v1 -> v2: |
|---|---|
| Publication Date | May 1, 2026, 11:16 p.m. |
| Registration Date | May 2, 2026, 4:06 a.m. |
| Last Update | May 7, 2026, 5:27 a.m. |
| Configuration1 | or higher | or less | more than | less than | |
| 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 | |||