Back to Intelligence

Fedora 44 PowerDNS Recursor Critical Bypass — Upgrade to 5.4.6 Now (Advisory 2026-ae048e451f)

SA
Security Arsenal Team
September 14, 2026
10 min read

Fedora has published advisory 2026-ae048e451f for Fedora 44, pushing PowerDNS Recursor 5.4.6 to stable to resolve a critical security bypass tracked internally as Red Hat Bugzilla rhbz#2527899 (source advisory). No CVE identifier has been published alongside this Fedora advisory at the time of writing, and the upstream changelog detail is thin — which, from a defender's perspective, makes this more urgent, not less. When a distribution maintainer fast-tracks a resolver package labeled "critical bypass," the correct response is to patch first and dissect later.

Recursive DNS resolvers sit in the worst possible place in your trust architecture: they speak to untrusted parties on the internet on behalf of every internal client, they cache answers that downstream systems will trust implicitly, and a validation bypass in a recursor is effectively a bypass for every host that depends on it. If you run pdns-recursor 5.4.x on Fedora 44 — as a caching forwarder, an internal resolver, or embedded in a container/edge stack — treat this advisory as a patch-now event.

Technical Analysis

Affected products and versions

ItemDetail
ProductPowerDNS Recursor (pdns-recursor package)
Fixed version5.4.6
PlatformFedora 44 (and any derivative container images built from F44 base layers)
Trackingrhbz#2527899, Fedora advisory 2026-ae048e451f
SeverityCritical (per Fedora advisory classification)

What "security bypass" means for a recursive resolver

Without a published CVE or detailed upstream write-up, we work the class of the bug rather than a single signature. Critical bypasses in recursive resolvers historically fall into a handful of high-impact patterns:

  • Validation/DNSSEC bypass — the resolver accepts an answer that fails cryptographic or policy validation and returns it to clients as trusted. Impact: cache poisoning and man-in-the-middle redirection at scale.
  • Cache-policy bypass — an attacker-crafted query or response pollutes the cache (or skips TTL/glue sanity checks), so subsequent clients receive attacker-controlled records.
  • Query-restriction bypass — recursor ACLs, RPZ policies, or forwarding rules are circumvented, letting external actors trigger resolutions (open-resolver abuse, SSRF-adjacent resolution of internal names) they should not be able to reach.
  • Trust-anchor / delegation bypass — the resolver follows a forged delegation chain, again ending in poisoned answers.

In every variant, the exploitation prerequisites are favorable to an attacker: the recursor listens on UDP/TCP 53, processes attacker-influenceable traffic continuously, and a single poisoned record multiplies across your entire client base until TTL expiry. That amplification factor is exactly why resolver bypasses earn "critical."

Exploitation status

As of this writing: no public PoC, no confirmed in-the-wild exploitation, and no CISA KEV entry tied to this advisory. That is the window you want to patch in — before a researcher reverse-engineers the 5.4.5→5.4.6 diff and publishes a working trigger. DNS resolver diffs are small and highly legible to exploit developers; assume a working exploit exists within days of any embargoed fix landing.

Detection & Response

Pre-patch, your defensive surface is limited: a validation bypass typically produces plausible-looking but wrong answers, which is notoriously hard to detect at the resolver itself. Focus on (a) confirming exposure — which hosts run vulnerable pdns-recursor versions — and (b) detecting abuse patterns around the resolver: anomalous query volumes, unexpected config reloads, and the resolver process behaving unlike a resolver.

YAML
---
title: pdns-recursor Configuration Modification or Unauthorized Reload
id: 8f2c1a94-6b3d-4e71-9a05-2c7d4f8e1b36
status: experimental
description: Detects modification of pdns-recursor configuration files or service restarts outside of change windows, which may indicate an attacker weakening resolver security settings (e.g. disabling DNSSEC validation, widening ACLs) to exploit a validation bypass.
references:
  - https://linuxsecurity.com/advisories/fedora/fedora-44-pdns-recursor-2026-ae048e451f
  - https://attack.mitre.org/techniques/T1562/
author: Security Arsenal
date: 2026/02/14
tags:
  - attack.defense_evasion
  - attack.t1562
logsource:
  product: linux
  service: auditd
detection:
  selection_paths:
    name|contains:
      - '/etc/pdns-recursor/'
      - '/etc/recursor.conf'
      - '/etc/pdns/recursor.conf'
  selection_write:
    type: 'PATH'
    nametype:
      - 'CREATE'
      - 'NORMAL'
  condition: selection_paths and selection_write
falsepositives:
  - Legitimate configuration management (Ansible, Puppet) runs
  - Package upgrade writing new config templates
level: medium
---
title: pdns-recursor Spawning Unexpected Child Processes
id: 3b7e5f12-9c4a-4d28-b6f1-5a8c2e9d7f40
status: experimental
description: Detects the pdns-recursor daemon spawning shells or system utilities. A resolver daemon has no legitimate reason to execute command interpreters; this behavior post-exploitation of any recursor flaw is a strong compromise indicator.
references:
  - https://linuxsecurity.com/advisories/fedora/fedora-44-pdns-recursor-2026-ae048e451f
  - https://attack.mitre.org/techniques/T1059/
author: Security Arsenal
date: 2026/02/14
tags:
  - attack.execution
  - attack.t1059.004
logsource:
  category: process_creation
  product: linux
detection:
  selection_parent:
    ParentImage|endswith:
      - '/pdns_recursor'
  selection_child:
    Image|endswith:
      - '/sh'
      - '/bash'
      - '/dash'
      - '/zsh'
      - '/python'
      - '/python3'
      - '/perl'
      - '/curl'
      - '/wget'
      - '/nc'
      - '/ncat'
      - '/socat'
  condition: selection_parent and selection_child
falsepositives:
  - Extremely rare; Lua scripting hooks in recursor configs invoking external tools (review if custom Lua is deployed)
level: high
---
title: Excessive NXDOMAIN or Anomalous Query Volume to Recursive Resolver
id: 6d1a9c83-2e5b-4f74-a3c8-9b4e7d2f5a19
status: experimental
description: Detects sustained bursts of NXDOMAIN responses or query patterns consistent with cache-snooping or cache-poisoning attempts against a recursive resolver, a common precursor/companion behavior when exploiting resolver validation weaknesses.
references:
  - https://linuxsecurity.com/advisories/fedora/fedora-44-pdns-recursor-2026-ae048e451f
  - https://attack.mitre.org/techniques/T1071.004/
author: Security Arsenal
date: 2026/02/14
tags:
  - attack.command_and_control
  - attack.t1071.004
logsource:
  category: dns
detection:
  selection:
    rcode: 'NXDOMAIN'
  timeframe: 5m
  condition: selection | count(query) by src_ip > 200
falsepositives:
  - Security tooling performing DNS-based enumeration
  - Misbehaving IoT/printer firmware generating failed lookups
level: low
KQL — Microsoft Sentinel / Defender
// Hunt: pdns-recursor version exposure and anomaly signals from Syslog ingestion
// Covers: (1) inventory of hosts running pdns-recursor, (2) service restart/crash events
// that may indicate crash-trigger exploitation attempts, (3) abnormal query logging.

// --- Part 1: Hosts with pdns-recursor activity (exposure inventory) ---
Syslog
| where TimeGenerated > ago(7d)
| where ProcessName has "pdns" or SyslogMessage has "pdns_recursor"
| summarize FirstSeen=min(TimeGenerated), LastSeen=max(TimeGenerated),
            SampleMessage=any(SyslogMessage), EventCount=count()
  by Computer, ProcessName
| sort by EventCount desc;

// --- Part 2: Recursor restarts, crashes, or security-relevant log lines ---
Syslog
| where TimeGenerated > ago(24h)
| where ProcessName has "pdns" or SyslogMessage has "pdns_recursor"
| where SyslogMessage has_any ("starting", "shutdown", "exiting", "segfault",
                               "Refused", "validation", "bogus", "servfail",
                               "reload", "ACL")
| project TimeGenerated, Computer, ProcessName, SeverityLevel, SyslogMessage
| sort by TimeGenerated desc;

// --- Part 3: DNS via CommonSecurityLog (CEF-ingested resolver/firewall logs) —
// clients generating extreme NXDOMAIN volume against internal resolvers ---
CommonSecurityLog
| where TimeGenerated > ago(1h)
| where DeviceProduct has "dns" or ApplicationProtocol == "dns"
| where Message has "NXDOMAIN"
| summarize NXDCount=count() by SourceIP, DestinationIP
| where NXDCount > 200
| sort by NXDCount desc;
VQL — Velociraptor
-- Artifact: SecurityArsenal.Linux.PdnsRecursor.Exposure
-- Purpose: Identify hosts running vulnerable pdns-recursor versions and
--          inspect the daemon's listening sockets and child processes.

-- Step 1: Confirm installed package version (RPM-based Fedora 44 hosts)
LET rpm_check = SELECT * FROM execve(
    argv=['rpm', '-q', 'pdns-recursor', '--queryformat',
          '%{NAME}-%{VERSION}-%{RELEASE}\n']
)

SELECT Stdout AS InstalledPackage FROM rpm_check;

-- Step 2: Verify the daemon process and enumerate child processes
SELECT Pid, Ppid, Name, CommandLine, Exe, Username, CreateTime
FROM pslist()
WHERE Name =~ 'pdns'
   OR Ppid IN (SELECT Pid FROM pslist() WHERE Name =~ 'pdns_recursor');

-- Step 3: Confirm the resolver's listening sockets are scoped as expected
-- (exposure check: recursor bound to 0.0.0.0 when it should be internal-only)
SELECT Pid, Name, Laddr, Lport, Status
FROM netstat()
WHERE Name =~ 'pdns'
  AND Lport IN (53, 853);
Bash / Shell
#!/usr/bin/env bash
# Fedora 44 pdns-recursor 5.4.6 remediation + verification script
# Advisory: 2026-ae048e451f / rhbz#2527899
set -euo pipefail

FIXED_VERSION="5.4.6"

# --- 1. Check current exposure ---
echo "[*] Current pdns-recursor package:"
rpm -q pdns-recursor || { echo "[+] pdns-recursor not installed. Exiting."; exit 0; }

CURRENT=$(rpm -q pdns-recursor --queryformat '%{VERSION}')
echo "[*] Installed version: ${CURRENT} (fixed: ${FIXED_VERSION})"

# --- 2. Apply the update ---
echo "[*] Updating pdns-recursor via dnf..."
dnf upgrade -y --refresh pdns-recursor

NEW=$(rpm -q pdns-recursor --queryformat '%{VERSION}')
if [[ "${NEW}" != "${FIXED_VERSION}"* ]]; then
  echo "[!] WARNING: post-update version is ${NEW}; expected ${FIXED_VERSION}." >&2
  exit 1
fi

# --- 3. Restart and verify the service ---
systemctl restart pdns-recursor
sleep 2
systemctl is-active --quiet pdns-recursor \
  && echo "[+] pdns-recursor active on ${NEW}" \
  || { echo "[!] Service failed to start — check journalctl -u pdns-recursor" >&2; exit 1; }

# --- 4. Confirm running binary version ---
pdns_recursor --version | head -n1

# --- 5. Hardening sanity checks ---
echo "[*] Auditing listen scope (recursor should not answer the internet unless intended):"
ss -ulnp | grep -E ':53\s' || true
ss -tlnp | grep -E ':53\s' || true

# --- 6. Functional smoke test ---
echo "[*] Smoke test resolution:"
dig +short @127.0.0.1 example.com >/dev/null \
  && echo "[+] Resolution OK" \
  || echo "[!] Local resolution failed — investigate before returning to service" >&2

# --- 7. Flush cache after patch to clear any poisoned entries ---
rec_control wipe-cache '$' 2>/dev/null && echo "[+] Cache wiped" || echo "[*] rec_control unavailable — restart already cleared cache"

echo "[+] Remediation complete: pdns-recursor ${NEW} (fixes rhbz#2527899)"

Remediation

  1. Patch immediately. Upgrade to pdns-recursor 5.4.6 on all Fedora 44 systems: sudo dnf upgrade --refresh pdns-recursor. Restart the service and verify with pdns_recursor --version. Downtime for a recursor bounce is seconds; schedule it inside your lowest-traffic window but do it today, not in the next maintenance cycle.

  2. Inventory shadow deployments. pdns-recursor is frequently embedded in container images, edge appliances, and lab tooling. Search your image registry and dnf list installed pdns-recursor across the fleet — including hosts where it's installed but "not really used."

  3. Flush resolver caches post-patch. rec_control wipe-cache '$' (or a service restart) clears any records that may have been accepted through the bypass before the fix. Skipping this step leaves pre-patch poison potentially living until TTL expiry.

  4. Constrain the attack surface. Verify allow-from / ACL configuration in recursor.conf restricts query sources to intended networks only. An internal recursor answering the internet converts a client-side risk into an internet-reachable one. Confirm with ss -ulnp | grep :53 that bindings match intent.

  5. Harden validation posture. Where operationally feasible, ensure DNSSEC validation is enabled (dnssec=validate or process) and RPZ/forwarding policies are intact — and alert on any change to these settings, since weakening them is the natural post-exploitation move for a validation-bypass flaw.

  6. Monitor for follow-on advisories. Fedora's entry references rhbz#2527899; watch the upstream PowerDNS security advisories page and the original Fedora/LinuxSecurity advisory for a CVE assignment and technical detail. When the diff becomes public, expect PoC development — your detection content above should already be deployed by then.

  7. Feed resolver telemetry to the SOC. If pdns-recursor Syslog isn't already reaching your SIEM, onboard it now. Resolver crash loops, validation-failure spikes, and config reload events are your earliest compromise indicators for this entire bug class.

There is currently no CISA KEV deadline attached to this advisory — that is a function of its recency, not its severity. Recursive DNS is trust infrastructure; treat a critical bypass in it with the same urgency you'd give a perimeter VPN flaw.

Related Resources

Security Arsenal Penetration Testing Services AlertMonitor Platform Book a SOC Assessment vulnerability-management Intel Hub

Is your security operations ready?

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