CVE-2016-1907 に関する通知を今朝見ました。
7.1p2より前のOpenSSHのpacket.cにあるssh_packet_read_poll2関数では、リモートの攻撃者が巧妙に細工されたネットワークトラフィックを介してサービス拒否(範囲外の読み取りとアプリケーションのクラッシュ)を引き起こすことができます。
リリースノート の一般的なメモ以外に、それに関する他の情報は見つかりません。
セキュリティ:パケット処理の範囲外の読み取りアクセスを修正
コード。ベンホークスによって報告されました。
Chromiumでは ソースリポジトリでの変更 (期限切れの証明書とHSTS)を表示できないため、パッチ自体はまだ確認していません。
誰かがこの欠陥の分析を投稿しましたか?少なくとも、それがクライアント、サーバー、またはその両方に影響するかどうかを知りたいです(たとえば、アカウントを持たない誰かが任意のサーバーにDoSを実行できるかどうか)。
これは良い質問です。この問題は出ていないので、2週間前に調査しました。このバグは、openssh-6.8の refactoring commit で初めて発生しました。基本的に問題は、exit()
を呼び出す関数がエラー値のみを返す関数に置き換えられたことです。
_if (state->packlen < 1 + 4 ||
state->packlen > PACKET_MAX_SIZE) {
#ifdef PACKET_DEBUG
sshbuf_dump(state->input, stderr);
#endif
logit("Bad packet length %u.", state->packlen);
if ((r = sshpkt_disconnect(ssh, "Packet corrupt")) != 0)
return r;
return SSH_ERR_CONN_CORRUPT; /* <-- this line was added */
}
sshbuf_reset(state->incoming_packet);
_
現在のバージョン (上記のスナップショット)のコンテキストでわかるように、このブランチは誤ったパケット長(5 B未満で_PACKET_MAX_SIZE
_より大きい)を処理します。この状態はエラーメッセージをスローし、パケットが切断され、復帰するはずです。しかし、sshpkt_disconnect()
が失敗した可能性があり、この時点で、コードの実行は関数を続行し、他のピアから受信したバッファーを追加のチェックなしで有効として処理します。コードはサーバーとクライアントの両方で使用されます。
ご覧のとおり、CVSSの重大度は、同じバージョンでリリースされた other CVE よりもかなり低くなっています。このバグをうまく利用するには、上記の条件に適合したパケット(長さが間違っている)を作成し、sshpkt_disconnect()
が失敗することを確認して(ソケットを閉じますか?)、邪悪なことが起こることを盲目的に予想する必要があります。攻撃対象領域は、巧妙に細工されたサーバーでの概念実証でさえあったCVE-2016-0778よりもはるかに限定的であり、調査も少なくなっています。
また、openSSHは権限分離をサーバーに実装しているため、基本的にはサンドボックス内の制限されたネットの子で可能なコード実行のみを実行できることに注意してください。一方、細工された悪意のあるサーバーを使用してクライアント側でコード実行を使用することはできますが、クライアントの切断の代償が伴います。ユーザーはおそらく疑わしいでしょうが、スクリプト(autossh
、rsync
ジョブなど)ではありません。