CVE-2026-63981

Source
https://cve.org/CVERecord?id=CVE-2026-63981
Import Source
https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-63981.json
JSON Data
https://api.osv.dev/v1/vulns/CVE-2026-63981
Downstream
Published
2026-07-19T14:56:04.580Z
Modified
2026-07-21T03:47:45.439207434Z
Summary
net/sched: act_mirred: Fix blockcast recursion bypass leading to stack overflow
Details

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

net/sched: act_mirred: Fix blockcast recursion bypass leading to stack overflow

tcfmirredact() checks schedmirrednest against MIRREDNESTLIMIT (4) to prevent deep recursion. However, when the action uses blockcast (tcfmblockid != 0), the function returns at the tcfblockcast() call BEFORE reaching the counter increment. As a result, the recursion counter never advances and the limit check is entirely bypassed.

When two devices share a TC egress block with a mirred blockcast rule, a packet egressing on device A is mirrored to device B via blockcast; device B's egress TC re-enters tcfmirredact() via blockcast and mirrors back to A, creating an unbounded recursion loop:

tcfmirredact -> tcfblockcast -> tcfmirredtodev -> devqueuexmit -> schhandleegress -> tcfclassify -> tcfmirred_act -> (repeat)

This recursion continues until the kernel stack overflows.

The bug is reachable from an unprivileged user via unshare(CLONENEWUSER | CLONENEWNET): user namespaces grant CAPNETADMIN in the new network namespace, which is sufficient to create dummy devices, attach clsact qdiscs with shared blocks, and install mirred blockcast filters.

BUG: TASK stack guard page was hit at ffffc90000b7fff8 Oops: stack guard page: 0000 [#1] SMP KASAN NOPTI CPU: 2 UID: 1000 PID: 169 Comm: poc Not tainted 7.0.0-rc7-next-20260410 RIP: 0010:xasfind+0x17/0x480 Call Trace: xafind+0x17b/0x1d0 tcfmirredact+0x640/0x1060 tcfactionexec+0x400/0x530 basicclassify+0x128/0x1d0 tcfclassify+0xd83/0x1150 tc_run+0x328/0x620 _devqueuexmit+0x797/0x3100 tcfmirredtodev+0x7b1/0xf70 tcfmirredact+0x68a/0x1060 [repeating ~30+ times until stack overflow] Kernel panic - not syncing: Fatal exception in interrupt

Fix this by incrementing schedmirrednest before calling tcfblockcast() and decrementing it on return, mirroring the non-blockcast path. This ensures subsequent recursive entries see the updated counter and are correctly limited by MIRREDNEST_LIMIT.

Database specific
{
    "osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/63xxx/CVE-2026-63981.json",
    "cna_assigner": "Linux"
}
References

Affected packages

Git / git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

Affected ranges

Type
GIT
Repo
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
Events
Introduced
906736728cea480a85803c67fafb1b0e78491922
Fixed
25fc9352590f5ef21ebf290432bd768b336693bc
Type
GIT
Repo
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
Events
Introduced
fe946a751d9b52b7c45ca34899723b314b79b249
Fixed
34457de389fb64a01fdcc71177dfebe65fd2d362
Fixed
a005fa5d7502eefec7ee6e1c01adadc06de2f9ad

Database specific

source
"https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-63981.json"

Linux / Kernel

Package

Name
Kernel

Affected ranges

Type
ECOSYSTEM
Events
Introduced
6.19.0
Fixed
7.0.12

Database specific

source
"https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-63981.json"