我已使用以下路由器和传输与 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
正确设置为替换。我无法进行查找,因为使用的电子邮件地址是任意的。我并不担心攻击者,因为演示服务器仅限于公司中的少数人。我想一个相对简单的检查来防止无效字符和类似..
防止文件目录转义的操作对我来说就足够了。
答案1
鉴于 exim 4.94 中关于污染变量的严格规则,这破坏了很多配置文件。
在配置的路由器部分,仅当您有配置选项时才会设置 $local_part_data检查本地用户(对于操作系统支持的本地用户)或通过设置选项的值本地部分。似乎在处理路由器部分后,ACL 期间卡在 $local_part_data 中的任何东西都会被丢弃。
如果你是绝对地尽管存在风险,但如果您确定要使用 $local_part 的值,您可以通过将此行放入路由器配置中来“消除”该值的污染(假设为 UNIX 操作系统):
local_parts = ${run{/bin/echo $local_part}{$value}}
现在您的 $local_part_data 已为传输部分设置。如果您希望使其更安全,您可以运行一个脚本来清理从 exim 传入的值。