All vulnerabilities
CVE-2026-97566

Linux: mptcp: pm: kernel: drop pending ADD_ADDR when removing ID0

Linux LinuxOperating systems
CVSS
NoneNot scored
ExploitationNo known exploitationNot in CISA KEV, which does not prove it is unexploitedCISA KEV
Exploit odds (EPSS)0.20%Chance of exploitation activity in the next 30 days, higher than 9% of CVEs. Scored 23 Oct 2026FIRST EPSS
Fixed in189d60057e5f3d6a62e3d71a3cc428c9150bc14fAlso 545616b4e7325be3c61fc082538cb06d14f7b1db, 2ac7d6e620764f1fc79eb4edd3610a7a661981caCVE List
Published25 Sep 2026Updated 21 Oct 2026CVE List

What fixes it

  • 189d60057e5f3d6a62e3d71a3cc428c9150bc14fLinuxCVE List
  • 545616b4e7325be3c61fc082538cb06d14f7b1dbLinuxCVE List
  • 2ac7d6e620764f1fc79eb4edd3610a7a661981caLinuxCVE List

A fixed version on one release line is not the upgrade target for every line. Check your exact version and any vendor backports.

Description

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

mptcp: pm: kernel: drop pending ADD_ADDR when removing ID0

The in-kernel MPTCP path manager can leave a stale ADD_ADDR announcement entry alive when removing the id 0 endpoint. This happens because the id 0 removal path does not tear down pending announcements, unlike the non-zero id path.

When the PM later reselects id 0 after adding another signal endpoint, it finds the stale anno_list entry and hits WARN_ON_ONCE(mptcp_pm_is_kernel()) in mptcp_pm_announced_alloc().

Root cause: asymmetry between removal paths.

  • Non-zero id path: mptcp_nl_remove_subflow_and_signal_addr() calls

mptcp_pm_remove_announced() to clean up.

  • Id 0 path: mptcp_nl_remove_id_zero_address() skips cleanup entirely.

Fix by making the id 0 path symmetric: call mptcp_pm_announced_remove() and decrement add_addr_signaled before queuing the RM_ADDR.

Subtle detail: signal endpoints are stored in anno_list with port 0, but msk_local carries the connection's local port. In other words, entries linked to ID0 paths should have port == 0. A follow-up patch will ensure that. mptcp_pm_announced_remove() uses use_port=true for comparison. So clear the port before the lookup.

Text from CVE List

Affected versions 12

  • Linuxaffected: 740d798e8767d8a449902b1a1bbc70facfce19b5 before 189d60057e5f3d6a62e3d71a3cc428c9150bc14fCVE List
  • Linuxaffected: 740d798e8767d8a449902b1a1bbc70facfce19b5 before bacf23e7c9876c9f4170166b3597cb22ea3ed39bCVE List
  • Linuxaffected: 740d798e8767d8a449902b1a1bbc70facfce19b5 before d4a67a880654e1bfe318a31bea0bdbb026a09adeCVE List
  • Linuxaffected: 740d798e8767d8a449902b1a1bbc70facfce19b5 before 545616b4e7325be3c61fc082538cb06d14f7b1dbCVE List
  • Linuxaffected: 740d798e8767d8a449902b1a1bbc70facfce19b5 before 2ac7d6e620764f1fc79eb4edd3610a7a661981caCVE List
  • Linuxaffected: 5.13CVE List
  • Linuxunaffected: all versions before 5.13CVE List
  • Linuxunaffected: 6.6.160 through 6.6.*CVE List
  • Linuxunaffected: 6.12.112 through 6.12.*CVE List
  • Linuxunaffected: 6.18.53 through 6.18.*CVE List
  • Linuxunaffected: 7.2.7 through 7.2.*CVE List
  • Linuxunaffected: 7.3CVE List

References 5