Linux ์ปค๋„์˜ ๋ฃจํŠธ ์ทจ์•ฝ์  ๋ฐ systemd์˜ ์„œ๋น„์Šค ๊ฑฐ๋ถ€

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

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€