CVE-2013-7458_Redis redis-cli信息泄露漏洞

Catalogue
  1. 1. 漏洞信息
    1. 1.1. 漏洞简介
    2. 1.2. 组件概述
    3. 1.3. 漏洞概述
    4. 1.4. 漏洞利用条件
    5. 1.5. 漏洞影响
  2. 2. 漏洞复现
    1. 2.1. 漏洞复现
  3. 3. 漏洞分析
    1. 3.1. 技术背景
      1. 3.1.1. 包含头文件:
      2. 3.1.2. 函数:
      3. 3.1.3. 模式类型:
      4. 3.1.4. Demo:
    2. 3.2. 详细分析
      1. 3.2.1. 代码分析
      2. 3.2.2. 补丁分析
  4. 4. 参考资料

漏洞信息

漏洞简介

  • 漏洞名称: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
2
3
4
127.0.0.1:6379> config get client-output-buffer-limit
1) "client-output-buffer-limit"
2) "normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60"
127.0.0.1:6379>info

​ 退出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
2
3
4
5
int isCreate = mkdir(path,S_IRUSR | S_IWUSR | S_IXUSR | S_IRWXG | S_IRWXO);
if( !isCreate )
printf("create path:%s\n",path);
else
printf("create path failed! error code : %s \n",isCreate,path);

详细分析

代码分析

​ 如果.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权限,代表该文件所有者拥有可写的权限,其他组和其他用户无任何权限。

参考资料