A 32-year-old skeleton key that doesn't quite fit modern locks
CVE-2026-32746 is a BSS-based buffer overflow in the LINEMODE SLC suboption handler of GNU inetutils telnetd, affecting all versions through 2.7. The vulnerable add_slc() function in telnetd/slc.c writes 3-byte SLC triplets into a fixed 0x6C-byte (108-byte) buffer with zero bounds checking. An unauthenticated attacker on port 23 can send a crafted subnegotiation packet during option negotiation — before any login prompt — to corrupt ~400 bytes of adjacent BSS variables, including a pointer (slcptr / def_slcbuf) later passed to free(). Because telnetd typically runs as root, successful exploitation yields full system compromise. Affected platforms span Debian, Ubuntu, FreeBSD, NetBSD, macOS, Citrix NetScaler, TrueNAS Core, DragonFlyBSD, and embedded Linux distributions.
The vendor CVSS 9.8 treats this as trivially exploitable (AC:L), but that overstates real-world risk significantly. The watchtowr/DREAM research team who discovered the bug explicitly stated they *"didn't find a direct route to exploitation on any of the systems we observed"* on modern 64-bit distributions. On 64-bit x86, pointer alignment constraints and NULL bytes in addresses make the overflow extremely difficult to weaponize. On 32-bit targets exploitation is more feasible, but modern heap hardening (glibc chunk validation) still blocks naive approaches. Public PoCs achieve crash and pointer-leak primitives — not reliable RCE. Meanwhile, telnet itself is a legacy protocol with a tiny internet footprint (~3,362 exposed hosts per Censys). The 9.8 is defensible on paper but misleading for anyone managing a modern fleet.
5 steps from start to impact.
Reach telnetd on port 23
telnetd. No credentials or prior access are required — the vulnerable code path is hit during Telnet option negotiation, before the login prompt is displayed. The service is typically launched via inetd/xinetd or systemd socket activation.- Target host runs inetutils-telnetd ≤ 2.7
- Port 23 is reachable from attacker's network position
- Telnet is disabled by default on modern Linux installs
- Most enterprises migrated to SSH decades ago
- Only ~3,362 hosts expose port 23 to the internet per Censys (March 2026)
- Enterprise firewalls and segmentation typically block port 23 at the perimeter
nmap -sV -p23) trivially identify exposed telnetd instances. Qualys QID and Tenable plugins exist for this CVE.Trigger LINEMODE SLC deferred processing
def_slcbuf deferral mechanism. This is a specific ordering trick that causes telnetd to store SLC data in the deferred buffer rather than processing it immediately, setting up the exploitable code path through do_opt_slc() → process_slc() → add_slc().- Attacker understands Telnet option negotiation protocol
- Target telnetd supports LINEMODE (default in GNU inetutils)
- Requires protocol-level understanding of Telnet subnegotiation sequencing
- The ordering dependency is non-obvious without source code analysis
Send oversized SLC triplets to overflow slcbuf
slcbuf boundary. This corrupts ~400 bytes of adjacent BSS variables including the def_slcbuf pointer and slcptr. The entire payload fits within a single 0x200-byte Telnet subnegotiation packet. Public PoCs (ExploitDB #52556, GitHub repos) implement this step.- Crafted Telnet subnegotiation packet with >36 SLC triplets
- No WAF or protocol-aware proxy sanitizing Telnet traffic
- The overflow is BSS-based, not stack-based — no direct return address overwrite
- On 64-bit systems, pointer corruption produces addresses with NULL bytes, breaking exploitation chains
- Modern glibc heap hardening validates chunk metadata before
free(), blocking naive arbitrary-free primitives
telnetd segfaults.Convert memory corruption to code execution
def_slcbuf pointer — which is later passed to free() — to achieve an arbitrary-free primitive, then chain it into arbitrary write and ultimately code execution. On 32-bit systems this is theoretically feasible via heap metadata manipulation. On 64-bit modern distributions, the watchtowr team was unable to complete this step despite extensive effort.- 32-bit target OR a novel 64-bit exploitation technique
- Absence of modern heap protections (ASLR, glibc safe-unlinking)
- Knowledge of target's specific compiler layout and libc version
- watchtowr explicitly stated they found no direct route to RCE on any modern system they tested
- 64-bit x86 pointer alignment and NULL bytes make controlled writes extremely difficult
- glibc safe-unlinking checks block the classic unlink exploitation path
- ASLR randomizes heap and library addresses, requiring an info-leak chain
telnetd process behavior (shellcode execution, unexpected child processes). Crash dumps provide forensic evidence.Obtain root shell
telnetd process, which typically runs as root. From here, the attacker has full control of the host — credential harvesting, lateral movement, persistence installation. On network appliances like Citrix NetScaler, this could mean control of traffic inspection and SSL termination.- Successful completion of step 4 (unproven on modern systems)
- telnetd running as root (default)
- SELinux/AppArmor policies may confine telnetd even after code execution
- Container isolation limits blast radius if telnetd runs in a container
The supporting signals.
| In-the-Wild Exploitation | No confirmed active exploitation. Not listed on CISA KEV. No campaigns attributed by Mandiant, CrowdStrike, or Microsoft as of September 2026. Wiz reported 23% of cloud environments have *vulnerable resources* but this reflects installed-not-running telnetd packages, not active exploitation. |
|---|---|
| Proof-of-Concept | Multiple public PoCs available. ExploitDB #52556 (crash + probe + RCE modes), GitHub repos including "Kangaroo" exploit. Discovered by DREAM Security Research Team (Israel), detailed writeup by watchtowr Labs. No public PoC achieves reliable RCE on modern 64-bit systems — only crash and info-leak primitives. |
| EPSS Score | 0.23674 — 23.7th percentile. Moderate exploitation probability, reflecting public PoC availability but tempered by exploitation complexity and small attack surface. |
| KEV Status | Not listed. No CISA KEV entry as of 2026-09-18. No known due date for federal agencies. |
| CVSS Vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H — The AC:L (Attack Complexity: Low) is disputed by the discovering researchers themselves, who could not achieve RCE on modern systems. A more accurate assessment would be AC:H, which would drop the score to ~8.1. |
| Affected Versions | GNU inetutils all versions through 2.7 (current upstream). Also affects derivative implementations in FreeBSD 13/15, NetBSD 10.1, macOS, Citrix NetScaler, TrueNAS Core, DragonFlyBSD, uCLinux, Haiku, libmtev. |
| Fixed Versions | Upstream commit 6864598a29b652a6b69a958f5cd1318aa2b258af — no official release yet. Debian unstable/sid: 2:2.7-4. Debian stable (bookworm, bullseye, trixie): still vulnerable. OpenEmbedded backports available for 2.5/2.6/2.7. |
| Exposure Data | Censys: 3,362 internet-exposed hosts (March 2026). Shodan: ~212K devices with Telnet banners globally (includes non-GNU implementations). The vast majority of GNU inetutils-telnetd instances are on internal networks or disabled. |
| Disclosure Timeline | 2026-03-11: Reported by DREAM Security Research Team. 2026-03-13: CVE assigned and NVD published. 2026-03-18: Censys advisory. Bug has existed since 1994 (~32 years). |
| Discovering Researcher | DREAM Security Research Team (Israel), with detailed technical analysis published by watchtowr Labs (Aliz Hammond, Sonny Macdonald). |
noisgate verdict.
The single most decisive factor is unproven exploitability on modern 64-bit systems — the discovering researchers explicitly stated they found no direct route to RCE on any modern platform tested, despite achieving memory corruption primitives. This fundamentally contradicts the vendor's AC:L designation and invalidates a CRITICAL rating for modern enterprise deployments.
Why this verdict
- Exploitation gap: The vendor CVSS assumes
AC:Lbut the researchers who discovered the bug could not achieve RCE on any modern 64-bit system. Public PoCs achieve crash and pointer leaks only. This is a significant downward pressure — the theoretical worst-case is not the practical reality. - Tiny exposure population: Only ~3,362 internet-facing hosts per Censys. In a typical 10,000-host enterprise, telnetd is likely running on zero to single-digit hosts. The protocol has been deprecated in favor of SSH for over two decades.
- Modern mitigations compound: ASLR, glibc safe-unlinking, and 64-bit pointer alignment each independently raise the exploitation bar. Combined, they make reliable weaponization a research-grade challenge, not a script-kiddie exercise.
- Role multiplier: telnetd can run on (a) *low-value:* dev boxes, lab systems — crash only, no RCE, minimal impact; (b) *typical:* legacy servers with telnet for management — crash = DoS, no proven RCE; (c) *high-value:* Citrix NetScaler (network edge appliance), embedded OT/ICS devices, TrueNAS (storage). On NetScaler, telnet is management-plane access typically restricted to internal/OOB networks — not data-plane exposed. On 32-bit embedded/OT devices, exploitation is more plausible and blast radius could be operational/safety-impacting, but these represent a minority of the GNU inetutils installed base. The high-value role outcome (network appliance compromise) is plausible on 32-bit embedded targets, which floors the verdict at HIGH. It does not reach CRITICAL because telnetd is not canonically a high-value-role component — it is a deprecated utility that happens to ship on some appliances.
- No active exploitation: Not on CISA KEV, no attributed campaigns, no ransomware adoption. EPSS at 23.7th percentile reflects moderate — not urgent — exploitation probability.
Why not higher?
A CRITICAL rating would require either proven reliable RCE on modern systems or active in-the-wild exploitation, and this CVE has neither. The discovering researchers themselves could not complete the exploitation chain on 64-bit, which directly contradicts the AC:L assumption underpinning the 9.8 score. The internet-facing exposure of ~3,362 hosts is far too small to justify fleet-wide emergency response.
Why not lower?
The vulnerability is pre-authentication, requires no user interaction, and targets a service that runs as root. On 32-bit embedded targets (network appliances, OT/ICS devices, TrueNAS), exploitation is more feasible and the blast radius includes network edge compromise. Public PoCs exist and lower the barrier for further research. A MEDIUM rating would understate the risk to organizations with legacy telnet-enabled infrastructure or embedded appliances.
What to do — in priority order.
- Disable telnetd immediately on all systems where it is not business-critical — The most effective mitigation is eliminating the attack surface entirely. Run
systemctl disable --now telnetd.socketor remove from/etc/inetd.conf. For any enterprise in 2026, SSH should be the only remote shell protocol. Deploy within the noisgate mitigation SLA of 30 days for HIGH. - Firewall port 23 at the perimeter and internal segment boundaries — If telnetd cannot be disabled (legacy systems, OT devices), restrict port 23 access to specific management VLANs and jump hosts via ACLs. No internet-facing telnet should exist. Implement within 30 days.
- Apply the upstream patch commit manually where vendor packages are unavailable — Cherry-pick commit
6864598afrom the inetutils repository and rebuild the package. Debian unstable users can upgrade to2:2.7-4. OpenEmbedded backports exist for 2.5–2.7. This is the definitive fix. - Deploy IDS/IPS signatures for CVE-2026-32746 — Suricata ET Open and Snort signatures detect the anomalous LINEMODE SLC subnegotiation pattern. This provides detection-in-depth for hosts where telnetd must remain running. Tune to alert-and-block mode.
- Migrate legacy telnet consumers to SSH — Identify all systems and automation scripts using telnet for management and migrate them to SSH with key-based authentication. This is the long-term remediation that eliminates the entire class of telnet vulnerabilities.
- WAF/reverse proxy — Telnet is not an HTTP protocol; web application firewalls do not inspect port 23 traffic and provide zero protection.
- **Endpoint patching of the telnet *client*** — This CVE affects the *server* (
telnetd), not the client. Patching the client binary does nothing. - TLS-wrapping telnet (stunnel) — While stunnel encrypts the transport, it does not sanitize Telnet option negotiation. The overflow occurs at the application protocol layer, so a TLS wrapper does not prevent exploitation — it only hides the traffic from network IDS.
Crowdsourced verification payload.
Run this script on each target host where telnetd may be installed. No special privileges required — it checks the installed package version. Example: chmod +x check_cve_2026_32746.sh && ./check_cve_2026_32746.sh
#!/usr/bin/env bash
# CVE-2026-32746 Checker — GNU inetutils telnetd BSS overflow
# Checks: (1) whether telnetd is installed, (2) version, (3) whether service is active
# Output: VULNERABLE / PATCHED / UNKNOWN
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN
set -euo pipefail
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m'
# Check if telnetd binary exists
TELNETD_BIN=$(command -v in.telnetd 2>/dev/null || command -v telnetd 2>/dev/null || true)
if [[ -z "$TELNETD_BIN" ]]; then
# Check if package is installed even if binary not in PATH
if dpkg -l inetutils-telnetd 2>/dev/null | grep -q '^ii'; then
TELNETD_BIN=$(dpkg -L inetutils-telnetd 2>/dev/null | grep telnetd$ | head -1)
elif rpm -q inetutils 2>/dev/null | grep -q inetutils; then
TELNETD_BIN=$(rpm -ql inetutils 2>/dev/null | grep telnetd$ | head -1)
fi
fi
if [[ -z "$TELNETD_BIN" ]]; then
echo -e "${GREEN}[PATCHED]${NC} telnetd is not installed on this system. Not affected."
exit 0
fi
echo "[*] Found telnetd binary: $TELNETD_BIN"
# Check if service is actively listening
LISTENING=false
if ss -tlnp 2>/dev/null | grep -q ':23 '; then
LISTENING=true
echo -e "${RED}[!] telnetd is ACTIVELY LISTENING on port 23${NC}"
elif netstat -tlnp 2>/dev/null | grep -q ':23 '; then
LISTENING=true
echo -e "${RED}[!] telnetd is ACTIVELY LISTENING on port 23${NC}"
else
echo "[*] telnetd is installed but NOT currently listening on port 23"
fi
# Attempt version detection
VERSION=""
if dpkg -l inetutils-telnetd 2>/dev/null | grep -q '^ii'; then
PKG_VER=$(dpkg -l inetutils-telnetd 2>/dev/null | awk '/^ii/{print $3}')
echo "[*] Debian package version: $PKG_VER"
# Debian patched version is 2:2.7-4 or later
if dpkg --compare-versions "$PKG_VER" ge "2:2.7-4" 2>/dev/null; then
echo -e "${GREEN}[PATCHED]${NC} Installed version ($PKG_VER) contains the fix for CVE-2026-32746."
exit 0
else
echo -e "${RED}[VULNERABLE]${NC} Installed version ($PKG_VER) is affected by CVE-2026-32746."
if $LISTENING; then
echo -e "${RED}[CRITICAL] Service is actively listening — immediate action required.${NC}"
fi
exit 1
fi
elif rpm -q inetutils 2>/dev/null | grep -q inetutils; then
RPM_VER=$(rpm -q inetutils 2>/dev/null)
echo "[*] RPM package: $RPM_VER"
echo -e "${YELLOW}[UNKNOWN]${NC} Cannot determine patch status for RPM-based install. Check vendor advisory."
exit 2
fi
# Fallback: check binary for patched signature via strings
if strings "$TELNETD_BIN" 2>/dev/null | grep -q 'slcbuf.*bound\|SLC_MAX_TRIPLETS'; then
echo -e "${GREEN}[PATCHED]${NC} Binary appears to contain bounds-checking fix."
exit 0
fi
# If we got here, telnetd is installed but we can't confirm patch status
if $LISTENING; then
echo -e "${RED}[VULNERABLE]${NC} telnetd is installed and listening. Assume vulnerable (inetutils <= 2.7)."
exit 1
else
echo -e "${YELLOW}[UNKNOWN]${NC} telnetd is installed but not listening. Cannot confirm patch status. Verify manually."
exit 2
fiIf you remember one thing.
telnetd anywhere in your fleet in 2026, Monday morning's job is simple: disable it. Run the verification script across your estate to identify every host with inetutils-telnetd installed, then kill the service (systemctl disable --now telnetd.socket) and firewall port 23. Per the noisgate mitigation SLA for HIGH severity, compensating controls (disable service or firewall port 23) should be in place within 30 days. The noisgate remediation SLA gives you 180 days to formally patch or remove the package, but honestly, if you can disable telnet this week, do it — there is no legitimate reason to run unencrypted remote shells in a modern enterprise. For the rare exception (legacy OT devices, embedded appliances where telnet is the only management interface), restrict port 23 access to a dedicated management VLAN reachable only from hardened jump hosts, deploy IDS signatures, and begin vendor engagement for a firmware update. Despite the vendor's CRITICAL 9.8 label, this is not a drop-everything emergency — no active exploitation exists, and reliable RCE on modern 64-bit systems remains unproven. Prioritize it behind any actively exploited KEV-listed vulnerabilities in your queue.Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.