//security advisory
CVE-2026-123158 (*sshole): Alpine OpenSSH Password Bypass
CVE-2026-123158, which its finder named *sshole (also written sshhole), lets an attacker who can reach SSH log in to an account that has no password, using any password between 257 and 1024 bytes. It hits sshd on musl-based Linux, such as Alpine, when sshd checks passwords without PAM, which is how Alpine’s default openssh-server package is built. One connection is enough, and it works every time. Update openssh and restart sshd, or set PasswordAuthentication no until you can.
On this page
Are you affected by CVE-2026-123158?
Only hosts that run OpenSSH’s sshd on musl, without PAM, with password logins on. Most Alpine servers that run sshd fit that description by default. Find the row that describes you.
You run sshd on Alpine with password logins on
The default openssh-server package, or openssh-server-pam with UsePAM no
Act nowUpdate openssh and restart sshd today. If an account has a real password hash, every key-only account on that host is open to anyone who can reach port 22. What to do
You launched VMs from official Alpine tiny-cloud images
qcow2, VHD and AMI images from 3.18.11 through 3.24.3
Act nowThese ship an
alpineuser with no password and passwordlessdoas. Once any password hash exists on the VM, the attacker gets root. Update every running instance; a new image does not fix old ones. Cloud imagesYou build devices or images on musl with OpenSSH
Buildroot, Yocto, OpenWrt with OpenSSH installed, custom images
Update neededThe same conditions apply outside Alpine, and no distribution list covers you. Build OpenSSH 10.6p2 or set
PasswordAuthentication no. Beyond AlpineYou run Alpine containers that do not run sshd
Most Alpine-based application images
Low riskNot affected, per Alpine. If an image installs openssh-server, rebuild it on the fixed package or remove sshd.
Your servers run Debian, Ubuntu, RHEL or another glibc distribution
Also macOS, Windows, OpenBSD and any sshd that checks passwords through PAM
ProtectedNot affected, according to OpenSSH. The bug needs musl, the C library Alpine uses, and sshd checking passwords without PAM.
You already set PasswordAuthentication no
Including hosts configured by cloud-init, which sets it for you
ProtectedNot affected. Update anyway, and confirm the setting is in force with sshd -T rather than trusting the config file.
A host is exploitable when all four of these are true, according to Alpine:
- sshd checks passwords without PAM. Alpine’s
openssh-serverpackage is built that way;openssh-server-pamis affected only withUsePAM no. PasswordAuthenticationisyes, which is the OpenSSH default.- An account that can log in has
*as its password field: a key-only user created withadduserand no password, thealpineuser on tiny-cloud images, or a directory user from nslcd, winbind or sssd through musl-nscd. - At least one other local account has a
$5$or$6$password hash. One is enough to expose every passwordless account.
Root ships as root:* on Alpine, but OpenSSH’s default PermitRootLogin prohibit-password blocks password logins to it. That stops helping as soon as the attacker lands on another account that can become root, for example through doas. Accounts locked with ! are not affected.
What to do
Update and restart. Turn off password logins anywhere you cannot update today. Then check the logs.
Find every sshd running on musl
Alpine servers and VMs, but also appliances, routers and embedded boards built with Buildroot or Yocto, and any container image that installsopenssh-server. How to checkUpdate openssh and restart sshd
Upgrading the package does not replace the running daemon. Until sshd restarts, the host is still exposed. Fixed versionsTurn off password logins where you cannot update
PasswordAuthentication nocloses the hole on its own. Confirm key login works first. The commandsLook for password logins to passwordless accounts
Any such login in the logs means the host was broken into. What to look forRecord the decisions
Note which hosts met the conditions, what you changed and when, and what the log review found. For compliance
Fixed versions
OpenSSH fixed it in portable 10.6p2. Alpine backported the fix to every branch from 3.16, including releases that are out of support.
| Alpine branch | Fixed openssh | Point release |
|---|---|---|
| edge | 10.6_p2-r0 | Rolling |
| 3.24 | 10.3_p1-r2 | 3.24.4 |
| 3.23 | 10.2_p1-r1 | 3.23.8 |
| 3.22 | 10.0_p1-r11 | 3.22.8 |
| 3.21 | 9.9_p2-r1 | 3.21.10 (end of support 1 November 2026) |
| 3.20 | 9.7_p1-r6 | Out of support, package only |
| 3.19 | 9.6_p1-r3 | Out of support, package only |
| 3.18 | 9.3_p2-r4 | Out of support, package only |
| 3.17 | 9.1_p1-r7 | Out of support, package only |
| 3.16 | 9.0_p1-r6 | Out of support, package only |
apk upgrade -U -a
apk info -v | grep '^openssh' # compare with the table above
rc-service sshd restart # the upgrade does not restart sshdStable branches keep their older OpenSSH version and carry a patch for the same problem, so do not look for 10.6 there. Compare the package version with the table instead. Source from Alpine’s advisory.
Cloud images
Alpine’s official tiny-cloud images (qcow2, VHD and AMI) from 3.18.11 through 3.24.3 create an alpine user with a * password field and passwordless doas. They are safe on first boot, because no account has a password hash yet. They become exploitable once one does, for example when an admin sets a console password or user-data adds a user with hashed_passwd. The attacker then logs in as alpine and becomes root.
Images built from 3.21.10, 3.22.8, 3.23.8 and 3.24.4 include the fixed package. Instances already running from older images keep the old package until you update them. Images configured through cloud-init are not affected, because cloud-init writes PasswordAuthentication no.
Beyond Alpine
The CVE record covers OpenSSH before 10.6p2 on any Linux system that uses musl without PAM. The researcher names OpenWrt, Buildroot and Yocto. OpenWrt uses Dropbear for SSH by default, and Dropbear is not affected, per musl’s maintainer, so OpenWrt matters only where someone installed the OpenSSH server. Alpine is the only distribution with a published fix list as of 5 November. For other musl builds, move to OpenSSH 10.6p2 or turn off password logins.
Check your hosts
Run as root on the host, or inside any container that runs sshd. The output tells you which of the four conditions hold.
cat /etc/alpine-release 2>/dev/null || ldd "$(command -v sshd)" | grep -i musl
apk info -v 2>/dev/null | grep '^openssh-server'
sshd -T | grep -Ei '^(usepam|passwordauthentication|permitrootlogin) '
awk -F: '$2=="*" {print $1}' /etc/shadow # accounts with no password
awk -F: '$2 ~ /^\$[56]\$/ {print $1}' /etc/shadow # accounts with a $5$ or $6$ hash- If the first line prints nothing, sshd is not on musl and this flaw does not apply.
- If
sshd -Tprintspasswordauthentication yesand either nousepamline orusepam no, the host is exposed until it runs the fixed package. Builds without PAM do not print ausepamline at all. - If both
awklines print names, the accounts from the first are the ones an attacker can log in as. sshd -Tshows global settings. AMatchblock can turn password logins back on for some users or addresses, so read the config file too.
From outside, a scanner can only tell you that sshd offers password logins. It cannot see the C library or the shadow file. Use it to find candidates, then check each on the host.
Until you patch
Turning off password logins closes the hole completely. It is Alpine’s, OpenSSH’s and musl’s recommended stopgap.
Before you start, confirm that SSH key login works, and keep your current session open until a new login succeeds. These are Alpine’s commands. The drop-in file is read from Alpine 3.19 onward; the sed line covers older releases by changing every PasswordAuthentication yes in the main file to no, including inside Match blocks, and adding the setting at the top. It keeps the original as sshd_config.bak.
mkdir -p /etc/ssh/sshd_config.d
echo 'PasswordAuthentication no' > /etc/ssh/sshd_config.d/00-no-passwords.conf
sed -i.bak -e '1i PasswordAuthentication no' \
-e 's/^\(\s*PasswordAuthentication[^y#]*\)yes/\1no/i' \
/etc/ssh/sshd_config
sshd -t && rc-service sshd restart
sshd -T | grep -i passwordauthentication # expect: passwordauthentication norm /etc/ssh/sshd_config.d/00-no-passwords.conf
cp /etc/ssh/sshd_config.bak /etc/ssh/sshd_config
sshd -t && rc-service sshd restartIf nobody needs password logins over SSH, leave them off after you update. Key-only SSH is the safer default, and it would have made this flaw irrelevant.
Locking a passwordless account with ! also blocks the attack for that account, but on builds without PAM it blocks key logins as well. Do not use it on accounts you log in to.
Were you broken into?
A successful attack leaves an ordinary password login in the logs, for an account that has no password.
grep 'sshd.*Accepted password for' /var/log/messages*
awk -F: '$2=="*" {print $1}' /etc/shadow # compare the names against these
grep doas /var/log/messages* # doas use after a suspicious login- The tell. An
Accepted password forline namingalpine,rootor any key-only user cannot happen legitimately. Alpine logs sshd to/var/log/messagesby default; check your central log store too, since local logs can be wiped after a break-in. - What else to review.
doasuse, new users, changed files and new entries inauthorized_keyson exposed machines, per Alpine. - If you find one. Alpine’s advice is to treat the machine as compromised if you cannot rule out a login. Rebuild it rather than clean it, and rotate any secrets it held.
- In the wild. No attacks had been reported as of 5 November 2026, and the CVE is not in CISA’s KEV catalog. CISA rates exploitation as proof of concept, not active. The researcher notes the bug has been present since 2016, so absence of reports is not evidence nobody used it.
How the flaw works
Two reasonable decisions, four years apart, in two different projects, that happen to use the same one-character string.
Without PAM, sshd checks a password itself. It hashes the attempt with crypt(), the C library function that turns a password into its stored form, and compares the result with the field in /etc/shadow. A real hash looks like $6$salt$…. An account with no password has just *, which nothing should ever match.
Since a 2016 fix for a timing flaw, sshd does not reject those accounts instantly. It hashes the attempt anyway, borrowing another account’s salt, so attackers cannot tell real usernames from fake ones by response time. That is why a $5$ or $6$ hash must exist somewhere on the host.
musl’s crypt() returns the string * when it fails, and its SHA-256 and SHA-512 code refuses passwords over 256 bytes. So a password of 257 bytes or more “hashes” to *, which equals the stored *, and sshd accepts the login. glibc returns a different failure value, and PAM never calls crypt() for a * account, which is why other systems are unaffected.
OpenSSH 10.6p2 makes sshd refuse a match when the stored field is shorter than four characters. The release notes call it a workaround for a root cause outside sshd and credit Özgün Kültekin of Wakefield, whose write-up says he found it by running about 17,600 unusual logins against sshd builds for glibc and musl, with and without PAM, using AI agents.
Where the sources differ
The CVE arrived after the vendor advisories, and a few details vary between them. Here is what each says and how we read it.
| Question | What the sources say | Our reading |
|---|---|---|
| Is there a CVE? | Alpine’s advisory and early coverage say none had been assigned, and the OpenSSH release notes give no CVE. MITRE published CVE-2026-123158 later on 5 November. | Use CVE-2026-123158 in tickets and scanner exceptions. Alpine’s page may not mention it yet. |
| How long must the password be? | Alpine says 257 to 1024 bytes. The CVE record says 256 to 1024 characters. | musl rejects keys over 256 bytes, so the bypass starts at 257. The upper limit is sshd’s own cap of 1024 bytes. |
| How severe is it? | OpenSSH calls it critical. MITRE scores it CVSS 3.1 8.1 with high attack complexity, reflecting the account conditions. | On a host that meets the conditions, one connection gets a shell every time. Treat exposed hosts as critical. |
| Whose bug is it? | OpenSSH places the root cause outside sshd. musl maintainer Rich Felker says it is not a musl bug but an erroneous use by the caller, and expects musl to change the behaviour in its next release cycle. | It does not change what you do. The fix you can install today is in sshd. |
| Is exploit code public? | The CVE record links two public reproduction labs, and CISA’s assessment on the record rates exploitation as proof of concept. Some vulnerability feeds still report no public exploit code. | The attack is a long password over a normal SSH login, which any SSH client can send. Assume anyone can do it. |
NVD has not published its own analysis. Scanners that read NVD alone may not flag this yet, and none can see the account conditions from the network.
Timeline
Times are UTC.
- 2012-08-09
2012-08-09
musl changes crypt() to return the string “*” instead of NULL when it fails, so callers that never check for errors see a wrong password rather than crash.
- 2012-08-29
2012-08-29
musl caps SHA-crypt keys at 256 bytes to stop very long passwords tying up the CPU. Longer keys now fail, and failure returns “*”.
- 2016-07-15
2016-07-15
To fix a username-guessing timing flaw (CVE-2016-6210), sshd starts hashing password attempts with another account’s salt when the target account has no real hash.
- 2022-05-23
2022-05-23
Alpine 3.16 ships root as root:* (no password) in the base image, the earliest release Alpine lists as affected.
- 2026-11-04
2026-11-04
Özgün Kültekin of Wakefield reports the bypass to the OpenSSH project, according to heise.
- 2026-11-05
2026-11-05
OpenSSH releases portable 10.6p2. Damien Miller tells operators of musl systems without PAM to set PasswordAuthentication no or disable SSH “IMMEDIATELY”.
2026-11-05
Alpine publishes its advisory and fixed openssh packages for edge and every branch back to 3.16, plus point releases 3.21.10, 3.22.8, 3.23.8 and 3.24.4.
2026-11-05 · 15:07 UTC
musl maintainer Rich Felker posts an advisory telling users who cannot upgrade to set PasswordAuthentication no.
2026-11-05 · 15:46 UTC
MITRE publishes CVE-2026-123158, scored CVSS 3.1 8.1. NVD has not yet published its own analysis.
2026-11-05 · 17:18 UTC
CISA adds its assessment to the CVE record: proof-of-concept exploitation, not automatable, total technical impact. It tags the sshhole.com write-up as an exploit reference.
Recording it for compliance
An authentication bypass on an internet-facing login service is what auditors ask about. Record the assessment, the configuration change, the update dates and the log review.
| Framework | Control | What to record |
|---|---|---|
| ISO 27001:2022 | A.8.8 | Management of technical vulnerabilities. Record when you assessed CVE-2026-123158, which hosts met the conditions, and when each was updated and sshd restarted. |
| ISO 27001:2022 | A.8.5, A.5.17 | Secure authentication and authentication information. Record the decision on password logins over SSH, and which accounts are key-only. |
| ISO 27001:2022 | A.8.9, A.8.32 | Configuration and change management. Record the PasswordAuthentication change and the image rebuilds as changes. |
| ISO 27001:2022 | A.8.15, A.5.25 | Logging and assessment of events. Record the log review for password logins to passwordless accounts, and its outcome. |
| SOC 2 | CC7.1 | Identifying vulnerabilities. Show the issue was picked up and assessed against your inventory of musl hosts and images. |
| SOC 2 | CC6.1, CC8.1 | Logical access and change management for the SSH configuration change and the package rollout. |
| SOC 2 | CC7.3 | Evaluating security events. Keep the log review, and open an incident if you find a password login you cannot explain. |
Evidence to keep: the date you assessed it, the list of musl hosts and images with their openssh versions and sshd -T output, the date each was updated and sshd restarted, the PasswordAuthentication change, and the result of the log review. If a host cannot be updated within your patch policy’s deadline, record the exception and the compensating control.
For how these controls work day to day, see our guides to ISO 27001 vulnerability management, SOC 2 vulnerability management and ISO 27001 change management.
CVE-2026-123158 FAQ
Short answers. The sections above have the detail and sources.
What is CVE-2026-123158?
CVE-2026-123158 is a password authentication bypass in OpenSSH's sshd before 10.6p2 on Linux systems that use the musl C library without PAM, such as Alpine. For an account whose password field is *, meaning no password is set, any password from 257 to 1024 bytes is accepted. MITRE scores it CVSS 3.1 8.1.
What is *sshole (sshhole)?
*sshole, also written sshhole or sshole, is the name researcher Özgün Kültekin gave CVE-2026-123158 in the write-up at sshhole.com. The star refers to the * that marks an account with no password, which musl's crypt() also returns on failure. It is the same flaw: OpenSSH's sshd before 10.6p2 on musl Linux without PAM accepts long passwords for accounts that have none.
Which Alpine versions are affected and fixed?
Every Alpine release Alpine checked, 3.16 through 3.24 and edge, running openssh-server or openssh-server-pam with UsePAM no. Fixed packages: edge 10.6_p2-r0, 3.24 10.3_p1-r2, 3.23 10.2_p1-r1, 3.22 10.0_p1-r11, 3.21 9.9_p2-r1, and 3.16 to 3.20 also patched. Point releases 3.21.10, 3.22.8, 3.23.8 and 3.24.4 include the fix.
Do I need to restart sshd after updating?
Yes. Upgrading the openssh package does not replace the sshd process that is already running, so the host stays exposed until you restart it. On Alpine, run apk upgrade -U -a and then rc-service sshd restart.
Is there a workaround for CVE-2026-123158?
Yes. Set PasswordAuthentication no in the sshd configuration and restart sshd. Alpine, OpenSSH and musl all recommend it, and it closes the hole completely. Confirm your SSH key login works and keep a session open before you restart, and check Match blocks that might turn password logins back on.
Are Debian, Ubuntu or RHEL affected?
No. OpenSSH says the bug does not exist on non-Linux systems, Linux systems using glibc, or systems that check passwords through PAM. That covers Debian, Ubuntu, RHEL and its derivatives, Fedora, macOS and OpenBSD. Dropbear, OpenWrt's default SSH server, is also unaffected.
Are Alpine Docker containers affected?
Only if the container runs sshd. Most Alpine-based application images do not, and Alpine says those are not affected. If an image installs openssh-server, rebuild it on the fixed package or remove sshd.
Can attackers log in as root on Alpine?
Not directly with OpenSSH's default PermitRootLogin prohibit-password, which blocks password logins as root even though root has no password on Alpine. But an attacker who logs in as another passwordless account can become root if that account can, as the alpine user on tiny-cloud images can through passwordless doas.
How do I know if I was attacked through CVE-2026-123158?
Search /var/log/messages and your central logs for sshd lines reading Accepted password for an account that has no password, such as alpine, root or a key-only user. That cannot happen legitimately. Also review doas use, new users and authorized_keys. If you cannot rule out a login, treat the machine as compromised.
Sources
- Alpine Linux: Security advisory: openssh-server password authentication bypassConditions, fixed packages per branch, the PasswordAuthentication workaround, cloud images and log checks.
- OpenSSH 10.6p2 release notesThe sshd workaround and credit to Özgün Kültekin of Wakefield.
- CVE-2026-123158, CVE record (MITRE)Description, affected versions, the CVSS 3.1 8.1 score and CISA’s SSVC assessment.
- NVD entry for CVE-2026-123158Received by NVD and not yet analysed as of 5 November 2026.
- LWN: Critical security vulnerability affects OpenSSH on AlpineDamien Miller’s announcement and the scope statement.
- Rich Felker: Advisory for OpenSSH+musl usersmusl’s position on the root cause, and that Dropbear is unaffected.
- Özgün Kültekin: *sshole write-upThe researcher’s history of the bug and the musl platforms to check.
- heise online: OpenSSH and Alpine Linux warn of severe but niche bugWhen the report reached OpenSSH, and why the release was rushed.
- OpenWrt: Dropbear configurationOpenWrt’s default SSH server, which is not OpenSSH.
- CISA Known Exploited Vulnerabilities catalogNo entry for CVE-2026-123158 as of 5 November 2026.