web-dev-qa-db-ja.com

CVE-2019-10149からサーバーを保護する方法-Exim-パッチを適用するかパッチを適用しない-RCPTへのメールを拒否する方法$ {run

最近公開されたEximの脆弱性CVE-2019-10149を参照して、パッチが適用されたはずのExim v。4.90_1(2019年6月4日ビルド)をUbuntu 18.04.2 LTSで実行しています。

Canonicalによると、パッチが適用されていると思われますが、最終的にはフリーズメッセージとして利用されるエクスプロイトの試みが数多く行われています。

これはやや心配です。

「$」で始まる受信者へのメッセージを拒否する方法はありますか?

そして、これらのエクスプロイトが機能していないことを確認するにはどうすればテストできますか?

2
jdmayfield

クイックバージョン:

Exim "split-config"を使用するDebianベースのOSを使用している場合、パッチを適用したEximバージョンでもパッチを適用していないEximバージョンでも、CVE-2019-10149 "Return of the WIZard"エクスプロイトからのサーバーを保護するには、次の行を追加します。 /etc/exim4/conf.d/mainフォルダー内の00_local_macrosファイル、またはシステム上のそのファイルが存在するパス:

CHECK_RCPT_LOCAL_LOCALPARTS  = ^[.] : ^.*[\${}@%!/|`#&?] : ^.*/\\.\\./
CHECK_RCPT_REMOTE_LOCALPARTS = ^[.] : ^.*[\${}@%!/|`#&?] : ^.*/\\.\\./

さらに、以下を追加することをお勧めします。

smtp_banner = $smtp_active_hostname ESMTP $tod_full      

これにより、Eximサーバーの挨拶が変更され、バージョン番号とEximであることが破棄されるため、 https://shodan.io のようなサービススキャナーはその情報を表示しません(一部の後で)このエクスプロイト(またはEximに基づく他の攻撃)に固有の表面攻撃ベクトルとして。

他のシステムでは多少異なる場合がありますが、基本的には、システム上で追加の文字「$」、「{」、および「}」を含むレシピエントアドレスを単に拒否します。不正な文字が指定されている設定にドル記号を追加することもできますが、同様のエクスプロイトが見つかった場合はより安全であることを望んでいるので、中括弧も追加しました。

唯一の注意点は、ローカルシステムにドル記号または中括弧が含まれているアドレスがある場合、メールを受信できないことです。しかし、アドレスに$$bling{me}@whatever.comを持っているのは誰ですか?これらのアドレスへのメール送信はブロックされませんが、万が一my{$$$}@somewhere-else.comに送信された場合

これには、悪用されるメールを拒否するだけでなく、それに関するバウンスメッセージを問題のサーバーに送信するという追加の利点があります。

私はこの件についてここで説明します:

https://www.bleepingcomputer.com/forums/t/699962/mail-remote-code-execution-attempt/#entry4818756

以前はこのバットチャンネルで---

背景:これは、パッチが適用されたExim(4.99未満である可能性がありますが、4.91を超える可能性があります)を参照しています。最初に、Exim、sshd、そして実際のシステム全体を、合理的かつ安全に実行できる限りの高さにアップグレードします。

私が読んだ記事で概説されている「ウィザードの戻り」Eximワームの既知の証拠を見つけられなかったため、パッチが適用されたバージョン4.90_1は実際に侵入を防止したようです。さらに、Ubuntu上のExim(および他のDebianベースのフレーバー)は、rootとしてではなく、ユーザーDebian-eximの下で実行されるため、これ自体で多くの損傷を防ぐことができた可能性があります。 Debian-eximユーザーの妥協と同じくらい悪いかもしれませんが、それはrootよりもはるかに優れています。いずれにせよ、私は改ざんの成功の兆候を見たことがありません。

しかし、これはまだ憂慮すべきことでした。私が目にしたことの1つは、RCPTがすべて$ {run {で始まり、その後に/ bin/bashや一連のコマンド(以下の恐ろしいwgetを含む)いくつかの怪しげなエンドポイント。

最も具体的には、それらはすべて89.248.171.57-scanner20.openportstats.comに解決されるIPに由来するようです。同様のフリーズメッセージが表示されている場合は、openportstats.comにアクセスしてIPを検索し、そこにリストされているかどうかを確認できます。このサイトはshodan.ioに少し似ています。

問題は、彼らが故意にこれをしているのですか?または彼らは感染していますか?私は最初は前者を考えましたが、IPを調べたときにEximの脆弱性に関する結果についての言及があるとは思っていなかったので、完全にはわかりませんが、ポートに関する基本的な情報と初期接続から抽出されたデータしかありませんでした。

とにかく、次に進みます。

パッチを当てたEximバージョンに関するUbuntuからの(漠然とした)記事は次のとおりです https://usn.ubuntu.com/4010-1/

以下は、実際のメカニズムの一部を詳しく説明したより詳細な記事です。 https://hackernews.blog/exim-4-87/#more

個人的には、これについて多くの情報源が唇を締めていると思いますが、パラノイアは人よりも害を及ぼしています!猫は悪い俳優のために袋から出ています。それと戦おうとしている人、および/または自分自身を保護している人は、それ以上の情報が必要です。

この修正は、Eximをパッチされたバージョンに更新するためにさらにすることを目的としています。

これにより、パッチが適用されていないバージョンがこのエクスプロイト、つまりワームから保護されるかどうかはわかりません。しかし、それはおそらく私が読んだことに基づいているようです。なんらかの理由でEximを更新できない場合は、ぜひお試しになり、動作をお知らせください。

脆弱性は、ACLではなくルーターにあると思いますが、これについて多くのゴミをスキャンしましたが、今のところ、私の記憶は少し揚げられています。

私がテストしたので、私が言えることは、これはドル記号を含むRCPTアドレスを持つすべてのメールを拒否するということです。これには$ {run'sが含まれます。

$ {runを拒否することに関して、私はここで長い答えを見つけました。 https://marius.bloggt-in-braunschweig.de

振り返ってみると無意味なようですが、私はそれを考えすぎていました。

ここにあります:

追加のターミナルを開いて実行することにより、次の修正をライブでテストできます-修正前に-

tail -Fn +0 /var/log/exim4/mainlog | grep "{run"

次に、ローカルメールアカウントから${run{true}}@yourdomain.nameに送信します

そして、リモートアドレスからその同じアドレスに送信します。

次に、以下の修正を行います。

注:異なる場合は、ログパスをメインログパスに交換してください。

とにかく、私はDebian分割ファイル構成を持っているので、次の行を見つけました

 90 .ifndef CHECK_RCPT_LOCAL_LOCALPARTS                                                                                                                                                     
 91 CHECK_RCPT_LOCAL_LOCALPARTS = ^[.] : ^.*[@%!/|`#&?]                                                                                                                                   
 92 .endif                                                                                                                                                                                  
 93                                                                                                                                                                                         
 94 .ifndef CHECK_RCPT_REMOTE_LOCALPARTS                                                                                                                                                    
 95 CHECK_RCPT_REMOTE_LOCALPARTS = ^[./|] : ^.*[@%!`#&?] : ^.*/\\.\\./                                                                                                                    
 96 .endif

そしてそれらを次のように変更しました:

 90 .ifndef CHECK_RCPT_LOCAL_LOCALPARTS                                                                                                                                                     
 91 CHECK_RCPT_LOCAL_LOCALPARTS = ^[.] : ^.*[\$@%!/|`#&?]                                                                                                                                   
 92 .endif                                                                                                                                                                                  
 93                                                                                                                                                                                         
 94 .ifndef CHECK_RCPT_REMOTE_LOCALPARTS                                                                                                                                                    
 95 CHECK_RCPT_REMOTE_LOCALPARTS = ^[./|] : ^.*[\$@%!`#&?] : ^.*/\\.\\./                                                                                                                    
 96 .endif

両方に「\ $」が追加されていることに注意してください。

その後、Eximを再起動します。

同じ方法で、成功した拒否をテストします。

ローカルのメールアカウントから${run{true}}@yourdomain.nameに送信します

そして、リモートアドレスからその同じアドレスに送信します。

成功し、通常はバウンス用に構成されている場合、2番目の送信ペアのバウンスをすぐに取得する必要があります。

ログの末尾で開いたターミナルを見てください。 2番目のペアで拒否が表示されます。

テストに関するその他のアイデア

したがって、基本的に、脆弱性はターミナルで行うのと同じように、シェルコマンドを実行するだけです。次のようなアドレスにコマンドを送信するだけです:${run{my_command}}@mytargetdomain.com。小さな問題があり、通常は(電子メールアドレスに対して)不正な文字をエンコードする必要があります。この方法でスクリプトを作成するか、/ binディレクトリにスクリプトをドロップして、たとえばファイルをルートディレクトリに保存します。

ローカルアドレスから送信して表示された場合は、ルートとして実行されることを意味するため、すばやく修正することをお勧めします。同じことを試すこともできますが、Eximを実行するユーザー(Ubuntuでは通常、ユーザーDebian-exim)が所有する/ runtestなどのフォルダーを作成します。それが表示された場合は、まだ疑わしい領域にいますが、ワームのワーストバリアントの最悪の場合はルートが必要なようです(これまでのところ、公開されているようですが、いつでも変わる可能性があります)。それでも修正します。

なぜ${run{true}}@mydomain.comを使用したのかと不思議に思っているのは、サーバーを破壊しない安全な方法で拒否をテストしたかったからです。

誰かがこれについて詳しく説明できる場合は、お願いします。世界はそれを聞く必要があります。

のぞき見、善、悪、無関心を1人も行っていないことに本当に驚いています。

時間があるので定期的に更新し、情報が入ります。

1
jdmayfield

これはeximを更新していない人々のために私たちが働いているものです。 ${run{...}}文字列に一致させる方がより具体的です。また、サーバーが脆弱かどうかをローカルで確認するためのスクリプト exim-cve-2019-10149

acl_smtp_rcptacl_check_rcptに設定されていない場合(おそらくMAIN_ACL_CHECK_RCPTを介して)、変更します

acl_smtp_rcpt = acl_smtp_rcpt

acl_smtp_rcpt = acl_check_rcpt

begin aclの後、または分割構成の/etc/exim4/conf.d/acl/30_exim4-config_check_rcptで、追加または変更します。

acl_check_rcpt:

  deny
    message = Restricted characters in address
    domains = +local_domains
    local_parts = ^[.] : ^.*[@%!/|] : ^.*\N\${run{\N.*}}

  deny
    message = Restricted characters in address
    domains = !+local_domains
    local_parts = ^[./|] : ^.*[@%!] : ^.*/\\.\\./ : ^.*\N\${run{\N.*}}

  accept
3
Andréw Hüang