連載「OSS脆弱性ウォッチ」では、さまざまなオープンソースソフトウェアの脆弱性に関する情報を取り上げ、解説する。今回は、OpenSSHでリモートからユーザー名を列挙できる脆弱性について。
「OSSセキュリティ技術の会」の面和毅です。本連載「OSS脆弱性ウォッチ」では、さまざまなオープンソースソフトウェア(OSS)の脆弱(ぜいじゃく)性に関する情報を取り上げ、解説しています。
2018年8月下旬に、OpenSSHでリモートからユーザー名を列挙できる脆弱性が見つかりました。今回は、このOpenSSHの脆弱性を詳しく見ていきます。
SSHは2006年にRFC化されており、RFC4250-4256が認定されました。この一連のRFCの中にある、RFC4252でユーザー認証(パスワード認証や公開鍵認証)について規定されてます。
このRFC4252については、USENIXのサイトで日本語の説明を読めますが、この中の「SSH_MSG_USERAUTH_FAILURE(実装上はSSH2_MSG_USERAUTH_FAILURE)」を返す実装に問題があり、これにより外部からユーザーが存在するか否かが分かってしまうというものになります。
実際にSSH_MSG_USERAUTH_FAILUREの返答を確認してみましょう。
opensshのsshクライアントでユーザー認証部分を確認してみます。「ssh -vvv」オプション(DEBUGメッセージまで表示)で、ログレベルを高くしてユーザー認証部分を見てみたのが図1です(図1)。
図からも分かるように、opensshのsshクライアントでは、SSHのパケット情報を見ることはできません。そのため、sshクライアントで通信の状況は確認できません。
puttyは、トンネル機能やフォワーディングなども実装しているSSHクライアントです。Windowsなどで使えます。puttyの設定画面でログ出力の箇所に「SSHパケット」があるので、これを有効にしてログを取得します(図2)。
この状態で、puttyでログインを実行すると、ログインが拒否されるまでにやりとりされたSSHパケットの情報が取得できます。このログを見ると、「SSH2_MSG_SERVICE_ACCEPT」の後の「SSH2_MSG_USERAUTH_REQUEST」「SSH2_MSG_USERAUTH_FAILURE」などのパケットもやりとりされているのがログ上から確認できます(図3)。
今回の脆弱性は、こちらのパッチ(パケットに含まれているリクエストが完全にパースされるまで、無効な認証ユーザーに対する処理を遅らせる)がopensshに投げられたことで発覚しました。
今回の問題は、認証に関する箇所で、図4(この場合は「auth2-pubkey.c」中の「userauth_pubkey()」の処理)のように、ユーザー名を先に検証して無効の場合にはエラー処理を行い、その判定の後にパケットの中身を確認しています。
これにより下記の2種類の処理になっています。
つまり、「パケットがおかしいもの(例えば、切り詰められたパケットなど)を送れば、「ユーザー名が無効でエラーになったか」「パケットの方でエラーになったか」が外部から分かるので、ユーザーが存在するか否かが分かる」ということになります。
Copyright © ITmedia, Inc. All Rights Reserved.