CVE-2026-98173

smb: client: fix use-after-free of iface in cifs_try_adding_channels()

State
Published
Severity
7.5 High
Published
Oct 6, 2026
Updated
Oct 30, 2026
Reserved
Sep 25, 2026

Read the record on cve.org

Description

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

smb: client: fix use-after-free of iface in cifs_try_adding_channels()

cifs_try_adding_channels() iterates ses->iface_list with list_for_each_entry_safe_from(), which captures the next entry (niface) under iface_lock. The loop body then drops iface_lock for the whole duration of cifs_ses_add_channel().

A concurrent interface refresh (SMB3_request_interfaces() -> parse_server_interfaces()) marks all ifaces inactive and removes and frees any that are not re-advertised via list_del() + kref_put(), where release_iface() is a bare kfree(). Since niface typically has no channel holding a reference, the list reference is its last and it can be freed inside the unlocked window. On continue, the iterator advance step then dereferences niface->iface_head.next, and the loop body reads iface->rdma_capable/is_active, both on freed memory.

Fix this by never keeping an unreferenced list pointer across the unlocked window. Each channel attempt now re-scans the list from the head under iface_lock, takes a kref on the selected candidate, and passes only that referenced candidate to cifs_ses_add_channel(). weight_fulfilled still tracks selection progress, so restarting the scan preserves the original weighted distribution and the weight_fulfilled-before-kref_put ordering on the failure path.

Add a per-pass attempts cap so a flapping interface refresh cannot keep the inner loop spinning within a single tries increment.

Scores

CVSSScoreVectorSource
3.17.5 HighCVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:HLinux

Weaknesses

The record names no weakness.

Affected Products

ProductVersions
LinuxLinux
  • aa45dadd34e44fcd6a9df4b395bee5b5633b4cec to before 93e8a49adb2a575202c5ee766435eff2f9f95f5bAffected
  • aa45dadd34e44fcd6a9df4b395bee5b5633b4cec to before ee0d8f83d68f6e6509f092c997ccab3c8c801538Affected
  • aa45dadd34e44fcd6a9df4b395bee5b5633b4cec to before c941f1ebfd26f683de81091473f3596a218abff0Affected
  • aa45dadd34e44fcd6a9df4b395bee5b5633b4cec to before e99040e5e9c60441e6b4725e1a7b88c3106ae903Affected
  • aa45dadd34e44fcd6a9df4b395bee5b5633b4cec to before ec36b38e65596950e6c29bed7dfc90b98707c19cAffected
  • aa45dadd34e44fcd6a9df4b395bee5b5633b4cec to before d034e836eefd7ce75e588f7031cffbeec594f5acAffected
LinuxLinux
  • 5.19Affected
  • before 5.19Not affected
  • 6.1.191 through 6.1.*Not affected
  • 6.6.160 through 6.6.*Not affected
  • 6.12.112 through 6.12.*Not affected
  • 6.18.54 through 6.18.*Not affected
  • 7.2.8 through 7.2.*Not affected
  • 7.3 and laterNot affected

References

Every record here comes from the CVE Program’s CVE List. © 1999–2026 The MITRE Corporation. CVE is a registered trademark of The MITRE Corporation. The records are reproduced under the CVE Program terms of use.