sshole OpenSSH vulnerability: check Alpine and OpenWrt
sshole lets long passwords into OpenSSH on musl without PAM. Who is affected, the fixed Alpine and OpenWrt packages, and how to check your logs.

Quick summary · TL;DR
- **The accounts at risk are the ones with
*in the password field.** Key-only users and the tiny-cloud alpine user have it, and when sshd runs on musl without PAM they accept any password over 256 bytes once another account has a real hash. Root has it too, but the default PermitRootLogin keeps it off password logins. - On Alpine, compare the package release, not the version string. Stable branches got backports, so a patched 3.24 box reports 10.3_p1-r2, and only edge carries 10.6_p2-r0.
- Restart sshd after the upgrade. Alpine's advisory says
apk upgradealone leaves the vulnerable daemon running, which is easy to miss on a box nobody logs into. - PasswordAuthentication no is the quick workaround. Test a key login in a second session before the restart, since getting it wrong can lock you out of a remote box.
The sshole OpenSSH vulnerability lets an account whose password field is just * log in with any password longer than 256 bytes. It hits Alpine and anything else built on musl libc where sshd checks passwords without PAM, as long as one other account has a real hash. Fixing it takes OpenSSH 10.6p2 or your distro’s patched package, plus an sshd restart.
That * is the nasty part, because key-only users, directory users and root on Alpine since about 3.16 all carry it. Root is saved by the default PermitRootLogin prohibit-password, unless another reachable account can doas to it.
What the sshole OpenSSH vulnerability is
Özgün Kültekin of Wakefield reported it, and OpenSSH shipped 10.6p2 on 2026-11-05. Its release notes call it “a critical security workaround” for musl systems with PAM disabled and place the root cause outside sshd.
MITRE published CVE-2026-123158 the same day, scored 8.1 (CVSS 3.1, attack complexity high). Alpine’s advisory of 2026-11-05 says no CVE had been assigned yet.
Who is affected
You’re exposed only when all five hold. That’s the researcher’s list, and Alpine’s advisory carries the last four:
- sshd runs on musl (Alpine, and per sshhole.com also OpenWrt, Buildroot and Yocto)
- sshd does not use PAM (Alpine’s
openssh-serveris built without it, andopenssh-server-pamwithUsePAM nocounts too) PasswordAuthentication yes, which is the OpenSSH default- some account has exactly
*as its password field - at least one local account has a
$5$or$6$hash
Alpine lists these as safe:
UsePAM yesPasswordAuthentication no- locked
!accounts - boxes with no
$hash - cloud-init images (they write
PasswordAuthentication no) - containers without sshd
Glibc distros, Dropbear and OpenBSD are safe too, per the researcher.
Why it happens
In August 2012 musl changed crypt() to return an unmatchable hash instead of NULL on failure, which is * in this case. Weeks later its SHA-256 and SHA-512 crypt set a 256-byte key limit, so a longer password fails and gets that * back. And since a 2016 timing fix for CVE-2016-6210, sshd hashes the attempt with another account’s salt when the stored field has none.
So sshd compares * with *, and the login goes through. OpenSSH’s upstream fix refuses any stored field shorter than four characters.
Fixed versions and packages
For the sshole OpenSSH vulnerability, stable branches carry a backported patch under the old version number, so sshd -V on a patched 3.24 box still says 10.3, not 10.6p2. Compare the package release instead (Alpine advisory and package index, 2026-11-06):
Run apk upgrade -U -a, then rc-service sshd restart, since upgrading leaves the old daemon running.
OpenWrt’s default SSH server is Dropbear, per its wiki. If you swapped in the openssh-server package, the packages feed took fixes on 2026-11-05: 10.6p2 on master and openwrt-25.12 (10.6_p2-r1), and a backport on openwrt-24.10 that ships as 9.9_p2-r2, the same version trap as on Alpine. On 2026-11-06 mipsel_24kc on 24.10 still served 9.9_p2-r1, so check your router’s build.
Check your box for sshole
A rough manual check for the sshole OpenSSH vulnerability, run as root. These commands were not run here:
ls /lib/ld-musl-*.so.1 # a match means musl
sshd -T | grep -E '^(usepam|passwordauthentication) '
awk -F: '$2=="*"{print $1}' /etc/shadow # accounts with exactly *
awk -F: '$2 ~ /^\$[56]\$/{print $1}' /etc/shadow # accounts with a real hash
apk info -v openssh-server # compare with the table
On musl without PAM, if both awk lines print names and passwordauthentication yes shows up, treat the box as exposed until it’s patched. Directory users from musl-nscd have no shadow line, so awk misses them, but they are targets too.
The researcher’s check.sh tests the same conditions; read it before running it as root. Its version test only counts 10.6p2 and later as fixed, so a patched 3.24 box can still print EXPOSED. Trust the package release.
If you cannot patch yet
Switch password logins off. Alpine and the researcher both say that alone closes the hole.
Tell whether you were broken into
Alpine says to search /var/log/messages for Accepted password for on an account with no password, such as alpine, root or a key-only user.
grep 'Accepted password for' /var/log/messages # not tested here
Then review doas use, new users, new files and authorized_keys. If you can’t rule out a login, Alpine says to treat the machine as compromised. As of 2026-11-06 the CVE is not in CISA’s Known Exploited Vulnerabilities catalog, and neither Alpine nor OpenSSH reports attacks in the wild.
What this means for proxy and scraping setups
Proxy and scraping setups often include exactly the boxes the sshole OpenSSH vulnerability needs:
- Alpine images that run sshd for SFTP drops or as a jump host
- VPS boxes on the official tiny-cloud images (3.18.11 through 3.24.3), whose
alpineuser has a*field and passwordlessdoas, so the first password set on the box opens a path to root - routers where someone replaced Dropbear with OpenSSH
A server that exists only to give a web scraping architecture a fixed exit is one more sshd to keep patched. Rented datacenter proxies with username and password auth move that box off your list, and the types of proxies guide compares the categories.
Frequently asked questions
sshole is a password authentication bypass in sshd on musl libc, without PAM and with password logins on. An account whose password field is exactly * will take any password longer than 256 bytes, up to 1024, once another local account has a $5$ or $6$ hash. Özgün Kültekin of Wakefield reported it, and it was fixed on 2026-11-05.
Yes. MITRE published CVE-2026-123158 on 2026-11-05, with a CVSS 3.1 score of 8.1 and high attack complexity. Alpine's advisory from the same day says no CVE had been assigned at the time it was written, so some early write-ups do not carry the number.
Upstream, the fix is portable OpenSSH 10.6p2, released on 2026-11-05. Distros backport it under older version numbers, so Alpine 3.24 ships it as 10.3_p1-r2, 3.23 as 10.2_p1-r1 and 3.22 as 10.0_p1-r11. The package upgrade does not replace the running daemon, so restart sshd after updating.
Only if sshd runs inside the container. Alpine's advisory lists Docker and other container users without sshd as not affected. An Alpine image that runs sshd for SFTP or as a jump host needs the fixed package or PasswordAuthentication no, then a rebuild or restart.
Not with its default SSH server. OpenWrt uses musl, but ships Dropbear, which the researcher lists as not affected. Routers running the openssh-server package got the fix through the OpenWrt packages feed on 2026-11-05, with 25.12 shipping it as 10.6_p2-r1 and 24.10 as a backport in 9.9_p2-r2. Check the installed release on your router before assuming you are patched.
Yes. Alpine's advisory and the researcher both say PasswordAuthentication no closes the hole. Make sure a key login works in a second session before you restart sshd. Patch anyway, because a config change can be undone by the next image or config management run.
Search /var/log/messages on Alpine for Accepted password for lines that name an account with no password, such as alpine, root or a key-only user. Then review doas use, new users, new files and authorized_keys. If you cannot rule out a login, Alpine says to treat the machine as compromised.
Researched and drafted with AI tools, then checked against our publishing rules before it went live: 11 outside links, 3 links to other proxymint pages, no prices and a fact-check pass against our product records. How we write.