导语:思科研究人员发现MySQL mmm_agent存在远程代码注入漏洞,本文对漏洞的细节和环节措施进行了分析。

概述

MySQL Master-Master Replication Manager (MMM) mmm_agentd daemon 2.2.1发现多个可利用的远程代码注入漏洞。一般mmm_agentd不会以root权限运行,默认情况下也不需要认证。攻击者伪造一个特殊的MMM协议消息可以造成shell命令注入,导致以mmm_agentd process任意命令执行。攻击者可以用含有mmm_agented的TCP session来触发这些漏洞。

漏洞详情

MMM即MySQL的多主复制管理工具,提供给MySQL数据库集群很高的可用性。在MMM环境中,每个MySQL服务器主机运行在mmm_agentd代理之上。在默认配置中,mmm_agentd不需要认证,而且是以root权限运行的,因为需要足够的权限来重新配置网络接口。

研究人员发现mmm_agentd含有多个远程利用命令注入漏洞。在许多MMM环境中,如果非认证的网络攻击者可以与mmm_agentd process建立TCP连接,就可以以root权限运行任意命令。该漏洞产生的原因是mmm_agentd在shell命令中含有攻击者提供的输入,而这些输入都没有经过适当的处理。

比如,MMM SET_STATUS 协议消息可以给mmm_agentd主机分配角色。角色是在role_name(ip_addr) 列表中用“,”隔开的,比如 role_a(10.10.10.10),role_b(10.10.10.11)。lib/Common/Role.pm中的MMM::Common::Role::from_string()使用下面的表达式来对角色名和IP地址进行分割:

/(.*)\((.*)\)/

这样,最后一个圆括号之前的部分会被翻译为角色名,剩下的到最后一个闭合圆括号的内容会被翻译为角色的IP地址。攻击者可以构造一个恶意IP地址,来让之后的角色处理代码调用任意命令,如role_a(10.10.10.10`malicious_command`)。

恶意IP地址值是由mmm_agentd中的shell和帮助应用共同翻译的。角色的IP地址值应该经过验证来确保其有效性。但是,因为其他的数据流可能会允许恶意输入到达有漏洞的函数,所有要融入shell命令的动态值都应该处理来确保shell元字符不引入新的参数或者执行其他命令。

CVE-2017-14474 – MMM::Agent::Helpers::_execute()

MMM::Agent::Helpers::_execute() 函数接受一个命令和含有命令执行参数的字符串,它会通过把路径,请求的命令,mmm_agentd config文件和特定的参数联系起来,构造一个Bourne shell命令行。_execute()用Perl backtick operator来运行生成的命令。

image.png

因为 _execute() 不会处理$params,$params里的任意shell元字符都会被shell翻译。有许多的代码路径可以用$params参数中不安全的输入来调用 _execute() 。为了处理新增和删除的角色,mmm_agentd会为每个新增的角色调用MMM::Agent::Helpers::configure_ip($if, $ip) ,为每个删除的角色调用MMM::Agent::Helpers::clear_ip($if, $ip)。这两个函数都会把$ip在没有处理的情况下传递给_execute()。

image.png

角色IP地址可以包含任意的内容,设置一些字符的限制,这允许攻击者来执行任意的shell命令。

GET_SYSTEM_STATUS和CLEAR_BAD_ROLES MMM协议消息可以被用来调用每个角色的IP地址值的MMM::Agent::Helpers::check_ip($if, $ip)。check_ip()也会把不可信的$ip值在没有处理的情况下传给_execute()。

image.png

因为输入源有很多,_execute()应该进行修改来获取一个离散的命令参数数组,使用execv这样的功能或引用命令参数来防止shell翻译。

CVE-2017-14475 – MMM::Agent::Helpers::Network::add_ip() (Linux)

如上所述,为了配置新的IP地址,mmm_agentd会调用:

/path/to/agent/configure_ip  /path/to/mmm_agent.conf  $if  $ip

为了给特定的端口增加IP地址,configure_ip 帮助命令会调用MMM::Agent::Helpers::Network::add_ip()。它会在Linux主机上运行下面的命令:

image.png

被引用来防止在MMM::Agent::Helpers::_execute() 中翻译的恶意角色IP地址就会到达add_ip(),允许任意命令的执行。

CVE-2017-14476 – MMM::Agent::Helpers::Network::add_ip() (Solaris)

为了配置新的 IP地址,mmm_agentd调用了:

/path/to/agent/configure_ip  /path/to/mmm_agent.conf  $if  $ip

为了在特定接口增加IP地址,configure_ip helper命令会调用MMM::Agent::Helpers::Network::add_ip()。在Solaris主机上运行下面的命令:

image.png

已经被引用防止在MMM::Agent::Helpers::_execute()中翻译的恶意角色IP地址值会以被引用的形式达到add_ip(),允许任意代码执行。

CVE-2017-14477 – MMM::Agent::Helpers::Network::add_ip() (FreeBSD)

为了配置新的 IP地址,mmm_agentd调用了:

/path/to/agent/configure_ip  /path/to/mmm_agent.conf  $if  $ip

为了在特定接口增加IP地址,configure_ip helper命令会调用MMM::Agent::Helpers::Network::add_ip()。在FreeBSD主机上运行下面的命令:

image.png

已经被引用防止在MMM::Agent::Helpers::_execute()中翻译的恶意角色IP地址值会以被引用的形式达到add_ip(),允许任意代码执行。

CVE-2017-14478 – MMM::Agent::Helpers::Network::clear_ip() (Linux)

为了移除已删除角色的IP地址,mmm_agentd调用了:

/path/to/agent/clear_ip  /path/to/mmm_agent.conf  $if  $ip

为了在特定接口删除IP地址, clear_ip helper命令会调用MMM::Agent::Helpers::Network::clear_ip()。在Linux主机上运行下面的命令:

image.png

已经被引用防止在MMM::Agent::Helpers::_execute()中翻译的恶意角色IP地址值会以被引用的形式达到clear_ip(),允许任意代码执行。

CVE-2017-14479 – MMM::Agent::Helpers::Network::clear_ip() (Solaris)

为了移除已删除角色的IP地址,mmm_agentd调用了:

/path/to/agent/clear_ip  /path/to/mmm_agent.conf  $if  $ip

为了在特定接口删除IP地址, clear_ip helper命令会调用MMM::Agent::Helpers::Network::clear_ip()。在Solaris主机上运行下面的命令:

image.png

已经被引用防止在MMM::Agent::Helpers::_execute()中翻译的恶意角色IP地址值会以被引用的形式达到clear_ip(),允许任意代码执行。

CVE-2017-14480 – MMM::Agent::Helpers::Network::clear_ip() (FreeBSD)

为了移除已删除角色的IP地址,mmm_agentd调用了:

/path/to/agent/clear_ip  /path/to/mmm_agent.conf  $if  $ip

为了在特定接口删除IP地址, clear_ip helper命令会调用MMM::Agent::Helpers::Network::clear_ip()。在FreeBSD主机上运行下面的命令:

image.png

已经被引用防止在MMM::Agent::Helpers::_execute()中翻译的恶意角色IP地址值会以被引用的形式达到clear_ip(),允许任意代码执行。

CVE-2017-14481 – MMM::Agent::Helpers::Network::send_arp() (Solaris)

新的IP地址配置成功后,configure_ip helper命令的实施会发送gratuitous ARP:

image.png

在Solaris系统中,在send_arp() 在对$ip的值插入到shell命令中前不会对其进行处理。这样虽然很危险,但是这个实例并不会马上被利用,因为send_arp()只有当add_ip()成功时才会被调用;如果MMM::Agent::Helpers::Network::check_ip()不能验证IP地址配置尝试是成功的,那么就会返回失败。check_ip()会尝试去匹配角色IP地址的全文和来自操作系统的值。$ip中额外的非IP地址字符会导致check_ip()返回错误:

image.png

但应该修复send_arp()来对shell命令参数进行处理,因为这样的行为可能会在之后的释放版本中进行改变。

缓解

通过配置mmm_agentd来请求TLS多认证和使用网络ACL来拦截除合法主机外的其他主机访问mmm_agentd,可以减轻这些漏洞带来的影响。开启TLS多认证的步骤如下:

1.生成对MMM唯一的mmm_agentd和mmm_mond CA。mmm_agentd和mmm_mond会接受所有可信CA签名的证书。因此,为了防止非MMM节点连接到mmm_agent,并防止恶意mmm_agentd主机模仿mmm_mond,应该创建新的独立的CA来签署mmm_agentd和mmm_mond证书。

image.png

2.为每个mmm_agentd主机生成私钥和证书:

image.png

3.为每个mmm_mond主机生成私钥和证书:

image.png

4.配置mmm_agentd主机需要mmm_mond客户端识别mmm_mond CA证书,增加下面的配置内容到 /etc/…/mmm_agent.conf:

image.png

5.配置mmm_mond主机需要mmm_agentd daemons识别mmm_agentd CA证书,增加下面的配置内容到 /etc/…/mmm_mon.conf:


image.png

6.重启mmm_agentd和mmm_mond进程。

源链接

Hacking more

...