在 Exim 邮件服务器中
在默认配置中,本地用户可以在没有不必要的复杂性的情况下执行攻击,因为应用了“验证=收件人”ACL,该ACL对外部地址执行额外的检查。 当设置更改时,例如充当另一个域的辅助 MX、删除“verify=recipient”ACL 或对 local_part_suffix 进行某些更改,可能会发生远程攻击。 如果攻击者能够将与服务器的连接保持打开状态 7 天(例如,每分钟发送一个字节以绕过超时),那么远程攻击也是可能的。 同时,可能存在更简单的攻击向量来远程利用该问题。
该漏洞是由于 /src/deliver.c 文件中定义的 Deliver_message() 函数中收件人地址验证不正确造成的。 通过操纵地址格式,攻击者可以将其数据替换为通过 root 权限的 execv() 函数调用的命令的参数。 操作不需要使用用于缓冲区溢出或内存损坏的复杂技术;简单的字符替换就足够了。
该问题与地址转换结构的使用有关:
交付本地部分 = 展开字符串(
string_sprintf("${local_part:%s}", new->address));
交付域=展开字符串(
string_sprintf("${域名:%s}", new->address));
Expand_string() 函数是一个过于复杂的组合器,包括识别命令“${run{commandargs}”,这会导致启动外部处理程序。 因此,要在 SMTP 会话中进行攻击,本地用户只需发送类似“RCPT TO “username+${run{...}}@localhost”的命令,其中 localhost 是 local_domains 列表中的主机之一, username 是现有本地用户的名称。
如果服务器用作邮件中继,则远程发送命令“RCPT TO“${run{...}}@relaydomain.com”就足够了,其中relaydomain.com是relay_to_domains中列出的主机之一设置部分。 由于 Exim 不默认为删除特权模式 (deliver_drop_privilege = false),因此通过“${run{...}}”传递的命令将以 root 身份执行。
值得注意的是,该漏洞是
对继续在发行版中使用的先前版本的修复目前仅提供
来源: opennet.ru