Solaris の重大なバッファ オーバーフローの脆弱性により、リモート テイクオーバーが可能になる — CVE-2020-14871

Solaris の重大なバッファ オーバーフローの脆弱性により、リモート テイクオーバーが可能になる — CVE-2020-14871 news

FireEye Mandiant は、顧客環境で侵害された Oracle Solaris マシンを調査しています。調査中に、お客様のシステムでエクスプロイト ツールを発見し、それを分析して、Solaris 環境をどのように攻撃しているかを確認しました。 FLARE チームの Offensive Task Force は、エクスプロイトを分析してその仕組みを特定し、さまざまなバージョンの Solaris で脆弱性を再現してから、Oracle に報告しました。このブログ投稿では、脆弱性の説明を提示し、システムが脆弱であるかどうかを簡単にテストする方法を提供し、軽減策と回避策を提案します。 FLARE チームの Mandiant の専門家が、11 月 12 日のウェビナーで、この脆弱性とUNC1945 によってどのように使用されたかについて、より多くの情報を提供します。今日登録して、質問の準備を始めてください。セッションの最後に聴衆から質問を投げかけます。

脆弱性の発見

セキュリティの脆弱性は、Pluggable Authentication Modules (PAM) ライブラリで発生します。 PAM を使用すると、Solaris アプリケーションはユーザーを認証できますが、システム管理者は認証パラメータ (パスワードの複雑さや有効期限など) を 1 か所で構成できます。このパラメータは、すべてのアプリケーションによって一貫して適用されます。

実際の脆弱性は、 PAM parse_user_name関数にある従来のスタックベースのバッファ オーバーフローです。この関数の省略版を図 1 に示します。

静的整数
parse_user_name(char *user_input, char **ret_username)
{
char *ptr; を登録します。
レジスタ int インデックス = 0;
char ユーザー名[PAM_MAX_RESP_SIZE];
/* … */

ptr = user_input;
/* … */
/*
* ユーザー名は、user_input から取得する最初の文字列になります
* – 先頭の空白をスキップし、末尾の空白を無視します
*/
while (*ptr != ‘

static int
parse_user_name(char *user_input, char **ret_username)
{
            register char *ptr;
            register int index = 0;
            char username[PAM_MAX_RESP_SIZE];
       /* … */

            ptr = user_input;
       /* … */
             /*
             * username will be the first string we get from user_input
             * – we skip leading whitespaces and ignore trailing whitespaces
             */
            while (*ptr != ”) {
                  if ((*ptr == ‘ ‘) || (*ptr == ‘t’))
                               break;
                  else {
                               username[index] = *ptr;
                               index++;
                               ptr++;
                  }
            }
             /* ret_username will be freed in pam_get_user(). */
            if ((*ret_username = malloc(index + 1)) == NULL)
                  return (PAM_BUF_ERR);
            (void) strcpy(*ret_username, username);
            return (PAM_SUCCESS);
}

‘) {
if ((*ptr == ‘ ‘) || (*ptr == ‘t’))
壊す;
そうしないと {
ユーザー名[インデックス] = *ptr;
インデックス++;
ptr++;
}
}
/* ret_username は pam_get_user() で解放されます。 */
if ((*ret_username = malloc(index + 1)) == NULL)
リターン (PAM_BUF_ERR);
(void) strcpy(*ret_username, username);
戻ります (PAM_SUCCESS);
}

図 1: parse_user_name 関数には、スタックベースのバッファ オーバーフローの脆弱性があります

この脆弱性は、 PAM_MAX_RESP_SIZE (512 バイト) よりも長いユーザー名がparse_user_nameに渡されるたびに発生します。この脆弱性は何十年も前から存在していた可能性が高く、考えられる理由の 1 つは、アプリケーションがユーザー名を PAM に渡す前にユーザー名をより短い長さに制限していない場合にのみ悪用可能であるということです。ネットワーク向けソフトウェアがユーザー名の長さを常に制限しているとは限らない 1 つの状況が SSH サーバーで発生します。

SSH キーボード インタラクティブ認証は、SSH プロトコルがサーバーの PAM ライブラリとクライアントの間でプロンプトと応答をリレーする「パススルー」認証メカニズムです。 SSH プロトコルを変更せずに、2 要素などのカスタム形式の認証をサポートするように設計されています。 SSH クライアント設定を操作して、通常の方法でユーザー名を送信するのではなく、キーボード インタラクティブ認証でユーザー名を要求するように強制することで、攻撃者は PAM parse_user_name関数に無制限の入力を渡すこともできます。

概念実証エクスプロイト

さまざまなバージョンの Solaris をすばやくテストして脆弱性があるかどうかを確認するために、オーバーフローをトリガーして SSH サーバーをクラッシュさせる概念実証のエクスプロイトを開発しました。標準の OpenSSH クライアントは、脆弱性を引き起こすために必要なすべてのオプションを提供します (図 2)。

A server can be quickly tested to see if it is vulnerable over SSH
図 2: サーバーが SSH 経由で脆弱かどうかを簡単にテストできます

サーバーが脆弱であることを示す兆候は、SSH クライアントが「Authentication failed;」と出力することです。脆弱性のない PAM ライブラリにより、SSH サーバーが受信したユーザー名が長すぎる場合、ユーザー名の入力を繰り返し求められます。図 3 に示すように、PAM ライブラリのオーバーフローも SSH サーバーのクラッシュの原因となります。デバッガーが接続されていない状態で SSH サーバーがクラッシュした場合、オペレーティング システムはクラッシュ ダンプを/coreに書き込みます。実際、Solaris マシンに/coreファイルが存在し、 file コマンドがsshdからのものであると報告した場合、それらはこの脆弱性が悪用されたことを示す指標です。

parse_user_name 関数で SSH サーバーがクラッシュする
図 3: parse_user_name 関数で SSH サーバーがクラッシュする

脆弱なオペレーティング システム

  • Solaris 9 (一部のリリース)
  • Solaris 10 (すべてのリリース)
  • ソラリス 11.0
    • パッチが適用されていない Solaris 11.1 以降ではparse_user_name関数が脆弱なままですが、PAM ライブラリへの無関係な変更により、脆弱な関数がユーザー名を受け取る前にユーザー名が切り詰められ、SSH 経由で問題を悪用できなくなります。 parse_user_name関数が別のコンテキストで到達可能である場合、脆弱性が悪用される可能性があります。
  • イルモス (OpenIndiana 2020.04)

軽減策と回避策

Solaris 10 および 11 用の Oracle のパッチは、 2020 年 10 月のクリティカル パッチ アップデートに記載されています。

Solaris 9 はサポートされなくなったため、Oracle はパッチをリリースしていません。 Solaris 9 およびパッチ適用が不便な Solaris 10 または 11 システムの場合、 /etc/ssh/sshd_configファイルを編集してChallengeResponseAuthentication noおよびKbdInteractiveAuthentication no行を追加し、SSH サーバーを再起動することをお勧めします。これにより、SSH キーボード インタラクティブ認証を使用して脆弱性を悪用する機会がなくなりますが、 parse_user_name関数を攻撃する方法が他にもある可能性があります。この回避策は、Solaris 9 システムがアップグレードされるか、10 月のパッチが適用されるまでの応急処置としてのみ使用することをお勧めします。サポートされている Solaris バージョンにアクセスしてインストールします。

謝辞

Rapid7 の Jeffrey Martin は、この脆弱性のテストに貢献しました。

参照: https://www.mandiant.com/resources/blog/critical-buffer-overflow-vulnerability-in-solaris-can-allow-remote-takeover

Comments

Copied title and URL