{"id":"CVE-2026-98030","state":"PUBLISHED","title":"net: dsa: bcm_sf2: bound the CFP rule dump by the caller's buffer size","description":"In the Linux kernel, the following vulnerability has been resolved:\n\nnet: dsa: bcm_sf2: bound the CFP rule dump by the caller's buffer size\n\nbcm_sf2_cfp_rule_get_all() walks the whole cfp.unique bitmap into\nrule_locs[] without consulting nfc->rule_cnt, which is how many entries\nthe caller had room for.  ETHTOOL_GRXCLSRLALL requires no CAP_NET_ADMIN\nand the ioctl sizes the buffer from the rule_cnt userspace passes in, so\nonce an admin has installed CFP rules any user can ask for fewer slots\nthan there are rules and run off the end of the allocation.  A rule_cnt\nof 0 leaves the buffer pointer NULL and the walk dereferences it.","publishedAt":"2026-09-25T10:23:46.959Z","updatedAt":"2026-10-19T09:12:35.325Z","severity":{"score":7,"label":"High","version":"3.1","vector":"CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H","source":"Linux"},"assigner":"Linux","products":["Linux Linux"],"affected":[{"vendor":"Linux","product":"Linux","defaultStatus":"unaffected","versions":[{"version":"7318166cacad158b46240f66250d7cc5a481653b","status":"affected","lessThan":"ca49c526291d7cd3a5cb49b0edd7f50a5ae7176e","versionType":"git"},{"version":"7318166cacad158b46240f66250d7cc5a481653b","status":"affected","lessThan":"8e41ce02589c92356bfd8ef62f6ceff840546e1a","versionType":"git"},{"version":"7318166cacad158b46240f66250d7cc5a481653b","status":"affected","lessThan":"f2cf4ef2d94fc15fd2e21c131fc1ab3f76125bf4","versionType":"git"},{"version":"7318166cacad158b46240f66250d7cc5a481653b","status":"affected","lessThan":"f5e93162b3dd195bfda815e8f7a39aaf1d45437b","versionType":"git"},{"version":"7318166cacad158b46240f66250d7cc5a481653b","status":"affected","lessThan":"f1a2869b3629c0e8394b77b38cb9f19a018c653c","versionType":"git"},{"version":"7318166cacad158b46240f66250d7cc5a481653b","status":"affected","lessThan":"fd1a78c16b1f6978c09cf048e15f349732e4c707","versionType":"git"},{"version":"7318166cacad158b46240f66250d7cc5a481653b","status":"affected","lessThan":"b231b6d8516d3fe0d4bba549908e08d26a4531a5","versionType":"git"},{"version":"7318166cacad158b46240f66250d7cc5a481653b","status":"affected","lessThan":"cdb719f4b8596d9ccee2d56d204c2c4dce982f46","versionType":"git"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["drivers/net/dsa/bcm_sf2_cfp.c"]},{"vendor":"Linux","product":"Linux","defaultStatus":"affected","versions":[{"version":"4.11","status":"affected"},{"version":"0","status":"unaffected","lessThan":"4.11","versionType":"semver"},{"version":"5.10.271","status":"unaffected","lessThanOrEqual":"5.10.*","versionType":"semver"},{"version":"5.15.222","status":"unaffected","lessThanOrEqual":"5.15.*","versionType":"semver"},{"version":"6.1.189","status":"unaffected","lessThanOrEqual":"6.1.*","versionType":"semver"},{"version":"6.6.158","status":"unaffected","lessThanOrEqual":"6.6.*","versionType":"semver"},{"version":"6.12.111","status":"unaffected","lessThanOrEqual":"6.12.*","versionType":"semver"},{"version":"6.18.53","status":"unaffected","lessThanOrEqual":"6.18.*","versionType":"semver"},{"version":"7.2.7","status":"unaffected","lessThanOrEqual":"7.2.*","versionType":"semver"},{"version":"7.3","status":"unaffected","lessThanOrEqual":"*","versionType":"original_commit_for_fix"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["drivers/net/dsa/bcm_sf2_cfp.c"]}],"references":["https://git.kernel.org/stable/c/ca49c526291d7cd3a5cb49b0edd7f50a5ae7176e","https://git.kernel.org/stable/c/8e41ce02589c92356bfd8ef62f6ceff840546e1a","https://git.kernel.org/stable/c/f2cf4ef2d94fc15fd2e21c131fc1ab3f76125bf4","https://git.kernel.org/stable/c/f5e93162b3dd195bfda815e8f7a39aaf1d45437b","https://git.kernel.org/stable/c/f1a2869b3629c0e8394b77b38cb9f19a018c653c","https://git.kernel.org/stable/c/fd1a78c16b1f6978c09cf048e15f349732e4c707","https://git.kernel.org/stable/c/b231b6d8516d3fe0d4bba549908e08d26a4531a5","https://git.kernel.org/stable/c/cdb719f4b8596d9ccee2d56d204c2c4dce982f46"],"weaknesses":[],"ingestedAt":"2026-10-29T20:13:43.249Z","source":{"repository":"CVEProject/cvelistV5","path":"cves/2026/98xxx/CVE-2026-98030.json","commit":"556c9d3a8cd17e218bb8e452ba7cd619a384ff47"},"raw":{"dataType":"CVE_RECORD","dataVersion":"5.2","cveMetadata":{"cveId":"CVE-2026-98030","state":"PUBLISHED","datePublished":"2026-09-25T10:23:46.959Z","dateUpdated":"2026-10-19T09:12:35.325Z","assignerShortName":"Linux","assignerOrgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","dateReserved":"2026-09-25T10:19:56.070Z"},"containers":{"cna":{"title":"net: dsa: bcm_sf2: bound the CFP rule dump by the caller's buffer size","descriptions":[{"lang":"en","value":"In the Linux kernel, the following vulnerability has been resolved:\n\nnet: dsa: bcm_sf2: bound the CFP rule dump by the caller's buffer size\n\nbcm_sf2_cfp_rule_get_all() walks the whole cfp.unique bitmap into\nrule_locs[] without consulting nfc->rule_cnt, which is how many entries\nthe caller had room for.  ETHTOOL_GRXCLSRLALL requires no CAP_NET_ADMIN\nand the ioctl sizes the buffer from the rule_cnt userspace passes in, so\nonce an admin has installed CFP rules any user can ask for fewer slots\nthan there are rules and run off the end of the allocation.  A rule_cnt\nof 0 leaves the buffer pointer NULL and the walk dereferences it."}],"affected":[{"vendor":"Linux","product":"Linux","defaultStatus":"unaffected","versions":[{"version":"7318166cacad158b46240f66250d7cc5a481653b","status":"affected","lessThan":"ca49c526291d7cd3a5cb49b0edd7f50a5ae7176e","versionType":"git"},{"version":"7318166cacad158b46240f66250d7cc5a481653b","status":"affected","lessThan":"8e41ce02589c92356bfd8ef62f6ceff840546e1a","versionType":"git"},{"version":"7318166cacad158b46240f66250d7cc5a481653b","status":"affected","lessThan":"f2cf4ef2d94fc15fd2e21c131fc1ab3f76125bf4","versionType":"git"},{"version":"7318166cacad158b46240f66250d7cc5a481653b","status":"affected","lessThan":"f5e93162b3dd195bfda815e8f7a39aaf1d45437b","versionType":"git"},{"version":"7318166cacad158b46240f66250d7cc5a481653b","status":"affected","lessThan":"f1a2869b3629c0e8394b77b38cb9f19a018c653c","versionType":"git"},{"version":"7318166cacad158b46240f66250d7cc5a481653b","status":"affected","lessThan":"fd1a78c16b1f6978c09cf048e15f349732e4c707","versionType":"git"},{"version":"7318166cacad158b46240f66250d7cc5a481653b","status":"affected","lessThan":"b231b6d8516d3fe0d4bba549908e08d26a4531a5","versionType":"git"},{"version":"7318166cacad158b46240f66250d7cc5a481653b","status":"affected","lessThan":"cdb719f4b8596d9ccee2d56d204c2c4dce982f46","versionType":"git"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["drivers/net/dsa/bcm_sf2_cfp.c"]},{"vendor":"Linux","product":"Linux","defaultStatus":"affected","versions":[{"version":"4.11","status":"affected"},{"version":"0","status":"unaffected","lessThan":"4.11","versionType":"semver"},{"version":"5.10.271","status":"unaffected","lessThanOrEqual":"5.10.*","versionType":"semver"},{"version":"5.15.222","status":"unaffected","lessThanOrEqual":"5.15.*","versionType":"semver"},{"version":"6.1.189","status":"unaffected","lessThanOrEqual":"6.1.*","versionType":"semver"},{"version":"6.6.158","status":"unaffected","lessThanOrEqual":"6.6.*","versionType":"semver"},{"version":"6.12.111","status":"unaffected","lessThanOrEqual":"6.12.*","versionType":"semver"},{"version":"6.18.53","status":"unaffected","lessThanOrEqual":"6.18.*","versionType":"semver"},{"version":"7.2.7","status":"unaffected","lessThanOrEqual":"7.2.*","versionType":"semver"},{"version":"7.3","status":"unaffected","lessThanOrEqual":"*","versionType":"original_commit_for_fix"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["drivers/net/dsa/bcm_sf2_cfp.c"]}],"references":[{"url":"https://git.kernel.org/stable/c/ca49c526291d7cd3a5cb49b0edd7f50a5ae7176e"},{"url":"https://git.kernel.org/stable/c/8e41ce02589c92356bfd8ef62f6ceff840546e1a"},{"url":"https://git.kernel.org/stable/c/f2cf4ef2d94fc15fd2e21c131fc1ab3f76125bf4"},{"url":"https://git.kernel.org/stable/c/f5e93162b3dd195bfda815e8f7a39aaf1d45437b"},{"url":"https://git.kernel.org/stable/c/f1a2869b3629c0e8394b77b38cb9f19a018c653c"},{"url":"https://git.kernel.org/stable/c/fd1a78c16b1f6978c09cf048e15f349732e4c707"},{"url":"https://git.kernel.org/stable/c/b231b6d8516d3fe0d4bba549908e08d26a4531a5"},{"url":"https://git.kernel.org/stable/c/cdb719f4b8596d9ccee2d56d204c2c4dce982f46"}],"metrics":[{"cvssV3_1":{"version":"3.1","vectorString":"CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H","baseScore":7,"baseSeverity":"HIGH"},"scenarios":[{"lang":"en","value":"AV:L - The trigger is the local SIOCETHTOOL ioctl with ETHTOOL_GRXCLSRLALL on a bcm_sf2 DSA user port. The path is ethtool_get_rxnfc() -> dsa_user_get_rxnfc() -> bcm_sf2_get_rxnfc() -> bcm_sf2_cfp_rule_get_all(). The bad rule_cnt comes from userspace, and no packet from a remote peer is involved.\nAC:H - The overflow needs CFP rules installed beyond the default at bit 0 of cfp.unique, since the walk starts at index 1. Installing them via ETHTOOL_SRXCLSRLINS needs CAP_NET_ADMIN over the switch's netns, so the unprivileged attacker cannot create the rule state. Once rules exist, the bug fires every time.\nPR:L - ETHTOOL_GRXCLSRLALL is on ethtool's no-capability list in net/ethtool/ioctl.c, so any unprivileged local user who can open a socket in the netns holding the DSA port can send the dump request.\nUI:N - The attacker issues the ioctl themselves and picks rule_cnt. No other user has to act.\nS:U - Both the memory corruption and the leak stay inside the kernel's own security authority, with no VM or IOMMU boundary crossed.\nC:H - After the walk, nfc->rule_cnt holds the real rule count, which can be larger than the buffer. ethtool_rxnfc_copy_to_user() then copies rule_cnt*4 bytes from the undersized kcalloc buffer to userspace. That leaks up to about 1 KB of adjacent heap from a slab cache the attacker chooses.\nI:H - bcm_sf2_cfp_rule_get_all() writes u32 rule indices past a kcalloc(rule_cnt) buffer sized by the user. This is a heap out-of-bounds write into neighbouring objects in a slab cache the attacker picks, and it can corrupt kernel data structures.\nA:H - With rule_cnt=0 the rule_locs buffer stays NULL, so the walk writes through a NULL pointer and the kernel oopses. Any user can repeat this at will once rules are installed. Heap corruption from the out-of-bounds write can also crash the system."}]}],"providerMetadata":{"shortName":"Linux","orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","dateUpdated":"2026-10-19T09:12:35.325Z"},"cpeApplicability":[{"nodes":[{"operator":"OR","negate":false,"cpeMatch":[{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.11","versionEndExcluding":"5.10.271"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.11","versionEndExcluding":"5.15.222"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.11","versionEndExcluding":"6.1.189"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.11","versionEndExcluding":"6.6.158"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.11","versionEndExcluding":"6.12.111"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.11","versionEndExcluding":"6.18.53"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.11","versionEndExcluding":"7.2.7"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.11","versionEndExcluding":"7.3"}]}]}],"x_generator":{"engine":"bippy-1.2.0"}}}}}