Sending a suspiciously tiny package to the post office and watching them try to fill a warehouse-sized receipt
CVE-2026-18355 is an integer underflow in sasl_io_start_packet() within 389 Directory Server (389-ds-base). When a SASL-bound client sends a wrapped-record length of 0, 1, or 2 bytes, encrypted_buffer_count falls below the already-consumed encrypted_buffer_offset, producing an unsigned subtraction that wraps to ~4 GiB. The subsequent PR_Recv() call then tries to shove network-controlled data into a 1024-byte heap buffer, giving the attacker a massive heap overflow. The bug requires a completed SASL bind with integrity protection (SSF > 0), meaning the attacker must hold valid LDAP credentials. Affected versions span 389-ds-base shipped in RHEL 9 (≤ 2.8.0-8), RHEL 10 (≤ 3.0.6-20), and Red Hat Directory Server 11 for RHEL 8. This is distinct from CVE-2026-11774, whose fix only addressed the *upper*-bound overflow path — the lower-bound underflow was left unpatched until now.
Red Hat rates this Important / 7.5 HIGH, which is fair. The CVSS vector correctly encodes the authentication prerequisite (PR:L) and high attack complexity (AC:H) stemming from the need for a successful SASL integrity-layer bind before the trigger. However, the vector's Scope:Unchanged understates the real blast radius in identity-tier deployments: 389-ds-base is the backend for FreeIPA / Red Hat IdM, meaning a successful RCE on this process owns the enterprise identity store. Red Hat explicitly states *no practical mitigation exists* — you must patch. Given that the attack is post-auth, requires a specific SASL negotiation path, and no public PoC exists, the vendor's HIGH is appropriate: high enough to reflect the identity-tier consequence, not CRITICAL because of real friction in weaponization.
4 steps from start to impact.
Obtain valid LDAP credentials
- Valid LDAP credentials or Kerberos principal
- Network reachability to LDAP port 389/636 or LDAPS
- Credential must be obtained first — requires phishing, credential stuffing, or prior compromise
- Most enterprise 389-ds instances are internal-only; Shodan shows ~140K LDAP servers exposed but most are not 389-ds-base
Complete SASL bind with integrity protection (SSF > 0)
sasl_io_recv() / sasl_io_start_packet() once the bind completes.- Successful SASL bind
- Server configured to allow SASL mechanisms with SSF > 0 (default in FreeIPA)
- If SASL is disabled or only SIMPLE binds are allowed, the vulnerable code path is unreachable
- GSSAPI requires a valid Kerberos ticket — adds another authentication barrier
Send crafted SASL-wrapped record with tiny length
sasl_io_start_packet(), the code reads this length and subtracts the already-consumed offset. Because the length is smaller than the offset, the unsigned subtraction wraps to a value near 0xFFFFFFFF (~4 GiB). This value is passed to PR_Recv() as the read size.- Active SASL security layer on the connection
- Ability to send raw bytes on the LDAP socket (trivial with any LDAP client library or raw socket)
- No public PoC or exploit tool exists as of 2026-09-08
- Constructing the trigger requires understanding the SASL I/O framing internals — non-trivial but documented in source
Heap buffer overflow → DoS or RCE
PR_Recv() attempts to read ~4 GiB of attacker-controlled network data into a 1024-byte heap buffer, causing a massive heap overflow. The immediate effect is a crash (DoS). Achieving RCE requires heap grooming to place controllable data at predictable offsets — feasible but complicated by ASLR and the 389-ds-base heap layout. On identity-tier servers (FreeIPA/IdM), even DoS alone disrupts authentication for the entire domain.- Successful trigger of the underflow
- For RCE: ability to groom the heap layout, bypass ASLR
- ASLR on RHEL 9/10 significantly complicates reliable RCE
- Crash-only exploitation (DoS) is far more likely than code execution in practice
- 389-ds may be behind a load balancer or replicated, limiting single-instance DoS impact
ns-slapd process availability is the primary detection. RHEL ABRT can capture the crash signature.The supporting signals.
| In-the-Wild Exploitation | None observed. Not listed on CISA KEV. No reports of active exploitation as of 2026-09-08. |
|---|---|
| Proof-of-Concept | No public PoC. The trigger is straightforward (send a 0-2 byte SASL record length after auth), but no weaponized code has been published on GitHub or exploit databases. |
| EPSS Score | Not yet scored — CVE published 2026-09-07, EPSS typically populates within 7-14 days. |
| KEV Status | Not listed. No CISA KEV entry as of 2026-09-08. |
| CVSS Vector | CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H — Network-reachable but requires auth (PR:L) and high complexity (AC:H). All three CIA impacts are High. |
| Affected Versions | 389-ds-base ≤ 2.8.0-8.el9_8 (RHEL 9), ≤ 3.0.6-20.el10_0 (RHEL 10), ≤ 2.6.1-23.el9_6 (RHEL 9.6 EUS), Red Hat Directory Server 11.7 E4S for RHEL 8. |
| Fixed Versions | 389-ds-base 2.8.0-10.el9_8, 3.0.6-21.el10_0, 2.6.1-24.el9_6. Errata: RHSA-2026:64771 through RHSA-2026:64793. Earlier RHSA-2026:36195 (2.8.0-8) does not fix this CVE — it only covers CVE-2026-11610 and CVE-2026-11774. |
| Scanning / Exposure | Shodan shows ~140K LDAP-responding hosts on port 389 globally (~60K in the US), but the majority are Active Directory or OpenLDAP. 389-ds-base is a fraction of that footprint, predominantly internal-only in RHEL/FreeIPA shops. |
| Disclosure Timeline | Reported 2026-07-08 → Published 2026-09-07 → Patches available 2026-09-07. |
| Credit | Discovered by Ada Logics researchers and Team Anthropic, credited by Red Hat. |
noisgate verdict.
The single most decisive factor sustaining the HIGH verdict is role multiplier — 389-ds-base is the canonical LDAP backend for FreeIPA/Red Hat IdM, an identity provider where RCE or even sustained DoS equates to domain-wide authentication disruption. The authentication prerequisite and high attack complexity prevent an upgrade to CRITICAL, but the identity-tier blast radius floors the verdict at HIGH and prevents any downgrade.
Why this verdict
- Authentication gate (PR:L): The attacker must hold valid LDAP credentials and complete a SASL integrity-layer bind before reaching the vulnerable code. This eliminates opportunistic scanning and limits the attacker population to insiders or post-compromise actors. Neutral — does not lower from vendor baseline because LDAP credentials are widely held in enterprise environments.
- Attack complexity (AC:H): The SASL security layer must be negotiated, and reliable RCE requires heap grooming past ASLR. This is correctly modeled in the vendor vector and keeps the score at 7.5 rather than 8.8 (which would result from AC:L). No adjustment.
- No PoC, no exploitation: Zero public exploit code and no KEV listing reduce urgency relative to actively exploited vulns but do not change the inherent severity. No adjustment.
- Role multiplier: 389-ds-base is canonically an identity-tier component — ≥90% of installations serve as the LDAP backend for FreeIPA/IdM or Red Hat Directory Server. Successful exploitation (even DoS-only) on a FreeIPA replica disrupts Kerberos authentication, sudo policy, HBAC, and certificate issuance for the entire IPA domain. RCE grants read/write access to all user credentials, Kerberos keys, and group memberships — equivalent to domain compromise. This floors the verdict at HIGH regardless of friction.
- No vendor mitigation available: Red Hat explicitly states no practical compensating control exists. The only remediation is patching. This increases operational urgency within the HIGH bracket but does not change the severity score itself.
Why not higher?
CRITICAL would require either active exploitation (KEV/ITW) or a lower friction path (unauthenticated, low complexity). This CVE requires valid credentials *and* a specific SASL negotiation path (AC:H), and there is no public PoC or evidence of weaponization. The theoretical RCE via heap overflow is undemonstrated past ASLR on RHEL 9/10. While the identity-tier role is severe, the compounding authentication and complexity prerequisites keep this firmly in HIGH, not CRITICAL.
Why not lower?
Downgrading to MEDIUM would require either a narrow installed base or limited blast radius — neither applies. 389-ds-base is the *defining* component of FreeIPA/IdM identity infrastructure, placing ≥90% of installations in the high-value identity-provider role. Even the DoS-only outcome (which is trivially achievable once authenticated) causes domain-wide authentication outage. Red Hat confirms no mitigation exists, meaning unpatched instances have zero compensating controls. The identity-tier floor holds at HIGH.
What to do — in priority order.
- Restrict LDAP network access to known management and replica IPs — Use
iptables/nftablesor firewall zones to limit who can reach ports 389/636 on the directory server. This reduces the pool of hosts that can attempt the SASL bind. Deploy within the noisgate mitigation SLA of 30 days for HIGH severity. - Audit and reduce LDAP service accounts with SASL bind capability — Review accounts that bind via GSSAPI or other SASL mechanisms. Disable or rotate credentials for unused service accounts to shrink the attack surface. Complete within the 30-day mitigation window.
- Monitor ns-slapd process health and auto-restart — Configure systemd watchdog or a process monitor (e.g., Monit) to detect and restart
ns-slapdcrashes immediately. This limits DoS dwell time but does not prevent RCE. Implement immediately as a resilience measure. - Deploy FreeIPA replicas across failure domains — Ensure at least 2-3 FreeIPA replicas exist so that a DoS crash on one instance does not cause domain-wide authentication failure. This is standard IdM architecture but worth verifying now.
- Disabling SASL entirely — In FreeIPA environments, GSSAPI/SASL is required for host enrollment, replication, and Kerberos integration. Disabling it breaks IdM functionality.
- WAF / reverse proxy in front of LDAP — LDAP is a binary protocol (BER-encoded), not HTTP. Standard WAFs cannot inspect or filter SASL-layer record lengths.
- TLS-only enforcement (LDAPS on 636) — The vulnerability is in the SASL I/O layer, not the transport layer. SASL integrity wrapping occurs *above* TLS, so LDAPS does not prevent the trigger.
- nsslapd-maxsasliosize tuning — This parameter guards the *upper* bound of SASL record sizes. CVE-2026-18355 exploits the *lower* bound (underflow from tiny values), so adjusting maxsasliosize has no effect.
Crowdsourced verification payload.
Run this script on each 389-ds-base host as root (or any user that can query RPM). Usage: sudo bash check_cve_2026_18355.sh. No network access required — it checks the installed package version against known-fixed versions.
#!/bin/bash
# check_cve_2026_18355.sh — Detect CVE-2026-18355 in 389-ds-base
# Run on target RHEL host. Requires: rpm. No special privileges needed.
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN
set -euo pipefail
PKG="389-ds-base"
# Check if 389-ds-base is installed
if ! rpm -q "$PKG" &>/dev/null; then
echo "UNKNOWN — $PKG is not installed on this host."
exit 2
fi
INSTALLED=$(rpm -q --qf '%{VERSION}-%{RELEASE}\n' "$PKG" | head -1)
echo "Installed: $PKG-$INSTALLED"
# Extract major.minor.patch and release number
VER=$(echo "$INSTALLED" | grep -oP '^[0-9]+\.[0-9]+\.[0-9]+')
REL=$(echo "$INSTALLED" | grep -oP '(?<=-)[0-9]+' | head -1)
MAJOR=$(echo "$VER" | cut -d. -f1)
MINOR=$(echo "$VER" | cut -d. -f2)
PATCH=$(echo "$VER" | cut -d. -f3)
# Fixed versions:
# RHEL 9.8: 2.8.0-10.el9_8
# RHEL 10.0: 3.0.6-21.el10_0
# RHEL 9.6 EUS: 2.6.1-24.el9_6
vulnerable=0
if [[ "$MAJOR" -eq 3 ]]; then
# RHEL 10 stream: fixed in 3.0.6-21
if [[ "$MINOR" -eq 0 && "$PATCH" -le 6 && "$REL" -lt 21 ]]; then
vulnerable=1
elif [[ "$MINOR" -eq 0 && "$PATCH" -lt 6 ]]; then
vulnerable=1
fi
elif [[ "$MAJOR" -eq 2 && "$MINOR" -eq 8 ]]; then
# RHEL 9.8 stream: fixed in 2.8.0-10
if [[ "$PATCH" -eq 0 && "$REL" -lt 10 ]]; then
vulnerable=1
fi
elif [[ "$MAJOR" -eq 2 && "$MINOR" -eq 6 ]]; then
# RHEL 9.6 EUS stream: fixed in 2.6.1-24
if [[ "$PATCH" -le 1 && "$REL" -lt 24 ]]; then
vulnerable=1
fi
elif [[ "$MAJOR" -eq 2 && "$MINOR" -lt 6 ]]; then
# Older 2.x — likely vulnerable, no backport confirmed
vulnerable=1
elif [[ "$MAJOR" -lt 2 ]]; then
vulnerable=1
fi
if [[ "$vulnerable" -eq 1 ]]; then
echo "VULNERABLE — $PKG-$INSTALLED is affected by CVE-2026-18355."
echo "Update to the fixed version for your RHEL stream."
exit 1
else
echo "PATCHED — $PKG-$INSTALLED includes the fix for CVE-2026-18355."
exit 0
fiIf you remember one thing.
ns-slapd (trivially) or potentially yield RCE on your identity infrastructure. Red Hat confirms no workaround exists — patching is the only fix. Under the noisgate mitigation SLA for HIGH severity, deploy compensating network controls (firewall LDAP access, audit SASL-capable accounts, ensure replica redundancy) within 30 days. Under the noisgate remediation SLA, apply the vendor patch (389-ds-base ≥ 2.8.0-10.el9_8 / 3.0.6-21.el10_0 / 2.6.1-24.el9_6) within 180 days. Given this is identity-tier infrastructure with no mitigation path, push patching toward the front of the 180-day window — aim for your next maintenance cycle, ideally within 30-45 days. Prioritize FreeIPA/IdM masters and replicas first, then standalone 389-ds instances.Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.