延遲 exim 中的字典攻擊

延遲 exim 中的字典攻擊

我的 exim 伺服器受到持續攻擊。我正在嘗試使用以下 acl 來延遲嘗試

  deny    condition     = ${if and {\
                        {>{$rcpt_count}{10}}\
                        {<{$recipients_count}{${eval:$rcpt_count/2}}} }}
          delay         = 5s
          message       = Rejected for too many bad recipients
          logwrite      = REJECT [$sender_host_address]: bad recipient count high [${eval:$rcpt_count-$recipients_count}]
         .endif

前 10 次嘗試後會延遲一次。

2023-09-10 12:14:34 H=([212.164.218.15]) [212.164.218.15] F=<[email protected]> rejected RCPT <[email protected]>: Unrouteable address
2023-09-10 12:14:34 H=([212.164.218.15]) [212.164.218.15] F=<[email protected]> rejected RCPT <[email protected]>: Unrouteable address
2023-09-10 12:14:34 H=([212.164.218.15]) [212.164.218.15] F=<[email protected]> rejected RCPT <[email protected]>: Unrouteable address
2023-09-10 12:14:34 H=([212.164.218.15]) [212.164.218.15] F=<[email protected]> rejected RCPT <[email protected]>: Unrouteable address
2023-09-10 12:14:34 H=([212.164.218.15]) [212.164.218.15] F=<[email protected]> rejected RCPT <[email protected]>: Unrouteable address
2023-09-10 12:14:34 H=([212.164.218.15]) [212.164.218.15] F=<[email protected]> rejected RCPT <[email protected]>: Unrouteable address
2023-09-10 12:14:34 H=([212.164.218.15]) [212.164.218.15] F=<[email protected]> rejected RCPT <[email protected]>: Unrouteable address
2023-09-10 12:14:34 H=([212.164.218.15]) [212.164.218.15] F=<[email protected]> rejected RCPT <[email protected]>: Unrouteable address
2023-09-10 12:14:34 H=([212.164.218.15]) [212.164.218.15] F=<[email protected]> rejected RCPT <[email protected]>: Unrouteable address
2023-09-10 12:14:34 H=([212.164.218.15]) [212.164.218.15] F=<[email protected]> rejected RCPT <[email protected]>: Unrouteable address
2023-09-10 12:14:39 REJECT [212.164.218.15]: bad recipient count high [11]
2023-09-10 12:14:39 H=([212.164.218.15]) [212.164.218.15] F=<[email protected]> rejected RCPT <[email protected]>: Rejected for too many bad recipients
2023-09-10 12:14:39 REJECT [212.164.218.15]: bad recipient count high [12]
2023-09-10 12:14:39 H=([212.164.218.15]) [212.164.218.15] F=<[email protected]> rejected RCPT <[email protected]>: Rejected for too many bad recipients

我希望它能推遲每次後續的嘗試。我怎樣才能做到這一點?

答案1

我遇到了同樣的問題,並做了一些研究和測試。

您需要了解的第一件事是,SMTP 最初是嚴格基於命令回應的,這意味著客戶端只能向伺服器發送命令,並且必須等待回應才能發送下一個命令。因為這種來回每次都需要安靜的等待,從而產生延遲,RFC 2920後來又介紹了「SMTP Pipelined」。這允許客戶端將多個命令批量發送到伺服器,伺服器處理這些命令並發迴回應。在 exim 中,「SMTP 管道」的可用性可以透過選項控制pipelining_advertise_hosts,預設允許每個人使用。我認為您的配置也是如此。

我認為在您的情況下發生的情況是客戶端(又稱垃圾郵件發送者)連接到您的 exim 伺服器,被告知它支援“SMTP 管道”,因此它發送了一批 100 個RCPT TO:命令。您的伺服器收到它們並開始處理它們,透過acl_smtp_rcpt每個收件者的 acl 運行。前 10 個指令550 Unrouteable address各回傳一個回應,550其中RFC5321錯誤代碼含義Requested action not taken後面跟著人類可讀的原因。該原因可以使用指令在 exim 中設置message,並且也會在冒號後面列印在日誌中。客戶可能只是忽略了他們;畢竟它正在尋找有效的收件人。

當處理第 11 個命令/接收者時,規則的條件deny評估為 true,並且 exim 延遲(休眠)5 秒;這就是您看到的延遲。之後它將550 Rejected for too many bad recipients響應發送給客戶端。由於所包含的(眾所周知的)原因,客戶端檢測到它越界了,並且沒有機會再找到有效的收件人;以下所有命令也將被拒絕。由於不再有任何值得期待/獲得的東西,它會終止連接而不等待其餘響應(並可能立即轉向下一個受害者)。當您的伺服器注意到這一點時(因為使用了 TCP),它仍然繼續處理命令批次。但由於與客戶端的 SMTP 連線已經終止,因此沒有必要再拖延了;它唯一會拖延的就是它自己。因此,延遲將被忽略,您的伺服器將運行命令,直到整個批次完成。

如果用戶端不會終止連接,這將像您預期的那樣工作:第 10 號之後將對每個接收者應用 5 秒的延遲。

假設上述內容是正確的,我能想到的最佳解決方案是刪除預設原因/訊息。如果伺服器只是繼續以類似的方式回應550 Unrouteable address,則客戶端無法知道它越界並且無法退出。根據客戶端的工作方式,將其更改/改寫為與預設值不同的內容可能就足夠了,因此不會對其進行特殊處理。

或者,您可以使用上述選項在伺服器中停用「SMTP 管道」。用戶端在看到第 11 個答案後可能仍然會中止,而且您的伺服器仍然只延遲一次,但至少您不會在日誌中看到其他 89 個失敗的收件者。明顯的缺點是您會「減慢」每個用戶端的速度,但是透過僅對選定的「已知良好」用戶端啟用「SMTP 管道」可以在一定程度上提高此速度。

順便一提:延遲不一定是靜態值,它也可以是表達式。這使得漸進式延遲成為可能,每增加一個無效收件者都會使延遲變得更長。優秀的郵件交換器的垃圾郵件過濾HowTo 有一個這樣的例子。

相關內容