Back to Intelligence

BIND 9.20.29 / 9.21.26 Released: Unauthenticated DoH Crash Flaw — Detection, Patching and Hardening Guide

SA
Security Arsenal Team
September 17, 2026
10 min read

On 16 September, the Internet Systems Consortium (ISC) published fourteen security advisories for BIND 9 — the most widely deployed open-source authoritative and recursive DNS server on the planet — and shipped fixes in BIND 9.20.29 and BIND 9.21.26. The headline issue is a denial-of-service condition that lets an unauthenticated remote attacker crash the named daemon with a single request carrying an invalid SIG(0) signature, and it affects any BIND server that answers DNS-over-HTTPS (DoH) — no credentials, no zone transfer access, no special positioning required.

That last point should concentrate minds. DNS is a tier-zero dependency: when named dies, every resolution path that flows through it dies with it — outbound browsing, email delivery, VPN authentication, SaaS reachability, and in many environments the service discovery layer itself. A single-packet kill against an internet-facing DoH listener is exactly the class of flaw that gets weaponized into opportunistic scanning within days of disclosure. The other thirteen flaws in this release batch compound the risk; ISC does not batch fourteen fixes into a coordinated disclosure when the bugs are cosmetic.

If you operate BIND anywhere in your infrastructure — authoritative, recursive, or forwarding — you need to inventory your versions today, patch to the fixed releases, and if you are running DoH, treat this as an urgent exposure until proven otherwise.

Technical Analysis

Affected Products and Versions

  • Product: ISC BIND 9 (open-source DNS server)
  • Fixed versions: 9.20.29 (9.20 extended support branch) and 9.21.26 (9.21 stable branch)
  • Affected scope: Any BIND 9 build prior to these releases — including most vendor-packaged builds (RHEL, Debian/Ubuntu, SUSE, FreeBSD ports) that track ISC upstream. Vendor backports will arrive on their own cadence; check your distribution's security tracker.
  • Critical exposure surface: Servers with DNS-over-HTTPS enabled, i.e. configurations where named listens for HTTPS-encapsulated DNS queries (typically TCP 443 using tls and http configuration blocks, or deployments fronting named with a DoH listener).

How the DoH Crash Works (Defender's View)

The DoH flaw lives in how named processes SIG(0) signed queries arriving over its HTTPS listener. SIG(0) is a transaction-signature mechanism that authenticates individual DNS messages using public-key cryptography (RFC 2931). When named receives a DoH request containing an invalid or malformed SIG(0) record, it hits an assertion/check failure path and the daemon terminates — a classic reachability-before-validation bug.

From a defender's perspective, the attack chain is brutally simple:

  1. Attacker identifies an internet-reachable DoH endpoint on TCP/443 answering DNS queries.
  2. Attacker sends a single crafted HTTPS request wrapping a DNS message with an invalid SIG(0) signature.
  3. named aborts. All DNS services hosted by that instance — including plain UDP/53 and TCP/53 resolution — go down.
  4. Repeat at will. Without auto-restart supervision (systemd Restart= etc.), the service stays down until manual intervention. With auto-restart, the attacker can keep it in a crash loop.

Exploitation requirements: none beyond network reachability to the DoH listener. No authentication, no valid zone data, no UDP spoofing gymnastics.

Exploitation Status

At the time of disclosure this is a vendor-patched flaw with no confirmed in-the-wild exploitation reported, and ISC has not published a public PoC. Do not let that lull you. Single-request, unauthenticated remote crashes of internet-facing daemons are among the fastest flaw classes to be reverse-engineered from patches — the diff between 9.20.28 and 9.20.29 tells a motivated researcher exactly where the missing validation lives. Assume public crashing tools will circulate and treat patching as time-sensitive. Monitor CISA's Known Exploited Vulnerabilities catalog and ISC's advisory page for escalation.

The Other Thirteen Flaws

ISC disclosed thirteen additional BIND 9 issues in the same batch. The full per-issue detail (including individual CVE assignments and CVSS scoring) is published on ISC's security advisory index at https://www.isc.org/blogs/ — pull the September 2026 advisory bundle and map each issue against your configuration. Historically, BIND batch disclosures include a mix of assertion-failure DoS conditions, cache poisoning edge cases, and resolver CPU-exhaustion issues; several of them will likely apply to recursive resolvers even if you do not run DoH. Do not patch selectively — ship the whole fixed release.

Detection & Response

Your primary detection goal is twofold: (1) detect named crashes and crash-loops that indicate exploitation, and (2) detect anomalous traffic against your DoH listener. BIND's own logging is your richest source — ensure named logs are forwarded to your SIEM via Syslog/CEF.

YAML
---
title: BIND named Daemon Crash or Unexpected Termination
id: 3f9b1c44-8a2e-4d5b-9c71-6e2f4a8b9d10
status: experimental
description: Detects abnormal termination, assertion failures, or fatal errors in the BIND named daemon, consistent with exploitation of remote crash vulnerabilities such as the invalid SIG(0) over DoH flaw fixed in 9.20.29/9.21.26.
references:
  - https://www.isc.org/blogs/
author: Security Arsenal
date: 2026/09/17
tags:
  - attack.impact
  - attack.t1499
logsource:
  product: linux
  service: named
detection:
  selection:
    - 'assertion failure'
    - 'fatal'
    - 'aborting'
    - 'exiting (due to fatal error)'
    - 'unexpected error'
    - 'general: critical'
  condition: selection
falsepositives:
  - Legitimate misconfiguration at startup causing named to exit
level: high
---
title: SIG(0) Processing Errors on BIND DoH Listener
id: 8c2d5e61-3f47-4a9b-b5e2-1a6d8c3f7e24
status: experimental
description: Detects SIG(0) verification or processing errors in BIND query logs, which may indicate crafted requests targeting the SIG(0) parsing path reachable over DNS-over-HTTPS.
references:
  - https://www.isc.org/blogs/
author: Security Arsenal
date: 2026/09/17
tags:
  - attack.impact
  - attack.t1499.004
logsource:
  product: linux
  service: named
detection:
  selection:
    - 'SIG(0)'
    - 'sig0'
    - 'invalid sig'
    - 'bad signature'
  condition: selection
falsepositives:
  - Misconfigured dynamic update clients using SIG(0) signing
level: medium
---
title: named Process Spawned by Non-init Parent After Crash
id: 5e1a7b92-4d63-4c8f-a291-7b3e9f2c6d48
status: experimental
description: Detects the named daemon being restarted by an unexpected parent process or in rapid succession, which may indicate a crash loop from repeated remote exploitation attempts.
references:
  - https://attack.mitre.org/techniques/T1499/
author: Security Arsenal
date: 2026/09/17
tags:
  - attack.impact
  - attack.t1499
logsource:
  category: process_creation
  product: linux
detection:
  selection_image:
    Image|endswith:
      - '/named'
  filter_parents:
    ParentImage|endswith:
      - '/systemd'
      - '/init'
      - '/named-checkconf'
  condition: selection_image and not filter_parents
falsepositives:
  - Manual restarts by administrators from an interactive shell
  - Container orchestrators with non-standard init systems
level: medium
KQL — Microsoft Sentinel / Defender
// Hunt for BIND named crash indicators and DoH-targeted abuse in Sentinel
// Assumes named logs are ingested via Syslog/CEF from DNS servers
Syslog
| where TimeGenerated > ago(24h)
| where ProcessName =~ "named" or SyslogMessage has "named["
| where SyslogMessage has_any ("assertion failure", "fatal", "aborting", "exiting (due to fatal error)", "sig0", "SIG(0)")
| project TimeGenerated, Computer, ProcessName, SeverityLevel, SyslogMessage
| order by TimeGenerated desc;
// Correlate: spike in HTTPS connections to DNS servers from single sources (DoH probing/crash attempts)
CommonSecurityLog
| where TimeGenerated > ago(24h)
| where DestinationPort == 443
| summarize ConnectionCount = count(), DistinctDestinations = dcount(DestinationIP) by SourceIP, bin(TimeGenerated, 5m)
| where ConnectionCount > 500
| order by ConnectionCount desc;
// Identify all DNS servers running named to scope the exposure inventory
Syslog
| where ProcessName =~ "named"
| summarize LastSeen = max(TimeGenerated) by Computer
| order by LastSeen desc;
VQL — Velociraptor
-- Hunt: enumerate BIND named instances, listeners, and recent crash artifacts on Linux DNS servers
SELECT Pid, Name, Exe, CommandLine, Username, CreateTime
FROM pslist()
WHERE Name =~ 'named'
   OR CommandLine =~ '/named'

-- Check which ports named is listening on (443 exposure = DoH enabled = urgent patch target)
SELECT Pid, Name, Laddr, Status
FROM netstat()
WHERE Name =~ 'named'
   AND Status =~ 'LISTEN'

-- Look for core dumps from repeated named crashes (exploitation artifact)
SELECT FullPath, Size, Mtime
FROM glob(globs=['/var/lib/systemd/coredump/*named*', '/var/crash/*named*', '/tmp/core*named*'])
ORDER BY Mtime DESC
Bash / Shell
#!/usr/bin/env bash
# BIND exposure check and remediation helper — run as root on each DNS server
set -euo pipefail

echo "=== [1] Installed BIND version ==="
if command -v named >/dev/null 2>&1; then
  named -v
  named -V | head -n 3
else
  echo "named binary not found on this host."
fi

# Flag vulnerable builds: anything below 9.20.29 (9.20 branch) or 9.21.26 (9.21 branch)
VER=$(named -v 2>/dev/null | awk '{print $2}' | cut -d- -f1 || echo "unknown")
echo "Detected version: $VER"
case "$VER" in
  9.20.29|9.21.26) echo "STATUS: PATCHED (fixed release installed)" ;;
  9.20.3*|9.21.2[6-9]*) echo "STATUS: likely patched — verify against ISC advisory" ;;
  9.20.*|9.21.*|9.18.*|9.16.*) echo "STATUS: VULNERABLE — upgrade required" ;;
  *) echo "STATUS: unknown — check vendor backport notices (distro packages may carry patched builds with older version strings)" ;;
esac

echo "=== [2] DoH exposure check (port 443 listener) ==="
ss -tlnp 2>/dev/null | grep -E 'named|:443' || echo "No HTTPS/DoH listener detected on named."

echo "=== [3] named.conf DoH directives ==="
grep -nE 'tls|http|doh|listen-on.*443' /etc/named.conf /etc/bind/named.conf* 2>/dev/null || echo "No DoH/TLS directives found in config files."

echo "=== [4] Recent named crash indicators in logs ==="
journalctl -u named --since "7 days ago" 2>/dev/null | grep -iE 'assertion|fatal|abort|sig' | tail -n 20 || true
grep -iE 'assertion failure|fatal|aborting' /var/log/named/*.log /var/log/messages /var/log/syslog 2>/dev/null | tail -n 20 || true

echo "=== [5] Apply vendor patch (choose your distro path) ==="
echo "# RHEL/Rocky/Alma:   dnf update bind && systemctl restart named"
echo "# Debian/Ubuntu:     apt-get update && apt-get install --only-upgrade bind9 && systemctl restart named"
echo "# ISC source builds: upgrade to 9.20.29 (ESV) or 9.21.26 (stable) from https://www.isc.org/download/"

echo "=== [6] TEMPORARY MITIGATION if patching is delayed ==="
echo "# If DoH is not business-critical, disable the HTTPS listener by removing the"
echo "# 'tls'/'http' listen blocks from named.conf, then run: named-checkconf && rndc reconfig"
echo "# If DoH IS required, restrict reachability with a firewall allowlist:"
echo "#   nft add rule inet filter input tcp dport 443 ip saddr {TRUSTED_NETS} accept"
echo "#   nft add rule inet filter input tcp dport 443 drop"

echo "=== [7] Ensure auto-restart to blunt DoS impact (mitigation, not a fix) ==="
systemctl show named -p Restart 2>/dev/null || echo "Consider: systemctl edit named -> [Service] Restart=on-failure, RestartSec=5"

echo "Done. Re-run after patching to confirm fixed version is active: named -v"

Remediation

  1. Patch immediately. Upgrade to BIND 9.20.29 (if you track the 9.20 ESV branch) or 9.21.26 (if you track 9.21 stable). Download and advisory details: https://www.isc.org/download/ and the ISC security advisory index at https://www.isc.org/blogs/. For distro-packaged BIND, apply your vendor's security update (RHEL, Ubuntu, Debian, SUSE advisories) — note that vendor builds backport fixes and may not display the upstream version string, so verify against the vendor advisory, not named -v alone.
  2. Inventory your DoH exposure first. Any named instance answering on TCP/443 is the priority target. If DoH is enabled but not business-critical, disable it as an interim mitigation by removing the tls/http listener configuration and running named-checkconf && rndc reconfig. If DoH is required, place it behind a firewall allowlist or an authenticating reverse proxy until the patch lands.
  3. Don't stop at the DoH flaw. All fourteen issues in this batch are fixed in the same releases. Recursive resolvers and authoritative-only servers alike should move to the fixed versions.
  4. Add resilience controls (defense in depth, not a substitute for patching): ensure systemd auto-restart (Restart=on-failure) so a successful crash is a blip, not an outage; distribute resolution across redundant servers on diverse paths; rate-limit inbound HTTPS at the perimeter.
  5. Validate after patching. Confirm the running daemon is the fixed build (named -v, then restart and re-check — package upgrades don't restart the daemon on every distro), run named-checkconf -z, and smoke-test resolution over UDP/53, TCP/53, and DoH.
  6. Monitor for escalation. Watch the ISC advisory page and CISA KEV (https://www.cisa.gov/known-exploited-vulnerabilities-catalog) for confirmation of active exploitation or added CVE remediation deadlines, and retain named logs from the exposure window for retro-hunting with the detections above.

Related Resources

Security Arsenal Alert Triage Automation AlertMonitor Platform Book a SOC Assessment platform Intel Hub

Is your security operations ready?

Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.