Qualys์ ๋ณด์ ์ฐ๊ตฌ์๋ค์ Linux ์ปค๋๊ณผ systemd ์์คํ ๊ด๋ฆฌ์์ ์ํฅ์ ๋ฏธ์น๋ ๋ ๊ฐ์ง ์ทจ์ฝ์ ์ ๋ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ๊ณต๊ฐํ์ต๋๋ค. ์ปค๋์ ์ทจ์ฝ์ (CVE-2021-33909)์ผ๋ก ์ธํด ๋ก์ปฌ ์ฌ์ฉ์๊ฐ ๊ณ ๋๋ก ์ค์ฒฉ๋ ๋๋ ํฐ๋ฆฌ๋ฅผ ์กฐ์ํ์ฌ ๋ฃจํธ ๊ถํ์ผ๋ก ์ฝ๋๋ฅผ ์คํํ ์ ์์ต๋๋ค.
์ฐ๊ตฌ์๋ค์ด ๊ธฐ๋ณธ ๊ตฌ์ฑ์ Ubuntu 20.04/20.10/21.04, Debian 11 ๋ฐ Fedora 34์์ ์๋ํ๋ ์ต์คํ๋ก์์ ์ค๋นํ ์ ์์๋ค๋ ์ฌ์ค๋ก ์ธํด ์ทจ์ฝ์ ์ ์ํ์ด ๋์ฑ ๊ฐ์ค๋์์ต๋๋ค. ๋ค๋ฅธ ๋ฐฐํฌํ์ ํ ์คํธ๋์ง ์์์ง๋ง ์ด๋ก ์ ์ผ๋ก ๋ฌธ์ ์ ์ทจ์ฝํ๊ณ ๊ณต๊ฒฉ์ ๋ฐ์ ์ ์๋ค๋ ์ ์ ์ ์ํ์ธ์. ๋ชจ๋ ๊ณณ์์ ๋ฌธ์ ๊ฐ ์ ๊ฑฐ๋ ํ ์ต์คํ๋ก์์ ์ ์ฒด ์ฝ๋๊ฐ ๊ฒ์๋ ๊ฒ์ด๋ผ๊ณ ์ฝ์๋์์ง๋ง ํ์ฌ๋ ๊ธฐ๋ฅ์ด ์ ํ๋ ํ๋กํ ํ์ ๋ง ์ฌ์ฉํ ์ ์์ด ์์คํ ์ถฉ๋์ด ๋ฐ์ํฉ๋๋ค. ์ด ๋ฌธ์ ๋ 2014๋ 3.16์๋ถํฐ ๋ฐ์ํ์ผ๋ฉฐ 19๋ถํฐ ์์๋๋ ์ปค๋ ๋ฆด๋ฆฌ์ค์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์ทจ์ฝ์ ์์ ์ ์ปค๋ฎค๋ํฐ์ ํ๋ ฅํ์ฌ XNUMX์ XNUMX์ผ์ ์ปค๋์ ์น์ธ๋์์ต๋๋ค. ์ฃผ์ ๋ฐฐํฌํ์์๋ ์ด๋ฏธ ์ปค๋ ํจํค์ง(Debian, Ubuntu, Fedora, RHEL, SUSE, Arch)์ ๋ํ ์ ๋ฐ์ดํธ๋ฅผ ์์ฑํ์ต๋๋ค.
์ด ์ทจ์ฝ์ ์ ์ผ๋ จ์ ๋ ์ฝ๋์์ ํ์ผ์ ์์ฑํ๋ seq_file ์ฝ๋์์ ์์ ์ ์ํํ๊ธฐ ์ ์ size_t์์ int๋ก์ ๋ณํ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ์ง ๋ชปํ์ฌ ๋ฐ์ํฉ๋๋ค. ํ์ธํ์ง ์์ผ๋ฉด ๋งค์ฐ ์ค์ฒฉ๋ ๋๋ ํฐ๋ฆฌ ๊ตฌ์กฐ(1GB๋ณด๋ค ํฐ ๊ฒฝ๋ก ํฌ๊ธฐ)๋ฅผ ์์ฑ, ๋ง์ดํธ ๋ฐ ์ญ์ ํ ๋ ๋ฒํผ์ ๋ํ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์ฐ๊ธฐ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ๊ณต๊ฒฉ์๋ ํ ๋น๋ ๋ฒํผ ๋ฐ๋ก ์ ์์ญ์ ๊ฐ๋ฆฌํค๋ "-10GB - 2๋ฐ์ดํธ"์ ์คํ์ ์ ๊ธฐ๋ก๋ 10๋ฐ์ดํธ ๋ฌธ์์ด "//์ญ์ "๋ฅผ ์ป์ ์ ์์ต๋๋ค.
์ค๋น๋ ์ต์คํ๋ก์์ด ์๋ํ๋ ค๋ฉด 5GB์ ๋ฉ๋ชจ๋ฆฌ์ 1๋ฐฑ๋ง ๊ฐ์ ์ฌ์ inode๊ฐ ํ์ํฉ๋๋ค. ์ด ์ต์คํ๋ก์์ mkdir()์ ํธ์ถํ์ฌ ์ฝ ๋ฐฑ๋ง ๊ฐ์ ํ์ ๋๋ ํฐ๋ฆฌ ๊ณ์ธต์ ์์ฑํ์ฌ 1GB๋ฅผ ์ด๊ณผํ๋ ํ์ผ ๊ฒฝ๋ก ํฌ๊ธฐ๋ฅผ ๋ฌ์ฑํ๋ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค. ์ด ๋๋ ํ ๋ฆฌ๋ ๋ณ๋์ ์ฌ์ฉ์ ๋ค์์คํ์ด์ค์ ๋ฐ์ธ๋ ๋ง์ดํธ๋ฅผ ํตํด ๋ง์ดํธ๋ ํ rmdir() ํจ์๋ฅผ ์คํํ์ฌ ์ ๊ฑฐํฉ๋๋ค. ๋์์, eBPF ์์ฌ ์ฝ๋๋ฅผ ํ์ธํ ํ JIT ์ปดํ์ผ ์ ์ ๋จ๊ณ์์ ์ฐจ๋จ๋๋ ์์ eBPF ํ๋ก๊ทธ๋จ์ ๋ก๋ํ๋ ์ค๋ ๋๊ฐ ์์ฑ๋ฉ๋๋ค.
๊ถํ์ด ์๋ ์ฌ์ฉ์ ID ๋ค์์คํ์ด์ค์์ /proc/self/mountinfo ํ์ผ์ด ์ด๋ฆฌ๊ณ ๋ฐ์ธ๋ ๋ง์ดํธ๋ ๋๋ ํ ๋ฆฌ์ ๊ธด ๊ฒฝ๋ก ์ด๋ฆ์ด ์ฝํ์ง๋ฉฐ, ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ฒํผ ์์ ์ ์์ญ์ "//deleted" ๋ฌธ์์ด์ด ๊ธฐ๋ก๋ฉ๋๋ค. ๋ผ์ธ ์ฐ๊ธฐ ์์น๋ ์ด๋ฏธ ํ ์คํธ๋์์ง๋ง ์์ง ์ปดํ์ผ๋์ง ์์ eBPF ํ๋ก๊ทธ๋จ์ ๋ช ๋ น์ด๋ฅผ ๋ฎ์ด์ฐ๋๋ก ์ ํ๋ฉ๋๋ค.
๋ค์์ผ๋ก eBPF ํ๋ก๊ทธ๋จ ์์ค์์ ์ ์ด๋์ง ์์ ๋ฒํผ ์ธ๋ถ ์ฐ๊ธฐ๋ btf ๋ฐ map_push_elem ๊ตฌ์กฐ์ ์กฐ์์ ํตํด ๋ค๋ฅธ ์ปค๋ ๊ตฌ์กฐ๋ฅผ ์ฝ๊ณ ์ธ ์ ์๋ ์ ์ด๋ ๊ธฐ๋ฅ์ผ๋ก ๋ณํ๋ฉ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ด ์ต์คํ๋ก์์ ์ปค๋ ๋ฉ๋ชจ๋ฆฌ์์ modprobe_path[] ๋ฒํผ์ ์์น๋ฅผ โโํ์ธํ๊ณ ๊ทธ ์์ ์๋ "/sbin/modprobe" ๊ฒฝ๋ก๋ฅผ ๋ฎ์ด์๋๋ค. ์๋ฅผ ๋ค์ด netlink ์์ผ์ ์์ฑํ ๋ ์คํ๋๋ request_module() ํธ์ถ์ ๋๋ค.
์ฐ๊ตฌ์๋ค์ ํน์ ์ ์ฉ์๋ง ํจ๊ณผ์ ์ธ ๋ช ๊ฐ์ง ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง๋ง ๋ฌธ์ ์์ฒด๋ฅผ ์ ๊ฑฐํ์ง๋ ์์ต๋๋ค. ๋ณ๋์ ์ฌ์ฉ์ ID ๋ค์์คํ์ด์ค์ ๋๋ ํฐ๋ฆฌ ๋ง์ดํธ๋ฅผ ๋นํ์ฑํํ๋ ค๋ฉด "/proc/sys/kernel/unprivileged_userns_clone"์ 0์ผ๋ก ์ค์ ํ๊ณ , eBPF ํ๋ก๊ทธ๋จ์ ์ปค๋์ ๋ก๋ํ์ง ์์ผ๋ ค๋ฉด "/proc/sys/kernel/unprivileged_bpf_disabled"๋ฅผ 1๋ก ์ค์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ฐ๊ตฌ์๋ค์ ๋๊ท๋ชจ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ง์ดํธํ๊ธฐ ์ํด ๋ฐ์ธ๋ ๋ง์ด๋ ๋์ FUSE ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ๋ ๋์ฒด ๊ณต๊ฒฉ์ ๋ถ์ํ๋ ๋์ systemd ์์คํ ๊ด๋ฆฌ์์ ์ํฅ์ ๋ฏธ์น๋ ๋ ๋ค๋ฅธ ์ทจ์ฝ์ (CVE-2021-33910)์ ๋ฐ๊ฒฌํ์ต๋๋ค. FUSE๋ฅผ ํตํด ๊ฒฝ๋ก ํฌ๊ธฐ๊ฐ 8MB๋ฅผ ์ด๊ณผํ๋ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ง์ดํธํ๋ ค๊ณ ํ๋ฉด ์ ์ด ์ด๊ธฐํ ํ๋ก์ธ์ค(PID1)์์ ์คํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด์ง๊ณ ์ถฉ๋์ด ๋ฐ์ํ์ฌ ์์คํ ์ด "ํจ๋" ์ํ์ ๋น ์ง๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค.
๋ฌธ์ ๋ systemd๊ฐ /proc/self/mountinfo์ ๋ด์ฉ์ ์ถ์ ๋ฐ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ , ๋์ ์ผ๋ก ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋ ์คํ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐฐ์นํ๋ strdupa() ์์ ์ ์ํํ๋ unit_name_path_escape() ํจ์์์ ๊ฐ ๋ง์ดํธ ์ง์ ์ ์ฒ๋ฆฌํ๋ค๋ ๊ฒ์ ๋๋ค. . ์ต๋ ์คํ ํฌ๊ธฐ๋ RLIMIT_STACK์ ํตํด ์ ํ๋๋ฏ๋ก ๋ง์ดํธ ์ง์ ์ ๋ํ ๊ฒฝ๋ก๋ฅผ ๋๋ฌด ํฌ๊ฒ ์ฒ๋ฆฌํ๋ฉด PID1 ํ๋ก์ธ์ค๊ฐ ์ถฉ๋ํ๊ณ ์์คํ ์ด ์ค์ง๋ฉ๋๋ค. ๊ณต๊ฒฉ์ ๊ฒฝ์ฐ ๊ฒฝ๋ก ํฌ๊ธฐ๊ฐ 8MB๋ฅผ ์ด๊ณผํ๋ ๊ณ ๋๋ก ์ค์ฒฉ๋ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ง์ดํธ ์ง์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ๊ณผ ํจ๊ป ๊ฐ์ฅ ๊ฐ๋จํ FUSE ๋ชจ๋์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ systemd 220(2015๋
248์)๋ถํฐ ๋ํ๋ฌ์ผ๋ฉฐ ์ด๋ฏธ ๊ธฐ๋ณธ systemd ์ ์ฅ์์์ ์์ ๋์์ผ๋ฉฐ ๋ฐฐํฌํ(Debian, Ubuntu, Fedora, RHEL, SUSE, Arch)์์ ์์ ๋์์ต๋๋ค. ํนํ, systemd ๋ฆด๋ฆฌ์ค 2018์์๋ /proc/self/mountinfo ์ฒ๋ฆฌ ์คํจ๋ฅผ ์ ๋ฐํ๋ systemd ์ฝ๋์ ๋ฒ๊ทธ๋ก ์ธํด ์ต์คํ๋ก์์ด ์๋ํ์ง ์์ต๋๋ค. 2018๋
์๋ ๋น์ทํ ์ํฉ์ด ๋ฐ์ํ๊ณ Qualys ์ฐ๊ตฌ์๋ค์ด Linux ์ปค๋์ CVE-14634-XNUMX ์ทจ์ฝ์ ์ ๋ํ ์ต์คํ๋ก์์ ์์ฑํ๋ ค๊ณ ํ ๋ systemd์์ ์ธ ๊ฐ์ง ์ฌ๊ฐํ ์ทจ์ฝ์ ์ ๋ฐ๊ฒฌํ๋ค๋ ์ ๋ ํฅ๋ฏธ๋กญ์ต๋๋ค.
์ถ์ฒ : opennet.ru