Skip to content

+Threat Wire · Needs attention

*sshole: OpenSSH password bypass on musl Linux

An authentication bypass in OpenSSH's sshd on musl-based Linux without PAM, including Alpine's default package, lets attackers log in to accounts with no password set.

Prioritize patchingCVE-2026-123158Checked Nov 6

What it means for your AI agents

The machines that run your agents, tool runners, sandboxes and MCP servers are hosts like any other. A host-level flaw reaches everything on the machine, including the provider keys and tool credentials your agents use.

  • Include agent hosts, container nodes and code sandboxes in your patch inventory, not only your web servers.
  • Containers share the host's kernel: rebuilding an agent's image does not fix a kernel flaw.
  • If an affected host was reachable, rotate the model-provider and tool keys stored on it.

Updates

  • Nov 5, 2026 : OpenSSH released 10.6p2, Alpine published fixed packages back to 3.16, and CVE-2026-123158 was assigned.

Details

When sshd is built without PAM, it checks a password by hashing the attempt with the C library's crypt() and comparing the result to the account's stored password field. Accounts with no password set store * in that field, which normally matches nothing.

musl's crypt() returns the string * as an error value when the password is longer than 256 bytes. sshd compares that * to the stored *, finds a match and accepts the login. The attack needs one other account on the machine with a $5$ or $6$ password hash, because sshd borrows its salt. One such account makes every account without a password reachable.

The flaw dates to 2016 and was reported by Özgün Kültekin of Wakefield. OpenSSH 10.6p2 adds a workaround in sshd; OpenSSH considers the root cause to be outside sshd. Alpine backported the fix to every branch from 3.16, so a lower OpenSSH version number does not mean a host is still vulnerable.

Alpine's official tiny-cloud images from 3.18.11 through 3.24.3 ship an alpine user with no password and passwordless doas. They are safe on first boot but become exploitable once any $6$ hash exists on the machine, for example after an admin sets a console password. An attacker can then log in as alpine and use doas to become root, even though root itself is reachable only if PermitRootLogin yes is set.

Not affected: glibc systems, Alpine's openssh-server-pam package with UsePAM yes, and accounts locked with !. According to Alpine, cloud images configured through cloud-init are not affected either, because cloud-init writes PasswordAuthentication no unless user-data sets ssh_pwauth: true.

Risk

With password logins enabled, an unauthenticated attacker can log in to passwordless accounts if another account has a $5$ or $6$ hash. Neither OpenSSH nor Alpine had reported exploitation as of November 6.

Affected deployments

Hosts running OpenSSH sshd before 10.6p2 and without their distribution's backported fix, on musl-based Linux such as Alpine (the researcher also lists OpenWrt, Buildroot and Yocto builds running OpenSSH) without PAM and with PasswordAuthentication enabled. Targets are accounts whose password field is * and directory-service users via musl-nscd, which have no shadow entry.

Evidence and sources9 links

CVE record

Rated High, CVSS 3.1 8.1. CISA's assessment lists a public proof of concept and does not consider the attack automatable.

CVE-2026-123158

Vendor advisories

Alpine lists the conditions for exposure, fixed package versions per branch, cloud image impact and how to check for compromise.

OpenSSH 10.6p2 release notes

Alpine Linux advisory

OpenSSH fix commit

cloud-init configuration

cloud-init's default config sets ssh_pwauth: false for Alpine, so it writes PasswordAuthentication no unless user-data sets ssh_pwauth: true.

cloud-init 26.2 default config (Alpine)

cloud-init ssh_pwauth reference

Original research

The researcher's check script compares sshd's version number, so it can report Alpine's backported fixed packages as exposed.

*sshole disclosure

Exposure check script and proof of concept

Disclosure announcement

oss-security post

Check your exposure with an agent

Paste this into an AI agent that can see your infrastructure. It asks for a read-only check of what's affected, including the systems behind your agents, and a table you can act on. Copying it changes nothing.

Prompt
Assess whether the infrastructure you can access is affected by *sshole: OpenSSH password bypass on musl Linux (CVE-2026-123158). Work read-only within your authorized access: do not run exploits, change configuration, restart services or install anything.

1. Confirm the affected and fixed versions from the vendor advisories and CVE records:
   - https://www.openssh.org/releasenotes.html#10.6p2
   - https://www.cve.org/CVERecord?id=CVE-2026-123158
   - https://alpinelinux.org/posts/2026-11-05-openssh-password-authentication-bypass/
   - https://github.com/openssh/openssh-portable/commit/4353fdc43ef646c43a8dda7025cc1a898caf1482
   - https://github.com/canonical/cloud-init/blob/26.2/config/cloud.cfg.tmpl#L63-L76
   - https://docs.cloud-init.io/en/latest/reference/modules.html#mod-cc-set-passwords
   Cite each source and the date you read it. Say plainly what you could not verify.

2. Inventory the systems that could run the affected software, including the hosts, containers, MCP servers, tool runners and sandboxes behind any AI agents. For each, record the asset, environment, owner if known and the version actually running, from read-only evidence (package metadata, version commands, platform inventory).

3. Note which affected systems are reachable from the internet or from agents and tools, and which credentials (model-provider keys, tool tokens, service accounts) are stored on them.

4. Report one row per asset: asset, running version, affected (yes / no / unknown), reachable from, credentials at risk, evidence, and the next step. List anything you could not access as a gap rather than assuming it is safe.

More from the Threat Wire

Briefing source: Cloudflare Radar Zero Wire (Cloudforce One), last checked November 6, 2026. Refreshed here every 30 minutes.