← Back to Feed CACHED · 2026-09-18 11:30:45 · CACHE_KEY CVE-2026-32746
CVE-2026-32746 · CWE-120 · Disclosed 2026-03-13

telnetd in GNU inetutils through 2.7

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

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.

"Pre-auth root RCE in theory, but researchers couldn't land it on modern 64-bit — downgrade to HIGH"
02 · The Attack Path

5 steps from start to impact.

STEP 01

Reach telnetd on port 23

The attacker establishes a TCP connection to port 23 on a host running GNU inetutils 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.
Conditions required:
  • Target host runs inetutils-telnetd ≤ 2.7
  • Port 23 is reachable from attacker's network position
Where this breaks in practice:
  • 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
Detection/coverage: Shodan, Censys, and Nmap service detection (nmap -sV -p23) trivially identify exposed telnetd instances. Qualys QID and Tenable plugins exist for this CVE.
STEP 02

Trigger LINEMODE SLC deferred processing

The attacker sends a LINEMODE response *before* a TTYPE (Terminal Type) response to activate the 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().
Conditions required:
  • Attacker understands Telnet option negotiation protocol
  • Target telnetd supports LINEMODE (default in GNU inetutils)
Where this breaks in practice:
  • Requires protocol-level understanding of Telnet subnegotiation sequencing
  • The ordering dependency is non-obvious without source code analysis
Detection/coverage: IDS/IPS signatures can detect anomalous LINEMODE SLC subnegotiation sequences. Suricata SID for CVE-2026-32746 was released by ET Open.
STEP 03

Send oversized SLC triplets to overflow slcbuf

The attacker crafts a LINEMODE SLC subnegotiation containing more than 36 SLC triplets (each 3 bytes), exceeding the 108-byte 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.
Conditions required:
  • Crafted Telnet subnegotiation packet with >36 SLC triplets
  • No WAF or protocol-aware proxy sanitizing Telnet traffic
Where this breaks in practice:
  • 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
Detection/coverage: Network IDS can match the oversized SLC payload pattern. Crash telemetry from systemd/journald will show telnetd segfaults.
STEP 04

Convert memory corruption to code execution

The attacker attempts to leverage the corrupted 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.
Conditions required:
  • 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
Where this breaks in practice:
  • 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
Detection/coverage: EDR agents will detect anomalous telnetd process behavior (shellcode execution, unexpected child processes). Crash dumps provide forensic evidence.
STEP 05

Obtain root shell

If the previous step succeeds, the attacker gains arbitrary code execution in the context of the 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.
Conditions required:
  • Successful completion of step 4 (unproven on modern systems)
  • telnetd running as root (default)
Where this breaks in practice:
  • SELinux/AppArmor policies may confine telnetd even after code execution
  • Container isolation limits blast radius if telnetd runs in a container
Detection/coverage: Host-based detection: unexpected processes spawned by telnetd, new network connections, file system modifications. SIEM correlation of telnetd crash → new session pattern.
03 · Intelligence Metadata

The supporting signals.

In-the-Wild ExploitationNo 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-ConceptMultiple 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 Score0.23674 — 23.7th percentile. Moderate exploitation probability, reflecting public PoC availability but tempered by exploitation complexity and small attack surface.
KEV StatusNot listed. No CISA KEV entry as of 2026-09-18. No known due date for federal agencies.
CVSS VectorCVSS: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 VersionsGNU 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 VersionsUpstream commit 6864598a29b652a6b69a958f5cd1318aa2b258afno 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 DataCensys: 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 Timeline2026-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 ResearcherDREAM Security Research Team (Israel), with detailed technical analysis published by watchtowr Labs (Aliz Hammond, Sonny Macdonald).
04 · The Call

noisgate verdict.

Final Verdict
DOWNGRADED to HIGH (7.5/10)

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.

HIGH Vulnerability existence and pre-auth reachability of the overflow
HIGH Downgrade from CRITICAL based on proven exploitation difficulty on 64-bit
MEDIUM Exploitation feasibility on 32-bit or embedded targets
LOW Whether a novel 64-bit technique could emerge to bypass current limitations

Why this verdict

  • Exploitation gap: The vendor CVSS assumes AC:L but 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.

05 · Compensating Control

What to do — in priority order.

  1. 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.socket or 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.
  2. 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.
  3. Apply the upstream patch commit manually where vendor packages are unavailable — Cherry-pick commit 6864598a from the inetutils repository and rebuild the package. Debian unstable users can upgrade to 2:2.7-4. OpenEmbedded backports exist for 2.5–2.7. This is the definitive fix.
  4. 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.
  5. 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.
What doesn't work
  • 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.
06 · Verification

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

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

If you remember one thing.

TL;DR
If you're running 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

  1. watchtowr Labs — Full Technical Writeup
  2. Censys Advisory — Exposure Data
  3. The Hacker News — CVE-2026-32746 Coverage
  4. ExploitDB — PoC #52556
  5. Debian Security Tracker
  6. CyCognito — Emerging Threat Analysis
  7. GNU bug-inetutils Mailing List — Original Report
  8. NVD Entry
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.