ALPACA 攻击防御|涓流攻击防御|高级 master.cf 查询/更新支持|屏幕后僵尸防御|TLS(SSL)重新协商攻击
ALPACA 攻击防御
[最近更新时间:2021 年 8 月]
ALPACA是一种混淆攻击,在这种攻击中,网络客户端希望与 https://example.com 通信,但却被诱骗与 SMTP、FTP、IMAP 或其他非网络服务器通信,而这些服务器也拥有 example.com 的 TLS 证书。 这样,客户端就可能将敏感信息提供给错误的服务。
Postfix 不能被用于此类攻击,因为 Postfix SMTP 服务器默认会在客户端发送 CONNECT、GET、POST 或任何看起来像报头的命令时放弃连接。 不良命令列表可通过smtpd_forbidden_commands 进行配置。 该功能是在 2004 年某人的 SMTP 服务器被大量来自开放代理的请求淹没后添加的。 在此之前,Postfix 命令解析器只拦截 CONNECT 和电子邮件中出现的硬编码标题列表。
SOPHOS 写了一篇很好的文章,说明 Postfix 如何阻止 ALPACA 攻击: https://nakedsecurity.sophos.com/2021/06/11/alpaca-the-wacky-tls-security-vulnerability-with-a-funky-name/
涓流攻击防御
[最近更新时间:2021 年 8 月]
涓流攻击(Trickle attacks)是一种古老的攻击方式,但在网络服务器中却备受关注。 其原理是攻击者缓慢地发送请求,例如一次一个字节。 由于许多服务器实行的是每次读取的时间限制,而不是每次事务的时间限制,因此攻击者可以让连接忙碌很长时间。 在 Postfix 2.8 及以上版本中,postscreen 守护进程提供了一个读取时间限制,即读取操作超时前的最长秒数乘以每个事务的最大字节数,再乘以每个会话的事务数。
Postfix 2.8 及更高版本中的postscreen守护进程可实现接收一条完整 SMTP 命令行的时间限制。 Postscreen 使用 300 秒的默认时限,以符合 RFC 的规定,但在超负荷的情况下,它会切换到 10 秒的时限。 Postscreen 会限制每个会话的命令数量,并且永远不会接收邮件,因此这是一个完整的解决方案。
Postfix 3.7 版本支持 Postfix SMTP 服务器和客户端的每次请求时间限制。 这限制了发送或接收一条完整 SMTP 命令或回复的总时间。 为了使这一解决方案更加完善,Postfix SMTP 服务器和客户端还可以强制执行最低(明文)数据传输速率,从而使大型电子邮件不会受到每次请求的时间限制。
整个过程只需在 Postfix 最低层例程中编写很少的代码即可实现。 有了每次请求的时间限制和最低数据传输速率,Postfix 的行为就和以前一样了,除非有人偷换字节。
这种防御措施比 2012 年实施的每记录时间限制更全面,因为后者无法强制执行最低数据传输速率。
参考:
smtpd_per_request_deadline,smtpd_min_data_rate,
smtp_per_request_deadline,smtp_min_data_rate 。
支持高级 master.cf 查询/更新
[最近更新时间:2013 年 11 月]
支持高级 master.cf 查询和更新操作主要是为了支持自动化系统管理工具。
其目的是使 Postfix master.cf 的所有详细信息都能以 "name=value "对列表的形式访问,其中的名称被组织到结构化的名称空间中。 这样,其他程序就可以查询信息或请求更新,而不必担心 master.cf 文件的具体布局。
首先,举例说明传统形式的 smtp/inet 服务:
$ postconf -M smtp/inet
smtp inet n - n - - smtpd
该命令的不同变体会显示不同数量的输出。 例如,"postconf -M smtp "会枚举所有名称为 "smtp "且服务类型为 "inet"、"unix "等的服务,而 "postconf -M "则会枚举所有 master.cf 服务。
一般规则:每个不存在的名称组件都会变成 "*"通配符。
回到上面的例子,postconf -F 选项现在可以枚举 smtp/inet 服务字段如下:
$ postconf -F smtp/inet
smtp/inet/service = smtp
smtp/inet/type = inet
smtp/inet/private = n
smtp/inet/unprivileged = -
smtp/inet/chroot = n
...
例如,在您使用的 smtp/inet 服务上打开 chroot:
$ postconf -F smtp/inet/chroot=y
此外,使用"-F "可以在服务名称或服务类型中指定 "*",以获得通配符匹配。 例如,要关闭所有 Postfix 守护进程的 chroot 功能,请使用下面的命令:
$ postconf -F '*/*/chroot=n'
第二个例子是提交服务。 该服务通常有多个"-o parameter=value "重载。 首先是传统视图:
$ postconf -Mf submission
submission inet n - n - - smtpd
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
...
postconf -P 选项现在可以枚举这些参数如下:
$ postconf -P submission
submission/inet/smtpd_sasl_auth_enable = yes
submission/inet/smtpd_tls_security_level = encrypt
...
同样,通过该表单可以非常方便地修改一个参数设置,例如更改提交/inet 服务的 smtpd_tls_security_level 设置:
$ postconf -P 'submission/inet/smtpd_tls_security_level=may'
您可以创建或删除 parametername=parametervalue 设置:
创建:
$ postconf -P 'submission/inet/parametername=parametervalue'
移除:
$ postconf -PX submission/inet/parametername
最后,还可以添加 master.cf 条目,但目前还没有 "高级 "支持。 它只能在传统 master.cf 文件格式的级别上完成。
例如,要克隆 smtp/unix 服务设置并创建一个新的延迟/unix 服务,可以这样枚举 smtp/unix 服务:
$ postconf -M smtp/unix
smtp unix - - n - - smtp
然后复制这些字段(第一个字段除外),更新或创建延迟/Unix 服务:
$ postconf -M delay/unix="delay unix - - n - - smtp"
将上述命令合并为一条命令:
$ postconf -M delay/unix="`postconf -M smtp/unix|awk '{$1 = "delay"}'`"
对于手动克隆来说,这也许不是超级方便,但对于程序化配置管理来说,这应该足够了。
main.cf 已经有了 -X(删除条目)和 -#(注释出条目)选项,现在它们也适用于整个 master.cf 条目:
删除 main.cf 或 master.cf 条目:
$ postconf -X parametername
$ postconf -MX delay/unix
注释 main.cf 或 master.cf 条目:
$ postconf -# parametername
$ postconf -M# delay/unix
目前还不支持操作其他守护进程选项(-v、-D)和非选项参数。 目前,请使用 "postconf -M "传统视图。
屏幕后僵尸防御
[最近更新时间:2010 年 11 月]
Postscreen 是一个新守护进程的代号,它位于 Postfix 的前端,可进行连接级过滤。 该程序目前是 Postfix 2.8 实验版本的一部分。
该程序的主要目标是
- 让僵尸远离 Postfix SMTP 服务器。 根据 MessageLabs 2010 年 8 月的报告,92% 的电子邮件是垃圾邮件,而 95% 的垃圾邮件是由僵尸网络发送的。
- 通过将 DNS blocklist 查找和 SMTP 协议检查等可能耗时的操作移出 SMTP 服务器,提高 Postfix 的可扩展性。
在圣何塞举行的 2010 LISA 会议上展示了几周垃圾邮件的早期结果:
- 垃圾邮件发送者 SMTP 客户端实施中的异常现象。 垃圾邮件发送者急于发送垃圾邮件,因此他们在 SMTP 协议中偷工减料。 Postscreen 目前可检测到过早开始说话的 SMTP 客户端(预触发器)。 Postscreen 包含一个假 SMTP 引擎,可记录被拒邮件的发件人和收件人。 这个虚拟引擎还能检测发送多条命令(流水线)和犯其他错误的垃圾邮件机器人。
- 从 DNS blocklists 和 whitelists 并行查找,可配置权重和拒绝阈值。
- 针对连接到欧洲服务器的垃圾邮件,提供地理定位和时间模式。 地理定位是根据日志文件分析离线完成的。
数据是在 Ralf Hildebrandt 的帮助下收集的。 在 2009 年的一次试点实验中,拉尔夫报告说,通过放弃与一台服务器的所有前端连接,他将 "所有服务器端口繁忙 "的频率从每天数次降低到了每周一次。
在这一领域,之前的工作已有很长的历史。 例如,OpenBSD spamd、MailChannels TrafficControl 以及 Michael Tokarev 在 2000 年代初的工作。
TLS (SSL) 重新协商攻击
[最近更新时间:2009 年 11 月]
2009 年 11 月初,有一则关于 TLS 协议安全漏洞的重大新闻,该漏洞允许中间人在完全安全的 TLS 会话中预先添加数据。 也就是说,服务器证书经过验证,因此没有人能读取或修改网络流量。 我们是这么认为的。 最初的讨论集中在对 HTTP 应用程序的影响上。
在研究这对 SMTP 邮件的影响时,Wietse 提出了一种攻击,可以重定向和修改通过完全安全的 TLS 连接发送的 SMTP 邮件;Victor 提出了一种攻击,可以更改 TLS 会话中的第一个命令。 您可以在以下网址找到初步分析:
http://www.porcupine.org/postfix-mirror/smtp-renegotiate.pdf
这篇文章附带了关于 TLS SMTP 和 TLS 重新协商攻击的小教程。
基于 TLS 的攻击对 SMTP 的影响不容忽视。 目前,大多数 SMTP 客户端都不验证 SMTP 服务器的 TLS 证书。 这些客户端已经很容易受到普通的中间人攻击,TLS 重新协商不会给它们带来新的威胁。
由于 Postfix 和 OpenSSL 实现的意外细节,使用 OpenSSL 的 Postfix SMTP 服务器不受重定向和修改 SMTP 邮件的 TLS 重新协商攻击的影响。 其他 SMTP 服务器实现可能会受到影响(我的报告描述了一些要求)。 当然,还可能存在我在撰写分析报告时没有注意到的其他攻击。
包括 Postfix 在内的大多数 SMTP 客户端实现都无法检测到 TLS 重新协商攻击在 SMTP 层面造成的后果。 在 TLS 协议和 TLS 实现中的错误修复之前,Victor 和 Wietse 已经研究了许多可以在 SMTP 客户端中实现的变通方法。 其中一些变通方法最终可能会被 Postfix 采用。