{"id":"CVE-2026-109125","kind":"vulnerability","aliases":["CVE-2026-109125"],"related":[],"title":"Unbound: cache clear side-channel leaks upstream port, enabling cache poisoning","description":"In NLnet Labs Unbound up to and including version 1.26.1, an observable  cache-level side-channel can be exposed with 'unwanted-reply-threshold > 0' configurations (not a default configuration). If a response-like UDP datagram reaches the upstream source port currently used by a recursive query, but its TXID does not match any pending query, Unbound counts the packet as an unwanted reply. When the accumulated count reaches the configured threshold, Unbound clears the worker's RRset cache and message cache. This cache clear action does not destroy the current upstream UDP pending query. Therefore, an external observer can distinguish whether a candidate port matches the current upstream source port by checking whether an existing cached item has been cleared. This is a cache side-channel vulnerability that can be used to probe the upstream source port. Although the attack is not feasible on default configurations and the suggested value (10 million) makes it an ureliable attack on a public resolver, in scenarios where the attacker can keep a concurrent query window alive, the attacker can first filter the source port and then perform birthday-style guessing against the TXID, making cache poisoning a feasible attack path.","summary":"With a non-default unwanted-reply-threshold setting, Unbound clears its cache when too many unmatched UDP replies arrive, which lets an outside observer tell whether a guessed port is the upstream source port. That narrows the search space, so an attacker with a sustained query window may be able to poison the cache.","severity":"medium","cvss":5.3,"epss":0.00134,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["dns-resolver","linux","runtime","self-hosted","unbound"],"not_affected_if":["default-config","other-resolver-software"],"how_to_check":"- Run `unbound -V` to read the installed version and compare it against `1.26.1`\n- Search the config (usually `unbound.conf`) for `unwanted-reply-threshold`; the issue applies only when it is set above 0\n- unknown whether a fixed version number is listed in the sources","fix":"- Upgrade Unbound past `1.26.1` (the NVD entry says up to and including 1.26.1; the first fixed version is unknown from these sources)\n- Or set `unwanted-reply-threshold` to `0` in unbound.conf as a mitigation, unless the threshold is needed","status":"open","published_at":"2026-10-21T09:17:06+00:00","first_seen_at":"2026-10-23T21:57:28+00:00","triaged_at":"2026-10-25T04:21:02+00:00","updated_at":"2026-10-25T04:21:02+00:00","category":"runtime","confidence":0.7,"triage":{"at":"2026-10-25T04:21:02Z","model":"claude-haiku-5-5","output":{"fix":"- Upgrade Unbound past `1.26.1` (the NVD entry says up to and including 1.26.1; the first fixed version is unknown from these sources)\n- Or set `unwanted-reply-threshold` to `0` in unbound.conf as a mitigation, unless the threshold is needed","reach":"internet","title":"Unbound: cache clear side-channel leaks upstream port, enabling cache poisoning","impact":"medium","summary":"With a non-default unwanted-reply-threshold setting, Unbound clears its cache when too many unmatched UDP replies arrive, which lets an outside observer tell whether a guessed port is the upstream source port. That narrows the search space, so an attacker with a sustained query window may be able to poison the cache.","category":"runtime","nicknames":[],"who_cares":["unbound","dns-resolver","self-hosted","linux"],"confidence":0.7,"needs_auth":"no","worst_case":"Attacker can narrow the port and enable DNS cache poisoning","analyst_note":"Find the first fixed Unbound version and the NLnet Labs advisory text at the NVD link, since the sources do not name it.","how_to_check":"- Run `unbound -V` to read the installed version and compare it against `1.26.1`\n- Search the config (usually `unbound.conf`) for `unwanted-reply-threshold`; the issue applies only when it is set above 0\n- unknown whether a fixed version number is listed in the sources","needs_analyst":true,"not_affected_if":["default-config","other-resolver-software"],"who_is_affected":"Only resolvers running Unbound 1.26.1 or earlier with unwanted-reply-threshold set above 0 are exposed, which the sources say is not a default configuration. Operators of public resolvers are less at risk because the sources say the attack is unreliable there, but operators running a resolver where an attacker can hold a concurrent query window open should treat it as a real risk. Teams on default configs or on other resolvers can skip it.","user_interaction":"no","needs_special_setup":"yes","severity_if_unknown":"medium"},"cost_usd":0.000722,"input_tokens":3638,"output_tokens":716,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-109125':15A,18A '-2026':14A,17A '0':110C '1.26.1':93C '10':239C 'abl':79B 'accumul':153C 'action':172C 'aliv':261C 'although':226C 'arriv':48B 'attack':71B,228C,245C,254C,263C,285C 'birthday':274C 'birthday-styl':273C 'cach':2A,11A,41B,83B,97C,165C,168C,170C,203C,211C,281C 'cache-level':96C 'candid':190C 'channel':6A,101C,214C 'check':199C 'clear':3A,39B,160C,171C,207C 'concurr':258C 'configur':111C,115C,157C,234C 'count':144C,154C 'current':128C,177C,194C 'cve':13A,16A 'datagram':122C 'default':32B,114C,233C 'destroy':175C 'distinguish':187C 'dns':20B 'dns-resolv':19B 'enabl':10A 'exist':202C 'expos':104C 'extern':184C 'feasibl':231C,284C 'filter':266C 'first':265C 'guess':57B,276C 'host':26B 'includ':91C 'item':204C 'keep':256C 'lab':86C 'leak':7A 'let':50B 'level':98C 'like':120C 'linux':22B 'make':241C,280C 'mani':44B 'match':139C,192C 'may':77B 'messag':167C 'million':240C 'narrow':65B 'nlnet':85C 'non':31B 'non-default':30B 'observ':53B,95C,185C 'outsid':52B 'packet':146C 'path':286C 'pend':141C,180C 'perform':272C 'poison':12A,81B,282C 'port':9A,58B,63B,127C,191C,197C,225C,269C 'probe':221C 'public':248C 'queri':75B,133C,142C,181C,259C 'reach':123C,155C 'recurs':132C 'repli':35B,47B,108C,150C 'resolv':21B,249C 'respons':119C 'response-lik':118C 'rrset':164C 'runtim':23B 'scenario':251C 'search':67B 'self':25B 'self-host':24B 'set':37B 'side':5A,100C,213C 'side-channel':4A,99C,212C 'sourc':62B,126C,196C,224C,268C 'space':68B 'style':275C 'suggest':237C 'sustain':74B 'tell':54B 'therefor':182C 'threshold':36B,109C,158C 'txid':136C,279C 'udp':46B,121C,179C 'unbound':1A,27B,38B,87C,143C,159C 'unmatch':45B 'unwant':34B,107C,149C 'unwanted-reply-threshold':33B,106C 'upstream':8A,61B,125C,178C,195C,223C 'ureli':244C 'use':129C,219C 'valu':238C 'version':92C 'vulner':215C 'whether':55B,188C,200C 'window':76B,260C 'worker':162C","nicknames":[],"mitigations":[],"who_affected":"Only resolvers running Unbound 1.26.1 or earlier with unwanted-reply-threshold set above 0 are exposed, which the sources say is not a default configuration. Operators of public resolvers are less at risk because the sources say the attack is unreliable there, but operators running a resolver where an attacker can hold a concurrent query window open should treat it as a real risk. Teams on default configs or on other resolvers can skip it.","tier":"C","verified":{},"analyst_revisit_at":null,"first_public_at":"2026-10-21T09:17:06+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:A/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N","cvss_by":"sep@nlnetlabs.nl","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-109125","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-109125","severity":null,"published_at":"2026-10-21T09:17:06+00:00","modified_at":"2026-10-22T15:22:40+00:00","first_seen_at":"2026-10-23T21:57:28+00:00","fetched_at":"2026-10-23T22:29:01+00:00","note":null},{"source":"epss","external_id":"CVE-2026-109125","url":"https://api.first.org/data/v1/epss?cve=CVE-2026-109125","severity":null,"published_at":null,"modified_at":null,"first_seen_at":"2026-10-24T13:15:54+00:00","fetched_at":"2026-10-24T13:15:54+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"}