OpenSSHの欠陥により、パスワード無効化済みのLinuxアカウントに攻撃者がログイン可能に

OpenSSHとmuslに関わる新たな脆弱性「*sshole」が公開されました。この脆弱性を突くと、パスワード認証をブロックするよう設定されたAlpine Linuxなどmuslベースの一部Linuxアカウントに、過大なサイズのパスワードを入力するだけでログインできてしまいます。

影響を受けるのは、musl C ライブラリを採用するLinuxディストリビューション(Alpine Linux、OpenWrt、Buildroot、Yoctoなど)上で動作するOpenSSHサーバーのうち、特定の認証設定を使用しているものに限られます。

この脆弱性を発見し、本日詳細を公開したセキュリティ研究者のOzgun Kultekin氏によると、問題は2016年から存在していました。原因は、musl C ライブラリを使うシステムでOpenSSHがパスワード検証エラーを処理する方法にあります。

Linuxでは、/etc/shadowファイル内のパスワードハッシュをアスタリスク(*)に置き換えることで、パスワードによるログインを禁止できます。これは有効なパスワードハッシュではないため、本来はどんなパスワードでもそのアカウントにはアクセスできないはずです。

ところが、2016年にOpenSSHへ導入されたパッチが、この挙動を変えてしまいました。このパッチは、CVE-2016-6210として追跡されているユーザー名列挙の脆弱性を修正するもので、使用可能なパスワードハッシュを持たないアカウントの扱いが変更されました。

攻撃者が応答時間の違いから有効なユーザー名を特定するのを防ぐため、OpenSSHは修正後、使用可能なパスワードハッシュがないアカウントに対してもパスワードのハッシュ化処理を実行するようになりました。パスワードログインを禁止するために* を設定したアカウントも対象です。

問題は、muslのC ライブラリのcrypt()関数も、ハッシュ化に失敗した場合に*を返す点です。送信されたパスワードが256バイトの上限を超えた場合も同様です。

そのため攻撃者が過大なサイズのパスワードを送信すると、OpenSSHは返された* とアカウントに保存された* を比較し、一致と判定してログインを許可してしまいます。

なお、この欠陥によって、有効なパスワードハッシュを持つアカウントのパスワードを回避できるわけではありません。

Kultekin氏によると、悪用には次の条件がすべて必要です。

  • OpenSSHがmuslベースのLinuxシステム(Alpine Linux、OpenWrt、Buildroot、Yoctoなど)で動作している
  • PAM認証が無効である(Alpine Linuxのopenssh-serverパッケージではデフォルトで無効)
  • SSHパスワード認証が有効である
  • パスワードハッシュがアスタリスク(*)のアカウントが少なくとも1つある
  • 有効なパスワードハッシュを持つ別のアカウントがある

同氏は、Alpine LinuxのAWS・Azure向け公式クラウドイメージにも注意を促しています。これらのイメージでは、デフォルトの「alpine」アカウントが影響を受けるうえ、パスワードなしで「doas」の権限を使えるため、攻撃者にroot権限を奪われるおそれがあるといいます。

Debian、Ubuntu、Fedoraなどglibcを使用するシステムや、PAM認証を使用するシステムは、この攻撃の影響を受けません。

Kultekin氏は、AIエージェントを使ってこの脆弱性を発見したと説明しています。エージェントは、さまざまなOpenSSH設定、不正な形式のパスワードハッシュ、過大なサイズのパスワードを組み合わせ、約17,600回の認証テストを実施しました。

脆弱性はOpenSSH 10.6p2で修正されました。Alpine Linuxの管理者は、apk upgrade opensshでOpenSSHパッケージを更新することが推奨されます。

すぐに更新を適用できない場合は、SSHサーバーの設定でPasswordAuthentication noを指定してSSHパスワード認証を無効にし、SSHを再起動すれば、問題を緩和できます。

またKultekin氏は、SSHの認証ログを調べ、パスワードログインを許可すべきでないアカウントでパスワードによるログインが行われていないか確認することで、悪用の痕跡を検出できると述べています。

Alpine Linuxでは、次のコマンドでSSHのパスワードログインの成功を確認できます。

grep "Accepted password" /var/log/messages

alpineアカウントでパスワードログインに成功した記録がある場合は、そのアカウントのパスワード認証が無効になっているかどうかを次のコマンドで確認します。

grep '^alpine:' /etc/shadow

アカウントのパスワードフィールドが*であるにもかかわらず、SSHログにパスワードログインの成功が記録されている場合は、この脆弱性が悪用された可能性があります。

翻訳元: https://www.bleepingcomputer.com/news/security/openssh-flaw-lets-attackers-log-into-password-disabled-linux-accounts/

本記事は bleepingcomputer.com の記事を翻訳・要約したものです。