์ฝ๊ธฐ ์ ์ฉ ๋ชจ๋์ ์๊ฑฐ๋ 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