← Back to Feed CACHED · 2026-09-08 08:50:11 · CACHE_KEY CVE-2026-18355
CVE-2026-18355 · CWE-191 · Disclosed 2026-09-07

A heap buffer overflow flaw was found in the SASL I/O layer of 389 Directory Server

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

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.

"Identity-tier heap overflow behind SASL auth — vendor HIGH stands, role blast radius prevents downgrade."
02 · The Attack Path

4 steps from start to impact.

STEP 01

Obtain valid LDAP credentials

The attacker needs any account that can bind to the 389-ds-base instance. In FreeIPA environments, this includes any enrolled host principal, service account, or human user. In standalone 389-ds deployments, a low-privilege LDAP account suffices. The credentials must support SASL mechanisms (GSSAPI, PLAIN over TLS, etc.).
Conditions required:
  • Valid LDAP credentials or Kerberos principal
  • Network reachability to LDAP port 389/636 or LDAPS
Where this breaks in practice:
  • 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
Detection/coverage: Failed bind attempts logged in 389-ds access log; anomalous SASL bind from unexpected source IPs detectable via SIEM correlation.
STEP 02

Complete SASL bind with integrity protection (SSF > 0)

The attacker must negotiate a SASL mechanism that establishes an integrity or confidentiality security layer (SSF > 0). GSSAPI with Kerberos or SASL PLAIN over TLS both satisfy this. The server wraps subsequent I/O through sasl_io_recv() / sasl_io_start_packet() once the bind completes.
Conditions required:
  • Successful SASL bind
  • Server configured to allow SASL mechanisms with SSF > 0 (default in FreeIPA)
Where this breaks in practice:
  • 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
Detection/coverage: SASL bind success events are logged; unusual mechanism negotiation from atypical clients could be flagged.
STEP 03

Send crafted SASL-wrapped record with tiny length

After the SASL layer is active, the attacker sends a SASL-wrapped LDAP PDU with a record-length field of 0, 1, or 2. In 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.
Conditions required:
  • 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)
Where this breaks in practice:
  • 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
Detection/coverage: IDS signatures for anomalous SASL record lengths could catch this; no known Snort/Suricata rule exists yet.
STEP 04

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.
Conditions required:
  • Successful trigger of the underflow
  • For RCE: ability to groom the heap layout, bypass ASLR
Where this breaks in practice:
  • 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
Detection/coverage: Process crash generates a core dump and systemd journal entry; monitoring ns-slapd process availability is the primary detection. RHEL ABRT can capture the crash signature.
03 · Intelligence Metadata

The supporting signals.

In-the-Wild ExploitationNone observed. Not listed on CISA KEV. No reports of active exploitation as of 2026-09-08.
Proof-of-ConceptNo 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 ScoreNot yet scored — CVE published 2026-09-07, EPSS typically populates within 7-14 days.
KEV StatusNot listed. No CISA KEV entry as of 2026-09-08.
CVSS VectorCVSS: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 Versions389-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 Versions389-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 / ExposureShodan 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 TimelineReported 2026-07-08 → Published 2026-09-07 → Patches available 2026-09-07.
CreditDiscovered by Ada Logics researchers and Team Anthropic, credited by Red Hat.
04 · The Call

noisgate verdict.

Final Verdict
= UNCHANGED to HIGH (7.5/10)

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.

HIGH Vulnerability existence and technical mechanism
MEDIUM RCE achievability (heap overflow is confirmed; reliable code execution past ASLR is undemonstrated)
HIGH DoS achievability (crash is near-certain on trigger)
LOW Exploit development timeline (no PoC exists; complexity is moderate)

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.

05 · Compensating Control

What to do — in priority order.

  1. Restrict LDAP network access to known management and replica IPs — Use iptables/nftables or 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.
  2. 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.
  3. Monitor ns-slapd process health and auto-restart — Configure systemd watchdog or a process monitor (e.g., Monit) to detect and restart ns-slapd crashes immediately. This limits DoS dwell time but does not prevent RCE. Implement immediately as a resilience measure.
  4. 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.
What doesn't work
  • 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.
06 · Verification

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.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/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
fi
07 · Bottom Line

If you remember one thing.

TL;DR
Patch your 389-ds-base / FreeIPA servers this month. CVE-2026-18355 is a post-auth heap overflow in the SASL I/O layer that can crash 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

  1. Red Hat CVE Page — CVE-2026-18355
  2. OffSeq Threat Radar — CVE-2026-18355
  3. Shenlong CVE Platform — SASL heap overflow intel
  4. THREATINT — CVE-2026-18355
  5. Red Hat Errata RHSA-2026:36195 (earlier SASL fixes)
  6. Red Hat Bugzilla — CVE-2026-11774 (related upper-bound fix)
  7. 389ds/389-ds-base GitHub Security Advisories
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.