| | |

OpenSSH ‘SSHole’ CVE-2026-123158: Unauthenticated Root on Alpine Linux, Exploited Within Hours

A race condition buried in a 2016 OpenSSH security patch now lets any unauthenticated attacker log into locked accounts on Alpine Linux — the base image for the majority of Docker containers in production. Exploitation started within nine hours of disclosure. The fix is a package upgrade plus a daemon restart, but most teams will discover that upgrading alone is not enough.

DataWater Threat Intelligence Desk | Published November 8, 2026 | 8-minute read

Threat level: Critical (exploited in the wild)

What: CVE-2026-123158 (“SSHole”), a CVSS 8.1 unauthenticated authentication bypass in OpenSSH on musl-based Linux systems. An attacker who submits an oversized password (257–1,024 bytes) can log into accounts that have no usable password — including key-only users, the default alpine cloud user, and in some configurations, root.

Status: Actively exploited. Threat intelligence firm Previdian confirmed root access on an Alpine Linux honeypot within hours of CVE publication. Exploitation was observed as of November 5, 2026. CISA had not yet added CVE-2026-123158 to its Known Exploited Vulnerabilities catalog at time of this briefing.

Deadline: No CISA KEV deadline at time of reporting. Watch the catalog for a potential addition and 21-day remediation window.

Fix: Upgrade to OpenSSH 10.6p2 (or Alpine’s branch-specific patched package), then restart sshd. The upgrade does not restart the running daemon — the vulnerable binary stays in memory and continues accepting connections until you restart it. As an immediate mitigation, set PasswordAuthentication no in /etc/ssh/sshd_config and restart sshd.

Key takeaways

  • Upgrading OpenSSH is not enough — you must also restart sshd. The old, vulnerable daemon process keeps running after the package update. The exploit works against the running binary until you restart the service.
  • Alpine Linux 3.16 through 3.24 (and edge) are all affected by default. The default openssh-server package uses musl without PAM, which is exactly the configuration the bypass exploits. Fixed packages are available back to 3.16.
  • Official Alpine cloud images for AWS and Azure are affected once any account gets a password. On images running Alpine 3.18.11 through 3.24.3, the alpine user has passwordless doas, meaning an attacker who logs in as alpine can reach root without needing PermitRootLogin.
  • The attack is a 257-byte password submitted to the SSH login prompt. No exploit code, no CVE-specific tooling, no network position required — just an SSH client and a known-locked account name such as alpine or a key-only user.
  • Exploitation was observed in the wild within nine hours of CVE publication, per Previdian. Source IP was 89.116.89[.]18 (geolocated to Japan), which ran id, uname, and hostname after gaining access.
  • Non-musl distributions are not affected. Ubuntu, Debian, Red Hat, Fedora, and other glibc-based systems, as well as systems using PAM, are not vulnerable to CVE-2026-123158.
  • Docker containers running Alpine that do not expose sshd are not at risk. Most containers do not run sshd; the attack requires SSH to be reachable.

Executive Summary

The fix for a 2016 username-enumeration patch introduced a silent bypass for all accounts with no usable password.

When OpenSSH’s developers patched a timing side-channel in 2016 (CVE-2016-6210), they made the daemon hash a submitted password against a borrowed salt even when the target account had no real password hash. The goal was to prevent attackers from learning which usernames were valid by measuring response time. The fix worked as intended on glibc-based systems. On musl-based systems, it did not.

musl’s implementation of crypt() rejects passwords longer than 256 bytes and returns "*" on failure. When the submitted password is at least 257 bytes and the target account stores * as its shadow entry — the standard placeholder for accounts with no usable password — the returned value matches, and OpenSSH accepts the login.

Researcher Özgün Kültekin, who discovered the flaw and named it SSHole, confirmed the bypass in approximately 17,600 login attempts across different OpenSSH builds before disclosure. Only musl builds without PAM were vulnerable. Alpine Linux ships that configuration as its default.

The practical result: on any internet-facing Alpine Linux host with password authentication enabled — the OpenSSH default — and at least one locked account alongside one normal user, an unauthenticated attacker can log into the locked account. On official Alpine cloud images, that locked account is alpine, and alpine can reach root through passwordless doas.

OpenSSH 10.6p2 was published November 5. Alpine released patched packages the same day for every supported branch back to 3.16. Exploitation began within hours.

Why This Matters to CISOs and Security Leaders

Alpine Linux is not a niche distribution. It is the default base image for Docker containers — the smallest, most commonly used starting point for containerized services, CI/CD pipelines, internal tooling, and cloud functions. Organizations that run containers at scale almost certainly run Alpine. Many expose SSH for administrative access or debugging. Those are the systems most at risk today.

The attack does not require finding a zero-day, buying exploit code, or running a complex toolchain. Any SSH client and a 257-byte string is enough. The barrier for exploitation is as low as it gets for a network-accessible service.

Upgrading the package without restarting sshd leaves the system fully exposed. This is the detail most remediation checklists will miss. A team that updates the package, confirms the new version is installed, and marks the ticket closed has not fixed anything until sshd is restarted. In container environments, that may mean redeploying the image, not just running apk upgrade.

Cloud images are specifically at risk. Official Alpine cloud images for AWS and Azure running versions 3.18.11 through 3.24.3 carry the vulnerable configuration out of the box. Once any administrator account on those images gets a password — a common onboarding step — the bypass becomes exploitable and the default alpine user’s passwordless doas provides a path to root.

Executive insight

The question to ask your infrastructure team this week: “Do we have any Alpine Linux hosts — cloud VMs, containers, or base images — where sshd is exposed and password authentication is enabled?” If the answer is “I’m not sure,” that is your answer. Start the inventory now.

The Timeline

Date (2026) What happened
Prior to Nov 5 Researcher Özgün Kültekin discovers and validates SSHole, confirms bypass across approximately 17,600 test login attempts; coordinates disclosure with OpenSSH developers
Nov 5 OpenSSH 10.6p2 released with fix. CVE-2026-123158 published. Alpine Linux releases patched openssh-server packages for branches 3.16 through edge. Alpine security advisory published.
~9 hours after disclosure Previdian observes the first exploitation attempt against its honeypots, originating from IP 89.116.89[.]18 (Japan-geolocated)
Nov 5–6 Previdian confirms root access on an Alpine Linux honeypot. Eight total attempts logged from the same source. Reconnaisance commands run: id, uname, hostname
Nov 6 Multiple security outlets (The Hacker News, Help Net Security, Detectify, Security Boulevard, SOCRadar) report active exploitation. GitHub proof-of-concept code appears (unverified; Previdian warns of possible malware)
Nov 8 This briefing. CISA has not yet added CVE-2026-123158 to the KEV catalog. Exploitation is ongoing.

The same patch that fixed a username-enumeration timing leak a decade ago is the reason any attacker with a 257-byte password can log into your Alpine Linux servers today.

Vulnerability & Exploit Analysis

Root cause

CVE-2026-123158 (CWE-287: Improper Authentication) traces directly to the 2016 remediation for CVE-2016-6210, a timing side-channel that allowed username enumeration. The 2016 fix made OpenSSH hash the submitted password against a borrowed salt even when the target account had no usable password, equalizing the response time regardless of whether the account existed. The fix worked as intended on glibc, whose crypt() implementation handles overlong passwords. It did not account for musl’s behavior: musl’s crypt() rejects passwords longer than 256 bytes and returns the string "*" on failure. Since * is exactly the placeholder value that locked accounts store in /etc/shadow, the comparison succeeds and OpenSSH accepts the login.

Attack prerequisites

All four of the following must be true for a system to be exploitable:

  1. The host runs openssh-server (not openssh-server-pam, or openssh-server-pam with UsePAM no)
  2. PasswordAuthentication is set to yes (the OpenSSH default)
  3. At least one account has * as its shadow entry — such as key-only users, directory users via musl-nscd, or the default alpine user on cloud images
  4. At least one local account has a valid password hash ($5$ or $6$), which OpenSSH uses to borrow the salt

Affected and fixed versions

Platform Vulnerable Fixed in
OpenSSH upstream All versions before 10.6p2 on musl without PAM 10.6p2 or later
Alpine Linux 3.24 Up to 3.24.3 3.24.4 or later
Alpine Linux 3.23 Up to 3.23.7 3.23.8 or later
Alpine Linux 3.22 Up to 3.22.7 3.22.8 or later
Alpine Linux 3.21 Up to 3.21.9 3.21.10 or later
Alpine Linux 3.16–3.20 All releases Patched packages available via apk upgrade
Alpine official cloud images (AWS/Azure) 3.18.11–3.24.3 (once any account has a password) Rebuild from 3.24.4+ image or patch in place and restart sshd
OpenWrt, Buildroot, Yocto (musl builds) Builds using musl without PAM Upgrade when vendor issues patched build; set PasswordAuthentication no immediately
glibc distributions (Ubuntu, Debian, Fedora, RHEL) Not affected No action required for this CVE

Attack Chain Analysis

Stage Technique Control to apply
Reconnaissance Internet scanning for open port 22; banner fingerprinting to identify Alpine Linux or musl-based hosts Restrict SSH port to VPN/bastion; do not expose sshd directly to the internet
Account enumeration Identify common locked accounts: alpine, root, or key-only user accounts Monitor for repeated SSH authentication attempts; block the source IP after failed attempts
Authentication bypass Submit a 257–1,024-byte password string to the SSH login prompt targeting a locked account; musl crypt() returns * which matches the shadow placeholder Set PasswordAuthentication no; apply patched openssh-server package and restart sshd
Initial access Obtain shell access as the target account (e.g., alpine user on official cloud images) Monitor for “Accepted password for” in /var/log/messages on accounts with * shadow entries
Privilege escalation On Alpine cloud images, run doas sh to reach root via passwordless doas configuration; on other systems, exploit local privilege escalation or use credentials found on the host Remove passwordless doas rules for the alpine user; treat any lateral movement path as a priority
Persistence & impact Add SSH authorized keys; create new admin accounts; deploy additional payloads; harvest credentials and secrets from container environment variables or mounted secrets Restrict access to secrets managers; audit authorized_keys files; monitor for new accounts and scheduled tasks
What nobody is talking about
The confirmation requirements create a hidden risk in automated infrastructure. Many organizations run Alpine base images in CI/CD pipelines with a build user that has a valid password hash, alongside other accounts configured as key-only. Those pipelines are almost certainly accessible from runners that have internet exposure. The same logic that makes a cloud VM vulnerable applies to a containerized build agent if sshd is running. CI/CD is not on most people’s mental model for “internet-facing SSH,” but many pipelines effectively are.

Threat Intelligence Breakdown

Attribution: No threat actor has been named. The only observed source is IP 89.116.89[.]18, geolocated to Japan by Previdian. The initial activity involved reconnaissance commands (id, uname, hostname), which is consistent with automated scanning for vulnerable hosts rather than a targeted campaign. No ransomware or espionage tooling has been associated with the activity observed so far.

Proof-of-concept code: GitHub repositories claimed to contain working exploits appeared shortly after disclosure. Previdian explicitly warned that at least some of these may be malicious and advises against running unverified PoC code.

Indicators of compromise (source: Previdian, Detectify, Kültekin research; defanged):

Type Indicator Context
IP address 89.116.89[.]18 Source of exploitation attempts on Previdian honeypots; Japan-geolocated; may be a VPS or relay node
Auth log pattern Accepted password for alpine (or any locked account name) in /var/log/messages Primary behavioral indicator; any “Accepted password” for an account with * in shadow is a confirmed compromise
Shadow entry Account with * as the password field receiving a successful auth in logs Cross-reference shadow entries with successful auth events
Recon commands id, uname -a, hostname Post-exploit reconnaissance; may appear in shell history or process audit logs
doas usage Unexpected doas invocations by alpine user, especially doas sh Indicator of privilege escalation on affected cloud images

What is still unknown: No confirmed victim count has been published. No attribution to a named threat actor or group. No ransomware or espionage tooling has been confirmed in connection with active exploitation. The full scope of automated scanning activity is unknown.

Enterprise Impact

Container fleets: Any container that runs sshd and uses Alpine as its base image must be assessed. The majority of containerized services do not run sshd, but ops teams frequently enable SSH for debugging or as a legacy holdover. Finding those containers is the first task.

Cloud VMs: All official Alpine cloud images for AWS and Azure from 3.18.11 through 3.24.3 carry the vulnerable configuration. The window of risk opens once any account on the image receives a password hash — a step many organizations take during provisioning or through user-data scripts.

Embedded and edge systems: OpenWrt, Buildroot, and Yocto environments using musl without PAM are affected. These are harder to patch than a managed Linux VM and are often forgotten in vulnerability management programs. For organizations that have already been managing edge device exposure, this adds another category to track.

Credential and secrets exposure: An attacker who gains a shell on an Alpine container may find environment variables, mounted secrets, service account tokens, and cloud metadata endpoint credentials. The lateral movement potential from a compromised container or cloud instance is significant, particularly in Kubernetes environments where the service account token may carry permissions beyond the pod itself.

Compliance and notification: If an attacker accessed a system before patching and reached production data or credentials, that may constitute a reportable incident under applicable regulations. Organizations should document when they became aware of the vulnerability, what systems were exposed, and what actions were taken.

What Security Leaders Should Do Next

Today

  1. Inventory Alpine Linux hosts. Find every Alpine-based VM, container base image, cloud image, and embedded system in your environment. Check whether sshd is running and whether PasswordAuthentication yes is set.
  2. Apply the immediate mitigation on all exposed systems. Set PasswordAuthentication no in /etc/ssh/sshd_config and restart sshd. Confirm key-based login works before disabling password auth. This protects systems you cannot immediately repatch.
  3. Upgrade the openssh-server package. Run apk update && apk upgrade openssh-server on each Alpine host. For branch-specific targets: 3.24.4+, 3.23.8+, 3.22.8+, 3.21.10+ or the latest patched package for older branches.
  4. Restart sshd immediately after upgrading. Run rc-service sshd restart (OpenRC) or the equivalent for your init system. Without this step, the upgrade does not change anything about the running daemon.

Within 48 hours

  1. Check for compromise. Review /var/log/messages on all affected systems for “Accepted password for” entries, especially for accounts like alpine, root, or any key-only users. Cross-reference shadow entries — if an account has * in its password field and shows a successful password login, treat that system as compromised.
  2. Audit doas usage on cloud images. Review logs for any unexpected doas invocations by the alpine user, particularly doas sh or commands that would escalate to root.
  3. Rebuild container images. For containerized workloads, pushing a package update to a running container is often insufficient. Rebuild affected base images to include the patched openssh-server, update your image registry, and redeploy affected containers.
  4. Block or firewall port 22 on systems that do not require internet-facing SSH. This is defense in depth — the patch is what matters, but reducing exposure is always valuable.
  5. Scan for IP 89.116.89[.]18 in firewall, proxy, and SSH logs going back to November 5, 2026, the date exploitation was first observed.

Long-term

  1. Establish an inventory and patching program for Alpine Linux and musl-based systems. These systems have historically been treated as immutable and exempt from traditional patching programs. CVE-2026-123158 demonstrates that the base OS matters, not just application-layer dependencies.
  2. Disable password authentication globally where possible. Enforce key-based SSH across your environment. This is both a remediation for SSHole and a durable reduction in SSH attack surface generally.
  3. Add Alpine sshd to your vulnerability scanner’s scope. Ensure your scanning platform is running authenticated checks against Alpine hosts, not just glibc-based systems. Many scanner templates default to Debian or Red Hat and miss Alpine-specific findings. For related guidance on proactive Linux system hardening after active exploitation, see our earlier PHP2Shell briefing.
  4. Review doas and sudo configurations. Remove passwordless privilege escalation rules that could be used as a post-bypass path to root. The alpine user’s default doas rule on cloud images is a one-step root escalation that survived the patch.

Stay ahead of the next exploited CVE

DataWater’s executive threat briefings cover the vulnerabilities that security leaders and CISOs need to act on — with the technical details, timelines and first three actions, every day.

Read more briefings

Winners and Losers

Better positioned More exposed
Organizations that already enforce PasswordAuthentication no across all SSH deployments Teams that left OpenSSH’s default password authentication enabled on Alpine hosts “for convenience”
Teams that treat containers as immutable and redeploy on any base image change Teams that update packages inside running containers without tracking what services were restarted
glibc-based shops (Ubuntu, Debian, Red Hat) — not affected by this CVE Cloud teams running official Alpine AWS/Azure images where any account has a password hash
Teams with mature Alpine-specific patching programs and SSH port restrictions Embedded and IoT teams running OpenWrt, Buildroot, or Yocto who cannot quickly deploy patches
Organizations that disable passwordless doas for default cloud image users Kubernetes teams where a compromised pod’s service account token has cluster-wide permissions
Security teams that reviewed SSH auth logs within hours of this disclosure Organizations that patched without restarting sshd and believe they are now protected

Final Executive Takeaway

This is not a vulnerability in an obscure product.

Alpine Linux is in production at virtually every organization that runs containers. OpenSSH is on every Alpine host by default. Password authentication is on by default. The bypass works with a single SSH client and a long string. Nine hours after the CVE was published, an attacker had root on a honeypot.

The two actions that matter are simple but easy to get wrong: upgrade the package, then restart sshd. Doing only the first step leaves the system fully exposed. For container environments, that often means rebuilding and redeploying, not just running apk upgrade.

Upgrade. Restart. Verify. Then hunt the logs for anyone who got in before you did.

Frequently Asked Questions

Am I affected if I use Docker with alpine base images?

Containers that use Alpine as their base image but do not run sshd are not affected by CVE-2026-123158. The bypass requires an active, reachable SSH daemon. If your Alpine-based container does run sshd — for debugging, remote access, or legacy reasons — assess it against the prerequisites: musl-based openssh-server without PAM, PasswordAuthentication yes (the default), at least one locked account, and at least one account with a real password hash. If all four are true, the system is vulnerable and should be patched and redeployed immediately.

Does upgrading OpenSSH automatically fix the running daemon on Alpine Linux?

No. Running apk upgrade openssh-server installs the patched binary but does not replace the already-running sshd process in memory. The vulnerable daemon continues accepting connections until you explicitly restart it with rc-service sshd restart or the equivalent for your init system. Confirm sshd is running the new version with sshd -V after restart. Many teams will mark this ticket closed after the upgrade step and remain fully exposed.

Can an attacker get root directly with CVE-2026-123158?

Direct root access depends on configuration. By default, Alpine sets PermitRootLogin prohibit-password, which blocks direct root login. However, root’s shadow entry contains * since approximately Alpine 3.16, so if PermitRootLogin were changed to yes, root would be directly accessible via the bypass. More commonly, the attacker logs in as the alpine user on official cloud images, which has passwordless doas configured by default on images from 3.18.11 through 3.24.3. One doas sh command is enough to reach root from there.

What if I cannot patch my Alpine Linux systems immediately?

The most effective immediate mitigation is to set PasswordAuthentication no in /etc/ssh/sshd_config and restart sshd, after first confirming that key-based login works. This eliminates the attack vector entirely while you schedule the upgrade. If you cannot do this, restrict port 22 to known IP ranges using firewall rules. For embedded systems like OpenWrt or Buildroot where vendor patches may not yet be available, the same mitigation applies: disable password authentication or firewall SSH access.

Are glibc-based systems like Ubuntu and Debian affected by CVE-2026-123158?

No. CVE-2026-123158 specifically requires the musl C library’s implementation of crypt(), which rejects passwords longer than 256 bytes and returns * on failure. glibc-based distributions handle overlong passwords differently and do not exhibit this behavior. Researcher Özgün Kültekin tested approximately 17,600 login attempts across different OpenSSH builds and confirmed the bypass only on musl-based builds without PAM. Ubuntu, Debian, Fedora, Red Hat, and other glibc systems are not affected by this specific vulnerability.

How do I check whether my Alpine Linux system has already been compromised?

Search /var/log/messages for lines containing “Accepted password for” followed by an account name that should not accept passwords — particularly alpine, root, or any user configured as key-only. Verify shadow entries: if grep '^alpine:' /etc/shadow shows a * as the password field and your logs show a successful password login for that user, treat the system as compromised. Also review doas usage logs, recently created users, new files in /tmp and home directories, any changes to authorized_keys, and unexpected outbound network connections. If a compromise cannot be ruled out, isolate the host and rebuild from a clean image rather than patching in place.

What accounts are specifically vulnerable to the CVE-2026-123158 bypass?

Any account that stores * as its password field in /etc/shadow is potentially bypassable. Common examples on Alpine Linux include the alpine user on official cloud images, accounts configured for key-only SSH access, accounts provisioned from an LDAP or directory source via musl-nscd, and any service account that was created without a password. Accounts locked with ! as the password field are not affected — only those with *. Run sudo awk -F: '$2 == "*" {print $1}' /etc/shadow to list the accounts at risk on a given system.

Sources

Primary sources: OpenSSH 10.6p2 release and security advisory (November 5, 2026); CVE-2026-123158 record; Alpine Linux security advisory (November 5, 2026); researcher Özgün Kültekin’s original disclosure. Corroborating reporting: Help Net Security (exploitation confirmed); The Hacker News (threat intelligence details); Detectify (affected version matrix and enterprise guidance); SOCRadar; Picus Security (attack chain analysis). Reflects public reporting as of November 8, 2026.

Similar Posts