针对最近公布的 Exim 漏洞 CVE-2019-10149,我在 Ubuntu 18.04.2 LTS 上运行据称已修补的 Exim v. 4.90_1(2019 年 6 月 4 日构建)。
尽管据称已经修补,但根据 Canonical 的说法,我收到了很多漏洞尝试,最终都以“冻结”消息结束。
这实在有些令人担忧。
有没有办法拒绝以“$”开头的收件人的消息?
我该如何测试才能确保这些漏洞不会起作用?
答案1
这是我们为尚未更新 exim 的用户提供的。它更具体匹配${run{...}}
字符串。这里还有一个脚本,用于本地检查您的服务器是否易受攻击,exim-cve-2019-10149
如果acl_smtp_rcpt
尚未设置为acl_check_rcpt
(可能通过MAIN_ACL_CHECK_RCPT
),则更改
acl_smtp_rcpt = acl_smtp_rcpt
到
acl_smtp_rcpt = acl_check_rcpt
之后begin acl
,或在/etc/exim4/conf.d/acl/30_exim4-config_check_rcpt
拆分配置中,添加或修改:
acl_check_rcpt:
deny
message = Restricted characters in address
domains = +local_domains
local_parts = ^[.] : ^.*[@%!/|] : ^.*\N\${run{\N.*}}
deny
message = Restricted characters in address
domains = !+local_domains
local_parts = ^[./|] : ^.*[@%!] : ^.*/\\.\\./ : ^.*\N\${run{\N.*}}
accept
答案2
快速版本:
为了保护您的服务器免受 CVE-2019-10149“WIZard 回归”漏洞的攻击,无论是修补还是未修补的 Exim 版本,如果您使用的是带有 Exim“split-config”的基于 Debian 的操作系统,请将以下几行添加到 /etc/exim4/conf.d/main 文件夹中的 00_local_macros 文件中,或该文件在您系统上的任何路径中:
CHECK_RCPT_LOCAL_LOCALPARTS = ^[.] : ^.*[\${}@%!/|`#&?] : ^.*/\\.\\./
CHECK_RCPT_REMOTE_LOCALPARTS = ^[.] : ^.*[\${}@%!/|`#&?] : ^.*/\\.\\./
此外,最好添加:
smtp_banner = $smtp_active_hostname ESMTP $tod_full
这将更改你的 Exim 服务器问候语,以排除其版本号,以及它是 Exim 的事实,因此服务扫描程序https://shodan.io不会将该信息(稍后)显示为特定于此漏洞(或任何其他基于 Exim 的漏洞)的表面攻击媒介。
其他系统可能略有不同,但基本上您只需拒绝系统上包含附加字符“$”、“{”和“}”的收件人地址即可。您只需将美元符号添加到指定非法字符的配置中,但我希望在发现类似漏洞时更加安全,所以我也添加了花括号。
唯一的警告是,如果您本地系统上的地址包含美元符号或花括号,他们将无法收到邮件。但是谁的地址是 $$bling{me}@whatever.com?它不会阻止向这些地址发送邮件,但是,万一您向 my{$$$}@somewhere-else.com 发送邮件
这还有一个额外的好处,那就是不仅可以拒绝漏洞邮件,还可以向有问题的服务器发送退回邮件。
我在这里阐述这个问题:
https://www.bleepingcomputer.com/forums/t/699962/mail-remote-code-execution-attempt/#entry4818756
此前在这个蝙蝠频道上——
背景:这是针对已修补的 Exim(可能小于 4.92,但很可能大于 4.91)的。首先,尽可能合理安全地升级您的 Exim、sshd 以及整个系统。
修补后的 4.90_1 版本确实似乎阻止了入侵,因为我没有发现我读过的文章中概述的“巫师回归”Exim 蠕虫的任何已知证据。此外,Ubuntu 上的 Exim(我认为其他基于 Debian 的版本也是)在用户 Debian-exim 下运行,而不是以 root 身份运行,因此这本身可能已经阻止了很多破坏。尽管 Debian-exim 用户的入侵可能很严重,但它比 root 要好得多。无论如何,我还没有看到任何成功篡改的迹象。
但这仍然令人担忧。我看到的一件事是,我的 Exim 主日志中定期引用冻结消息,其中的 RCPT 都以 ${run{ 开头,后面跟着一些代码,这些代码会缩减为 /bin/bash 之类的内容和一系列命令,包括可怕的 wget 命令,这些命令指向一些可疑的端点。
具体来说,它们似乎都来自 89.248.171.57——该 IP 解析为 scanner20.openportstats.com 。如果您看到类似的冻结消息,您可以转到 openportstats.com 并查找您的 IP,看看您是否在那里列出。该网站看起来有点像 shodan.io 。
问题是,他们是故意这样做的吗?还是他们被感染了?我最初认为是前者,但并不完全确定,因为当我查找我的 IP 时,我以为会有一些关于 Exim 漏洞的结果,但只有关于端口的基本信息和从初始连接中提取的数据。
无论如何,继续前进。
Ubuntu 上有关修补的 Exim 版本的 (相当模糊的) 文章是: https://usn.ubuntu.com/4010-1/
这里有一篇更深入的文章,描述了其中涉及的一些实际机制: https://hackernews.blog/exim-4-87/#more
我个人认为,很多消息来源对此都守口如瓶,但人们,这种偏执带来的坏处多于好处!坏人已经暴露了。那些试图与之抗争和/或只是保护自己的人需要更多信息。
此修复旨在此外将您的 Exim 更新为修补版本。
我不知道这是否能保护未打补丁的版本免受此漏洞和蠕虫的侵害。但根据我所读到的内容,这似乎是可能的。如果由于某种疯狂的原因你无法更新你的 Exim,一定要试一试,并让我们知道它的效果如何。
我确实认为漏洞存在于路由器中,而不是 ACL,但我已经扫描了太多垃圾,现在我的记忆有点混乱了。
我能说的是,因为我已经测试过了,这将拒绝任何带有包含美元符号的 RCPT 地址的邮件。其中包括 ${run's。
我在这里找到了关于拒绝${run's. https://marius.bloggt-in-braunschweig.de
回想起来这似乎很明显,但当时我想得太多了。
这里是:
您可以在修复之前实时测试以下修复,方法是打开另一个终端并运行
tail -Fn +0 /var/log/exim4/mainlog | grep "{run"
然后从本地邮件帐户发送至 ${run{true}}@yourdomain.name
并从远程地址发送到同一地址。
然后进行下面的修复。
注意:如果不同,请将日志路径替换为主日志路径。
无论如何,我有 Debian 拆分文件配置,所以我只找到了以下几行
90 .ifndef CHECK_RCPT_LOCAL_LOCALPARTS
91 CHECK_RCPT_LOCAL_LOCALPARTS = ^[.] : ^.*[@%!/|`#&?]
92 .endif
93
94 .ifndef CHECK_RCPT_REMOTE_LOCALPARTS
95 CHECK_RCPT_REMOTE_LOCALPARTS = ^[./|] : ^.*[@%!`#&?] : ^.*/\\.\\./
96 .endif
并将其改为:
90 .ifndef CHECK_RCPT_LOCAL_LOCALPARTS
91 CHECK_RCPT_LOCAL_LOCALPARTS = ^[.] : ^.*[\$@%!/|`#&?]
92 .endif
93
94 .ifndef CHECK_RCPT_REMOTE_LOCALPARTS
95 CHECK_RCPT_REMOTE_LOCALPARTS = ^[./|] : ^.*[\$@%!`#&?] : ^.*/\\.\\./
96 .endif
请注意两者都添加了“\$”。
然后重新启动 Exim。
测试是否拒绝成功,方法相同:
从本地邮件帐户发送至 ${run{true}}@yourdomain.name
并从远程地址发送到同一地址。
如果成功,并且正常配置了退回,您应该立即收到第二对发送的退回。
查看你打开的带有日志尾部的终端。你应该看到第二对被拒绝。
关于测试的其他想法
因此,漏洞基本上只是执行 shell 命令,就像您在终端上执行的操作一样。您只需将命令发送到/发送到以下地址:${run{my_command}}@mytargetdomain.com。有一个小问题,通常必须对非法字符(对于电子邮件地址)进行编码。您可以用这种方式编写脚本,或者您可以将脚本放在 /bin 目录中,该脚本会执行某些操作,例如将文件保存到根目录。
如果您从本地地址发送它并且它出现了,您最好尽快修复它,因为这意味着它以 root 身份运行。您也可以尝试相同的方法,但创建一个文件夹,即 /runtest,由运行 Exim 的用户拥有(在 Ubuntu 上通常是 Debian-exim 用户)。如果它出现了,您仍然处于可疑的境地,但最糟糕的蠕虫变体似乎需要 root(到目前为止,我已经看到公开的,但这可能随时会改变)。仍然修复它。
如果你想知道我为什么使用 ${run{true}}@mydomain.com,那是因为我想以一种安全的方式测试拒绝,这样就不会破坏我的服务器。
如果有人能详细阐述这一点,请尽情阐述。世界需要听到它。
我真的很惊讶,没有一个人发表一点意见,无论是好的、坏的还是无所谓的。
只要我有时间并且有信息,我就会定期更新此内容。