CVE-2026-74700 (GCVE-0-2026-74700)

Vulnerability from cvelistv5 – Published: 2026-08-22 15:33 – Updated: 2026-08-25 05:41
VLAI
Title
net/sched: cls_api: Always acquire rtnl_lock when destroying locked classifiers
Summary
In the Linux kernel, the following vulnerability has been resolved: net/sched: cls_api: Always acquire rtnl_lock when destroying locked classifiers Another challenge with unlocked filters. There is a short window in tc_new_tfilter where a tcf_proto can be found and briefly referenced by a totally unrelated, unlocked classifier's request and cause a race. Feng created a poc which created this race with two threads, one creating a u32 filter and other a flower filter in the same chain/prio: 1. Both threads enter tc_new_tfilter, both find the chain empty, both drop filter_chain_lock 2. u32 finishes tcf_proto_create("u32") first, calls tcf_chain_tp_insert_unique() -> inserts u32_tp into the chain 3. flower finishes tcf_proto_create("flower") later, calls tcf_chain_tp_insert_unique() -> tcf_chain_tp_find() now sees u32_tp already there, takes a reference on it, destroys flower's own tp_new and returns u32_tp to the caller. Flower then hits the kind mismatch check (because it requested for kind "flower" but tp->ops->kind is "u32") and goes through the errout path which calls tcf_proto_put() on u32_tp. If the u32 thread has already gone through its own errout (its change() call failed on the PoC's empty options) and dropped its create and insert refs, flower's put is the last one and drops u32_tp's refcnt to zero. At this point tp->ops->destroy() runs in a context that never took rtnl_lock. When that happens, it might cause a UAF like the following (illustrated by the PoC): [ +0.000710] BUG: KASAN: slab-use-after-free in u32_init (net/sched/cls_u32.c:393) [ +0.000281] Read of size 8 at addr ffff888120022f00 by task poc_feng_xue/524 Call Trace: u32_init (net/sched/cls_u32.c:393) tc_new_tfilter (net/sched/cls_api.c:2378) Allocated by task 526: u32_init (net/sched/cls_u32.c:378) tc_new_tfilter (net/sched/cls_api.c:2378) Freed by task 522: kfree u32_destroy (net/sched/cls_u32.c:662) tcf_proto_destroy (net/sched/cls_api.c:446) tcf_proto_put (net/sched/cls_api.c:459) tc_new_tfilter (net/sched/cls_api.c:2459) Fix this by having tcf_proto_destroy() take rtnl_lock around tp->ops->destroy() for locked classifiers whenever rtnl is not held. To explain why I used a temp variable "not_lockless" I'd like to point to a semi-related note on rtnl_held vs TCF_PROTO_OPS_DOIT_UNLOCKED (adding here for future cleanup if deemed necessary): The rtnl_held parameter and the TCF_PROTO_OPS_DOIT_UNLOCKED flag are redundant sources of truth for whether rtnl_lock is held. Among the nine classifier destroy(..rtnl_held..) callbacks, only flower consults the rtnl_held parameter which it propagates to tc_setup_cb_destroy() and tc_setup_cb_call(). The other eight (u32, flow, bpf, cgroup, route, basic, fw, mall) ignore it entirely;-> those that call tc_setup_cb_destroy() (u32, bpf, mall) hardcode true always instead of forwarding the parameter. A future cleanup should remove the rtnl_held parameter from the destroy callback signature entirely and have callers rely solely on their knowledge whether they are running in an unlocked context.
Assigner
Linux CNA under the mitre root
CNA scorecard D 53/100 over 6665 records in the last 180 days details
Impacted products
Vendor Product Version CPE status
Linux Linux Affected: 12db03b65c2b90752e4c37666977fd4a1b5f5824 , < 34e77d8e3570f9df3952496ddb402833695662fd (git)
Affected: 12db03b65c2b90752e4c37666977fd4a1b5f5824 , < b648c8a56531aeabd1c14f6b5cf1891e269b3756 (git)
Affected: 12db03b65c2b90752e4c37666977fd4a1b5f5824 , < d6222af7274f08e7a1848131dc30319993d8f377 (git)
Affected: 12db03b65c2b90752e4c37666977fd4a1b5f5824 , < a81f9c44d87fb59d99fce72e29e02cab3a49a1c3 (git)
Affected: 12db03b65c2b90752e4c37666977fd4a1b5f5824 , < a347304b2ca1a5377d5bd2d8a72e4b4f12afe648 (git)
guessed Create a notification for this product.
Linux Linux Affected: 5.1
Unaffected: 0 , < 5.1 (semver)
Unaffected: 6.6.152 , ≤ 6.6.* (semver)
Unaffected: 6.12.104 , ≤ 6.12.* (semver)
Unaffected: 6.18.45 , ≤ 6.18.* (semver)
Unaffected: 7.1.9 , ≤ 7.1.* (semver)
Unaffected: 7.2 , ≤ * (original_commit_for_fix)
guessed Create a notification for this product.
Show details on NVD website

{
  "containers": {
    "cna": {
      "affected": [
        {
          "defaultStatus": "unaffected",
          "product": "Linux",
          "programFiles": [
            "net/sched/cls_api.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "lessThan": "34e77d8e3570f9df3952496ddb402833695662fd",
              "status": "affected",
              "version": "12db03b65c2b90752e4c37666977fd4a1b5f5824",
              "versionType": "git"
            },
            {
              "lessThan": "b648c8a56531aeabd1c14f6b5cf1891e269b3756",
              "status": "affected",
              "version": "12db03b65c2b90752e4c37666977fd4a1b5f5824",
              "versionType": "git"
            },
            {
              "lessThan": "d6222af7274f08e7a1848131dc30319993d8f377",
              "status": "affected",
              "version": "12db03b65c2b90752e4c37666977fd4a1b5f5824",
              "versionType": "git"
            },
            {
              "lessThan": "a81f9c44d87fb59d99fce72e29e02cab3a49a1c3",
              "status": "affected",
              "version": "12db03b65c2b90752e4c37666977fd4a1b5f5824",
              "versionType": "git"
            },
            {
              "lessThan": "a347304b2ca1a5377d5bd2d8a72e4b4f12afe648",
              "status": "affected",
              "version": "12db03b65c2b90752e4c37666977fd4a1b5f5824",
              "versionType": "git"
            }
          ]
        },
        {
          "defaultStatus": "affected",
          "product": "Linux",
          "programFiles": [
            "net/sched/cls_api.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "status": "affected",
              "version": "5.1"
            },
            {
              "lessThan": "5.1",
              "status": "unaffected",
              "version": "0",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.6.*",
              "status": "unaffected",
              "version": "6.6.152",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.12.*",
              "status": "unaffected",
              "version": "6.12.104",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.18.*",
              "status": "unaffected",
              "version": "6.18.45",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "7.1.*",
              "status": "unaffected",
              "version": "7.1.9",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "*",
              "status": "unaffected",
              "version": "7.2",
              "versionType": "original_commit_for_fix"
            }
          ]
        }
      ],
      "cpeApplicability": [
        {
          "nodes": [
            {
              "cpeMatch": [
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.6.152",
                  "versionStartIncluding": "5.1",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.12.104",
                  "versionStartIncluding": "5.1",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.18.45",
                  "versionStartIncluding": "5.1",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.1.9",
                  "versionStartIncluding": "5.1",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.2",
                  "versionStartIncluding": "5.1",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ]
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nnet/sched: cls_api: Always acquire rtnl_lock when destroying locked classifiers\n\nAnother challenge with unlocked filters.\nThere is a short window in tc_new_tfilter where a tcf_proto can be found\nand briefly referenced by a totally unrelated, unlocked classifier\u0027s request\nand cause a race.\n\nFeng created a poc which created this race with two threads, one creating a\nu32 filter and other a flower filter in the same chain/prio:\n\n1. Both threads enter tc_new_tfilter, both find the chain empty, both\n   drop filter_chain_lock\n2. u32 finishes tcf_proto_create(\"u32\") first, calls\n   tcf_chain_tp_insert_unique() -\u003e inserts u32_tp into the chain\n3. flower finishes tcf_proto_create(\"flower\") later, calls\n   tcf_chain_tp_insert_unique() -\u003e tcf_chain_tp_find() now sees u32_tp\n   already there, takes a reference on it, destroys flower\u0027s own tp_new\n   and returns u32_tp to the caller.\n\nFlower then hits the kind mismatch check (because it requested for kind\n\"flower\" but tp-\u003eops-\u003ekind is \"u32\") and goes through the errout path\nwhich calls tcf_proto_put() on u32_tp. If the u32 thread has already\ngone through its own errout (its change() call failed on the PoC\u0027s empty\noptions) and dropped its create and insert refs, flower\u0027s put is the\nlast one and drops u32_tp\u0027s refcnt to zero.\n\nAt this point tp-\u003eops-\u003edestroy() runs in a context that never took\nrtnl_lock. When that happens, it might cause a UAF like the following\n(illustrated by the PoC):\n\n[  +0.000710] BUG: KASAN: slab-use-after-free in u32_init (net/sched/cls_u32.c:393)\n[  +0.000281] Read of size 8 at addr ffff888120022f00 by task poc_feng_xue/524\n\n  Call Trace:\n   u32_init (net/sched/cls_u32.c:393)\n   tc_new_tfilter (net/sched/cls_api.c:2378)\n\n  Allocated by task 526:\n   u32_init (net/sched/cls_u32.c:378)\n   tc_new_tfilter (net/sched/cls_api.c:2378)\n\n  Freed by task 522:\n   kfree\n   u32_destroy (net/sched/cls_u32.c:662)\n   tcf_proto_destroy (net/sched/cls_api.c:446)\n   tcf_proto_put (net/sched/cls_api.c:459)\n   tc_new_tfilter (net/sched/cls_api.c:2459)\n\nFix this by having tcf_proto_destroy() take rtnl_lock around\ntp-\u003eops-\u003edestroy() for locked classifiers whenever rtnl is not held.\n\nTo explain why I used a temp variable \"not_lockless\" I\u0027d like to point to a\nsemi-related note on rtnl_held vs TCF_PROTO_OPS_DOIT_UNLOCKED (adding here\nfor future cleanup if deemed necessary):\nThe rtnl_held parameter and the TCF_PROTO_OPS_DOIT_UNLOCKED flag are\nredundant sources of truth for whether rtnl_lock is held. Among the nine\nclassifier destroy(..rtnl_held..) callbacks, only flower consults the\nrtnl_held parameter which it propagates to tc_setup_cb_destroy()\nand tc_setup_cb_call(). The other eight (u32, flow, bpf, cgroup, route, basic,\nfw, mall) ignore it entirely;-\u003e those that call tc_setup_cb_destroy()\n(u32, bpf, mall) hardcode true always instead of forwarding the parameter.\n\nA future cleanup should remove the rtnl_held parameter from the destroy callback\nsignature entirely and have callers rely solely on their knowledge whether\nthey are running in an unlocked context."
        }
      ],
      "metrics": [
        {
          "cvssV3_1": {
            "baseScore": 7.8,
            "baseSeverity": "HIGH",
            "vectorString": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H",
            "version": "3.1"
          },
          "scenarios": [
            {
              "lang": "en",
              "value": "AV:L - The bug is reached only via RTM_NEWTFILTER/rtnetlink from a local process (tc filter add); tc_new_tfilter() is a TC configuration path, not packet receive or any remote network service, and per kernel CNA guidance tc/netlink qdisc/classifier operations are Local.\nAC:L - A PoC triggers this with two attacker-controlled threads concurrently creating u32 and flower filters on the same chain/priority; the attacker creates and wins the tcf_chain_tp_insert_unique race without uncontrollable victim timing or memory layout.\nPR:L - rtnetlink enforces CAP_NET_ADMIN via netlink_net_capable() before tc_new_tfilter(); this capability is routinely obtainable in an unprivileged-created user+network namespace (unshare -Urn) and is commonly delegated to containers with NET_ADMIN.\nUI:N - Exploitation requires only the attacker\u0027s own concurrent tc/netlink operations to race u32 and flower filter creation; no victim action such as opening a file or mounting a filesystem is needed.\nS:U - The UAF corrupts kernel TC classifier state (tc_u_common hash/hlist) during cls_api teardown on the same host kernel; this is standard kernel memory corruption, not a VM escape or cross-security-authority boundary.\nC:H - Concurrent u32_destroy() without rtnl_lock frees tp_c while another thread\u0027s u32_init() reads tp_c-\u003ehlist (cls_u32.c:393); KASAN-confirmed slab use-after-free that per kernel guidance enables arbitrary kernel memory disclosure.\nI:H - The race frees and reuses tc_u_common/tcf_proto structures without rtnl synchronization, corrupting shared classifier hash lists; UAF on these heap objects enables heap spraying and arbitrary kernel write or code execution primitives.\nA:H - The PoC triggers KASAN slab-use-after-free in u32_init(); UAF on core net/sched classifier teardown can cause kernel oops/panic/hang, denying system availability until reboot."
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-08-25T05:41:42.546Z",
        "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "shortName": "Linux"
      },
      "references": [
        {
          "url": "https://git.kernel.org/stable/c/34e77d8e3570f9df3952496ddb402833695662fd"
        },
        {
          "url": "https://git.kernel.org/stable/c/b648c8a56531aeabd1c14f6b5cf1891e269b3756"
        },
        {
          "url": "https://git.kernel.org/stable/c/d6222af7274f08e7a1848131dc30319993d8f377"
        },
        {
          "url": "https://git.kernel.org/stable/c/a81f9c44d87fb59d99fce72e29e02cab3a49a1c3"
        },
        {
          "url": "https://git.kernel.org/stable/c/a347304b2ca1a5377d5bd2d8a72e4b4f12afe648"
        }
      ],
      "title": "net/sched: cls_api: Always acquire rtnl_lock when destroying locked classifiers",
      "x_generator": {
        "engine": "bippy-1.2.0"
      }
    }
  },
  "cveMetadata": {
    "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
    "assignerShortName": "Linux",
    "cveId": "CVE-2026-74700",
    "datePublished": "2026-08-22T15:33:00.933Z",
    "dateReserved": "2026-08-15T05:44:03.927Z",
    "dateUpdated": "2026-08-25T05:41:42.546Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2",
  "vulnerability-lookup:meta": {
    "epss": {
      "cve": "CVE-2026-74700",
      "date": "2026-10-14",
      "epss": "0.00125",
      "percentile": "0.01986"
    },
    "microsoft_vex": {
      "current_release_date": "2026-09-25T02:12:08.000Z",
      "cve": "CVE-2026-74700",
      "id": "msrc_CVE-2026-74700",
      "initial_release_date": "2026-08-24T01:08:53.000Z",
      "product_status:fixed": "1",
      "product_status:known_affected": "1",
      "source": "Microsoft CSAF VEX",
      "status": "final",
      "title": "net/sched: cls_api: Always acquire rtnl_lock when destroying locked classifiers",
      "url": "https://msrc.microsoft.com/csaf/vex/2026/msrc_cve-2026-74700.json",
      "version": "4"
    },
    "nvd": {
      "cve": {
        "affected": [
          {
            "affectedData": [
              {
                "defaultStatus": "unaffected",
                "product": "Linux",
                "programFiles": [
                  "net/sched/cls_api.c"
                ],
                "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
                "vendor": "Linux",
                "versions": [
                  {
                    "lessThan": "34e77d8e3570f9df3952496ddb402833695662fd",
                    "status": "affected",
                    "version": "12db03b65c2b90752e4c37666977fd4a1b5f5824",
                    "versionType": "git"
                  },
                  {
                    "lessThan": "b648c8a56531aeabd1c14f6b5cf1891e269b3756",
                    "status": "affected",
                    "version": "12db03b65c2b90752e4c37666977fd4a1b5f5824",
                    "versionType": "git"
                  },
                  {
                    "lessThan": "d6222af7274f08e7a1848131dc30319993d8f377",
                    "status": "affected",
                    "version": "12db03b65c2b90752e4c37666977fd4a1b5f5824",
                    "versionType": "git"
                  },
                  {
                    "lessThan": "a81f9c44d87fb59d99fce72e29e02cab3a49a1c3",
                    "status": "affected",
                    "version": "12db03b65c2b90752e4c37666977fd4a1b5f5824",
                    "versionType": "git"
                  },
                  {
                    "lessThan": "a347304b2ca1a5377d5bd2d8a72e4b4f12afe648",
                    "status": "affected",
                    "version": "12db03b65c2b90752e4c37666977fd4a1b5f5824",
                    "versionType": "git"
                  }
                ]
              },
              {
                "defaultStatus": "affected",
                "product": "Linux",
                "programFiles": [
                  "net/sched/cls_api.c"
                ],
                "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
                "vendor": "Linux",
                "versions": [
                  {
                    "status": "affected",
                    "version": "5.1"
                  },
                  {
                    "lessThan": "5.1",
                    "status": "unaffected",
                    "version": "0",
                    "versionType": "semver"
                  },
                  {
                    "lessThanOrEqual": "6.6.*",
                    "status": "unaffected",
                    "version": "6.6.152",
                    "versionType": "semver"
                  },
                  {
                    "lessThanOrEqual": "6.12.*",
                    "status": "unaffected",
                    "version": "6.12.104",
                    "versionType": "semver"
                  },
                  {
                    "lessThanOrEqual": "6.18.*",
                    "status": "unaffected",
                    "version": "6.18.45",
                    "versionType": "semver"
                  },
                  {
                    "lessThanOrEqual": "7.1.*",
                    "status": "unaffected",
                    "version": "7.1.9",
                    "versionType": "semver"
                  },
                  {
                    "lessThanOrEqual": "*",
                    "status": "unaffected",
                    "version": "7.2",
                    "versionType": "original_commit_for_fix"
                  }
                ]
              }
            ],
            "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
          }
        ],
        "cveTags": [],
        "descriptions": [
          {
            "lang": "en",
            "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nnet/sched: cls_api: Always acquire rtnl_lock when destroying locked classifiers\n\nAnother challenge with unlocked filters.\nThere is a short window in tc_new_tfilter where a tcf_proto can be found\nand briefly referenced by a totally unrelated, unlocked classifier\u0027s request\nand cause a race.\n\nFeng created a poc which created this race with two threads, one creating a\nu32 filter and other a flower filter in the same chain/prio:\n\n1. Both threads enter tc_new_tfilter, both find the chain empty, both\n   drop filter_chain_lock\n2. u32 finishes tcf_proto_create(\"u32\") first, calls\n   tcf_chain_tp_insert_unique() -\u003e inserts u32_tp into the chain\n3. flower finishes tcf_proto_create(\"flower\") later, calls\n   tcf_chain_tp_insert_unique() -\u003e tcf_chain_tp_find() now sees u32_tp\n   already there, takes a reference on it, destroys flower\u0027s own tp_new\n   and returns u32_tp to the caller.\n\nFlower then hits the kind mismatch check (because it requested for kind\n\"flower\" but tp-\u003eops-\u003ekind is \"u32\") and goes through the errout path\nwhich calls tcf_proto_put() on u32_tp. If the u32 thread has already\ngone through its own errout (its change() call failed on the PoC\u0027s empty\noptions) and dropped its create and insert refs, flower\u0027s put is the\nlast one and drops u32_tp\u0027s refcnt to zero.\n\nAt this point tp-\u003eops-\u003edestroy() runs in a context that never took\nrtnl_lock. When that happens, it might cause a UAF like the following\n(illustrated by the PoC):\n\n[  +0.000710] BUG: KASAN: slab-use-after-free in u32_init (net/sched/cls_u32.c:393)\n[  +0.000281] Read of size 8 at addr ffff888120022f00 by task poc_feng_xue/524\n\n  Call Trace:\n   u32_init (net/sched/cls_u32.c:393)\n   tc_new_tfilter (net/sched/cls_api.c:2378)\n\n  Allocated by task 526:\n   u32_init (net/sched/cls_u32.c:378)\n   tc_new_tfilter (net/sched/cls_api.c:2378)\n\n  Freed by task 522:\n   kfree\n   u32_destroy (net/sched/cls_u32.c:662)\n   tcf_proto_destroy (net/sched/cls_api.c:446)\n   tcf_proto_put (net/sched/cls_api.c:459)\n   tc_new_tfilter (net/sched/cls_api.c:2459)\n\nFix this by having tcf_proto_destroy() take rtnl_lock around\ntp-\u003eops-\u003edestroy() for locked classifiers whenever rtnl is not held.\n\nTo explain why I used a temp variable \"not_lockless\" I\u0027d like to point to a\nsemi-related note on rtnl_held vs TCF_PROTO_OPS_DOIT_UNLOCKED (adding here\nfor future cleanup if deemed necessary):\nThe rtnl_held parameter and the TCF_PROTO_OPS_DOIT_UNLOCKED flag are\nredundant sources of truth for whether rtnl_lock is held. Among the nine\nclassifier destroy(..rtnl_held..) callbacks, only flower consults the\nrtnl_held parameter which it propagates to tc_setup_cb_destroy()\nand tc_setup_cb_call(). The other eight (u32, flow, bpf, cgroup, route, basic,\nfw, mall) ignore it entirely;-\u003e those that call tc_setup_cb_destroy()\n(u32, bpf, mall) hardcode true always instead of forwarding the parameter.\n\nA future cleanup should remove the rtnl_held parameter from the destroy callback\nsignature entirely and have callers rely solely on their knowledge whether\nthey are running in an unlocked context."
          },
          {
            "lang": "es",
            "value": "En el kernel de Linux, la siguiente vulnerabilidad ha sido resuelta:\n\nnet/sched: cls_api: Adquirir siempre rtnl_lock al destruir clasificadores bloqueados\n\nOtro desaf\u00edo con filtros desbloqueados.\nExiste una ventana corta en tc_new_tfilter donde un tcf_proto puede ser encontrado y brevemente referenciado por la solicitud de un clasificador totalmente no relacionado y desbloqueado, y causar una condici\u00f3n de carrera.\n\nFeng cre\u00f3 una PoC que gener\u00f3 esta condici\u00f3n de carrera con dos hilos, uno creando un filtro u32 y el otro un filtro flower en la misma cadena/prioridad:\n\n1. Ambos hilos entran en tc_new_tfilter, ambos encuentran la cadena vac\u00eda, ambos sueltan filter_chain_lock\n2. u32 termina tcf_proto_create(\u0027u32\u0027) primero, llama a tcf_chain_tp_insert_unique()  -\u003e  inserta u32_tp en la cadena\n3. flower termina tcf_proto_create(\u0027flower\u0027) m\u00e1s tarde, llama a tcf_chain_tp_insert_unique()  -\u003e  tcf_chain_tp_find() ahora ve u32_tp ya all\u00ed, toma una referencia sobre \u00e9l, destruye el propio tp_new de flower y devuelve u32_tp al llamador.\n\nFlower entonces encuentra la verificaci\u00f3n de tipo no coincidente (porque solicit\u00f3 el tipo \u0027flower\u0027 pero tp -\u003e ops -\u003e kind es \u0027u32\u0027) y pasa por la ruta de error que llama a tcf_proto_put() en u32_tp. Si el hilo u32 ya ha pasado por su propio error (su llamada a change() fall\u00f3 en las opciones vac\u00edas de la PoC) y ha soltado sus referencias de creaci\u00f3n e inserci\u00f3n, el put de flower es el \u00faltimo y reduce el refcnt de u32_tp a cero.\n\nEn este punto, tp -\u003e ops -\u003e destroy() se ejecuta en un contexto que nunca tom\u00f3 rtnl_lock. Cuando eso sucede, podr\u00eda causar un UAF como el siguiente (ilustrado por la PoC):\n\n[ +0.000710] BUG: KASAN: uso despu\u00e9s de liberaci\u00f3n de slab en u32_init (net/sched/cls_u32.c:393)\n[ +0.000281] Lectura de tama\u00f1o 8 en la direcci\u00f3n ffff888120022f00 por la tarea poc_feng_xue/524\n\n  Rastro de Llamada:\n   u32_init (net/sched/cls_u32.c:393)\n   tc_new_tfilter (net/sched/cls_api.c:2378)\n\n  Asignado por la tarea 526:\n   u32_init (net/sched/cls_u32.c:378)\n   tc_new_tfilter (net/sched/cls_api.c:2378)\n\n  Liberado por la tarea 522:\n   kfree\n   u32_destroy (net/sched/cls_u32.c:662)\n   tcf_proto_destroy (net/sched/cls_api.c:446)\n   tcf_proto_put (net/sched/cls_api.c:459)\n   tc_new_tfilter (net/sched/cls_api.c:2459)\n\nSolucione esto haciendo que tcf_proto_destroy() tome rtnl_lock alrededor de tp -\u003e ops -\u003e destroy() para clasificadores bloqueados siempre que rtnl no est\u00e9 retenido.\n\nPara explicar por qu\u00e9 us\u00e9 una variable temporal \u0027not_lockless\u0027 me gustar\u00eda se\u00f1alar una nota semi-relacionada sobre rtnl_held vs TCF_PROTO_OPS_DOIT_UNLOCKED (a\u00f1adiendo aqu\u00ed para una futura limpieza si se considera necesario):\nEl par\u00e1metro rtnl_held y la bandera TCF_PROTO_OPS_DOIT_UNLOCKED son fuentes de verdad redundantes sobre si rtnl_lock est\u00e1 retenido. Entre las nueve devoluciones de llamada destroy(..rtnl_held..) del clasificador, solo flower consulta el par\u00e1metro rtnl_held, el cual propaga a tc_setup_cb_destroy() y tc_setup_cb_call(). Los otros ocho (u32, flow, bpf, cgroup, route, basic, fw, mall) lo ignoran por completo; -\u003e  aquellos que llaman a tc_setup_cb_destroy() (u32, bpf, mall) codifican \u0027true\u0027 siempre en lugar de reenviar el par\u00e1metro.\n\nUna futura limpieza deber\u00eda eliminar el par\u00e1metro rtnl_held de la firma de la devoluci\u00f3n de llamada destroy por completo y hacer que los llamadores conf\u00eden \u00fanicamente en su conocimiento sobre si se est\u00e1n ejecutando en un contexto desbloqueado."
          }
        ],
        "id": "CVE-2026-74700",
        "lastModified": "2026-10-14T13:10:00.187",
        "metrics": {
          "cvssMetricV31": [
            {
              "cvssData": {
                "attackComplexity": "LOW",
                "attackVector": "LOCAL",
                "availabilityImpact": "HIGH",
                "baseScore": 7.8,
                "baseSeverity": "HIGH",
                "confidentialityImpact": "HIGH",
                "integrityImpact": "HIGH",
                "privilegesRequired": "LOW",
                "scope": "UNCHANGED",
                "userInteraction": "NONE",
                "vectorString": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H",
                "version": "3.1"
              },
              "exploitabilityScore": 1.8,
              "impactScore": 5.9,
              "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
              "type": "Secondary"
            }
          ]
        },
        "published": "2026-08-22T16:16:44.610",
        "references": [
          {
            "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
            "url": "https://git.kernel.org/stable/c/34e77d8e3570f9df3952496ddb402833695662fd"
          },
          {
            "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
            "url": "https://git.kernel.org/stable/c/a347304b2ca1a5377d5bd2d8a72e4b4f12afe648"
          },
          {
            "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
            "url": "https://git.kernel.org/stable/c/a81f9c44d87fb59d99fce72e29e02cab3a49a1c3"
          },
          {
            "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
            "url": "https://git.kernel.org/stable/c/b648c8a56531aeabd1c14f6b5cf1891e269b3756"
          },
          {
            "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
            "url": "https://git.kernel.org/stable/c/d6222af7274f08e7a1848131dc30319993d8f377"
          }
        ],
        "sourceIdentifier": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "vulnStatus": "Received"
      }
    },
    "redhat_vex": {
      "aggregate_severity": "Moderate",
      "current_release_date": "2026-08-25T08:54:41+00:00",
      "cve": "CVE-2026-74700",
      "id": "CVE-2026-74700",
      "initial_release_date": "2026-08-22T00:00:00+00:00",
      "product_status:known_affected": "246",
      "product_status:known_not_affected": "28",
      "source": "Red Hat CSAF VEX",
      "status": "final",
      "title": "kernel: net/sched: cls_api: Always acquire rtnl_lock when destroying locked classifiers",
      "url": "https://security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-74700.json",
      "version": "3"
    }
  }
}



Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

Drag nodes to arrange them. Double-click a related vulnerability to open it, or a source to visit its link. The Physics button on the left tunes the layout and the simulation; the legend at the bottom left hides or shows nodes by kind and by sighting type.

Forecast uses a logistic model when the trend is rising, or an exponential decay model when the trend is falling. Fitted via linearized least squares.

Sightings

Author Source Type Date Other

Nomenclature

  • Seen: The vulnerability was mentioned, discussed, or observed by the user.
  • Confirmed: The vulnerability has been validated from an analyst's perspective.
  • Published Proof of Concept: A public proof of concept is available for this vulnerability.
  • Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
  • Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
  • Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
  • Not confirmed: The user expressed doubt about the validity of the vulnerability.
  • Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.
Vulnerability timeline

Sightings and recorded dates, grouped by day · UTC

JSON
Events included in the timeline

Loading timeline…


    Loading…

    Loading…

    Loading…

    Related by attack behaviour

    Vulnerabilities whose description is nearest to this one in the vector space of the CIRCL/vulnerability-attack-technique-biencoder model. This is a similarity search over the bi-encoder space (plain cosine), not a classification, and it has no measured accuracy.