How To

BIND CVE-2026-94300: Check and Patch the GSS-TSIG Replay Flaw

A BIND server that accepts Kerberos-signed dynamic updates is the one CVE-2026-94300 goes after. ISC published the flaw on 21 October 2026 with a CVSS score of 8.1. An attacker who captures one GSS-TSIG signed UDP message can replay it while the negotiated key is still valid and corrupt memory in named, and ISC warns that crafted queries alongside the replay may reach remote code execution. Red Hat places the risk on servers with GSS-TSIG configured, so your first check is a grep for two directives, not a version string.

Original content from computingforgeeks.com - post 181900

Below are the fixed BIND 9 packages for Debian, RHEL, Rocky Linux, AlmaLinux and Amazon Linux 2023, the upgrade on each, and two interim controls for Debian 12, Ubuntu and the EL8 and EL9 base packages, which have no fix yet. Every command shown ran in November 2026 on Debian 13 and AlmaLinux 10 lab VMs, with SELinux enforcing on the Alma box and the other distros checked in containers, so no step turns a security control off.

Fixed BIND packages for CVE-2026-94300

Compare the package release, not the upstream number named -v prints. RHEL 10 and Amazon Linux 2023 stay on BIND 9.18, a branch for which ISC’s CVE-2026-94300 advisory lists no fixed release, so their fix is a backport inside an old-looking version. Rows marked “Lab” were installed or queried on our test machines on 1 November 2026.

DistroReleasePackageFixed buildAdvisoryChecked
Debian13 trixiebind91:9.20.30-1~deb13u1DSA-6576-1Lab
Debian14 forky / sidbind91:9.20.30-1TrackerTracker
Debian12 bookwormbind9No fix (1:9.18.49-1~deb12u3 is vulnerable)None yetLab
Ubuntu26.04 LTS, 24.04 LTSbind9No fix (1:9.20.24-1ubuntu0.4 and 1:9.18.39-0ubuntu0.24.04.8 in the archive)None yetLab
RHEL10bind32:9.18.33-15.el10_2.14RHSA-2026:92419Advisory
Rocky Linux10bind32:9.18.33-15.el10_2.14RLSA-2026:92419Lab
AlmaLinux10bind32:9.18.33-15.el10_2.14ALSA-2026:92419Lab
RHEL9bind9.1832:9.18.29-14.el9_8.12RHSA-2026:93072Advisory
AlmaLinux9bind9.1832:9.18.29-14.el9_8.12ALSA-2026:93072Lab
Rocky Linux9bind9.18No fix yet (.el9_8.11 in the repos)None yetLab
RHEL, Rocky, Alma9bind (9.16 base)No fix, listed as affectedNone yetAdvisory
RHEL, Rocky, Alma8bind, bind9.16No fix, listed as affectedNone yetAdvisory
Amazon Linux2023bind32:9.18.50-1.amzn2023.0.5ALAS2023-2026-3312Lab
Amazon Linux2bind9.11.4-26.P2.amzn2.13.20ALAS2-2026-4038Advisory
ISC upstream9.20, 9.21, Supported PreviewBIND 99.20.30, 9.21.27, 9.20.30-S1ISC KBAdvisory

Three groups have nothing to install yet. They are Debian 12, every Ubuntu release (the Ubuntu CVE page lists 20.04 through 26.10 as vulnerable), and the 9.16-based bind package on RHEL 8 and 9 and their rebuilds, while Rocky Linux 9 also lags AlmaLinux 9 on bind9.18. If your server is in one of those groups and has GSS-TSIG configured, go straight to the interim controls near the end. Keep this table bookmarked, because the Debian security tracker and the Red Hat pages are where the late packages will show up.

The conditions behind the replay

GSS-TSIG is how BIND authenticates DNS updates with Kerberos. Windows domain members use it to register their own A and PTR records, and so do FreeIPA clients and Samba AD domain controllers that run BIND as their DNS backend. The vulnerable path sits in how named handles those signed messages over UDP, and the attack needs every one of these to hold:

  • The loaded named config carries tkey-gssapi-keytab or tkey-gssapi-credential.
  • The attacker has captured a GSS-TSIG signed UDP message sent to that server.
  • The attacker can send that message back to port 53 before the negotiated TSIG key expires.

That chain is why the vector reads AV:N/AC:H with no privileges and no user interaction. High complexity is not the same as low risk, though: the worst case ISC names is code execution on the box that holds your zones, and the realistic case is a crash that takes internal name resolution down. Red Hat rates it Important and says plainly that standard RHEL deployments do not enable GSS-TSIG, which concentrates the exposure on servers joined to FreeIPA or Active Directory.

On urgency, the public signals are quiet. ISC says it is not aware of any active exploits, the CVE is not in CISA’s Known Exploited Vulnerabilities catalog, and FIRST scored its EPSS at 0.00953 on 31 October 2026. ISC found the bug in internal testing, and it was reported independently by Dave Aitel of OpenAI. None of that buys you time on a domain DNS server, where one successful replay hits every machine that resolves through it. Patch those this week. A recursive resolver with no GSS-TSIG directive can wait for its normal update window.

Windows Server DNS is a different product and is not covered by this CVE. If your AD zones live on domain controllers set up the way our Windows Server DNS server guide or the secondary DNS setup on Windows Server describes, only the Linux BIND servers in your estate are in scope. The same goes for PowerDNS, which our PowerDNS Admin install on Ubuntu uses as its backend.

GSS-TSIG directives in the running config

The fastest exposure check asks named-checkconf to print the config it would load, with every include expanded, and filters it for the two directives. That catches a directive buried in an include file such as one FreeIPA or a Samba provisioning script wrote, which a plain grep of named.conf would miss. On Debian the tool reads /etc/bind/named.conf, and on the RHEL family /etc/named.conf.

sudo named-checkconf -p | grep -E 'tkey-gssapi-(keytab|credential)'

Pair it with the installed package version. On Debian 13 the lab box was still on the trixie point-release build and returned one keytab line, which makes it both vulnerable and exposed:

Debian 13 terminal showing bind9 1:9.20.26-1~deb13u1 installed and named-checkconf listing tkey-gssapi-keytab, the setup CVE-2026-94300 targets

An empty result means the GSS-TSIG code path is not configured, and you can patch on your normal schedule. If you run the chrooted service (named-chroot) on the RHEL family, point the tool at the chroot with -t /var/named/chroot, because the copy outside the chroot may not be the one in use. The same check on an AlmaLinux 10 server, with a recursive grep to find which file holds the line and the pending advisory for the CVE:

rpm -q bind bind-libs
sudo grep -rnE 'tkey-gssapi-(keytab|credential)' /etc/named.conf /etc/named/
sudo dnf updateinfo list --cve CVE-2026-94300

The box was on the .13 build, the directive sat on line 14 of /etc/named.conf, and dnf already knew which advisory fixes it.

AlmaLinux 10 terminal showing bind 9.18.33-15.el10_2.13, a tkey-gssapi-keytab line in /etc/named.conf and dnf updateinfo listing ALSA-2026:92419

Last, see who can reach port 53. The replayed message travels over UDP, so check UDP listeners as well as TCP. A server that answers on a LAN address is reachable from that whole segment, and the replay needs nothing more than that:

sudo ss -tulnp 'sport = :53'

Next to loopback and the systemd-resolved stub, the Debian lab server bound UDP and TCP on its LAN address, so any host on that subnet could talk to it. We cut four IPv6 link-local lines because they embed the NIC’s MAC address.

Netid State  Recv-Q Send-Q                    Local Address:Port Peer Address:PortProcess
udp   UNCONN 0      0                         192.168.1.50:53        0.0.0.0:*    users:(("named",pid=2397,fd=25))
udp   UNCONN 0      0                         192.168.1.50:53        0.0.0.0:*    users:(("named",pid=2397,fd=24))
udp   UNCONN 0      0                             127.0.0.1:53        0.0.0.0:*    users:(("named",pid=2397,fd=19))
udp   UNCONN 0      0                             127.0.0.1:53        0.0.0.0:*    users:(("named",pid=2397,fd=18))
udp   UNCONN 0      0                            127.0.0.54:53        0.0.0.0:*    users:(("systemd-resolve",pid=334,fd=20))
udp   UNCONN 0      0                         127.0.0.53%lo:53        0.0.0.0:*    users:(("systemd-resolve",pid=334,fd=18))
udp   UNCONN 0      0                                 [::1]:53           [::]:*    users:(("named",pid=2397,fd=28))
udp   UNCONN 0      0                                 [::1]:53           [::]:*    users:(("named",pid=2397,fd=29))
tcp   LISTEN 0      4096                         127.0.0.54:53        0.0.0.0:*    users:(("systemd-resolve",pid=334,fd=21))
tcp   LISTEN 0      10                            127.0.0.1:53        0.0.0.0:*    users:(("named",pid=2397,fd=22))
tcp   LISTEN 0      10                            127.0.0.1:53        0.0.0.0:*    users:(("named",pid=2397,fd=20))
tcp   LISTEN 0      10                         192.168.1.50:53        0.0.0.0:*    users:(("named",pid=2397,fd=27))
tcp   LISTEN 0      10                         192.168.1.50:53        0.0.0.0:*    users:(("named",pid=2397,fd=26))
tcp   LISTEN 0      4096                      127.0.0.53%lo:53        0.0.0.0:*    users:(("systemd-resolve",pid=334,fd=19))
tcp   LISTEN 0      10                                [::1]:53           [::]:*    users:(("named",pid=2397,fd=30))
tcp   LISTEN 0      10                                [::1]:53           [::]:*    users:(("named",pid=2397,fd=31))

When the version is in the affected range, a GSS-TSIG directive is loaded and named listens beyond loopback, that server goes to the top of your patch list.

The bind9 upgrade on Debian 13

DSA-6576-1 ships the fix through trixie-security, so a host without that suite in its sources will never see it. Refresh the package lists and confirm the security build is offered before you touch anything:

sudo apt update
apt list --upgradable 2>/dev/null | grep bind9
apt-get changelog bind9 | head -12

All five bind9 packages came from stable-security, and the changelog lists CVE-2026-94300 next to three other BIND CVEs that this release also closes. Debian’s wording, “Prevent concurrent GSS-TSIG traffic from terminating named”, matches the title of ISC’s advisory rather than its replay description:

apt list showing bind9 1:9.20.30-1~deb13u1 upgradable from trixie-security and the changelog entry naming CVE-2026-94300

Upgrade the BIND packages together. Leaving bind9-libs behind is the usual way to end up with a new daemon linked against old code, and --only-upgrade stops apt from installing any of the named packages that are not on the box already:

sudo apt-get install -y --only-upgrade bind9 bind9-libs bind9-utils bind9-dnsutils bind9-host

Then confirm what is running, not only what is installed.

/usr/sbin/named -v
systemctl status named --no-pager -l | head -6

The Debian package restarted named on its own during the upgrade, which is why the status line reads “4s ago” and the version string shows the deb13u1 security build. The keytab directive was still loaded, so GSS-TSIG stayed configured on the patched daemon:

apt-get upgrading five bind9 packages to 1:9.20.30-1~deb13u1, then named -v and systemctl status confirming the patched named is running

If the start time in that status output is older than the upgrade, the old binary is still in memory and the server is still vulnerable. Restart it with sudo systemctl restart named and check again.

The bind update on RHEL, Rocky Linux and AlmaLinux 10

All three EL10 distros carry the same fixed build, 32:9.18.33-15.el10_2.14, under advisories that share a number: RHSA-2026:92419 on RHEL, RLSA-2026:92419 on Rocky Linux and ALSA-2026:92419 on AlmaLinux. Upgrading by advisory pulls exactly the packages that advisory covers and nothing else, which suits a change window on a DNS server. On AlmaLinux:

sudo dnf -y upgrade --advisory ALSA-2026:92419

Use your own distro’s ID in the same command on RHEL or Rocky Linux. The RPM restarts named on upgrade as well, but an explicit restart costs a second and removes any doubt about which binary is in memory. Then confirm the changelog carries the fix:

sudo systemctl restart named
rpm -q bind bind-libs
rpm -q --changelog bind | grep -m1 -B1 CVE-2026-94300

The transaction moved five packages to .el10_2.14, and Red Hat’s changelog entry describes the fix as preventing “arbitrary code execution via GSS-TSIG UDP message replay”. That is stronger language than Debian’s, and it lines up with the RCE warning in ISC’s description.

dnf upgrade --advisory ALSA-2026:92419 moving bind to 9.18.33-15.el10_2.14, the RPM changelog naming CVE-2026-94300 and named running again

The capture also shows the lab host’s named.conf being restored from the backup taken during the mitigation step later in this guide, which put the keytab line back. Run systemctl restart named-chroot instead if the chrooted unit is the one you enable.

The EL9 split between bind and bind9.18

EL9 ships two BIND packages, and only one of them is fixed. The default bind is the 9.16 branch, which Red Hat lists as affected with no fix. The optional bind9.18 package got RHSA-2026:93072, and AlmaLinux rebuilt it as ALSA-2026:93072 on 30 October. Rocky Linux 9 had not shipped it when we checked on 1 November: its repos still held the .11 build, and that build’s changelog has no entry for the CVE. Find out which package your server runs before you plan anything:

rpm -q bind bind9.18

Containers on the lab host give the repo state for each distro in one view. Amazon Linux 2023 and Rocky Linux 10 offer their fixed builds, AlmaLinux 9’s bind9.18 changelog names the CVE once, and Rocky Linux 9’s names it zero times:

Containers showing the fixed bind build on Amazon Linux 2023 and Rocky Linux 10, bind9.18 .12 on AlmaLinux 9 and the unfixed .11 build on Rocky Linux 9

On RHEL 9 or AlmaLinux 9 with bind9.18, upgrade it with dnf by advisory as on EL10, using RHSA-2026:93072 or ALSA-2026:93072, then restart. On the base bind package, or on Rocky Linux 9 today, switching packages is not a patch. Moving from 9.16 to 9.18 is a branch migration with its own config changes, and doing it during an incident is how DNS outages start. Apply the interim controls instead, and plan the move separately if you want off 9.16. Red Hat also lists EL9’s dhcp package as affected because it links BIND’s libraries; it doesn’t run a GSS-TSIG listener, but it will show up in scanner reports for this CVE.

The Amazon Linux 2023 backport

Amazon Linux 2023 is the case that confuses scanners. Its fixed package is 9.18.50, a number inside ISC’s affected range, because Amazon backported the fix rather than moving to 9.20. ALAS2023-2026-3312 also bundles CVE-2026-19630, CVE-2026-19668, CVE-2026-77119, CVE-2026-96888 and CVE-2026-97313. AL2023 versions its repositories, so a host locked to an older release will not see the update until you ask for the latest one.

sudo dnf --releasever=latest updateinfo list --cve CVE-2026-94300
sudo dnf -y upgrade --releasever=latest bind
rpm -q --changelog bind | grep -m1 CVE-2026-94300

The container started on the .0.4 build, the advisory listed five packages, and after the upgrade the changelog line named CVE-2026-94300 among the BIND fixes in .0.5:

ALAS2023-2026-3312 Important/Sec. bind-32:9.18.50-1.amzn2023.0.5.x86_64
ALAS2023-2026-3312 Important/Sec. bind-dnssec-utils-32:9.18.50-1.amzn2023.0.5.x86_64
ALAS2023-2026-3312 Important/Sec. bind-libs-32:9.18.50-1.amzn2023.0.5.x86_64
ALAS2023-2026-3312 Important/Sec. bind-license-32:9.18.50-1.amzn2023.0.5.noarch
ALAS2023-2026-3312 Important/Sec. bind-utils-32:9.18.50-1.amzn2023.0.5.x86_64
bind-9.18.50-1.amzn2023.0.5.x86_64
- Fix CVE-2026-94300, CVE-2026-97313, CVE-2026-96888, CVE-2026-19630

For a fleet pinned to a release version, the advisory itself gives the pinned form, dnf update --advisory ALAS2023-2026-3312 --releasever 2023.12.20261026, which moves only to the release that carries the fix. Restart named afterwards as on the other RPM distros. If your scanner still flags the host on version number alone, the changelog line is the evidence to attach to the exception.

Interim controls for hosts without a fix

ISC lists no workaround. Red Hat’s CVE page gives two mitigations, which are to remove the GSS-TSIG directives and restart, or to restrict DNS to trusted networks with a firewall. Which one fits depends on what the server does, and the choice should leave each host in one of these states:

  • A server that takes no Kerberos updates has its GSS-TSIG directives commented out.
  • A DNS server for AD, FreeIPA or Samba keeps GSS-TSIG and answers port 53 only from an allow-list.
  • Each control has a ticket to undo it once the fixed package is installed.

Running both controls on a server that needs neither Kerberos updates nor wide access is fine, and it is the tightest position until the package lands.

Read this before disabling GSS-TSIG on a domain DNS server. Removing the directives stops every Kerberos-authenticated dynamic update. Windows machines stop registering their records, FreeIPA client enrollment that adds DNS entries fails, and a Samba AD domain controller on the BIND backend loses secure updates. Red Hat warns that this may disrupt automated Active Directory or IdM enrollment. If that server is the DNS for your Active Directory domain or a FreeIPA realm like the one in our Keycloak and FreeIPA integration, use the firewall control and keep GSS-TSIG on.

For servers that do not need Kerberos updates, back up the config, comment the directives out rather than deleting them, and confirm none are left. Commenting keeps the exact original lines on disk for the day you patch. This is the RHEL-family path, which we ran on the AlmaLinux 10 box while it was still on the vulnerable build. Red Hat’s instructions cover include files too, so if the recursive grep from the check section listed a file under /etc/named/, back it up and run the same sed against it as well.

sudo cp -a /etc/named.conf /etc/named.conf.pre-cve-2026-94300
sudo sed -i -E 's|^(\s*)(tkey-gssapi-(keytab\|credential)\s)|\1// \2|' /etc/named.conf
sudo named-checkconf && sudo systemctl restart named && systemctl is-active named
sudo named-checkconf -p | grep -cE 'tkey-gssapi-(keytab|credential)'

The count dropped to 0 and named came back active, with the original line kept as a comment:

Commenting out tkey-gssapi-keytab in /etc/named.conf, restarting named and confirming zero GSS-TSIG directives remain

On Debian 12 and Ubuntu the directive normally sits in /etc/bind/named.conf.options. Find the file first, then run the same edit against it. This ran on the Debian 13 lab box, where it also brought the count to 0:

sudo grep -rlE 'tkey-gssapi-(keytab|credential)' /etc/bind/
sudo cp -a /etc/bind/named.conf.options /etc/bind/named.conf.options.pre-cve-2026-94300
sudo sed -i -E 's|^(\s*)(tkey-gssapi-(keytab\|credential)\s)|\1// \2|' /etc/bind/named.conf.options
sudo named-checkconf && sudo systemctl restart named && systemctl is-active named

The firewall control limits port 53 to the networks that should talk to the server, which shrinks who can deliver a replayed message. With firewalld, replace the open dns service with a rich rule for your trusted subnet. Add a rule for every client and domain controller range before the reload, because any range you miss loses DNS the moment the rules apply. Check which zone holds the DNS interface first, since the commands below change the default zone:

sudo firewall-cmd --get-active-zones

On the lab box eth0 sat in public, the default zone. If yours is in another zone, add --zone=<name> to each command that follows:

public (default)
  interfaces: eth0

Swap 10.0.1.0/24 for your own ranges, one rule per range. The rule is IPv4 only, so a server that also serves clients over IPv6 needs a matching family="ipv6" rule, or those clients lose DNS when the open service is removed:

sudo firewall-cmd --permanent --remove-service=dns
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.1.0/24" service name="dns" accept'
sudo firewall-cmd --reload
sudo firewall-cmd --list-all | grep -E 'services|rich|rule'

dns is gone from the open services and the only DNS path left is the rich rule:

firewall-cmd removing the open dns service and adding a rich rule that accepts DNS only from 10.0.1.0/24

Prove the rule from a host outside the trusted range, because a firewall you have not tested is a guess. The Debian box sat on 192.168.1.0/24 and could no longer reach the AlmaLinux server’s resolver:

dig +time=2 +tries=1 @192.168.1.51 localhost A

firewalld rejected the query, so dig reported the host as unreachable instead of waiting for a timeout:

dig from a host outside the trusted subnet failing with host unreachable after the firewalld rule

Debian and Ubuntu do not ship firewalld by default, so write the equivalent allow-list in whatever manages your nftables or ufw rules, then repeat the dig test from outside. Neither control replaces the package. A replay from inside the trusted subnet still works against a server with GSS-TSIG on, which is exactly the segment where domain members live.

If this CVE has you reconsidering BIND for authoritative zones that never needed Kerberos updates, PowerDNS with a database backend is the common alternative; our PowerDNS and PowerDNS Admin guide for Debian covers that setup end to end. For another backport-versus-version case worked through the same way, see the nginx CVE-2026-15176 check and patch.

Proof the DNS server is closed

A patch ticket closes when the server proves it, not when dnf or apt exits 0. Walk each BIND host through these checks, in order, and record the output with the change:

  1. The installed package matches the fixed build in the table above (dpkg-query -W bind9 or rpm -q bind bind9.18).
  2. The package changelog names CVE-2026-94300, which settles any scanner dispute on 9.18 backports.
  3. The named start time in systemctl status is later than the package upgrade.
  4. named-checkconf -p shows GSS-TSIG directives only on servers that take Kerberos updates.
  5. Port 53 answers only from the networks that should query the server, tested from a host outside them.
  6. Every host on a release with no fix carries at least one interim control, plus a ticket to undo it when the package lands.
  7. On a domain DNS server, one client re-registers its record after the change, which proves Kerberos updates still work.

Items 4 and 7 pull in different directions on a domain DNS server, and item 7 is the one people skip. On the AlmaLinux box, putting the backed-up named.conf back after the upgrade restored the keytab line, and named-checkconf accepted it on the patched build. Restoring was the right move there because the server needs secure updates. On a box that never needed them, leave the directive commented out for good: an unused GSS-TSIG listener is attack surface with no benefit.

Keep reading

UFW Firewall Commands with Examples on Ubuntu 26.04 / 24.04 Security UFW Firewall Commands with Examples on Ubuntu 26.04 / 24.04 PHP2Shell (CVE-2026-109618, CVE-2026-109619): Check and Patch PHP Php PHP2Shell (CVE-2026-109618, CVE-2026-109619): Check and Patch PHP PHP2Shell on End-of-Life PHP 8.1, 8.0 and 7.4 (WHMCS, ionCube) Php PHP2Shell on End-of-Life PHP 8.1, 8.0 and 7.4 (WHMCS, ionCube) Best Pentesting Hardware for Kali Linux in 2026 Security Best Pentesting Hardware for Kali Linux in 2026 APT CVE-2026-109518: Check and Patch Debian and Ubuntu Debian APT CVE-2026-109518: Check and Patch Debian and Ubuntu How To Configure UFW Firewall on Ubuntu 26.04 LTS Security How To Configure UFW Firewall on Ubuntu 26.04 LTS

Leave a Comment

Press ESC to close