Photo by Ian Britton
こんにちは、吉岡(@yoshiokatsuneo)です。
サーバ管理で使わない人はいないSSH(OpenSSH)ですが、SSHクライアントで秘密鍵が漏洩する 可能性のある脆弱性(CVE-2016-0777)が発見されています。 各ベンダーからリリースされるアップデートを適用していただくのですが、まだアップデートがリリース されていない環境も多いです。 そのような場合を含めて、結論から言うと、以下のコマンドをSSHクライアントでルート権限で実行することで、脆弱性は回避できます。
# echo -e '\nHost *\nUseRoaming no' >> /etc/ssh/ssh_config
ルート権限で上記コマンドが実行できない場合、以下のようにユーザ単位の設定を変更します。
$ echo -e '\nHost *\nUseRoaming no' >> ~/.ssh/config
この脆弱性は、OpenSSHでドキュメント化されていない実験的なローミング機能に関するもので、上記のローミングを 無効にするコマンドにより、この脆弱性を回避することができます。
また、もし秘密鍵がすでに漏洩されている場合には、鍵の再作成を行います。
詳しい情報は以下で公開されていますが、概要について書いてみます。
Qualys Security Advisory / Roaming through the OpenSSH client: CVE-2016-0777 and CVE-2016-0778
脆弱性の詳細
OpenSSH 5.4(2010/3/8リリース)以降で、OpenSSHクライアントは非公開のローミング機能を実装しています。 このローミング機能では、サーバとの接続が予期なく切断され、サーバ側がローミング機能をサポートしている場合、 クライアントはサーバと再接続を行い、中断されたセッションを再開することができます。
この機能はOpenSSHサーバではサポートされていませんが、OpenSSHクライアントではデフォルトで有効にされており、 また以下の2つの脆弱性により悪意のあるサーバで悪用される可能性があります。
- 情報漏洩(メモリの内容取得)
- バッファオーバフロー(ヒープメモリ)
情報漏洩の脆弱性はOpenSSHクライアントのデフォルト設定で存在し、クライアントのバージョン、コンパイラ、OSによりますが、 クライアントのSSH秘密鍵を悪意のあるサーバが取得できます。 この脆弱性による情報漏洩はすでに悪用されている可能性もあり、その場合、高度なセキュリティが求められるサイトでは SSH鍵の再生成と再配布が必要になる場合があります。
もう1つのバッファオーバフローの脆弱性もデフォルトで存在しますが、悪用するには2つのオプション ProxyCommandと、ForwardAgent(-A)又はForwardX11(-X)を有効にする必要があります。 そのため、この脆弱性はそれほど広く悪用される可能性は低いですが、考慮が必要な場合もあります。
OpenSSHのバージョン5.4から7.1に脆弱性は存在します。 非公開オプション"UseRoaming"を"no"にすることで回避することができます。 OpenSSH 7.1p2(2016/1/14リリース)にてローミングを無効にすることにより修正されています。
脆弱性が回避される場合
* この脆弱性は、"UseRoaming no"を設定ファイル(/etc/ssh/ssh_configや~/ssh/config)に設定するか、 コマンドラインで無効にする(-o "UseRoaming no")ことで無効にできます。
[connection suspended, press return to resume]
というメッセージをクライアントの標準エラーに表示し、改行が標準入力で待ちます。 熟練したユーザは疑いを持ち、Contro-C/Control-Zにより中断して脆弱性を回避できます。
しかしながら、標準入力をデータ転送で用いている場合や、バックアップスクリプトやcronで バッチで起動している場合は漏洩が起こる可能性があります。 同様にSCPでコピーを行う場合も発生する可能性があります。
Man in the Middleアタックだけではなく、攻撃者はサーバに侵入するなどにより、ユーザを攻撃された サーバに接続させる必要があります。
セキュリティ以外のバグにより、特定のバージョンや設定のOpenSSHでは実際にはローミング機能が動作せずに 脆弱性が悪用されない可能性があります。特に、OpenSSHバージョン6.5(2014/1/30リリース)以降では、 デフォルトのssh_connect_direct()(単純なTCP接続)でのバグにより、サーバへの再接続ができなくなります。
秘密鍵漏洩の例
以下の環境にて、実際に秘密鍵が漏洩することが確認されています。
- FreeBSD 10.0, OpenSSH 6.4p1
- FreeBSD 9.2, OpenSSH 6.2p2
- OpenBSD 5.4, OpenSSH 6.3
- OpenBSD 5.8, OpenSSH 7.0 (ProxyCommand利用)
- CentOS 7, OpenSSH 6.4p1
- Fedora 20, OpenSSH 6.4p1
参照
- Qualys Security Advisory / Roaming through the OpenSSH client: CVE-2016-0777 and CVE-2016-0778
- Reddit|OpenSSH: client bug CVE-2016-0777
- CVE-2016-0777
- RedHat|OpenSSH: Information-leak vulnerability (CVE-2016-0777)
- Announce: Portable OpenSSH 7.1p2 released
- OpenSSH: client bugs CVE-2016-0777 and CVE-2016-0778
まとめ
SSH(OpenSSH)はサーバ管理でのセキュリティの基本ツールですので、このような重要なツールでの脆弱性は 影響範囲が大きくなる可能性があります。 この件に限らず、適時リスクなどを判断して適時対応を行っていただくのが良いかと思います。
履歴
2016-01-15 16:51 設定ファイルが改行で終わっていない場合を考慮し、echoの先頭に改行"\n"を追加。
paizaではITエンジニアとしてのスキルレベル測定(9言語に対応)や、プログラミング問題による学習コンテンツ(paiza Learning)を提供(こちらは21言語に対応)しています。テストの結果によりS,A,B,C,D,Eの6段階でランクが分かります。自分のプログラミングスキルを客観的に知りたいという方は是非チャレンジしてみてください。