如何保護我的伺服器免受 CVE-2019-10149 - Exim - 已修補或未修補 - 如何拒絕發送給 RCPT ${run 的郵件
參考最近公佈的 Exim 漏洞 CVE-2019-10149,我正在 Ubuntu 18.04.2 LTS 上執行據稱已修補的 Exim v. 4.90_1(建構於 2019 年 6 月 4 日)。
儘管據說它已被修補,但根據 Canonical 的說法,我收到了很多以 Frozen 消息結尾的漏洞利用嘗試。
這有點令人擔憂。
有沒有辦法拒絕以“$”開頭的收件人的郵件?
我如何測試以確保這些漏洞利用不起作用?
快速版本:
為了保護您的伺服器免受 CVE-2019-10149“嚮導返回”漏洞的攻擊,無論是在修補或未修補的 Exim 版本上,如果您在基於 Debian 的作業系統上使用 Exim“split-config”,請添加以下行到 /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.92,但可能 > 4.91)。首先,升級您的 Exim、sshd 和真正的整個系統,盡可能合理和安全地升級。
修補後的 4.90_1 版本似乎確實阻止了入侵,因為我沒有發現任何已知證據表明我已閱讀文章中概述的“巫師歸來”Exim 蠕蟲。此外,Ubuntu 上的 Exim(我認為其他基於 Debian 的版本)在使用者 Debian-exim 下執行,而不是以 root 身份執行,因此這本身可能防止了很多損害。儘管 Debian-exim 使用者的妥協可能很糟糕,但它比 root 好得多。無論如何,我沒有看到任何成功篡改的跡象。
然而,這仍然令人擔憂。我看到的一件事是定期引用我的 Exim 主日誌中的凍結消息,其中 RCPT 都以 ${run{ 開頭,然後是編碼,這將減少到 /bin/bash 和一系列命令,包括可怕的 wget to一些陰暗的端點。
最具體地說,它們似乎都來自 89.248.171.57——一個解析為scanner20.openportstats.com 的IP。如果您看到類似的凍結消息,您可以訪問 openportstats.com 並查找您的 IP 以查看您是否在此處列出。該網站看起來有點像 shodan.io 。
問題是,他們是故意這樣做的嗎?還是他們被感染了?我最初認為是前者,但並不完全確定,因為當我查找我的 IP 時,我認為會提到有關 Exim 漏洞的結果,但只有從初始連接中提取的埠和數據的基本資訊。
無論如何,繼續前進。
來自 Ubuntu 的關於已修補的 Exim 版本的(相當模糊的)文章是: https ://usn.ubuntu.com/4010-1/
這是一篇更深入的文章,描述了所涉及的一些實際機制: https ://hackernews.blog/exim-4-87/#more
就個人而言,我認為許多消息來源我對此保持沉默,但偏執狂弊大於利,人們!對壞演員來說,這隻貓是出類拔萃的。那些試圖與之抗爭和/或只是保護自己的人需要更多資訊。
此修復程序旨在將您的Exim 更新為修補版本。
我不知道這是否會保護未打更新檔的版本免受此漏洞利用以及蠕蟲的侵害。但這似乎很可能基於我所閱讀的內容。如果由於某些瘋狂的原因您無法更新您的 Exim,請務必嘗試一下,讓我們知道它是如何工作的。
我確實認為漏洞存在於路由器中,而不是 ACL 中,但我已經掃描了這麼多垃圾,我的記憶現在有點炸了。
我可以說,因為我已經測試過了,這將拒絕任何帶有包含美元符號的 RCPT 地址的郵件。這包括 ${run’s.
我在這裡找到了關於拒絕 ${run’s 的長答案。 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
並從遠端地址發送到同一地址。
如果成功並且通常配置為退回,您應該立即獲得第二對發送的退回。
查看您使用日誌尾部打開的終端。您應該在第二對上看到拒絕。
關於測試的其他想法
所以基本上這個漏洞只是簡單地執行 shell 命令,就像你在終端上一樣。您只需將命令發送到/發送到這樣的地址: ${run{my_command}}@mytargetdomain.com 。有一個小問題,通常必須對非法字元(對於電子郵件地址)進行編碼。你可以這樣形成你的腳本,或者你可以在你的 /bin 目錄中放置一個腳本來做一些事情,比如——將一個文件保存到你的根目錄。
如果您從本地地址發送它並且它出現了,您最好快速修復它,因為這意味著它以 root 身份執行。您也可以嘗試相同的方法,但創建一個文件夾,即 /runtest 由您的 Exim 執行的使用者擁有(在 Ubuntu 上通常是使用者 Debian-exim)。如果它出現了,你仍然處於陰暗的領域,但最糟糕的蠕蟲變種似乎需要 root(到目前為止,我已經看到公開,但這可能隨時改變)。還是修吧。
如果您想知道我為什麼使用 ${run{true}}@mydomain.com,那是因為我希望以一種不會炸毀我的伺服器的安全方式來測試拒絕。
如果有人可以詳細說明這一點,請,請做。世界需要聽到它。
我真的很驚訝,沒有一個人窺視,好的,壞的或無動於衷的。
我會定期更新,因為我有時間,資訊進來了。
這就是我們為尚未更新 exim 的人所做的工作。
${run{...}}
匹配字元串更具體。這裡還有一個腳本,用於在本地檢查您的伺服器是否易受攻擊,exim-cve-2019-10149如果
acl_smtp_rcpt
尚未設置為acl_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