为了让邮件交换机MX服务器能够向主MX发送邮件,在从辅助MX连接时需要绕过SPF和DMARC检查。对于SPF,这是相当简单的:如果次要MX执行SPF检查,它可以被白名单。
对于DMARC来说,这会变得更加复杂。OpenDMARC信任来自外部DKIM和SPF检查的Authentication-Results头。默认情况下,它将信任来自同一个主机名的Authentication-Results,并且任何辅助服务器也需要在这里列出。这不是秘密信息,因为它通常是在SMTP横幅中广告的同一个主机名。
TrustedAuthservIDs字符串##默认主机名## ##指定一个或多个要信任的"authserv-id“值作为中继真正的##上游DKIM和SPF结果。默认情况下,使用##的名称,即处理消息的MTA。若要指定列表,请用逗号分隔每个条目##。关键字"HOSTNAME“将被运行过滤器的主机名(如gethostname(3)函数所报告的)所取代。##受托者主机名
因此,可以通过添加单个伪造标头轻松绕过OpenDMARC:
Authentication-Results: <HOSTNAME>;
dkim=pass (1024-bit key; unprotected) header.d=example.com header.i=@example.com;我的问题是:在OpenDMARC或其他方法中是否有任何配置参数来减少此类攻击?这在其他DMARC实现中解决得更好吗?
在本例中,攻击:
_dmarc.example.com有TXT "v=DMARC1; p=reject; aspf=s; adkim=s;。check_policy_service unix:private/policy-spfRejectFailures true默认配置。知道主机名(mx.example.com)并使用工作SPF域作为信封发送方,可以完全绕过OpenDMARC,但不超过:
<-- 220 mx.example.com ESMTP Postfix (Debian/GNU)
--> HELO evil.example.net
<-- 250 mx.example.com
--> MAIL FROM:<someone.from@evil.example.net>
<-- 250 2.1.0 Ok
--> RCPT TO:<user@example.com>
<-- 250 2.1.5 Ok
--> DATA
<-- 354 End data with <CR><LF>.<CR><LF>
--> Authentication-Results: mx.example.com; spf=pass
--> Authentication-Results: mx.example.com;
--> dkim=pass (1024-bit key; unprotected) header.d=example.com header.i=@example.com;
--> From: <user@example.com>
--> To: <user@example.com>
--> Subject: forged Authentication-Results: mx.example.com;据推测,MX服务器将检查所有DKIM+SPF+DMARC,然后依次排队并追加:
Authentication-Results: mx.example.com; spf=pass (mailfrom) smtp.mailfrom=evil.example.net ...
Authentication-Results: mx.example.com; dmarc=pass (p=reject dis=none) header.from=example.com
Received: from smtp.evil.example.net (evil.example.net [198.51.100.80])
by mx.example.com (Postfix) with SMTP id D4AC64048A
for <user@example.com>;与由Authentication-Results添加的真正mx.example.com区别开来的唯一方法是手动修改Receiced头的顺序。我想我们可以看到一波新的“你被黑了”的骗局,用伪造的Authentication-Results来掩盖假From: <self>。
发布于 2019-03-06 14:45:05
/etc/opendmarc.conf:SPFIgnoreResults真SPFSelfValidate真From报头匹配。Authentication-Results。TrustedAuthservIDs中删除次要MX表单,这是根本原因。/etc/opendkim.conf:AlwaysAddARHeader是当OpenDMARC只计算最上面匹配的Authentication-Results时,一切都很好。
如果这样做不起作用,那么OpenDMARC实现中也会出现一个问题:这似乎是一个已知的未修复的错误,票据#223可以恶意通过带有多个DKIM签名的DMARC检查:
示例:
这将不正确地导致DMARC通行证。根本原因是,对opendmarc_policy_store_dkim的第二次调用不匹配确切的匹配,也不匹配子域匹配,而且由于先前存储的dkim_outcome不是pass,所以它跳过了这一操作,传递到set_final标签中,并将dkim_outcome结果设置为为先前存储的dkim_domain传递的结果,在本例中是amazon.de。允许它通过验证。根据文档,opendmarc_policy_store_dkim声明:“您可以从多个DKIM签名中输入此函数。该函数将从那些与域的标头对齐的函数中选择最成功的检查。”
注释中有一个补丁,但是由于它没有合并到源代码中,所以您无法从您喜欢的发行版中获得它,但是需要自己构建OpenDMARC。
https://security.stackexchange.com/questions/204828
复制相似问题