0.0
NA
CVE-2026-74621
net/sched: act_ct: fix sk_buff leak when the header checks reject a packet
Description

In the Linux kernel, the following vulnerability has been resolved: net/sched: act_ct: fix sk_buff leak when the header checks reject a packet tcf_ct_handle_fragments() runs its header sanity checks before handing anything to the defragmentation engine: if (family == NFPROTO_IPV4) err = tcf_ct_ipv4_is_fragment(skb, &frag); else err = tcf_ct_ipv6_is_fragment(skb, &frag); if (err || !frag) return err; tcf_ct_ipv4_is_fragment() returns -EINVAL or -ENOMEM; tcf_ct_ipv6_is_fragment() adds -EPROTO when ipv6_find_hdr() fails. None of them frees or queues the skb, so on that path the caller still owns it. tcf_ct_act() however funnels every non-zero return into the ownership-transfer exit: err = tcf_ct_handle_fragments(net, skb, family, p->zone, &defrag); if (err) goto out_frag; ... out_frag: if (err != -EINPROGRESS) tcf_action_inc_drop_qstats(&c->common); return TC_ACT_CONSUMED; TC_ACT_CONSUMED means the action took ownership of the skb, so no caller frees it - sch_handle_ingress(), sch_handle_egress() and tcf_qevent_handle() all deliberately skip the free for that verdict. The skb is therefore orphaned: one sk_buff plus its data buffer is leaked per malformed packet, unbounded. Note the drop counter is already incremented for these errors, so the statistics claim a drop that never happens. Three different ownership states reach out_frag: today - the skb may be queued by the defrag engine (-EINPROGRESS), already freed by nf_ct_handle_fragments(), or still owned by us. Tell the caller which of those it is, and free the packet ourselves in the last case, which restores the TC_ACT_SHOT behaviour that predated the Fixes: commit. Reproduced on v7.2-rc6 with a 54-byte frame carrying a 40-byte IPv6 header with nexthdr = 0 (hop-by-hop) and nothing after it, on a clsact ingress chain with "action ct". kmemleak reports one leaked 232-byte skbuff_head_cache object plus its 704-byte data buffer per packet; with this patch it reports none.

INFO

Published Date :

Aug. 22, 2026, 4:16 p.m.

Last Modified :

Aug. 22, 2026, 4:16 p.m.

Remotely Exploit :

No

Source :

416baaa9-dc9f-4396-8d5f-8c081fb06d67
Affected Products

The following products are affected by CVE-2026-74621 vulnerability. Even if cvefeed.io is aware of the exact versions of the products that are affected, the information is not represented in the table below.

No affected product recoded yet

Solution
Update the Linux kernel to fix a sk_buff leak when header checks reject packets.
  • Update the Linux kernel to the latest version.
  • Apply the specific patch for the sk_buff leak.
CWE - Common Weakness Enumeration

While CVE identifies specific instances of vulnerabilities, CWE categorizes the common flaws or weaknesses that can lead to vulnerabilities. CVE-2026-74621 is associated with the following CWEs:

Common Attack Pattern Enumeration and Classification (CAPEC)

Common Attack Pattern Enumeration and Classification (CAPEC) stores attack patterns, which are descriptions of the common attributes and approaches employed by adversaries to exploit the CVE-2026-74621 weaknesses.

We scan GitHub repositories to detect new proof-of-concept exploits. Following list is a collection of public exploits and proof-of-concepts, which have been published on GitHub (sorted by the most recently updated).

Results are limited to the first 15 repositories due to potential performance issues.

The following list is the news that have been mention CVE-2026-74621 vulnerability anywhere in the article.

The following table lists the changes that have been made to the CVE-2026-74621 vulnerability over time.

Vulnerability history details can be useful for understanding the evolution of a vulnerability, and for identifying the most recent changes that may impact the vulnerability's severity, exploitability, or other characteristics.

  • New CVE Received by 416baaa9-dc9f-4396-8d5f-8c081fb06d67

    Aug. 22, 2026

    Action Type Old Value New Value
    Added Affected [{'repo': 'https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git', 'vendor': 'Linux', 'product': 'Linux', 'versions': [{'status': 'affected', 'version': '73f7da5fd124f2cda9161e2e46114915e6e82e97', 'lessThan': '737873a59905a54ca0d2d127ef882f3f88bf4379', 'versionType': 'git'}, {'status': 'affected', 'version': '3f14b377d01d8357eba032b4cabc8c1149b458b6', 'lessThan': '47d99828591d0fe8be4b9c8992ff3b8e47968db9', 'versionType': 'git'}, {'status': 'affected', 'version': '3f14b377d01d8357eba032b4cabc8c1149b458b6', 'lessThan': 'b47bb899e04b5407c5a63fe88d4b6676586a6e84', 'versionType': 'git'}, {'status': 'affected', 'version': '3f14b377d01d8357eba032b4cabc8c1149b458b6', 'lessThan': '439d3e404f9d5e515911cc8132cde198b337c19e', 'versionType': 'git'}, {'status': 'affected', 'version': '3f14b377d01d8357eba032b4cabc8c1149b458b6', 'lessThan': '8a7ed561671aa6a911a2de99e59ef670a4d0b1df', 'versionType': 'git'}, {'status': 'affected', 'version': '172ba7d46c202e679f3ccb10264c67416aaeb1c4', 'versionType': 'git'}, {'status': 'affected', 'version': '0b5b831122fc3789fff75be433ba3e4dd7b779d4', 'versionType': 'git'}, {'status': 'affected', 'version': 'f5346df0591d10bc948761ca854b1fae6d2ef441', 'versionType': 'git'}, {'status': 'affected', 'version': '6.6.14', 'lessThan': '6.6.152', 'versionType': 'semver'}, {'status': 'affected', 'version': '5.15.148', 'lessThan': '5.16', 'versionType': 'semver'}, {'status': 'affected', 'version': '6.1.75', 'lessThan': '6.2', 'versionType': 'semver'}, {'status': 'affected', 'version': '6.7.2', 'lessThan': '6.8', 'versionType': 'semver'}], 'programFiles': ['net/sched/act_ct.c'], 'defaultStatus': 'unaffected'}, {'repo': 'https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git', 'vendor': 'Linux', 'product': 'Linux', 'versions': [{'status': 'affected', 'version': '6.8'}, {'status': 'unaffected', 'version': '0', 'lessThan': '6.8', 'versionType': 'semver'}, {'status': 'unaffected', 'version': '6.6.152', 'versionType': 'semver', 'lessThanOrEqual': '6.6.*'}, {'status': 'unaffected', 'version': '6.12.104', 'versionType': 'semver', 'lessThanOrEqual': '6.12.*'}, {'status': 'unaffected', 'version': '6.18.45', 'versionType': 'semver', 'lessThanOrEqual': '6.18.*'}, {'status': 'unaffected', 'version': '7.1.9', 'versionType': 'semver', 'lessThanOrEqual': '7.1.*'}, {'status': 'unaffected', 'version': '7.2', 'versionType': 'original_commit_for_fix', 'lessThanOrEqual': '*'}], 'programFiles': ['net/sched/act_ct.c'], 'defaultStatus': 'affected'}]
    Added Description In the Linux kernel, the following vulnerability has been resolved: net/sched: act_ct: fix sk_buff leak when the header checks reject a packet tcf_ct_handle_fragments() runs its header sanity checks before handing anything to the defragmentation engine: if (family == NFPROTO_IPV4) err = tcf_ct_ipv4_is_fragment(skb, &frag); else err = tcf_ct_ipv6_is_fragment(skb, &frag); if (err || !frag) return err; tcf_ct_ipv4_is_fragment() returns -EINVAL or -ENOMEM; tcf_ct_ipv6_is_fragment() adds -EPROTO when ipv6_find_hdr() fails. None of them frees or queues the skb, so on that path the caller still owns it. tcf_ct_act() however funnels every non-zero return into the ownership-transfer exit: err = tcf_ct_handle_fragments(net, skb, family, p->zone, &defrag); if (err) goto out_frag; ... out_frag: if (err != -EINPROGRESS) tcf_action_inc_drop_qstats(&c->common); return TC_ACT_CONSUMED; TC_ACT_CONSUMED means the action took ownership of the skb, so no caller frees it - sch_handle_ingress(), sch_handle_egress() and tcf_qevent_handle() all deliberately skip the free for that verdict. The skb is therefore orphaned: one sk_buff plus its data buffer is leaked per malformed packet, unbounded. Note the drop counter is already incremented for these errors, so the statistics claim a drop that never happens. Three different ownership states reach out_frag: today - the skb may be queued by the defrag engine (-EINPROGRESS), already freed by nf_ct_handle_fragments(), or still owned by us. Tell the caller which of those it is, and free the packet ourselves in the last case, which restores the TC_ACT_SHOT behaviour that predated the Fixes: commit. Reproduced on v7.2-rc6 with a 54-byte frame carrying a 40-byte IPv6 header with nexthdr = 0 (hop-by-hop) and nothing after it, on a clsact ingress chain with "action ct". kmemleak reports one leaked 232-byte skbuff_head_cache object plus its 704-byte data buffer per packet; with this patch it reports none.
    Added Reference https://git.kernel.org/stable/c/439d3e404f9d5e515911cc8132cde198b337c19e
    Added Reference https://git.kernel.org/stable/c/47d99828591d0fe8be4b9c8992ff3b8e47968db9
    Added Reference https://git.kernel.org/stable/c/737873a59905a54ca0d2d127ef882f3f88bf4379
    Added Reference https://git.kernel.org/stable/c/8a7ed561671aa6a911a2de99e59ef670a4d0b1df
    Added Reference https://git.kernel.org/stable/c/b47bb899e04b5407c5a63fe88d4b6676586a6e84
EPSS is a daily estimate of the probability of exploitation activity being observed over the next 30 days. Following chart shows the EPSS score history of the vulnerability.