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.
4 steps from start to impact.
Reach the rsyslog listener
- Network path to rsyslog listener on TCP or UDP port 514 (or custom port)
- rsyslog configured with
imudporimtcpmodule to accept remote messages
- Port 514 is rarely exposed to the internet; firewalls block it by default
- Internal network segmentation limits which hosts can reach the syslog collector
Trigger the replace() code path
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.- rsyslog.conf (or included rulesets) must use the
replace()function on a message property that contains attacker-controlled data
- 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
Deliver the malformed payload
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.- Knowledge of the replace() pattern in use (or brute-force fuzzing of inputs)
- Message must survive any upstream filtering or normalization
- No public PoC exists as of 2026-09-03
- Blind exploitation requires guessing the replace() parameters in the target config
rsyslogd segfault).rsyslog crashes — logging stops
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.- Successful heap corruption from step 3
- 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
rsyslogd process state changes catches this immediately.The supporting signals.
| In-the-wild exploitation | None observed. Not listed in CISA KEV. No campaigns or threat actor usage reported as of 2026-09-03. |
|---|---|
| Proof-of-concept | No public PoC available. No exploit code found on GitHub, Exploit-DB, or security mailing lists. |
| EPSS score | 0.00612 (~0.6% probability of exploitation in 30 days). Low exploitation likelihood. |
| KEV status | Not listed in CISA Known Exploited Vulnerabilities catalog. |
| CVSS vector | CVSS: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 versions | rsyslog all versions through 8.2608.0-3 that include the RainerScript replace() function. |
| Fixed versions | Upstream 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 data | Syslog (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 date | 2026-08-27 (public disclosure); Debian bug #1145980 closed 2026-08-31. |
| Reporter / credit | Not publicly credited in available advisories. Fix cherry-picked from upstream rsyslog Git. |
noisgate verdict.
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.
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-failuredirective 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.
What to do — in priority order.
- Audit rsyslog configs for replace() usage — Run
grep -rn 'replace(' /etc/rsyslog.conf /etc/rsyslog.d/on all hosts. Ifreplace()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. - 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/nftablesorAllowedSenderdirectives in rsyslog.conf. This prevents arbitrary internal hosts from reaching the listener. - Enable systemd auto-restart and watchdog — Verify the rsyslog systemd unit has
Restart=on-failureandWatchdogSec=configured. This limits the DoS window to seconds per crash. Most distro-shipped units already have this. - 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.
- 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.
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
#!/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
fiIf you remember one thing.
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
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.