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來運行生成的命令。
因為 _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()。
角色IP地址可以包含任意的內容,設置一些字元的限制,這允許攻擊者來執行任意的shell命令。
GET_SYSTEM_STATUS和CLEAR_BAD_ROLES MMM協議消息可以被用來調用每個角色的IP地址值的MMM::Agent::Helpers::check_ip($if, $ip)。check_ip()也會把不可信的$ip值在沒有處理的情況下傳給_execute()。
因為輸入源有很多,_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主機上運行下面的命令:
被引用來防止在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主機上運行下面的命令:
已經被引用防止在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主機上運行下面的命令:
已經被引用防止在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主機上運行下面的命令:
已經被引用防止在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主機上運行下面的命令:
已經被引用防止在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主機上運行下面的命令:
已經被引用防止在MMM::Agent::Helpers::_execute()中翻譯的惡意角色IP地址值會以被引用的形式達到clear_ip(),允許任意代碼執行。
CVE-2017-14481 - MMM::Agent::Helpers::Network::send_arp() (Solaris)
新的IP地址配置成功後,configure_ip helper命令的實施會發送gratuitous ARP:
在Solaris系統中,在send_arp() 在對$ip的值插入到shell命令中前不會對其進行處理。這樣雖然很危險,但是這個實例並不會馬上被利用,因為send_arp()只有當add_ip()成功時才會被調用;如果MMM::Agent::Helpers::Network::check_ip()不能驗證IP地址配置嘗試是成功的,那麼就會返回失敗。check_ip()會嘗試去匹配角色IP地址的全文和來自操作系統的值。$ip中額外的非IP地址字元會導致check_ip()返回錯誤:
但應該修復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證書。
2.為每個mmm_agentd主機生成私鑰和證書:
3.為每個mmm_mond主機生成私鑰和證書:
4.配置mmm_agentd主機需要mmm_mond客戶端識別mmm_mond CA證書,增加下面的配置內容到 /etc/.../mmm_agent.conf:
5.配置mmm_mond主機需要mmm_agentd daemons識別mmm_agentd CA證書,增加下面的配置內容到 /etc/.../mmm_mon.conf:
6.重啟mmm_agentd和mmm_mond進程。
※如何拿下Gooligan(二):深度分析內部工作原理
※人工智慧在惡意應用領域的預測、預防和緩解方式
TAG:嘶吼RoarTalk |