如何保护我的服务器免受 CVE-2019-10149 攻击 - Exim - 已修补或未修补 - 如何拒绝发送至 RCPT ${run 的邮件

如何保护我的服务器免受 CVE-2019-10149 攻击 - Exim - 已修补或未修补 - 如何拒绝发送至 RCPT ${run 的邮件

针对最近公布的 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,那是因为我想以一种安全的方式测试拒绝,这样就不会破坏我的服务器。

如果有人能详细阐述这一点,请尽情阐述。世界需要听到它。

我真的很惊讶,没有一个人发表一点意见,无论是好的、坏的还是无所谓的。

只要我有时间并且有信息,我就会定期更新此内容。

相关内容