オープンソースソフトウェア「Unix Daemon」のSMTPサーバ「OpenSMTPD」上で、ルート権限の昇格およびリモートコード実行(RCE、Remote Code Execution)を可能にする脆弱性「CVE-2020-8794」が確認されました。この脆弱性は、境界外読み取りに起因するものであり、攻撃者は、これを悪用することで脆弱なシステム上で任意のコードを実行できます。
■本脆弱性について
この脆弱性「CVE-2020-8794」は、セキュリティ企業「Qualys Research Labs」により発見後、2020年2月24日に公表されました。この脆弱性が悪用されると、攻撃者は、ルート権限を持つユーザとしてコマンド実行が可能になります。OpenSMTPDの6.6.4より前のすべてのバージョンに影響を及ぼします。OpenSMTPDは、オープンソースのUnix系オペレーティングシステム(OS)「OpenBSD」の一部としてメールの取得や配信に関する通信を促してSMTPを実行します。
今回解説する脆弱性は、2020年1月以降で3番目に確認されたOpenSMTPDの脆弱性です。それ以前の2つの脆弱性としては、ローカルユーザに対して任意のシステムファイルの読み取りを可能にする脆弱性「CVE-2020-8793」と、特別に細工されたSMTPセッションを介してルート権限のユーザとして任意のコード実行を可能にする脆弱性「CVE-2020-7247」の2つが挙げられます。これらの脆弱性は、OpenSMTPDの既定のインストールに影響し、しかも一時はOpenBSDの最新版(当記事執筆時点ではバージョン6.6)の中にも修正されずに含まれていた点で注意が必要です。
「CVE-2020-8794」に関しては、この脆弱性の公表時点でまだ攻撃利用は確認されておらず、既に2月25日に修正バージョンが公開されています。ただし実際には2018年5月のOpenSMTPDのメッセージ文法更新からこの脆弱性は存在していました。また、OpenSMTPDのバージョン5.7.1ではルート権限を待たないユーザとしての実行が可能であり、その意味では2015年12月の時点からOpenBSDに含まれていたことになります。
■「CVE-2020-8794」脆弱性の悪用手法
脆弱性「CVE-2020-8794」は、OpenBSDのコード「mta_session.c」内で確認できます。具体的には、SMTPサーバからの複数行の応答を解析する「mta_io」関数内に存在します。境界外エラーは、「250 DATA」の代わりに「250」を渡すなど、応答の最終行が「3桁のコード/スペース/テキスト」の標準形式に従っていない場合に発生します。
このエラーが発生すると、プログラムが文字列の読み取りに使用するポインタは、ヌルターミネータ「\ 0’」の後ろを指します。その結果、プログラムはポインタが指した位置を誤って読み取り、次の行にバッファに追加します。
このように応答メッセージでエラーが発生すると、追加の行を含む指示内容は、メールの動作を記述するエンベロープ内に保存されます。これにより、追加した行に改行文字を含めることができるため、攻撃者は、この内部ファイルを改変することで、OpenSMTPDの動作を変更できます。
この脆弱性は、サーバ側ではなくクライアント側のコード部分に存在します。クライアントは、通常ローカルホストのみをリッスン(待ち受け)することから、この脆弱性を悪用するには、いくつかの作業が必要となります。この脆弱性の悪用には、クライアント側とサーバ側の2つ手法が挙げられます。
クライアント側からの脆弱性の悪用方法は単純です。この場合、クライアント側の端末からメールサーバにメッセージを送信することで、メールサーバからの応答は特別に細工されたものとなり、これにより、Out-of-Bounds(OOB、境界外読み取りエラー)が発生します。これを受けて、以下の行がメールのエンベロープに挿入されます。
この時点でメッセージタイプがメッセージ配送エージェント(Mail Delivery Agent、MDA)に変更されているため、エラーによるメッセージ配信の失敗に伴い、OpenSMTPDでコマンド実行が可能になります。これに乗じて攻撃者は、脆弱な端末上で(メールエンベロープに挿入された行による)任意のコード実行を行います。
サーバ側での脆弱性の悪用は、クライアント側よりも複雑なものとなっています。この場合、SMTPサーバへのメッセージ送信が伴います。この送信により、SMTPサーバからメールサーバへエラー通知が発生します。そしてサーバ側は、一時的なエラー通知として応答します。その後、このエラー通知が繰り返されることで致命的なエラーと判断され、メールサーバが強制的にクラッシュされます。
そしてクラッシュしたサーバを再起動する際、一時的なエラー通知の応答時に保存されていたコマンドの実行が可能になります。
なお、最初の段階では一時的なエラーとしてエラー通知が送信される必要があります。致命的なエラーとしてエラー通知の配信自体が自動的に破棄される状態のダブルバウンスが発生すると、もとよりコマンドを実行できなくなるからです。また、コマンド実行前にはサーバが再起動さている必要があります。コマンド実行に使用される行は、メールエンベロープ内に挿入されている一方、その行自体は、エラー通知の応答時に保存されているからです。そして再起動後、すべてが再確認され、保存済みの行がMDAキューへ移動され、コマンドが実行されることになります。
2018年5月より前のバージョンの脆弱性も、ほぼ同じ手法で悪用されます。ただし古いバージョンの場合、エンベロープに挿入される行の形式が少し異なり、脆弱性悪用の対象がルート権限を持たないユーザ向けとなっていました。
この脆弱性は、OpenSMTPDのバージョン6.6.4で修正パッチが施されています。この修正パッチにより、最終メッセージの行の長さが4より大きいかどうかをチェックする機能が追加されました。これにより、ポインタ「p」はnull文字「‘\ 0’」を超えて指示することができなくなります。その結果、境界外の内容は読み取り不可となります。
■脆弱性を狙う攻撃を防ぐためには
OpenSMTPDユーザは、6.6.4より前のバージョンや、特に2018年5月以降にリリースされたバージョンを使用している場合、最新版に更新することで、脆弱性「CVE-2020-8794」を悪用する脅威からシステムを保護できます。攻撃者がルート権限のユーザとしてコマンドを実行できない場合でも、多くの不正なコマンドが実行される可能性があるため、依然として深刻なリスクと言えます。例えば、攻撃者が他の脆弱性の悪用と組み合わせて、攻撃者の権限を昇格させることも可能です。
■被害に遭わないためには
システム管理者およびIT/セキュリティ部門は、以下のようなベストプラクティスおよびセキュリティ対策を常に講じる必要があります。
- 既知、未知、非公開の脆弱性の悪用を阻止する仮想パッチなどのセキュリティ対策の防御層を追加する
- 最小特権の原則を適用し、古いコンポーネントや未使用のコンポーネントを無効化するか削除しておく
- 侵入防御システムを介して不正なトラフィックを対するプロアクティブな監視、検出、ブロックを実行する
■トレンドマイクロの対策
法人向け総合エンドポイントセキュリティ「Trend Micro Apex One™ 」、総合サーバセキュリティ「Trend Micro Deep Security™」では、以下の DPIルールにより本記事内で挙げた脆弱性を利用する攻撃を検出します。
- 1010190 – OpenBSD OpenSMTPD ‘mta_io’ 境界外読み取りの脆弱性「CVE-2020-8794」
ネットワーク脅威防御ソリューション「TippingPoint」では、以下のMainlineDV filterにより今回の脅威をブロックします。
- 37303: 「OpenBSD」の一部である「OpenSMTPD」上の「mta_io」に存在する境界外読み取りに関する脆弱性「CVE-2020-8794」
「Deep Discovery ™ Inspector」をご利用のお客様は、以下のルールによって本記事で解説した脆弱性を利用する攻撃をブロックします。
- Rule 4355: CVE-2020-8794 – OPENSMTPD RCE EXPLOIT – SMTP (RESPONSE)
参考記事:
- 「OpenSMTPD Vulnerability (CVE-2020-8794) Can Lead to Root Privilege Escalation and Remote Code Execution」
by Alexander Elkholy (Threats Analyst)
翻訳: 下舘 紗耶加(Core Technology Marketing, Trend Micro™ Research)