漏洞信息
漏洞简介
- 漏洞名称:Redis redis-cli信息泄露漏洞
- 漏洞编号:CVE-2013-7458
- 漏洞类型:信息泄露
- CVSS评分:【CVSS v2.0:】【CVSS v3.0:3.3】
- 漏洞危害等级:低危
组件概述
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
漏洞概述
Redis redis-cli中存在本地信息泄露漏洞,该漏洞源于程序设置.rediscli_history文件为全局可读。攻击者可利用该漏洞获取敏感信息。
漏洞利用条件
攻击者先需要获取redis-server所在服务器的低权限用户。
漏洞影响
Redis: 3.2.2
漏洞复现
漏洞复现
本地使用redis-cli连接redis-server
1 | redis-cli |
随便输入一些命令
1 | 127.0.0.1:6379> config get client-output-buffer-limit |
退出redis-cli,用本地用户切换到/home路径下,查看.rediscli_history文件,此文件记录了redis-cli的一系列操作。
文件末尾包括刚刚执行的命令。
漏洞分析
技术背景
包含头文件:
/#include <sys/stat.h>
/#include <sys/types.h>
函数:
函数原型: int mkdir(const char *pathname, mode_t mode);
函数说明: mkdir()函数以mode方式创建一个以参数pathname命名的目录,mode定义新创建目录的权限。
返回值: 若目录创建成功,则返回0;否则返回-1,并将错误记录到全局变量errno中。
模式类型:
mode方式:
S_IRWXU 00700权限,代表该文件所有者拥有读,写和执行操作的权限
S_IRUSR(S_IREAD) 00400权限,代表该文件所有者拥有可读的权限
S_IWUSR(S_IWRITE) 00200权限,代表该文件所有者拥有可写的权限
S_IXUSR(S_IEXEC) 00100权限,代表该文件所有者拥有执行的权限
S_IRWXG 00070权限,代表该文件用户组拥有读,写和执行操作的权限
S_IRGRP 00040权限,代表该文件用户组拥有可读的权限
S_IWGRP 00020权限,代表该文件用户组拥有可写的权限
S_IXGRP 00010权限,代表该文件用户组拥有执行的权限
S_IRWXO 00007权限,代表其他用户拥有读,写和执行操作的权限
S_IROTH 00004权限,代表其他用户拥有可读的权限
S_IWOTH 00002权限,代表其他用户拥有可写的权限
S_IXOTH 00001权限,代表其他用户拥有执行的权限
Demo:
1 | int isCreate = mkdir(path,S_IRUSR | S_IWUSR | S_IXUSR | S_IRWXG | S_IRWXO); |
详细分析
代码分析
如果.rediscli_history文件不存在,则使用默认的umask 0022创建该文件,因此该文件的权限为0644。
redis-cli会将其历史记录默认写入~路径下,通常载/home中的文件夹,默认情况下,该文件夹可以在被其他用户读取,因为权限为0644,如上图所示。
在/deps/linenoise/linenoise.c文件中linenoiseHistorySave的函数,作用为创建一个文件,写入历史记录并保存。
/src/redis-cli.c文件的repl函数,调用了linenoiseHistorySave,来保存历史命令,创建.rediscli_history文件,没有考虑权限分配,默认umask为0022,故创建出一个权限为0644的.rediscli_history文件
补丁分析
在/deps/linenoise/linenoise.c文件中linenoiseHistorySave函数中增加,umask设置
打开文件前先进行权限掩码设置:
S_IWUSR 00200权限,代表该文件所有者拥有可写的权限, S_IRWXG 00070权限,代表该文件用户组拥有读,写和执行操作的权限,S_IRWXO 00007权限,代表其他用户拥有读,写和执行操作的权限。
写入数据后,更改文件权限(chmod)为 S_IRUSR 00400权限,代表该文件所有者拥有可读的权限, S_IWUSR(S_IWRITE) 00200权限,代表该文件所有者拥有可写的权限,其他组和其他用户无任何权限。