256文字超のパスワードでSSH認証突破 muslのバグ「*sshole」が話題
姉妹サイトの新着
海外の技術者向けサイト「Hacker News」で、SSH認証に関する脆弱性レポート『*sshole』が話題になっていた。musl libcのcrypt()関数は、256文字を超えるパスワードを渡された際に本来失敗とすべき処理を「常に成功扱い」にしてしまう仕組みになっており、musl libc・PAM未使用・OpenSSHでパスワード認証有効という条件が重なるとSSH認証を通過できてしまう可能性があるという。スレッドでは実際に再現できたかどうかや、どんな環境がこの条件に当てはまるのかをめぐって議論が交わされた。
*sshole(名前の由来は後述の議論で触れられている、musl libcのcrypt()関数に起因するSSH認証バイパスの脆弱性レポート)
出典: sshhole.com / 元記事はこちら
『少し』?! 言わせてもらうと、muslは正直ジョークみたいなものだ。今回の件もその証拠の一つに過ぎない。これだけ警告サインが出ていたのに、なぜ本番環境で使う人がいるのか理解できない。使っている側の自己責任だと思う。
いや、自分のFirecracker VM(そもそも外部に公開してないやつ)では再現できなかった。
自分の理解では、デフォルト設定では動かないはず。musl-libc、PAMなし、OpenSSHの組み合わせが必要。
先に普通の長さの間違ったパスワードで一度ログイン失敗させてから試した?
それは君の感性の問題かもね。自分は普通に楽しめた。ただ`*sshole`という名前と`sshhole.com`というドメインで`h`の数が違うのが気になって仕方なかった。これを見つけて書き上げるくらいこだわる人が、なぜ`h`の数を揃えることにはこだわらなかったのか[0]。
[0]: 人間であれLLMであれ、あるいはその両方が混ざった存在であれ。差別も判断もしない。
LLMの文章に慣れすぎて感覚が麻痺してるだけじゃない?
死んだものは二度死なない。今のブルーチーム(防御側)は皆アイアンボーンみたいなものさ。
大量のDockerコンテナじゃない?
追記: 確かにこの条件でsshdを動かしているのは少数派だろう。でも『少数派』×『世界中で動いているAlpineコンテナの数』をかけると、絶対数としてはかなり多くなる。
追記2: 実際、ダウンロード数百万規模の公開コンテナの例は探すのにそんなに苦労しない。
sshdを動かしているDockerコンテナなんてあるの?
Dockerコンテナでsshdを動かしてるの?
[1] https://hachyderm.io/@damienmiller/117563026759098135
自分はできる限りAlpineベースのコンテナを使うようにしている。systemdがLinuxを腐らせるのを少しでも防ぐためだ。sshdを有効にしたことは……あ、PostmarketOSを入れてるPineBook Proでは有効にしてた。やべえ。
A*(エースター)な名前、ね。
`*sshole`、つまり`*`が主役ってことね。ちなみに`\`でエスケープすればマークダウンの強調表示を防げるよ。
自分には全然理解できなかった。スクロールや画像がやたら気を散らして、集中できない。
いや、Alpineのコンテナにsshdは最初から入っていない。Dockerfileで手動インストールして、しかも設定をそのままにしておかないとこうはならない。
コンテナの中でsshdを動かす人なんていないでしょ、少なくともそう願いたい。docker execやkubectlが使えるのに、わざわざsshdを動かす意味がある?
他サイトの新着
パスワード認証が鍵認証より弱いって、具体的にはどういうこと? 認証コードのバグはどちらの経路でも起こりうる。極端に短いパスワードでなければ、総当たり耐性としてはどちらも同じくらい強いはず。つまり概念的には、鍵もパスワードの一種と言えるんじゃないか?
鍵は自分の端末から外に出ない、という違いがある。
このバグは、パスワード認証をオフにしていても発生する。
どこからそんな考えが出てきたの? このバグは丸ごとパスワードハッシュに関するものだ。パスワード認証がオフなら、そもそもその処理自体が実行されない。
『パスワード認証をオフにしていても発生する』って、本当に? 別の人はさっき『PasswordAuthentication=noにするか更新すれば対処できる』と言っていたけど。うちの職場ではmuslを使っていないので、自分で検証する手段がない。
『残念ながら、cryptを呼び出すプログラムの多くは、その失敗に対応できておらず、使う前に戻り値がnullでないかを確認していない。そのため、常に“成功”させつつ、絶対に一致しないハッシュを返す方が、エラーで失敗させるよりも良い挙動だと言われている』[1]
[1] https://git.musl-libc.org/cgit/musl/commit/?id=b3c4cc121f70f…
なんとも疑わしい判断だ!『呼び出し側がnullを正しく処理できずクラッシュするバグを表面化させるより、黙らせて呼び出し側が正しいことにしてしまおう。一部の状況で衝突が起きる(今回の脆弱性の原因になった)方が、クラッシュするよりマシだ』ということらしい。自分の『大声で失敗せよ』という主張(https://alejo.ch/3gk)に、この件を実例として追加しようかな。
よく見て。2つ目の`h`は文字の後ろに隠れていて、背景とほぼ同じ色になってる。
ああ、本当だ。ありがとう!
この話題の背景と論点
今回の脆弱性は、Cの標準ライブラリの一つであるmusl libcが提供するcrypt()関数の仕様に起因する。cryptは本来、処理に失敗した場合にNULLを返す仕様だが、呼び出し元の多くがNULLチェックを行わず異常終了してしまうため、musl側は「失敗時は絶対にマッチしないダミーのハッシュを返す」という設計にしていた。256文字を超える長大なパスワードを渡した際にこの分岐が働き、結果的に認証が通ってしまう組み合わせが生まれたとされる。スレッドでは、実際に再現できる条件が「musl libc・PAM未使用・OpenSSHでパスワード認証が有効」という狭い構成に限られる点や、パスワード認証自体を無効化していれば影響を受けないという誤解の訂正などが交わされ、技術的な論点と実害の範囲についての認識のずれが見られた。
※本記事は海外掲示板 Hacker News のスレッド「Sshole」から抜粋し、編集部で日本語に意訳したものです。訳文の責任は当サイトにあります。






まだコメントはありません。