Technology reviews & practical guides
CVE-2026-123158 lets a 257-1024 character password log into password-less accounts on musl Linux without PAM. It is exploited in the wild and CISA's KEV deadline is Nov 12. Here is who is affected and how to fix it.

A password authentication bypass in OpenSSH's sshd, nicknamed SSHole and tracked as CVE-2026-123158, is being exploited against Linux servers built on the musl C library. That means Alpine first of all, plus OpenWrt, Buildroot and Yocto images. On affected systems, any password longer than 256 bytes (up to 1,024) logs into an account that is supposed to refuse password logins entirely.
OpenSSH shipped a fix in version 10.6p2 on November 5. A public exploit was on GitHub about four hours later. GreyNoise logged its first confirmed compromise on November 7, and CISA added the flaw to its Known Exploited Vulnerabilities (KEV) catalog on November 9 with a remediation deadline of November 12, which is today. One detail trips people up: upgrading the package does not restart a running sshd, so a patched box can still be vulnerable.
OpenSSH 10.6p2 is a one-fix point release that followed 10.6/10.6p1 (October 6). Its release notes describe a "critical security workaround" to "avoid password authentication bypass that is exploitable through sshd(8) that affects some Linux systems when built and run with PAM support disabled." The notes credit Özgün Kültekin of Wakefield with the discovery and add: "We consider the root cause of this bug to be outside sshd, but it is exploitable via sshd and can be avoided there."
The CVE record scores the flaw at CVSS 3.1 8.1 (High), with vector AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H and weakness CWE-394 (Unexpected Status Code or Return Value). Its description reads: "For some configurations of accounts, any password between 256 and 1024 characters succeeds."
CISA lists it as "OpenBSD OpenSSH Unexpected Status Code or Return Value Vulnerability", added 2026-11-09 with a due date of 2026-11-12, forensic triage marked "Yes" and known ransomware use "Unknown". The required action points to CISA's BOD 26-04, "Prioritizing Security Updates Based on Risk", and its forensics triage requirements. The deadline binds US federal civilian agencies. For everyone else it is a strong signal, not a legal obligation. Three other flaws joined KEV the same day with the same due date: CVE-2026-102895 (GPUStack), CVE-2026-116779 (SignalWire FreeSwitch) and CVE-2026-123218 (IBM Aspera Faspex).
The bug lives where three old decisions meet. None of them is dangerous on its own.
Put together: an attacker sends a password over 256 bytes, musl's crypt() fails and returns "*", sshd compares that "*" with the "*" stored for the account, sees a match, and lets the attacker in.

The account still needs a salt to hash with, and that is where 2016 comes in. The fix for CVE-2016-6210, a username enumeration bug, made sshd hash passwords even for accounts without a usable hash, borrowing the salt of another account. That behavior also applies to real users whose hash is "*". This is why the attack needs at least one other account on the system with a real password hash.
Alpine supplied the "*" accounts. Since about Alpine 3.16 the base image ships root as "root:*". The change came from a December 2021 patch titled "scripts/genrootfs.sh: locked -> invalid password", whose message says "this still forbids password login but allows logins via ssh keys with pam disabled."

This is not a bug in every OpenSSH server. All of the following must be true:
Accounts with a real password hash are not bypassed: the attacker can only log into the "*" accounts. Per the researcher, glibc systems (Ubuntu, Debian, RHEL and the like), systems that use PAM, Dropbear and OpenBSD are not affected.
Alpine's advisory says it found the problem in "every Alpine release we checked, 3.21 through 3.24 and edge", and in the end-of-life releases 3.16 to 3.20. On a stock install, root is shielded by the default PermitRootLogin prohibit-password, but it is reachable if an admin set PermitRootLogin yes. Key-only users and directory-service users (nslcd, winbind, sssd) with "*" are exposed.
Alpine's official tiny-cloud images from 3.18.11 through 3.24.3 ship an "alpine" user with a "*" password field and passwordless doas. On those images, a password-bypass login as "alpine" is a root login.
GreyNoise published a minute-by-minute timeline (UTC):

As of November 12, GreyNoise counts 38 confirmed successful exploitation chains from 9 attacker IPs since November 5, up from 16 chains and 6 IPs reported on November 9. It also logged 53.3 million SYN scans of TCP port 22 over the same period, but most port-22 traffic is unrelated background noise, and GreyNoise notes that because SSH is encrypted, picking exploit attempts out of the traffic is "challenging". Successful exploitation was seen in countries including New Zealand, Laos, Australia, India, Japan and France.

Other sensors tell a similar story. Previdian lists 30 attempts from 19 unique IPs in 12 countries between November 6 and 11. watchTowr said on November 6 that it saw exploitation tied to botnets and cryptomining, while Defused saw "a small amount of actors" and called the activity not widespread. No threat actor has been named.
The successful chains GreyNoise captured dropped "TAC Agent", a single-file Python 3 implant at /opt/py3/tac_agent.py (v0.1.1). It beacons every 150 seconds to tac.vpnla.org with the User-Agent "TAC-Agent/1.0" and can run recon, list, read, exfiltrate and drop files, update itself and run arbitrary shell commands. Attackers also installed a Python runtime, probed cloud metadata services, tried to read /etc/shadow through doas and modified authorized_keys. One victim got an /etc/init.d/tac-agent startup service. GreyNoise says enrollment never succeeded and the agent never received a task.
On Alpine, upgrade and then restart sshd. The advisory is explicit: "Upgrading the package does not restart a running sshd."
apk upgrade -U -a
rc-service sshd restartCheck the package revision, not the version banner. Edge carries openssh 10.6_p2-r0, but stable branches got backported fixes under older version numbers, for example 10.0_p1-r11 on 3.21 and 9.9_p2-r1 on 3.20. A server that reports an OpenSSH version older than 10.6p2 can therefore already be patched, and scanners that read only the banner will flag it.
If you cannot update right away, turn off password logins with a drop-in file and restart sshd:
echo 'PasswordAuthentication no' > /etc/ssh/sshd_config.d/00-sshole.conf
rc-service sshd restartTo look for signs of a break-in, compare successful password logins with accounts that should have no password:
grep "Accepted password" /var/log/messages
grep '^alpine:' /etc/shadowIf an account's password field is "*" but the log shows an accepted password login for it, the box was most likely hit. The researcher's check tool is at github.com/oz9un/sshole. GreyNoise also suggests hunting for ~/.config/tac/agent.json, /opt/py3/tac_agent.py, an /etc/init.d/tac-agent service, unexpected authorized_keys entries and /etc/hosts lines pinning tac.vpnla.org. Block that domain rather than its IP, 104.21.88.83, which is a shared Cloudflare address.

Nobody fully owns this one. OpenSSH patched sshd but says the root cause lies outside it, and the release notes list no CVE number. Write-ups say musl maintainer Rich Felker does not consider it a musl vulnerability. The researcher traces it to musl's 2012 switch from NULL to "*", a return value that POSIX does not call for.
On oss-security, Gentoo developer Michael Orlitzky argued that since nobody knows what crypt(3) will return on error, authenticating logins with a plain strcmp on its output is "optimistic". The OpenSSH fix is commit 4353fdc4 in openssh-portable.
No. Glibc-based distributions are not affected, and neither are systems that run sshd with PAM. The bug needs musl libc.
No. Only passwords longer than 256 bytes, up to 1,024, trigger the bypass, and only against accounts whose password field is "*". Accounts with a real password hash still require the correct password.
Only after sshd restarts. The running daemon keeps the old code until you run rc-service sshd restart or reboot.
Only if they run sshd with password authentication enabled and are reachable. Most Alpine containers do not run sshd at all, but those that do and have not restarted it since November 5 should be treated as exposed.
No. The November 12 due date binds US federal civilian agencies. For everyone else, a KEV listing means confirmed exploitation and is a reason to prioritize the fix.
More in Tech News
Browse Tech News