如何创建欺骗 DKIM 验证者的电子邮件?

信息安全 电子邮件 电子签名 电子邮件欺骗 dkim
2021-08-13 19:53:11

发件人 Sammy 正在向收件人 Rita 发送电子邮件。我知道 Sammy 将对电子邮件应用 DKIM 签名,而 Rita 将使用 DKIM 验证器检查 DKIM 签名。我是一个恶意的中间人。我想修改电子邮件,以便 Rita 的邮件客户端中显示的标头值与 DKIM 签名的不同,但我仍然希望 Rita 收到的电子邮件在通过 DKIM 验证器时看起来是经过 DKIM 验证的。这可以做到吗?攻击者可以修改多少?

到目前为止,我已经学会了三种技术来做到这一点:

  1. 添加新标题。添加原始电子邮件中不存在且未包含在 DKIM 签名中的标头。Rita 的电子邮件客户端可能仍会显示该标头,即使它未包含在 DKIM 签名中。

  2. 标题的多个副本。添加具有不同值的同一标头的多个版本。DKIM 只会检查最后一项;如果电子邮件客户端显示第一个,则可以进行成功的攻击。更具体地说,在 DKIM 标头之前放置一个恶意标头(例如,From:具有恶意值的标头)。 如果我理解正确,DKIM 签名仅涵盖 DKIM 标头之后的标头,因此尽管恶意标头值未签名,但该签名似乎是有效的。信用:感谢罗伯特格雷厄姆指出这个技巧

  3. 在签名部分后添加内容。RFC 6376 指出了一种更隐蔽的攻击,如果原始电子邮件中的 DKIM 标头使用l=标签(大多数普通电子邮件通常不使用)并且不小心使用它。在大多数情况下可能不相关。

这些中的每一个都对攻击者可以实现的目标有限制。还有其他我忽略的攻击吗?

1个回答

首先,很好的问题。我已经通过修改现有邮件检查了 Thunderbird 的行为方式,它实际上采用第一个标头来显示 From、To 和 Subject 而 DKIM 签名机制从末尾开始:( 。因此即使 From, DKIM 签名也被认为是有效的, To 和 Subject 被欺骗了。有趣的是,第一个 From 行仅在邮件视图中使用,而在所有邮件的列表视图中,它显示最后一个 From 行。
至于其他攻击或您所描述的攻击如何用于你可能没有意识到的一种方式:

有一些邮件标头具有有趣的副作用,而且这些标头通常没有得到完全保护(即防止更改或添加新标头)。值得注意的是 Content-Type 和 Content-Transfer-Encoding 对内容如何被解释具有特殊意义。操纵这些标头可以产生有趣的效果。例如,具有不存在边界的 Content-Type multipart 会导致 Thunderbird 不再显示邮件的原始文本,而是显示空白内容。当结合欺骗主题(“从 hxxp://...下载更新”)和/或回复时,此意外的空白内容可用于社交攻击。例子:

 Subject: Blank mail? Download hotfix for your mail client at http://....
 Content-type: multipart/mixed; boundary=boundary_does_not_exist
 Subject: original subject
 Content-type: original/type

类似地将非多部分内容的 Content-Transfer-Encoding 更改为 base64 可能会导致它仅显示可以类似用于社交攻击的乱码。例子:

 Subject: Mail corrupt? Download hotfix for your mail client at http://....
 Content-Transfer-Encoding: base64
 Subject: original subject
 Content-type: text/plain

如果 DKIM 签名用于l=限制正文哈希中使用的行数,则还可以通过将 Content-type 更改(或添加)为具有特殊边界的某些多部分类型来“替换”邮件的内容。然后设计边界以跳过包含在散列中的现有内容,这些内容将被视为新 MIME 部分的前导码(因此不会显示)。例子:

 Content-type: multipart/mixed; boundary=my_own_boundary
 DKIM-Signature: ... bh=...; l=...
 Content-type: original/type

 here is the original content, no matter if single part or multipart
 this is the last line included in the body hash

 --my_own_boundary
 Content-type: text/plain

 Only this text is shown at the recipient
 --my_own_boundary--

... 使用 al= 标签(大多数普通电子邮件通常不使用)

l=实际上,我很惊讶在我的邮箱中找到了多少 DKIM 签名。值得注意的是,来自 cisco.com 的邮件使用(d?)此功能,我已使用一个以我描述的方式成功替换内容,同时保持签名有效。

除了修改来自 Sammy 的现有邮件外,攻击者还可以创建一封新邮件给 Rita,看起来它来自 Sammy。这可以通过创建具有有效 DKIM 签名的邮件,然后在顶部添加伪造的 From 标头来完成。如果 Rita 只是检查 DKIM 签名是否有效,她不会发现任何问题。如果她还检查签名域是否与发件人域匹配,则结果取决于用于此验证的 From 标头。但是,如果 Sammy 使用公共邮件提供商之一,攻击者可以简单地在那里获得一个邮件帐户,然后在检查域时考虑哪个 From 无关紧要,因为两者都来自同一个域。

编辑:这里的问题导致了 2017 年的一些更大规模的研究,我展示了如何在不破坏现实生活中的 DKIM 签名的情况下修改邮件。请参阅打破 DKIM-故意和偶然