Linuxサーバーにとって完璧な悪夢のシナリオとは、攻撃者がサーバーのSecure Shell(SSH)ポートに到達し、そのまま侵入して乗っ取るだけで済むことだ。まさにそれが、人気の軽量LinuxサーバーであるAlpine Linuxに起きた。さらに追い打ちをかけるように、これはAlpine LinuxがGitLab実装におけるセキュリティホール寸前の危機を回避したわずか数日後の出来事だった。

セキュリティエンジニアのGregory Bryant氏はLinkedInの投稿で次のように説明している。「ほとんどの認証バイパスは複雑なロジックチェーンから生まれますが、昨日のAlpine LinuxのOpenSSH脆弱性(CVE-2026-123158)はたった1文字、*に帰着します」。

Alpine Linux(または他のmuslベースのディストリビューション)をデフォルトのopenssh-serverパッケージ(Pluggable Authentication Modules、つまりPAMなし)で実行し、PasswordAuthenticationを有効にしている場合、攻撃者は257〜1024バイトの長さのパスワードを送るだけで、パスワード無効化アカウントや鍵認証専用アカウントにログインできてしまう。

Alpine Linuxだけがmuslを使っているOSではない。muslは標準Cライブラリ(libc)の軽量版だ。muslを使い、潜在的に脆弱な他のOSには、Adélie Linux、Void Linux、Sabotage Linux、Androidの変種であるOpenWrt、組み込みLinuxディストリビューションの構築に使われるYocto Projectなどがある。

商用組み込みLinuxディストリビューション「Wind River Linux」を提供するWind Riverもこの問題を調査中だ。同社の代表者は私にこう語った。「Wind Riverはセキュリティを真剣に受け止めています。報告された脆弱性を積極的にレビューし、潜在的な影響を評価しています。必要に応じて適切な措置を講じます」。

舞台裏では、OpenSSHがPAMなしでビルドされている場合、Cライブラリのcrypt()関数を使ってパスワード試行をハッシュ化し、その結果をアカウントの保存済みパスワードフィールドと比較することでパスワードを検証する。ここまでは順調だ。

しかし、キーが256バイトを超えると、muslのcrypt()関数はエラー指標として文字列*を返す。これは、鍵認証専用アカウントなどパスワードのないアカウントのパスワードフィールドに格納されている値でもある。したがって、「ハッシュ」が一致してログインが成功し、攻撃者が侵入する。

悪用するには、攻撃者はそのようなアカウントの名前を知っているだけでよい。また、マシン上に少なくとも1つ、5または6のパスワードハッシュを持つ別のアカウントが必要で、257〜1,024バイトのパスワードを送信する。Alpineによれば、パスワードを持つユーザーが1人いれば、すべてのパスワードなしアカウントにアクセス可能になる。

glibcのcrypt()を使うLinuxシステム(ほぼすべて)では、同じ試行はエラー時にNULLを返し、sshdはすでにそれを拒否するため、Debian、Ubuntu、Fedoraなどは影響を受けない。

問題を発見したグループ「*sshole」によると、これは2016年から隠れていた副作用だ。

Alpineは、チェックしたすべてのリリースが影響を受けると述べた。3.21から3.24、edge、そして古い3.16から3.20のブランチだ。露出には以下が必要だ:

ほとんどの場合、rootは直接露出していない。Alpine 3.16頃からベースイメージでroot:*として出荷されているが、OpenSSHのデフォルトPermitRootLogin prohibit-passwordがそれをブロックする。doasなどを通じてrootになれる別のアカウントがあれば、攻撃者はrootへの経路を依然として得られる。

Alpineは特に公式のtiny-cloudイメージ、バージョン3.18.11から3.24.3が脆弱であると指摘した。これらはパスワードフィールドが*のalpineユーザーとパスワードなしのdoasを搭載している。初回起動時は安全だが、マシン上に6ハッシュが存在すると悪用可能になる。これは管理者がコンソールパスワードを設定したときや、ユーザーデータがハッシュ化パスワードを持つユーザーを追加したときに起こり得る。つまり、事実上すべてだ。

Alpineは木曜日に3.21.10、3.22.8、3.23.8、3.24.4をリリースし、セキュリティ変更の中にOpenSSHの修正を含めた。また、3.16まで各リリースの修正パッケージも公開した。Alpine 3.21は11月1日にサポート終了となった。

先ほどリリースされたOpenSSH 10.6p2はsshdでの問題を回避する。Alpineの安定ブランチは同じ問題に対するパッチを搭載している。apk upgrade -U -aを実行し、その後再起動すべきだ。