使用 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正确设置为替换。我无法进行查找,因为使用的电子邮件地址是任意的。我并不担心攻击者,因为演示服务器仅限于公司中的少数人。我想一个相对简单的检查来防止无效字符和类似..防止文件目录转义的操作对我来说就足够了。

答案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 传入的值。

相关内容