← Back to Feed CACHED · 2026-09-03 15:30:49 · CACHE_KEY CVE-2026-78002
CVE-2026-78002 · CWE-131 · Disclosed 2026-08-27

A flaw was found in rsyslog.

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
Do you agree?
01 · The Real Story

Someone found a way to crash your diary mid-sentence by asking it to find-and-replace a booby-trapped word

CVE-2026-78002 is a heap buffer overflow in rsyslog's RainerScript replace() function. When rsyslog is configured to use replace() on incoming syslog messages — for example, to sanitize or rewrite log fields — an unauthenticated attacker who can send crafted syslog messages to the listener can trigger an incorrect buffer size calculation (CWE-131) that corrupts heap memory and crashes the rsyslog process. The impact ceiling is denial of service only: the CVSS vector explicitly scores C:N/I:N/A:H. All rsyslog versions through 8.2608.0-3 are affected; the fix landed in 8.2608.0-4 upstream, with Debian backporting to 8.2504.0-1+deb13u2 and SUSE shipping SUSE-SU-2026:3861-1 on 2026-08-28.

The vendor HIGH / 7.5 rating reflects the raw CVSS math: network-reachable, no auth, no interaction, high availability impact. That math is honest *if* rsyslog is listening on a network socket *and* the config uses replace() on attacker-controlled input. In practice, most enterprise rsyslog deployments receive logs over the internal network — not the internet — and a meaningful fraction never use the replace() function at all. Combined with the DoS-only impact (no code execution, no data leak) and the fact that systemd will auto-restart the crashed process, the real-world severity is closer to MEDIUM.

"Heap overflow in rsyslog replace() crashes the logger — DoS only, config-dependent, no RCE."
02 · The Attack Path

4 steps from start to impact.

STEP 01

Reach the rsyslog listener

The attacker must be able to send syslog messages (UDP/514 or TCP/514) to the target rsyslog instance. In most enterprises, syslog listeners accept traffic only from internal hosts or a dedicated log-forwarding VLAN. Internet exposure of port 514 is uncommon and considered a misconfiguration.
Conditions required:
  • Network path to rsyslog listener on TCP or UDP port 514 (or custom port)
  • rsyslog configured with imudp or imtcp module to accept remote messages
Where this breaks in practice:
  • Port 514 is rarely exposed to the internet; firewalls block it by default
  • Internal network segmentation limits which hosts can reach the syslog collector
Detection/coverage: Shodan/Censys can identify internet-exposed syslog ports; internal scanners (Qualys, Tenable) flag open 514/tcp.
STEP 02

Trigger the replace() code path

The crafted syslog message must be processed by a RainerScript rule that calls replace() on a field derived from the attacker's input. If the rsyslog config does not use replace() — or only applies it to static/local fields — the vulnerable code path is never reached.
Conditions required:
  • rsyslog.conf (or included rulesets) must use the replace() function on a message property that contains attacker-controlled data
Where this breaks in practice:
  • Many deployments use rsyslog purely as a forwarder with template-based output and never invoke replace()
  • Auditing the config for replace() usage is trivial: grep -r 'replace(' /etc/rsyslog.d/ /etc/rsyslog.conf
Detection/coverage: Configuration audit; no network-level detection for this prerequisite.
STEP 03

Deliver the malformed payload

The attacker sends a syslog message with content specifically crafted to cause an incorrect buffer size calculation in the replace() function. The replacement string and the target string must have a specific size relationship that triggers the off-by calculation. This causes a heap buffer overflow.
Conditions required:
  • Knowledge of the replace() pattern in use (or brute-force fuzzing of inputs)
  • Message must survive any upstream filtering or normalization
Where this breaks in practice:
  • No public PoC exists as of 2026-09-03
  • Blind exploitation requires guessing the replace() parameters in the target config
Detection/coverage: Heap corruption may trigger ASAN/valgrind in test environments; crash logs in journald (rsyslogd segfault).
STEP 04

rsyslog crashes — logging stops

The heap overflow corrupts memory and causes the rsyslog process to crash. Incoming logs are dropped until the service restarts. On systemd-managed hosts, Restart=on-failure in the rsyslog unit file typically brings the service back within seconds. The attacker can repeat the crash to sustain a logging blackout.
Conditions required:
  • Successful heap corruption from step 3
Where this breaks in practice:
  • systemd auto-restart limits the window of log loss to seconds per crash
  • No lateral movement, no code execution, no data exfiltration results from this crash
Detection/coverage: systemd journal records the crash and restart; monitoring for rsyslogd process state changes catches this immediately.
03 · Intelligence Metadata

The supporting signals.

In-the-wild exploitationNone observed. Not listed in CISA KEV. No campaigns or threat actor usage reported as of 2026-09-03.
Proof-of-conceptNo public PoC available. No exploit code found on GitHub, Exploit-DB, or security mailing lists.
EPSS score0.00612 (~0.6% probability of exploitation in 30 days). Low exploitation likelihood.
KEV statusNot listed in CISA Known Exploited Vulnerabilities catalog.
CVSS vectorCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H — Network-accessible, no privileges required, DoS-only impact (no confidentiality or integrity loss).
Affected versionsrsyslog all versions through 8.2608.0-3 that include the RainerScript replace() function.
Fixed versionsUpstream 8.2608.0-4; Debian 8.2504.0-1+deb13u2 (trixie); SUSE SUSE-SU-2026:3861-1 (2026-08-28); Ubuntu USN-8598-1.
Scanning / exposure dataSyslog (port 514) is rarely internet-exposed in enterprise environments. Shodan shows a modest population of exposed syslog receivers, overwhelmingly consumer routers and IoT, not enterprise rsyslog instances.
Disclosure date2026-08-27 (public disclosure); Debian bug #1145980 closed 2026-08-31.
Reporter / creditNot publicly credited in available advisories. Fix cherry-picked from upstream rsyslog Git.
04 · The Call

noisgate verdict.

Final Verdict
DOWNGRADED to MEDIUM (5.5/10)

The single most decisive factor is the DoS-only impact ceiling combined with config-dependent reachability: the vulnerability cannot achieve code execution, data exfiltration, or lateral movement, and only fires when the RainerScript replace() function is actively used on attacker-controlled input — a configuration that is common but far from universal. This narrows both the blast radius and the attacker's return on investment below the HIGH threshold.

HIGH Vulnerability description, impact ceiling (DoS only), and affected versions
MEDIUM Fraction of deployments using replace() in RainerScript configs
LOW Exploit complexity and whether sustained DoS is practical against systemd auto-restart

Why this verdict

  • DoS-only impact ceiling: The CVSS vector explicitly scores C:N/I:N/A:H. There is no path to code execution, privilege escalation, or data compromise. The worst outcome is a logging interruption.
  • Config-dependent code path: The replace() function must be actively used in the rsyslog config on attacker-influenced message fields. Deployments using rsyslog as a plain forwarder with template-based output are not vulnerable. This materially reduces the exposed population.
  • Internal network exposure: Syslog listeners are overwhelmingly internal-only. Internet exposure of port 514 is a misconfiguration, not a default. Attackers need internal network access (post-initial-compromise) or a very unusual perimeter config to reach the listener.
  • Auto-restart mitigation: systemd's Restart=on-failure directive on the rsyslog unit means the service recovers in seconds after each crash. Sustained DoS requires continuous attack traffic, which is noisy and detectable.
  • Role multiplier: rsyslog occupies the SIEM / detection plane role — it is the log transport layer. On a central syslog collector or SIEM forwarder, a sustained crash creates a detection blind spot that an attacker could exploit to mask concurrent activity. This is the highest-value scenario. However, the impact is still DoS (temporary log loss), not compromise of the collector itself. The blind-spot risk prevents a LOW rating but does not reach HIGH because (a) the attacker gains no persistent foothold, (b) systemd auto-restart limits the window, and (c) the replace() config prerequisite narrows which collectors are actually vulnerable.

Why not higher?

To justify HIGH, the vulnerability would need to enable code execution, persistent compromise, or reliable fleet-wide impact. This bug achieves none of those: it is a crash-only DoS that requires a specific RainerScript configuration and only affects availability. The absence of any public PoC, KEV listing, or in-the-wild exploitation further undermines the case for HIGH. While the detection-plane role of rsyslog is important, the transient nature of the DoS (auto-restart) and the config prerequisite keep the real-world risk below the HIGH threshold.

Why not lower?

rsyslog is installed on virtually every Linux server in an enterprise fleet, making the *potential* population enormous even if the *actually vulnerable* subset (those using replace()) is smaller. The detection-plane role means a crash creates a security-relevant blind spot, not just a benign service interruption. The network-reachable, no-auth, no-interaction attack vector is genuinely easy to execute once the attacker has internal access and the config prerequisite is met. These factors keep the rating at MEDIUM rather than LOW.

05 · Compensating Control

What to do — in priority order.

  1. Audit rsyslog configs for replace() usage — Run grep -rn 'replace(' /etc/rsyslog.conf /etc/rsyslog.d/ on all hosts. If replace() is not used, you are not vulnerable and can deprioritize patching. This takes minutes and immediately scopes the risk. No mitigation SLA applies for MEDIUM — go straight to the 365-day remediation window.
  2. Restrict syslog listener access via firewall rules — Ensure rsyslog's TCP/UDP 514 (or custom port) only accepts connections from known, trusted log sources. Use iptables/nftables or AllowedSender directives in rsyslog.conf. This prevents arbitrary internal hosts from reaching the listener.
  3. Enable systemd auto-restart and watchdog — Verify the rsyslog systemd unit has Restart=on-failure and WatchdogSec= configured. This limits the DoS window to seconds per crash. Most distro-shipped units already have this.
  4. Deploy the vendor patch within the 365-day remediation window — Apply rsyslog 8.2608.0-4 (upstream) or distro-specific updates (Debian 8.2504.0-1+deb13u2, SUSE-SU-2026:3861-1, USN-8598-1). Per noisgate remediation SLA for MEDIUM, patch within 365 days.
What doesn't work
  • WAF / IDS signatures — Syslog traffic is not HTTP; web application firewalls are irrelevant. Network IDS could theoretically signature the payload, but without a public PoC the signature content is unknown.
  • TLS encryption on syslog (imtls/omtls) — Encrypting the transport protects confidentiality but does NOT prevent the replace() overflow; the decrypted message still hits the vulnerable code path.
  • Rate-limiting syslog input — Rate limits reduce sustained DoS impact but do not prevent the initial crash; a single crafted message is sufficient to trigger the overflow.
06 · Verification

Crowdsourced verification payload.

Run this script on each target Linux host where rsyslog is installed. Execute as any user with read access to rsyslog config and the rsyslog binary (typically root or via sudo). Example: sudo bash check_cve_2026_78002.sh

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/bin/bash
# check_cve_2026_78002.sh
# Checks whether the host is vulnerable to CVE-2026-78002
# (rsyslog RainerScript replace() heap buffer overflow)
# Exit codes: 0 = PATCHED, 1 = VULNERABLE, 2 = UNKNOWN

set -euo pipefail

RSYSLOG_BIN=$(command -v rsyslogd 2>/dev/null || true)

if [ -z "$RSYSLOG_BIN" ]; then
  echo "UNKNOWN: rsyslogd not found on this host."
  exit 2
fi

VERSION=$($RSYSLOG_BIN -v 2>/dev/null | head -1 | grep -oP '[0-9]+\.[0-9]+\.[0-9]+')

if [ -z "$VERSION" ]; then
  echo "UNKNOWN: Could not determine rsyslog version."
  exit 2
fi

echo "Detected rsyslog version: $VERSION"

# Check for replace() usage in config
REPLACE_USED=$(grep -rl 'replace(' /etc/rsyslog.conf /etc/rsyslog.d/ 2>/dev/null || true)

if [ -z "$REPLACE_USED" ]; then
  echo "NOTE: replace() function not found in rsyslog config. Vulnerable code path is not reachable."
else
  echo "WARNING: replace() function found in: $REPLACE_USED"
fi

# Compare version - fixed in 8.2608.0-4 upstream
# For Debian, fixed in 8.2504.0-1+deb13u2
# We check the base version; distro backports may differ
MAJOR=$(echo "$VERSION" | cut -d. -f1)
MINOR=$(echo "$VERSION" | cut -d. -f2)
PATCH=$(echo "$VERSION" | cut -d. -f3)

# Check distro-specific package version for more accuracy
PKG_VER=""
if command -v dpkg-query &>/dev/null; then
  PKG_VER=$(dpkg-query -W -f='${Version}' rsyslog 2>/dev/null || true)
  echo "Debian/Ubuntu package version: $PKG_VER"
  if echo "$PKG_VER" | grep -qP 'deb13u[2-9]'; then
    echo "PATCHED: Debian package includes the fix ($PKG_VER)."
    exit 0
  fi
elif command -v rpm &>/dev/null; then
  PKG_VER=$(rpm -q rsyslog 2>/dev/null || true)
  echo "RPM package version: $PKG_VER"
fi

# Upstream version check
if [ "$MAJOR" -gt 8 ]; then
  echo "PATCHED: rsyslog version $VERSION is above affected range."
  exit 0
elif [ "$MAJOR" -eq 8 ] && [ "$MINOR" -gt 2608 ]; then
  echo "PATCHED: rsyslog version $VERSION is above affected range."
  exit 0
elif [ "$MAJOR" -eq 8 ] && [ "$MINOR" -eq 2608 ] && [ "$PATCH" -ge 4 ]; then
  echo "PATCHED: rsyslog version $VERSION includes the fix."
  exit 0
else
  echo "VULNERABLE: rsyslog version $VERSION is in the affected range (< 8.2608.0-4)."
  if [ -z "$REPLACE_USED" ]; then
    echo "MITIGATED: However, replace() is not used in config — code path is not reachable."
  fi
  exit 1
fi
07 · Bottom Line

If you remember one thing.

TL;DR
This is a DoS-only heap overflow in rsyslog's replace() function — no code execution, no data compromise. With no public PoC, no KEV listing, and a configuration prerequisite that limits actual exposure, noisgate downgrades this from vendor HIGH to MEDIUM (5.5). Start Monday by running grep -r 'replace(' /etc/rsyslog.conf /etc/rsyslog.d/ across your fleet to scope which hosts actually use the vulnerable code path — hosts without replace() in their config are not reachable. There is no noisgate mitigation SLA for MEDIUM — go straight to the 365-day noisgate remediation SLA and schedule the vendor patch (upstream 8.2608.0-4 or your distro's backport) in your next regular patch cycle. If you discover replace() is used on your central syslog collectors or SIEM forwarders, prioritize those hosts first to protect detection-plane availability.

Sources

  1. Debian Bug #1145980 (closed)
  2. Debian changelog for rsyslog 8.2504.0-1+deb13u2
  3. SUSE Security Update SUSE-SU-2026:3861-1
  4. Ubuntu USN-8598-1
  5. rsyslog Security Advisories
  6. CVE Details - rsyslog vulnerabilities
  7. GHSA for rsyslog heap overflow (prior similar vuln)
Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.