Exim

使用展示伺服器的 exim 為非本地收件人發送本地郵箱

  • September 18, 2020

我使用了以下路由器和 exim < 4.94 的傳輸將所有郵件非本地郵件傳遞到郵箱文件,而不是實際發送它。這是一個展示伺服器來測試應用程序。處理郵箱文件以提供它們的 Web 視圖。

路由器:

nonlocal:
 debug_print = "R: nonlocal for $local_part@$domain"
 driver = accept
 domains = ! +local_domains
 transport = demo_spool
 no_more

交通:

demo_spool:
 debug_print = "T: appendfile for $local_part@$domain"
 driver = appendfile
 file = /var/mail/remote/${tr{$local_part@$domain}{.}{_}}
 delivery_date_add
 envelope_to_add
 return_path_add
 group = mail
 mode = 0660
 mode_fail_narrower = false

這停止與 exim 4.94 一起工作,因為它正確地認為$local_part(並且很可能$domain)被污染了(這將允許攻擊者控製文件名)。

我不完全了解$local_part_data. 預設 acl 檢查會在檢查 local_parts 時設置它,但我無法讓它最終出現在傳輸中。對於localuser路由器和local_delivery傳輸,它可以工作,我不知道為什麼。

我遇到的問題是我無法$local_part_data正確設置為替代品。我無法進行查找,因為使用的電子郵件地址是任意的。我真的不擔心攻擊者,因為展示伺服器僅限於公司中的少數人。我想一個相對簡單的檢查來防止無效字元和..防止文件目錄轉義之類的東西對我來說就足夠了。

鑑於 exim 4.94 中有關受污染變數的嚴格規則,這破壞了許多配置文件。

在配置的路由器部分中, $local_part_data 僅在您具有配置選項check_local_user(在作業系統支持的本地使用者的情況下)或通過設置選項local_parts的值時才被設置。一旦處理了路由器部分,似乎在 ACL 期間卡在 $local_part_data 中的任何內容都會被丟棄。

如果您絕對確定您希望使用 $local_part 的值,儘管存在任何風險,您可以通過將此行放入您的路由器配置(假設 UNIX 作業系統)來“消除”該值:

local_parts = ${run{/bin/echo $local_part}{$value}}

現在您的 $local_part_data 已設置為傳輸部分。如果你想讓這更安全,你可以執行一個腳本來清理從 exim 傳入的值。

引用自:https://serverfault.com/questions/1033023