「Exim」メールサーバのバッファオーバーフロー脆弱性「CVE-2019-16928」を解説

中国のセキュリティリサーチ組織「QAX-A-Team」は、2019年9月、UNIX用のメール転送エージェント(MTA)「Exim」上に存在する脆弱性「CVE-2019-16928」を確認しました。市場調査によると、2019年9月の段階でEximはインターネット上で確認可能なメールサーバの50%以上を占めており、広範的な影響が懸念されます。この脆弱性が悪用されると、以下の2つの攻撃が実行される可能性があります。また、脆弱性の深刻度は「緊急」に分類されています。

  • サービス拒否(DoS、Denial of Service)攻撃
  • 遠隔からのコード実行(Remote Code Execution、RCE)攻撃

この脆弱性はEximの以下のバージョンに存在し、これ以前のバージョンへの影響は確認されていません。

  • 4.92
  • 4.92.1
  • 4.92.2.

Eximの脆弱性に関しては2019年6月にも「CVE-2019-10149」が公表されており、実際に脆弱性を攻撃するワームが登場しています。今回の脆弱性も遠隔からのコード実行が可能であり、同様の攻撃が発生する可能性は高いものと言えます。この脆弱性「CVE-2019-16928」は、ヒープ領域型のバッファオーバーフローによりEximプロセスの実行制御が可能になります。本記事ではその詳細を解説します。

■ヒープ領域型バッファーオーバーフロー攻撃とは?

PCのメモリ上でプログラムが実行される際、ローカル変数はスタックと呼ばれる記憶領域に格納されます。スタックには関数呼び出しに関するデータが保存されます。一方、動的変数は、ヒープと呼ばれる別の記憶領域に格納されます。動的変数は、アプリケーションやOSのランタイム時のメモリの割り当てや解放に使用されます。

スタック領域のローカル変数はヒープ領域の値に対応します。つまり、スタック領域のローカル変数は、それぞれヒープ領域の値のメモリアドレスに対応することになります。このため、スタック領域のローカル変数において、割り当てられたメモリを超える文字列が入力された場合、ヒープ領域上の別のメモリブログ上で上書きや変更が生じてしまいます。下図は、通常時と文字列が超過した場合を比較しています。文字列が超過し、変数1に値1と値2が対応してしまっています。

図1:通常時(左)とヒープ領域型バッファオーバーフロー時(右)のメモリ表現
図1:通常時(左)とヒープ領域型バッファオーバーフロー時(右)のメモリ表現

上記の例では、超過分の値2に任意の文字列もしくはバックドアのコマンドなどが入力され、ランタイム時に実行可能となります。これは、遠隔からのコード実行を仕掛ける手法としてもよく知られています。

■EHLOの文字列を利用した脆弱性の悪用

「Extended HELO(EHLO)」は、「インターネット技術特別調査委員会(Internet Engineering Task Force、IETF)」によれば、メールクライアント側の送信時、自身の識別やメールサーバへの通知に使用されるコマンドとして定義され、「Extended Simple Mail Transfer Protocol(ESMTP)」で使用されます。今回の脆弱性「CVE-2019-16928」では、具体的には、このEHLOコマンドの文字列を介して、DoS攻撃に伴うEximプロセス終了などいった不正活動が実行されます。さらには、EHLOに入力されるバックドアコマンドにより、遠隔からのコード実行を仕掛けることも可能になります。

この脆弱性は、C言語の文字列処理メソッド「string_vformat()」上に存在しています。コーディングエラーが原因となり、文字列が不十分な長さでとどまったため、バッファオーバーフローが発生しました。文字列の長さは、オフセット値の距離に基づいて変更されます。

図2:文字列により多くのメモリを割り当てる「gstring_grow()」の呼び出し
図2:文字列により多くのメモリを割り当てる「gstring_grow()」の呼び出し

図2のとおり、赤でハイライトされた文字列がコード上の欠陥です。「g-> ptr」(現在値のポインタもしくはオフセット値)と「(lim – g->ptr)」の差が不自然に小さく設定され、なおかつ追加された文字列のサイズが割り当てられたメモリを超過する場合、バッファオーバーフローが発生する可能性があります。正しくは緑字の次の文字列のようであるべきです。

■被害に遭わないためには

本記事執筆時点で、Eximは脆弱性「CVE-2019-16928」の修正に対応した更新版「バージョン4.92.3」をリリースしています。今回の脆弱性が悪用されることで生じるリスクを防ぐため、Eximのユーザは早急に最新バージョンへ更新する必要があります。

■トレンドマイクロの対策

サーバ向け総合セキュリティ製品「Trend Micro Deep Security™」をご利用のお客様は以下のルールによりこの脅威から保護されています。

  • 1010010 – Exim Remote Code Execution Vulnerability (CVE-2019-16928)

ネットワーク脅威防御ソリューション「TippingPoint」では、以下のMainlineDV filterにより今回の脅威をブロックします。

  • 36283: SMTP: Exim Buffer Overflow Vulnerability

Deep Discovery ™ Inspector」 をご利用のお客様は、以下のルールによって本記事で解説した脆弱性への攻撃を検知します。

  • Rule ID 4246: Possible CVE-2019-16928 – Exim Buffer Overflow Exploit – SMTP (Request)

参考記事:

翻訳: 下舘 紗耶加(Core Technology Marketing, Trend Micro™ Research)