This is someone peeling the tamper seal off the package in transit, not walking away with the package
CVE-2023-48795 is the SSH *Terrapin* prefix-truncation flaw: an on-path attacker can inject unauthenticated messages before encryption starts, then delete the same number right after NEWKEYS, causing SSH_MSG_EXT_INFO and related negotiation data to disappear. In OpenSSH, the named affected line is *before 9.6*, but the CVE is broader than OpenSSH and hits many SSH stacks and clients when they negotiate [email protected] or, for practical EtM abuse, CBC plus *[email protected].
The vendor's 5.9/MEDIUM score is defensible in a lab, but it overshoots enterprise patch urgency. The decisive friction is attacker position: this is not internet-scale unauthenticated exploitation, it is a live machine-in-the-middle attack against an SSH path, and in OpenSSH the practical impact is mostly security-feature downgrade rather than code execution, auth bypass, or plaintext recovery.
4 steps from start to impact.
Get on the SSH path with a MITM tool
bettercap, ARP spoofing, a rogue AP, a malicious VPN/proxy hop, or compromised routing infrastructure. Without that position, CVE-2023-48795 is inert.- Attacker can intercept and modify traffic between SSH client and server
- Target uses SSH over a path the attacker can influence
- Requires pre-existing network control or local adjacency
- Segmentation, private admin networks, bastions, and VPN pinning reduce reachable population sharply
- Internet exposure alone is not enough; the attacker must sit *in the middle*
Proxy the handshake with the Terrapin PoC
Terrapin-Artifacts, the attacker injects extra SSH_MSG_IGNORE packets before encryption begins. That manipulation is designed to desynchronize the implicit packet sequence state without immediately killing the session.- A client starts a fresh SSH connection through the attacker
- The attacker can transparently proxy both directions
- The attack only works during connection establishment, not against already-established sessions
- Operationally noisy compared with passive sniffing
Land on an affected cipher/MAC combination
[email protected] is negotiated, or when Encrypt-then-MAC is used and a CBC cipher makes practical exploitation viable. The research found broad support for affected modes, but support is not the same as successful, high-impact exploitation in a defended enterprise path.- Client and server negotiate
[email protected]or a practical CBC+EtM combination - Neither side enforces strict key exchange end to end
- If both sides support
strict kex, the countermeasure blocks the core manipulation - AES-GCM and common CTR/EaM paths do not provide the same practical attack surface
- Mixed estates with partial backports complicate attacker reliability
ssh-audit can identify absent kex-strict-* support and affected algorithms. Qualys and similar scanners can often identify support for vulnerable modes, but they still do not show exploit success.Strip extension negotiation and weaken the session
NEWKEYS extension message, typically SSH_MSG_EXT_INFO, causing client and server to proceed without some negotiated protections. For OpenSSH, the release notes call out the main demonstrated impact: disabling a subset of the keystroke timing obfuscation features added in 9.5; the paper also discusses signature-downgrade side effects in some flows.- Handshake manipulation succeeds without dropping the connection
- The target implementation relies on the stripped extension data
- OpenSSH maintainers state there is no other discernable impact to session secrecy or session integrity
- This is downgrade/feature suppression, not shell pop or memory corruption
- The more damaging AsyncSSH outcomes were tracked under separate CVEs, not this one
strict kex support and affected algorithm exposure than by waiting for exploitation artifacts.The supporting signals.
| In-the-wild status | No authoritative public source used here shows confirmed broad in-the-wild exploitation of CVE-2023-48795 itself. A CISA ICS advisory states there was no known public exploitation reported to CISA at publication time. |
|---|---|
| KEV status | Not listed in the CISA Known Exploited Vulnerabilities Catalog at review time. |
| PoC availability | Yes — the Ruhr University Bochum researchers published RUB-NDS/Terrapin-Artifacts, including proof-of-concept MITM proxies and scan artifacts. |
| EPSS | User-supplied EPSS is 0.54214. Public mirrors currently place it around the 98th percentile; that says *attempts are plausible*, not that enterprise impact is automatically urgent. |
| CVSS vector reality check | CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N is already pulled down by High Attack Complexity, but CVSS still misses the biggest real-world friction: live MITM position on an SSH path. |
| Affected versions | OpenSSH is affected before 9.6; the CVE also spans many other SSH clients, servers, and libraries including PuTTY, libssh, libssh2, Paramiko, AsyncSSH, WinSCP, SFTPGo, and others as tracked by NVD/MITRE. |
| Fixed versions | Upstream OpenSSH fixed this in 9.6 via strict key exchange. Distro backports matter: for example Ubuntu fixed via 1:8.9p1-3ubuntu0.5 on 22.04 LTS and 1:8.2p1-4ubuntu0.10 on 20.04 LTS; Debian fixed bullseye at 1:8.4p1-5+deb11u3 and bookworm at 1:9.2p1-2+deb12u2. |
| Exposure data | The Terrapin paper's internet scan found 71.6% of SSH servers supported at least one affected mode and 63.2% preferred one. That is broad cryptographic exposure, but still not proof that attackers can get MITM position on your admin paths. |
| Patch adoption signal | The researchers reported that an IPv4 scan on 2024-01-05 already showed more than 3.4M servers patched, indicating fast vendor and operator uptake of the strict kex countermeasure. |
| Disclosure / researchers | Public disclosure was 2023-12-18 by Fabian Bäumer, Marcus Brinkmann, and Jörg Schwenk. |
noisgate verdict.
The single biggest reason this lands in LOW is that exploitation requires a *live machine-in-the-middle position* on an SSH connection, which usually implies prior network control, local adjacency, or a compromised transit point. On top of that, the OpenSSH maintainers describe the practical OpenSSH impact as limited to early-session integrity downgrade, not code execution or broad confidentiality loss.
Why this verdict
- -2.0 attacker-position penalty: exploitation needs unauthenticated *network* reach plus a man-in-the-middle foothold on the SSH path, which is a huge real-world narrowing versus ordinary remote service CVEs
- -0.7 precondition penalty: the vulnerable behavior only matters when affected algorithms are actually negotiated and
strict kexis absent on at least one side - -0.6 impact penalty: for OpenSSH, the documented practical effect is mainly extension stripping and loss of some negotiated protections, not RCE, plaintext disclosure, or durable privilege gain
Why not higher?
This is not a wormable or sprayable internet bug. An attacker must first win routing position on the path, then catch a new SSH session, then land on affected crypto, and even then the mainstream OpenSSH impact is limited to downgrade behavior rather than direct system compromise.
Why not lower?
It is still a real protocol flaw in one of the most common admin channels in enterprise environments. Affected modes are widespread, PoC code exists, and a successful MITM against bastions, jump boxes, or contractor/Wi-Fi paths can systematically weaken many sessions at once.
What to do — in priority order.
- Disable affected algorithms where practical — Remove
[email protected]and CBC+*[email protected]from exposed SSH admin surfaces if you cannot confirmstrict kexsupport on both ends. For a LOW verdict there is no SLA beyond backlog hygiene, but do it earlier on internet-facing bastions, shared jump hosts, and contractor-access paths because those are the few places where the MITM precondition is believable. - Keep SSH on trusted paths — Force administrative SSH through private management networks, VPNs, or hardened bastions instead of flat user LANs and untrusted transit. This directly attacks the only thing that really matters for Terrapin: the attacker being able to sit in the middle.
- Verify strict-kex on both client and server fleets — The OpenSSH-style fix only activates when both peers support it, so a patched server talking to old clients can still leave downgrade room. Audit server banners, client versions, and distro backports during normal patch hygiene for this LOW item.
- Patching only one side and declaring victory does not reliably solve it, because
strict kexis negotiated and needs peer support to take effect - MFA does not meaningfully address this CVE, because the manipulation happens in the SSH transport handshake before authentication and targets negotiated protections
- Rotating host keys or changing user passwords does not fix the protocol weakness
Crowdsourced verification payload.
Run this on the target Linux host that provides OpenSSH server access. Invoke it as sudo bash terrapin-check.sh so it can read the effective sshd config and probe localhost:22; it needs ssh, sshd, and standard shell tools, but no internet access.
#!/usr/bin/env bash
# terrapin-check.sh
# Check whether a local OpenSSH server appears vulnerable to CVE-2023-48795.
# Outputs: VULNERABLE / PATCHED / UNKNOWN
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN
set -u
need_cmd() {
command -v "$1" >/dev/null 2>&1
}
for c in ssh grep awk sed; do
if ! need_cmd "$c"; then
echo "UNKNOWN - missing required command: $c"
exit 2
fi
done
SSHD_BIN=""
for p in /usr/sbin/sshd /sbin/sshd $(command -v sshd 2>/dev/null || true); do
if [ -n "$p" ] && [ -x "$p" ]; then
SSHD_BIN="$p"
break
fi
done
if [ -z "$SSHD_BIN" ]; then
echo "UNKNOWN - sshd not found"
exit 2
fi
# Capture sshd version (stderr on OpenSSH)
SSHD_VER_RAW="$($SSHD_BIN -V 2>&1 | head -n1)"
SSHD_VER="$(printf '%s' "$SSHD_VER_RAW" | sed -n 's/.*OpenSSH_\([0-9][0-9.]*p\{0,1\}[0-9]*\).*/\1/p')"
# Effective config. Requires privileges on some systems.
SSHD_T="$($SSHD_BIN -T 2>/dev/null || true)"
if [ -z "$SSHD_T" ]; then
echo "UNKNOWN - could not read effective sshd config; run with sudo"
exit 2
fi
CIPHERS="$(printf '%s\n' "$SSHD_T" | awk '/^ciphers /{print $2}')"
MACS="$(printf '%s\n' "$SSHD_T" | awk '/^macs /{print $2}')"
has_vuln_cipher=0
has_vuln_cbc=0
has_vuln_etm=0
printf '%s' "$CIPHERS" | grep -q '[email protected]' && has_vuln_cipher=1
printf '%s' "$CIPHERS" | grep -Eq '(^|,)(aes[0-9-]*-cbc|3des-cbc)(,|$)' && has_vuln_cbc=1
printf '%s' "$MACS" | grep -q -- '[email protected]' && has_vuln_etm=1
# Probe localhost for strict-kex advertisement. This does not require auth success.
STRICT_KEX=0
PROBE_OUT="$(ssh -vv \
-o BatchMode=yes \
-o StrictHostKeyChecking=no \
-o UserKnownHostsFile=/dev/null \
-o ConnectTimeout=5 \
-o PreferredAuthentications=none \
-p 22 localhost true 2>&1 || true)"
printf '%s' "$PROBE_OUT" | grep -q '[email protected]' && STRICT_KEX=1
# Helper: compare upstream-ish OpenSSH versions only. Backports may make this conservative.
ver_ge_96=0
case "$SSHD_VER" in
9.6*|9.7*|9.8*|9.9*|10.*)
ver_ge_96=1
;;
esac
# Decision logic:
# 1) If strict-kex is advertised by the local server, treat as PATCHED.
# 2) Else if upstream version is >=9.6, treat as PATCHED.
# 3) Else if affected algorithms are exposed, treat as VULNERABLE.
# 4) Else UNKNOWN because distro backports / custom configs may apply.
if [ "$STRICT_KEX" -eq 1 ]; then
echo "PATCHED - server advertises strict kex (mitigation for CVE-2023-48795)"
exit 0
fi
if [ "$ver_ge_96" -eq 1 ]; then
echo "PATCHED - OpenSSH version appears to be 9.6 or newer ($SSHD_VER_RAW)"
exit 0
fi
if [ "$has_vuln_cipher" -eq 1 ] || { [ "$has_vuln_cbc" -eq 1 ] && [ "$has_vuln_etm" -eq 1 ]; }; then
echo "VULNERABLE - no strict kex detected and affected algorithms are enabled"
exit 1
fi
echo "UNKNOWN - no strict kex detected, but enabled algorithms do not clearly show an exploitable profile; verify distro backports manually"
exit 2
If you remember one thing.
strict kex is active on both client and server fleets, and roll fixes into your normal OS/OpenSSH maintenance cycle; for bastions, jump hosts, and contractor-facing admin paths, disable the affected algorithms during the next routine change window if you cannot confirm both-side support yet.Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.