{"id":"CVE-2026-98629","kind":"vulnerability","aliases":["CVE-2026-98629"],"related":[],"title":"Linux kernel: u32 classifier table handles can alias and leak memory","description":"In the Linux kernel, the following vulnerability has been resolved:\n\nnet/sched: cls_u32: fix manual hash table handle IDR aliasing\n\nA u32 hash table created with an explicit handle ('tc filter add ...\nhandle 801: u32 divisor N') keys its IDR entry on the raw handle, while\nthe destroy paths free it under handle2id(handle). The two key domains\ndisagree for handles in the 0x800..0xFFF htid range:\nhandle2id() folds them back into the auto-allocated id space (1..0x7FF).\n\nA manual table therefore leaves its raw-keyed IDR entry unreachable on\ndelete (a permanent leak), and its delete can drop the idr entry of an\nunrelated live auto table. A later auto allocation can then hand out a\nhandle that aliases the live manual table; u32_lookup_ht() first-match\nroutes lookups and TCA_U32_LINK for that htid to the wrong table.\n\nKey the divisor-path alloc on handle2id(handle) so allocation and\nremoval share one key domain. A manual handle that maps onto an id\nalready in use is rejected with -ENOSPC, and auto allocation skips ids\nheld by live manual tables.\n\nConditions to recreate:\n  ip link add test0 type dummy\n  tc qdisc add dev test0 clsact\n  tc filter add dev test0 ingress protocol ip pref 1 \\\n          handle 801: u32 divisor 16\n  tc filter add dev test0 ingress protocol ip pref 2 u32 divisor 16\n  tc -d filter show dev test0 ingress | grep 'fh 801:'\n  # unpatched: two live tables with handle 0x80100000 (the pref 2 root\n  # hnode is auto-allocated id 1); patched: the auto hnode takes id 2.\n\nAlso tested with a poc with a live u32 table on the block, add/delete a manual\ntable 'handle 901: u32 divisor 1' twice; unpatched, the re-add fails with\n-ENOSPC because the raw key leaked on the first delete.","summary":"The Linux kernel's traffic-control u32 classifier mishandles IDR keys for manually created hash tables, so deleting one can leak its entry or drop an unrelated live table's entry. A later auto-allocated handle can then alias a live manual table and misroute lookups, and an unprivileged local attacker is not stated in the sources.","severity":"unknown","cvss":null,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["infrastructure","kernel","linux","networking","tc"],"not_affected_if":["no-tc-u32-filters"],"how_to_check":"- Run `uname -r` and compare against the fixed kernel in your distribution's advisory (unknown from these sources).\n- Check whether tc u32 is in use: `tc -d filter show dev <iface> ingress` and look for `u32 divisor` entries with explicit handles like `fh 801:`.","fix":"- Update the Linux kernel to a release that includes the upstream commit fixing cls_u32 manual hash table handle IDR aliasing (fixed version unknown from these sources).\n- Reboot into the patched kernel after updating.","status":"open","published_at":"2026-10-18T16:17:15+00:00","first_seen_at":"2026-10-23T21:57:16+00:00","triaged_at":"2026-10-25T05:21:07+00:00","updated_at":"2026-10-25T05:21:07+00:00","category":"infrastructure","confidence":0.5,"triage":{"at":"2026-10-25T05:21:07Z","model":"claude-haiku-5-5","output":{"fix":"- Update the Linux kernel to a release that includes the upstream commit fixing cls_u32 manual hash table handle IDR aliasing (fixed version unknown from these sources).\n- Reboot into the patched kernel after updating.","reach":"local","title":"Linux kernel: u32 classifier table handles can alias and leak memory","impact":"low","summary":"The Linux kernel's traffic-control u32 classifier mishandles IDR keys for manually created hash tables, so deleting one can leak its entry or drop an unrelated live table's entry. A later auto-allocated handle can then alias a live manual table and misroute lookups, and an unprivileged local attacker is not stated in the sources.","category":"infrastructure","nicknames":[],"who_cares":["linux","kernel","networking","tc"],"confidence":0.5,"needs_auth":"unknown","worst_case":"Kernel memory leak or misrouted traffic-control lookups; code execution not stated.","analyst_note":"Check the upstream kernel commit and distribution advisories for the fixed versions and whether unprivileged users can trigger the bug, since the sources give only the reproduction steps.","how_to_check":"- Run `uname -r` and compare against the fixed kernel in your distribution's advisory (unknown from these sources).\n- Check whether tc u32 is in use: `tc -d filter show dev <iface> ingress` and look for `u32 divisor` entries with explicit handles like `fh 801:`.","needs_analyst":true,"not_affected_if":["no-tc-u32-filters"],"who_is_affected":"Systems running a Linux kernel with the net/sched cls_u32 classifier in use, particularly hosts that create tc u32 filters with explicit divisor handles on a qdisc. Hosts that do not use tc u32 filters are unlikely to be exposed; the sources do not say whether unprivileged users can trigger it.","user_interaction":"no","needs_special_setup":"yes","severity_if_unknown":"unknown"},"cost_usd":0.000732,"input_tokens":3894,"output_tokens":686,"severity_before":"unknown"},"analyst_status":null,"analyst_note":null,"search":"'-2026':13A,16A '-98629':14A,17A '0x7ff':161C '0x800':145C '0x80100000':329C '0xfff':146C '1':160C,294C,340C,369C '16':299C,312C '2':309C,332C,347C '801':115C,296C,322C '901':366C 'add':113C,275C,281C,287C,302C,375C 'add/delete':361C 'alia':8A,63B 'alias':101C,204C 'alloc':59B,157C,196C,233C,238C,262C,338C 'alreadi':253C 'also':348C 'attack':75B 'auto':58B,156C,191C,195C,261C,337C,343C 'auto-alloc':57B,155C,336C 'back':152C 'block':360C 'classifi':4A,31B 'cls':93C 'clsact':284C 'condit':270C 'control':29B 'creat':37B,106C 'cve':12A,15A 'd':314C 'delet':41B,175C,181C,387C 'destroy':129C 'dev':282C,288C,303C,317C 'disagre':140C 'divisor':117C,231C,298C,311C,368C 'divisor-path':230C 'domain':139C,244C 'drop':48B,183C 'dummi':278C 'enospc':259C,378C 'entri':46B,54B,122C,172C,186C 'explicit':109C 'fail':376C 'fh':321C 'filter':112C,286C,301C,315C 'first':213C,386C 'first-match':212C 'fix':95C 'fold':150C 'follow':87C 'free':131C 'grep':320C 'hand':199C 'handl':6A,60B,99C,110C,114C,126C,135C,142C,202C,236C,247C,295C,328C,365C 'handle2id':134C,149C,235C 'hash':38B,97C,104C 'held':265C 'hnode':334C,344C 'ht':211C 'htid':147C,223C 'id':158C,252C,264C,339C,346C 'idr':33B,100C,121C,171C,185C 'infrastructur':18B 'ingress':290C,305C,319C 'ip':273C,292C,307C 'kernel':2A,19B,25B,85C 'key':34B,119C,138C,170C,228C,243C,382C 'later':56B,194C 'leak':10A,44B,178C,383C 'leav':166C 'link':220C,274C 'linux':1A,20B,24B,84C 'live':51B,65B,190C,206C,267C,325C,355C 'local':74B 'lookup':70B,210C,216C 'manual':36B,66B,96C,163C,207C,246C,268C,363C 'map':249C 'match':214C 'memori':11A 'mishandl':32B 'misrout':69B 'n':118C 'net/sched':92C 'network':21B 'one':42B,242C 'onto':250C 'patch':341C 'path':130C,232C 'perman':177C 'poc':352C 'pref':293C,308C,331C 'protocol':291C,306C 'qdisc':280C 'rang':148C 'raw':125C,169C,381C 'raw-key':168C 're':374C 're-add':373C 'recreat':272C 'reject':257C 'remov':240C 'resolv':91C 'root':333C 'rout':215C 'share':241C 'show':316C 'skip':263C 'sourc':81B 'space':159C 'state':78B 'tabl':5A,39B,52B,67B,98C,105C,164C,192C,208C,227C,269C,326C,357C,364C 'take':345C 'tc':22B,111C,279C,285C,300C,313C 'tca':218C 'test':349C 'test0':276C,283C,289C,304C,318C 'therefor':165C 'traffic':28B 'traffic-control':27B 'twice':370C 'two':137C,324C 'type':277C 'u32':3A,30B,94C,103C,116C,209C,219C,297C,310C,356C,367C 'unpatch':323C,371C 'unprivileg':73B 'unreach':173C 'unrel':50B,189C 'use':255C 'vulner':88C 'wrong':226C","nicknames":[],"mitigations":[],"who_affected":"Systems running a Linux kernel with the net/sched cls_u32 classifier in use, particularly hosts that create tc u32 filters with explicit divisor handles on a qdisc. Hosts that do not use tc u32 filters are unlikely to be exposed; the sources do not say whether unprivileged users can trigger it.","tier":"C","verified":{},"analyst_revisit_at":null,"first_public_at":"2026-10-18T16:17:15+00:00","kev":null,"cvss_vector":null,"cvss_by":null,"poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-98629","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-98629","severity":null,"published_at":"2026-10-18T16:17:15+00:00","modified_at":"2026-10-19T10:19:27+00:00","first_seen_at":"2026-10-23T21:57:16+00:00","fetched_at":"2026-10-23T22:28:56+00:00","note":null}],"documents":[],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}