Exim
使用展示伺服器的 exim 為非本地收件人發送本地郵箱
我使用了以下路由器和 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 傳入的值。