{
  "affected": [
    {
      "ecosystem_specific": {
        "urgency": "not yet assigned"
      },
      "package": {
        "ecosystem": "Debian:12",
        "name": "linux"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0"
            },
            {
              "fixed": "6.1.190-1"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ]
    },
    {
      "ecosystem_specific": {
        "urgency": "not yet assigned"
      },
      "package": {
        "ecosystem": "Debian:13",
        "name": "linux"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0"
            },
            {
              "fixed": "6.12.113-1"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ]
    },
    {
      "ecosystem_specific": {
        "urgency": "not yet assigned"
      },
      "package": {
        "ecosystem": "Debian:14",
        "name": "linux"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0"
            },
            {
              "fixed": "7.2.9-1"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ]
    }
  ],
  "details": "In the Linux kernel, the following vulnerability has been resolved:  net/sched: sch_hfsc: bound the classify inner-filter walk with a drift budget  hfsc_classify() applies the \"filter may only point downwards\" level check only when the filter result carries no bound class. A filter created with a flowid gets res.class set once at bind time, so the check never runs for it during classification. hfsc_adjust_levels() can later raise a class's level without revalidating existing bindings, leaving two binds that were each legal at bind time pointing at each other; the classify walk then bounces between two interior classes forever with the qdisc lock held and BH disabled — a soft lockup from a single packet. The stuck walk trips the watchdog:    watchdog: BUG: soft lockup - CPU#3 stuck for 13s! [ping:444]   RIP: 0010:u32_classify+0x542/0x17f0   ...   tcf_classify+0x66/0xa0   hfsc_enqueue+0x166/0xdf0  Bound the traversal with a budget of non-descending hops, the only way a configured walk can move without descending the class tree once levels drift after bind time. The budget is cumulative over the whole walk and is deliberately not reset on a descending hop: a chain that alternates a descent with a lateral hop would return the budget every lap and never trip. Descending hops never decrement it, so legitimately deep trees are unaffected and a terminating lateral chain still classifies normally. Drop the packet with a rate-limited warning once the budget is exhausted, mirroring the merged HTB fix.  This is a follow-up to commit 729c4896ab82 (\"net/sched: sch_htb: limit htb_classify inner-class filter hops\"), which bounded the same classify loop on the HTB side but left the HFSC walk unbounded.  Conditions to recreate the bug: - CONFIG_NET_SCHED, CONFIG_NET_SCH_HFSC, CONFIG_NET_CLS_U32,   CONFIG_LOCKUP_DETECTOR. - Build a cycle with two legal-at-bind-time flowid binds and a level   drift: class X 1:1 (child of root) with leaf child 1:10; class Y 1:2   (sibling of X) with children 1:20 and 1:200; root u32 filter flowid   1:1; filter on X flowid 1:2 (legal when Y is a leaf); after Y's level   rises to 2, filter on Y flowid 1:1 (legal then). Send one packet (ping   on the device). Unfixed kernel: classify spins with the qdisc lock   held; with softlockup_panic=1 it panics. - Reachable from unprivileged user via unshare -Urn (CAP_NET_ADMIN).",
  "id": "DEBIAN-CVE-2026-98610",
  "modified": "2026-10-19T04:47:23.544808274Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://security-tracker.debian.org/tracker/CVE-2026-98610"
    }
  ],
  "upstream": [
    "CVE-2026-98610"
  ]
}