์ฝ๊ธฐ ์ „์šฉ ํŒŒ์ผ์˜ ์†์ƒ์„ ํ—ˆ์šฉํ•˜๋Š” Linux ์ปค๋„์˜ ์ทจ์•ฝ์ 

์ฝ๊ธฐ ์ „์šฉ ๋ชจ๋“œ์— ์žˆ๊ฑฐ๋‚˜ O_RDONLY ํ”Œ๋ž˜๊ทธ๋กœ ์—ด๋ ธ๊ฑฐ๋‚˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์žˆ๋Š” ํŒŒ์ผ์„ ํฌํ•จํ•˜์—ฌ ๋ชจ๋“  ํŒŒ์ผ์— ๋Œ€ํ•ด ํŽ˜์ด์ง€ ์บ์‹œ์˜ ๋‚ด์šฉ์„ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ๋Š” ์ทจ์•ฝ์ ์ด Linux ์ปค๋„(CVE-2022-0847)์—์„œ ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฝ๊ธฐ ์ „์šฉ ๋ชจ๋“œ๋กœ ๋งˆ์šดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ด ์ทจ์•ฝ์ ์€ ์ž„์˜์˜ ํ”„๋กœ์„ธ์Šค์— ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๊ฑฐ๋‚˜ ์—ด๋ฆฐ ํŒŒ์ผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์†์ƒ์‹œํ‚ค๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด sshd ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œauthorized_keys ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ต์Šคํ”Œ๋กœ์ž‡์˜ ํ”„๋กœํ† ํƒ€์ž…์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” 2016๋…„์— ํ™•์ธ๋œ ์‹ฌ๊ฐํ•œ ์ทจ์•ฝ์  Dirty COW์™€ ์œ ์‚ฌํ•œ Dirty Pipe๋ผ๋Š” ์ฝ”๋“œ๋ช…์œผ๋กœ ์ง€์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์œ„ํ—˜ ์ˆ˜์ค€ ์ธก๋ฉด์—์„œ Dirty Pipe๋Š” Dirty COW์™€ ๋™์ผํ•œ ์ˆ˜์ค€์ด์ง€๋งŒ ์ž‘๋™ํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ ์„œ๋ฒ„์—์„œ ์••์ถ•๋œ ์•„์นด์ด๋ธŒ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ์‹œ์Šคํ…œ(๋กœ๋“œ๋œ ์‹œ์Šคํ…œ์—์„œ 37๊ฐœ์›” ๋™์•ˆ 3๊ฑด์˜ ์†์ƒ)์—์„œ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋‹ค์šด๋กœ๋“œํ•œ ํŒŒ์ผ์˜ ์ฃผ๊ธฐ์ ์ธ ์†์ƒ์— ๋Œ€ํ•œ ๋ถˆ๋งŒ์„ ๋ถ„์„ํ•˜๋Š” ๋™์•ˆ ์ทจ์•ฝ์ ์ด ๋ฐœ๊ฒฌ๋˜์—ˆ์œผ๋ฉฐ, ์ด๋ฅผ ์ค€๋น„ํ•˜๊ธฐ ์œ„ํ•ด splice() ์ž‘์—…์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฆ„์—†๋Š” ํŒŒ์ดํ”„.

์ด ์ทจ์•ฝ์ ์€ 5.8๋…„ 2020์›”์— ์ถœ์‹œ๋œ Linux ์ปค๋„ 11๋ถ€ํ„ฐ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. Debian 20.04์— ์žˆ์ง€๋งŒ Ubuntu 8 LTS์˜ ๊ธฐ๋ณธ ์ปค๋„์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. RHEL 15.x ๋ฐ openSUSE/SUSE 5.16.11 ์ปค๋„์€ ์ฒ˜์Œ์— ์ด์ „ ๋ถ„๊ธฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์ง€๋งŒ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํ•ด๋‹น ๋ถ„๊ธฐ๋กœ ๋ฐฑํฌํŠธ๋˜์—ˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค(์•„์ง ์ •ํ™•ํ•œ ๋ฐ์ดํ„ฐ๋Š” ์—†์Œ). Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux ํŽ˜์ด์ง€์—์„œ ๋ฐฐํฌํŒ์˜ ํŒจํ‚ค์ง€ ์—…๋ฐ์ดํŠธ ๊ฒŒ์‹œ๋ฅผ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ทจ์•ฝ์ ์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์€ ๋ฆด๋ฆฌ์Šค 5.15.25, 5.10.102 ๋ฐ XNUMX์—์„œ ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์ˆ˜์ • ์‚ฌํ•ญ์€ Android ํ”Œ๋žซํผ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ปค๋„์—๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ทจ์•ฝ์ ์€ ๊ตฌ์กฐ๋ฅผ ํ• ๋‹นํ•  ๋•Œ์™€ ํŠน์ • ์กฐ์ž‘ ์ค‘์— ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ง€์›Œ์ง€์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  copy_page_to_iter_pipe() ๋ฐ push_pipe() ํ•จ์ˆ˜ ์ฝ”๋“œ์˜ "buf->flags" ๊ฐ’์ด ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•„ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ช…๋˜์ง€ ์•Š์€ ํŒŒ์ดํ”„, ๋‹ค๋ฅธ ์ž‘์—…์˜ ๊ฐ’. ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ถŒํ•œ์ด ์—†๋Š” ๋กœ์ปฌ ์‚ฌ์šฉ์ž๊ฐ€ ํ”Œ๋ž˜๊ทธ์— PIPE_BUF_FLAG_CAN_MERGE ๊ฐ’์˜ ๋ชจ์–‘์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํŠน๋ณ„ํžˆ ์ค€๋น„๋œ ์ด๋ฆ„ ์—†๋Š” ํŒŒ์ดํ”„์— ์ƒˆ ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๊ธฐ๋งŒ ํ•˜๋ฉด ํŽ˜์ด์ง€ ์บ์‹œ์—์„œ ๋ฐ์ดํ„ฐ ๋ฎ์–ด์“ฐ๊ธฐ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณต๊ฒฉ์˜ ๊ฒฝ์šฐ ๋Œ€์ƒ ํŒŒ์ผ์„ ์ฝ์„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ ํŒŒ์ดํ”„์— ์“ธ ๋•Œ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ํ™•์ธ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๋งˆ์šดํŠธ๋œ ํŒŒํ‹ฐ์…˜์— ์žˆ๋Š” ํŒŒ์ผ(์˜ˆ: ํŒŒ์ผ c CD- ROM). ํŽ˜์ด์ง€ ์บ์‹œ์˜ ์ •๋ณด๋ฅผ ๊ต์ฒดํ•œ ํ›„ ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ๋•Œ ํ”„๋กœ์„ธ์Šค๋Š” ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ ๊ต์ฒด๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

PIPE_BUF_FLAG_CAN_MERGE ํ”Œ๋ž˜๊ทธ๊ฐ€ ์—ฐ๊ด€๋œ ๋ชจ๋“  ๋ง ๊ตฌ์กฐ์— ์„ค์ •๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฆ„ ์—†๋Š” ์ฑ„๋„์„ ์ƒ์„ฑํ•˜๊ณ  ์ž„์˜์˜ ๋ฐ์ดํ„ฐ๋กœ ์ฑ„์šฐ๋Š” ์ž‘์—…์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ, ๋ฐ์ดํ„ฐ๋Š” ์ฑ„๋„์—์„œ ์ฝํ˜€์ง€์ง€๋งŒ, ํŒŒ์ดํ”„_inode_info ๋ง ๊ตฌ์กฐ์˜ ํŒŒ์ดํ”„_๋ฒ„ํผ ๊ตฌ์กฐ์˜ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค์— ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋œ ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์›ํ•˜๋Š” ์˜คํ”„์…‹์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ๋Œ€์ƒ ํŒŒ์ผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ช…๋ช…๋˜์ง€ ์•Š์€ ํŒŒ์ดํ”„๋กœ ์ฝ์–ด๋“ค์ด๊ธฐ ์œ„ํ•ด splice()์— ๋Œ€ํ•œ ํ˜ธ์ถœ์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์ด ๋ช…๋ช…๋˜์ง€ ์•Š์€ ํŒŒ์ดํ”„์— ๋ฐ์ดํ„ฐ๋ฅผ ์“ธ ๋•Œ PIPE_BUF_FLAG_CAN_MERGE ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Pipe_buffer ๊ตฌ์กฐ์˜ ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋Œ€์‹  ํŽ˜์ด์ง€ ์บ์‹œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฎ์–ด์”๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

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