CVE-2022-50396

Source
https://nvd.nist.gov/vuln/detail/CVE-2022-50396
Import Source
https://storage.googleapis.com/osv-test-cve-osv-conversion/osv-output/CVE-2022-50396.json
JSON Data
https://api.test.osv.dev/v1/vulns/CVE-2022-50396
Downstream
Related
Published
2025-09-18T13:33:14.450Z
Modified
2025-11-28T02:34:23.907351Z
Summary
net: sched: fix memory leak in tcindex_set_parms
Details

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

net: sched: fix memory leak in tcindexsetparms

Syzkaller reports a memory leak as follows:

BUG: memory leak unreferenced object 0xffff88810c287f00 (size 256): comm "syz-executor105", pid 3600, jiffies 4294943292 (age 12.990s) hex dump (first 32 bytes): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ backtrace: [<ffffffff814cf9f0>] kmalloctrace+0x20/0x90 mm/slabcommon.c:1046 [<ffffffff839c9e07>] kmalloc include/linux/slab.h:576 [inline] [<ffffffff839c9e07>] kmallocarray include/linux/slab.h:627 [inline] [<ffffffff839c9e07>] kcalloc include/linux/slab.h:659 [inline] [<ffffffff839c9e07>] tcfextsinit include/net/pktcls.h:250 [inline] [<ffffffff839c9e07>] tcindexsetparms+0xa7/0xbe0 net/sched/clstcindex.c:342 [<ffffffff839caa1f>] tcindexchange+0xdf/0x120 net/sched/clstcindex.c:553 [<ffffffff8394db62>] tcnewtfilter+0x4f2/0x1100 net/sched/clsapi.c:2147 [<ffffffff8389e91c>] rtnetlinkrcvmsg+0x4dc/0x5d0 net/core/rtnetlink.c:6082 [<ffffffff839eba67>] netlinkrcvskb+0x87/0x1d0 net/netlink/afnetlink.c:2540 [<ffffffff839eab87>] netlinkunicastkernel net/netlink/afnetlink.c:1319 [inline] [<ffffffff839eab87>] netlinkunicast+0x397/0x4c0 net/netlink/afnetlink.c:1345 [<ffffffff839eb046>] netlinksendmsg+0x396/0x710 net/netlink/afnetlink.c:1921 [<ffffffff8383e796>] socksendmsgnosec net/socket.c:714 [inline] [<ffffffff8383e796>] socksendmsg+0x56/0x80 net/socket.c:734 [<ffffffff8383eb08>] syssendmsg+0x178/0x410 net/socket.c:2482 [<ffffffff83843678>] syssendmsg+0xa8/0x110 net/socket.c:2536 [<ffffffff838439c5>] _syssendmmsg+0x105/0x330 net/socket.c:2622 [<ffffffff83843c14>] _dosyssendmmsg net/socket.c:2651 [inline] [<ffffffff83843c14>] _sesyssendmmsg net/socket.c:2648 [inline] [<ffffffff83843c14>] _x64syssendmmsg+0x24/0x30 net/socket.c:2648 [<ffffffff84605fd5>] dosyscallx64 arch/x86/entry/common.c:50 [inline] [<ffffffff84605fd5>] dosyscall_64+0x35/0xb0 arch/x86/entry/common.c:80

[<ffffffff84800087>] entrySYSCALL64afterhwframe+0x63/0xcd

Kernel uses tcindex_change() to change an existing filter properties.

Yet the problem is that, during the process of changing, if old_r is retrieved from p->perfect, then kernel uses tcindexallocperfecthash() to newly allocate filter results, uses tcindexfilterresultinit() to clear the old filter result, without destroying its tcf_exts structure, which triggers the above memory leak.

To be more specific, there are only two source for the old_r, according to the tcindex_lookup(). old_r is retrieved from p->perfect, or old_r is retrieved from p->h.

  • If old_r is retrieved from p->perfect, kernel uses tcindexallocperfecthash() to newly allocate the filter results. Then r is assigned with cp->perfect + handle, which is newly allocated. So condition old_r && old_r != r is true in this situation, and kernel uses tcindexfilterresultinit() to clear the old filter result, without destroying its tcf_exts structure

  • If old_r is retrieved from p->h, then p->perfect is NULL according to the tcindexlookup(). Considering that cp->h is directly copied from p->h and p->perfect is NULL, r is assigned with tcindex_lookup(cp, handle), whose value should be the same as old_r, so condition old_r && old_r != r is false in this situation, kernel ignores using tcindexfilterresultinit() to clear the old filter result.

So only when old_r is retrieved from p->perfect does kernel use tcindexfilterresult_init() to clear the old filter result, which triggers the above memory leak.

Considering that there already exists a tcfilterwq workqueue to destroy the old tcindex_d ---truncated---

Database specific
{
    "cna_assigner": "Linux",
    "osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2022/50xxx/CVE-2022-50396.json"
}
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
b9a24bb76bf611a5268ceffe04219e6ad264559b
Fixed
53af9c793f644d5841d84d8e0ad83bd7ab47f3e0
Fixed
01d0d2b8b4e3cf2110baba9371c0c3d04ad5c77b
Fixed
55ac68b53f1cea1926ee2313afc5d66b91daad71
Fixed
7a6fb69bbcb21e9ce13bdf18c008c268874f0480
Fixed
b314f6c3512108d7a656c5caf07c82d1bbbdc0f1
Fixed
18c3fa7a7fdbb4d21dafc8a7710ae2c1680930f6
Fixed
6c55953e232ea668731091d111066521f3b7719b
Fixed
7c183dc0af472dec33d2c0786a5e356baa8cad19
Fixed
c4de6057e7c6654983acb63d939d26ac0d7bbf39
Fixed
facc4405e8b7407e03216207b1d1d640127de0c8
Fixed
3abebc503a5148072052c229c6b04b329a420ecd
Fixed
399ab7fe0fa0d846881685fd4e57e9a8ef7559f7
Fixed
372ae77cf11d11fb118cbe2d37def9dd5f826abd

Linux / Kernel

Package

Name
Kernel

Affected ranges

Type
ECOSYSTEM
Events
Introduced
4.9.0
Fixed
4.14.308
Type
ECOSYSTEM
Events
Introduced
4.15.0
Fixed
4.19.276
Type
ECOSYSTEM
Events
Introduced
4.20.0
Fixed
5.4.229
Type
ECOSYSTEM
Events
Introduced
5.5.0
Fixed
5.4.235
Fixed
5.10.163
Type
ECOSYSTEM
Events
Introduced
5.11.0
Fixed
5.10.173
Fixed
5.15.87
Type
ECOSYSTEM
Events
Introduced
5.16.0
Fixed
5.15.100
Fixed
6.0.19
Type
ECOSYSTEM
Events
Introduced
6.1.0
Fixed
6.1.5
Type
ECOSYSTEM
Events
Introduced
6.2.0
Fixed
6.1.18
Fixed
6.2.5