5.8์์ ๋ค์ด์ 5.17์์ ๋งํ ๊ตฌ๋ฉ: ๋ฆฌ๋ ์ค watch_queue OOB Write
๋ฆฌ๋ ์ค ์ปค๋ 5.8์ watch_queue๋ผ๋ ์กฐ์ฉํ ๊ธฐ๋ฅ์ด ํ๋ ๋ค์ด์์. ํค๋ง(keyring)์ด๋ ์ฅ์น ์ํ๊ฐ ๋ฐ๋ ๋ ์ปค๋์ด ์ฌ์ฉ์ ๊ณต๊ฐ์ผ๋ก ์๋ฆผ์ ๋ฐ์ด ๋ฃ์ด์ฃผ๋ ํต๋ก์ธ๋ฐ, ์ผ๋ฐ ํ์ดํ๋ฅผ ํน์ํ ํ๋๊ทธ๋ก ์ด์ด์ ๋ง๋๋ ๊ตฌ์กฐ๋ผ ๋์ ์ ๋์ง๋ ์์์. ๊ทธ๋ฐ๋ฐ ์ด ํต๋ก์ ๋ถ๋ ํํฐ ์ค์ ์ฝ๋๊ฐ ๊ฐ์ ๊ฐ์ ๋ ๋ฒ ๊ฒ์ฌํ๋ฉด์ ๊ธฐ์ค์ ์๋ก ๋ค๋ฅด๊ฒ ์ก์๋ฒ๋ ธ๊ณ , ๊ทธ ์ด๊ธ๋จ์ด 2022๋ 3์ CVE-2022-0995๋ก ์ ๋ฆฌ๋์.
- ๋ฆฌ๋ ์ค ์ปค๋ watch_queue ์๋ฆผ ์๋ธ์์คํ ์ ํํฐ ์ค์ ๊ฒฝ๋ก์์ ํ ๊ฒฝ๊ณ ๋ฐ ์ฐ๊ธฐ(OOB Write)๊ฐ ๋ฐ์ํจ. ๋ก์ปฌ ์ผ๋ฐ ์ฌ์ฉ์๊ฐ root ๊ถํ ์์น๊น์ง ๋ ธ๋ฆด ์ ์๋ ์ ํ์.
- ์์ธ์ "ํํฐ ๊ฐ์๋ฅผ ์ธ๋ ๊ฒ์ฌ"์ "ํํฐ๋ฅผ ์ค์ ๋ก ์ฑ์ฐ๋ ๊ฒ์ฌ"๊ฐ ์๋ก ๋ค๋ฅธ ์ํ์ ์ด ๊ฒ. ์ธ๋ ์ชฝ์ด ์๊ฒ ์ธ๋ ํ ๋น์ ์๊ฒ ๋๊ณ , ์ฐ๋ ์ชฝ์ ๊ทธ๋ณด๋ค ๋ง์ด ์.
- ์ ๋ต์ ํจ์น. ๋น์ฅ ๋ชป ์ฌ๋ฆฌ๋ฉด CONFIG_WATCH_QUEUE ๋นํ์ฑํ๋ seccomp๋ก ์๋ฆผ ํ์ดํ ์์ฑ ์์ฒด๋ฅผ ๋ง๊ณ , pipe2 ํ๋๊ทธ์ 'W' ๊ณ์ด ioctl์ ๋ก๊น ํด๋๋ฉด ํ์ง ์ ํธ๊ฐ ๊ฝค ์ ๋ช ํจ.
1. watch_queue๊ฐ ํ๋ ์ผ
์ฌ์ฉ์ ๊ณต๊ฐ์์ pipe2()๋ฅผ ํธ์ถํ ๋ O_NOTIFICATION_PIPE ํ๋๊ทธ๋ฅผ ์ฃผ๋ฉด ํ๋ฒํ ํ์ดํ๊ฐ ์๋๋ผ ์๋ฆผ ํ๊ฐ ๋ง๋ค์ด์ง. ๊ทธ๋ค์ ์ด fd์ ioctl์ ๊ฑธ์ด์ ํ ํฌ๊ธฐ๋ฅผ ์ ํ๊ณ , ์ด๋ค ์ข
๋ฅ์ ์๋ฆผ๋ง ๋ฐ์์ง ํํฐ๋ฅผ ๋ฑ๋กํจ. ํน๊ถ์ด ํ์ ์์. ์ปค๋ ์ต์
๋ง ์ผ์ ธ ์์ผ๋ฉด ์๋ฌด ์ผ๋ฐ ์ฌ์ฉ์๋ ์ด ๊ฒฝ๋ก๋ฅผ ๊ทธ๋๋ก ํ๋ค๋ ์ ์ด ์ด ์ทจ์ฝ์ ์ ์ ์ ์กฐ๊ฑด์ด์ ์ํ ์์์์.
2. ๋ฒ๊ทธ์ ์ ์ฒด — ๊ฐ์ ๊ฐ, ๋ค๋ฅธ ์
๊ฒฐ๊ณผ๋ ๋ปํจ. ์ฒซ ๋ฃจํ์์ "์ด๊ฑด ๋ฒ์ ๋ฐ์ด๋ ์ ์ ๊ฒ"๋ผ๊ณ ๊ฑด๋๋ด ํญ๋ชฉ์, ๋ ๋ฒ์งธ ๋ฃจํ๋ "์ด ์ ๋๋ฉด ๋ฒ์ ์์ด๋ค"๋ผ๋ฉฐ ๊ทธ๋๋ก ๊ธฐ๋กํจ. ํ ๋น๋ ๋ฐฐ์ด์ ์์๋ฐ ์ฐ๊ธฐ ์ปค์๋ ๊ณ์ ์ ์งํ๋ ํ ๊ฒฝ๊ณ ๋๋จธ๋ก ์ฌ์ฉ์๊ฐ ๊ณ ๋ฅธ ๊ฐ์ด ์์ด๋๊ฐ. ๋ค์ผ๋ก ํ์ ๋นํธ๋งต์ ์ธํ ํ๋ ๋นํธ ์ฐ์ฐ๋ ๊ฐ์ด ๋ฒ์๋ฅผ ๋ฒ์ด๋จ. ๊ฐ๋ ์ ์ผ๋ก๋ "์ธ๋ ์ฝ๋์ ์ฐ๋ ์ฝ๋๊ฐ ์๋ก ๋ค๋ฅธ ์๋ฅผ ๋ค๊ณ ์์๋ค" ๋ฑ ๊ทธ ํ ์ค์.
๊ณต๊ฒฉ์ ์ ์ฅ์์ ์ข์(=๋ฐฉ์ด์ ์ ์ฅ์์ ๋์) ์ ์, ๋์ด๊ฐ๋ ๊ฐ์ด ์ฌ์ฉ์๊ฐ ์๋น ๋ถ๋ถ ์ ์ด ๊ฐ๋ฅํ ๋ฐ์ดํฐ๋ผ๋ ๊ฒ. ์ปค๋ ํ ํ ๋น์์ ๊ฐ์ฒด ๋ฐฐ์น๋ฅผ ๋ค๋ฌ์ด ์ธ์ ์ฌ๋ฉ์ ์๋ฏธ ์๋ ๊ตฌ์กฐ์ฒด๋ฅผ ๋์ ์๋ง ์์ผ๋ฉด ๋จ์ ํฌ๋์์์ ๋๋์ง ์๊ณ ๊ถํ ์์น ์๋๋ฆฌ์ค๋ก ์ด์ด์ง. ์ค์ ๋ก ๊ณต๊ฐ๋ ์ฐ๊ตฌ์์๋ ๋ก์ปฌ ์ฌ์ฉ์๊ฐ root ์ ธ์ ์ป๋ ๋ฐ๊น์ง ๋๋ฌํ์. ์์ธํ ์ต์คํ๋ก์ ์ ์ฐจ๋ ์ฌ๊ธฐ์ ๋ค๋ฃจ์ง ์๊ฒ ์. ๋ฐฉ์ด์ ํ์ํ ๊ฑด "์ด๊ฒ ์ ํฐ์ง๋๊ฐ"๊น์ง๊ณ , ๊ทธ๋ค์์ ํจ์น๊ฐ ๋ต์ด๊ธฐ ๋๋ฌธ์.
3. ์ด๋๊น์ง ์ํฅ์ด ๊ฐ๋
- ๋ก์ปฌ ๊ถํ ์์น์ด ํต์ฌ์. ์๊ฒฉ ๋จ๋ ๊ณต๊ฒฉ์ ์๋์ง๋ง, ์น์ ธ์ด๋ ํ์ทจ๋ ์๋น์ค ๊ณ์ ๊ฐ์ ๋ฐํ์ด ์ด๋ฏธ ์๋ ์ํฉ์์ root๋ก ์ฌ๋ผ์๋ ๋ ๋ฒ์งธ ๋จ๊ณ๋ก ๋ฑ ๋ง์.
- ์ปจํ ์ด๋ ์์์๋ ๋ฌธ์ ๊ฐ ๋จ. ์ปค๋์ ํธ์คํธ์ ๊ณต์ ํ๋, ์ปจํ ์ด๋ ๋ด๋ถ ์ฌ์ฉ์๊ฐ ์ปค๋ ํ์ ๊ฑด๋๋ฆฌ๋ฉด ๊ฒฉ๋ฆฌ ๊ฒฝ๊ณ ์์ฒด๊ฐ ํ๋ค๋ฆผ.
- ๋จ, CONFIG_WATCH_QUEUE๊ฐ ์ผ์ง ์ปค๋์์๋ง ์ฑ๋ฆฝํจ. ๋ฐฐํฌํ๋ง๋ค ๊ฐ๋ ธ๊ณ , ์ด ์ต์ ์ ์ผ๋ ๋ฐ์คํฌํฑ·์๋ฒ ๋ฐฐํฌํ์ด ์ฃผ๋ ํ์ ์ด ๋์.
4. ๋ด ์์คํ ์ ํด๋น๋๋๊ฐ
- ์ปค๋ ๋น๋ ์ค์ ์์
grep WATCH_QUEUE /boot/config-$(uname -r)๋ก ์ต์ ์ด y์ธ์ง ํ์ธ. n์ด๋ฉด ์ด ๊ฒฝ๋ก ์์ฒด๊ฐ ์์. - ๋ฐฐํฌํ ์ปค๋์ด๋ฉด ๋ฒ์ ์ซ์๋ง ๋ณด๊ณ ํ๋จํ์ง ๋ง ๊ฒ. ๋ฐฑํฌํธ ํจ์น๊ฐ ๋ค์ด๊ฐ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์, ๋ฐฐํฌ์ฌ ๋ณด์ ๊ณต์ง์ ํจํค์ง ๋ฒ์ ๊ณผ ์ค์ ์ค์น๋ณธ์ ๋์กฐํ๋ ๊ฒ ์ ํํจ.
- ์ ์คํธ๋ฆผ ๊ธฐ์ค์ผ๋ก๋ 5.17 ๊ณ์ด์์ ์ ๋ฆฌ๋๊ณ , ๊ทธ ์ด์ ์์ ํ ๋ธ๋์น๋ค๋ก ์์ ์ด ๋ด๋ ค๊ฐ์.
5. ํ์ง — ๋ฌด์์ ๋ด์ผ ํ๋
์ด ์ทจ์ฝ์ ์ ๊ณ ๋ง์ด ์ ์ ์ ์ ์ํฌ๋ก๋์์ ๊ฑฐ์ ์ ์ฐ์ด๋ API๋ฅผ ์ง๋๋ค๋ ๊ฒ์. ์ฆ ์ ํธ ๋๋น ์ก์์ด ๋ฎ์.
- ์๋ฆผ ํ์ดํ ์์ฑ ๊ฐ์:
pipe2()ํธ์ถ ์ค O_NOTIFICATION_PIPE ํ๋๊ทธ๊ฐ ๋ถ์ ๊ฑด์ audit์ด๋ eBPF ๊ธฐ๋ฐ ์ผ์(Falco, Tetragon ๋ฑ)๋ก ์ก์. ์ผ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ด ํ๋๊ทธ๊ฐ ๋จ๋ ๊ฒฝ์ฐ๋ ์ฌ์ค์ ์๋ค๊ณ ๋ด๋ ๋จ. - watch_queue ๊ณ์ด ioctl: ํ ํฌ๊ธฐ ์ค์ ๊ณผ ํํฐ ์ค์ ioctl์ 'W' ๋งค์ง ๊ณ์ด์. auditd์ syscall ์ธ์ ํํฐ๋ก ioctl ๋ช ๋ น ๊ฐ์ ์ขํ ๊ท์น์ ๊ฑธ์ด๋๋ฉด, ์๋ ์์ฒด๊ฐ ๋ก๊ทธ์ ๋จ์.
- ์คํจ์ ํ์ : ์ต์คํ๋ก์์ ํ ๋ฒ์ ์ฑ๊ณตํ์ง ์์. ํ ๊ทธ๋ฃจ๋ฐ์ด ์ด๊ธ๋๋ฉด dmesg์ slab ์์ ๊ฒฝ๊ณ , general protection fault, kernel oops๊ฐ ๋จ์. ์ปค๋ ํฌ๋์ ๋ก๊ทธ๋ฅผ SIEM์ผ๋ก ์ ๋ณด๋ด๊ณ ์์๋ค๋ฉด ์ด๋ฒ ๊ธฐํ์ ํ์ดํ๋ผ์ธ์ ํ๋ ๋ถ์ฌ๋๊ธธ ๊ฐ์ธ์ ์ผ๋ก๋ ์ถ์ฒํจ.
- ์ฌํ ์ ํธ: setuid ๋ฐ์ด๋๋ฆฌ ์คํ ์์ด ํ๋ก์ธ์ค์ uid๊ฐ 0์ผ๋ก ๋ฐ๋๋ ์๊ฐ, ๋๋ ์ปจํ ์ด๋ ํ๋ก์ธ์ค๊ฐ ํธ์คํธ ๋ค์์คํ์ด์ค ์์์ ๊ฑด๋๋ฆฌ๋ ์๊ฐ. ์ปค๋ LPE ์ ๋ฐ์ ๊ณตํต์ผ๋ก ์ฐ์ด๋ ํ์ง ์ถ์ด๋ผ ์ด CVE ํ๋ ์ง๋๊ฐ๋ ๊ณ์ ๊ฐ์ด์น๋ฅผ ํจ.
6. ์ํ — ์ฐ์ ์์๋๋ก
- ํจ์น๊ฐ 1์์. ์ปค๋ ์ ๋ฐ์ดํธ ํ ์ฌ๋ถํ ๊น์ง ํด์ผ ์ ์ฉ๋จ. livepatch๋ฅผ ์ด๋ค๋ฉด ํด๋น CVE๊ฐ ํจ์น ์ธํธ์ ํฌํจ๋๋์ง ํ์ธ์ด ํ์ํจ.
- ๋น์ฅ ์ฌ๋ถํ ์ฐฝ์ ๋ชป ์ก๋ ์๋ฒ๋ผ๋ฉด ๊ณต๊ฒฉ๋ฉด ์ ๊ฑฐ๊ฐ ์ฐจ์ . ์์ฒด ๋น๋ ์ปค๋์ ์ด๋ค๋ฉด CONFIG_WATCH_QUEUE๋ฅผ ๋๋ ๊ฒ ๊ฐ์ฅ ํ์คํจ. ์ด ๊ธฐ๋ฅ์ ์ค์ ๋ก ์ฐ๋ ์ํฌ๋ก๋๋ ๋๋ฌพ.
- seccomp ํ๋กํ์ผ๋ก ์๋ฆผ ํ์ดํ ์์ฑ ํ๋๊ทธ์ ํด๋น ioctl์ ๊ฑฐ๋ถ. ์ปจํ ์ด๋ ์ํฌ๋ก๋๋ผ๋ฉด ๊ธฐ๋ณธ ํ๋กํ์ผ์ ๊ทธ๋๋ก ์ฐ์ง ๋ง๊ณ ํ์ํ syscall๋ง ๋จ๊ธฐ๋ ๋ฐฉํฅ์ผ๋ก ์กฐ์ฌ๋๋ ๊ฒ ์ด๋ฐ ์ข ๋ฅ์ ์ปค๋ ๋ฒ๊ทธ ์ ์ฒด์ ๋ํ ๋ณดํ์ด ๋จ.
- ์ปค๋ ํ๋๋ ์ต์
(์ฌ๋ฉ ํ๋ฆฌ๋ฆฌ์คํธ ๋๋คํ·๊ฐํ),
kernel.dmesg_restrict=1,kernel.kptr_restrict=2๊ฐ์ ์ค์ ์ ์ต์คํ๋ก์ ์์ ์ฑ์ ๋จ์ด๋จ๋ฆฌ๋ ์ญํ ์ ํจ. ๊ทผ๋ณธ ํด๊ฒฐ์ ์๋์ง๋ง ๊ณต๊ฒฉ์ ๋น์ฉ์ ์ฌ๋ ค์ค.
๋ง๋ฌด๋ฆฌํ๋ฉฐ
์ด ์ฌ๊ฑด์์ ๋จ๋ ๊ตํ์ ์ทจ์ฝ์ ์ด๋ฆ๋ณด๋ค ํจํด ์ชฝ์ธ ๊ฒ ๊ฐ์. "๊ฒ์ฆํ๋ ๋ฃจํ"์ "์ฌ์ฉํ๋ ๋ฃจํ"๊ฐ ๋ถ๋ฆฌ๋ผ ์์ผ๋ฉด ์ธ์ ๊ฐ ๋ ๊ธฐ์ค์ด ์ด๊ธ๋๋ค๋ ๊ฒ. ์ปค๋์ด๋ ์ฐ๋ฆฌ๊ฐ ์ง๋ ํ์๋ ๋๊ฐ์ด ์ ์ฉ๋๋ ์ด์ผ๊ธฐ๋ผ, ์ฝ๋ ๋ฆฌ๋ทฐํ ๋ "์ด ์ํ๊ฐ, ์๋์ชฝ์์ ๋ ๊ณ์ฐํ๊ณ ์์ง ์๋?" ํ ๋ฒ๋ง ๋์ง์ด๋ณด๋ฉด ๊ฝค ๋ง์ ๊ฑธ ๋ฏธ๋ฆฌ ์ก์ ์ ์์.
์ค๋์ ์ฌ๊ธฐ๊น์ง. ์ด์ ์ค์ธ ์๋ฒ์ grep WATCH_QUEUE /boot/config-$(uname -r) ํ ์ค ๋๋ ค๋ณด๋ ๊ฒ๋ถํฐ ์์ํด๋ณด์๊ณ , ์ปค๋ ํฌ๋์ ๋ก๊ทธ๋ฅผ SIEM์ผ๋ก ๋ณด๋ด๊ณ ๊ณ์ ๋ถ๋ค์ ์ด๋ค ๊ท์น์ผ๋ก ์ ๋ฆฌํ์
จ๋์ง ๋๊ธ๋ก ๊ณต์ ํด์ฃผ์๋ฉด ์ ๋ ๋ฐฐ์ฐ๊ฒ ์. ๊ฐ์ด ์กฐ๊ธ์ฉ ๋จ๋จํ๊ฒ ๋ง๋ค์ด๊ฐ์.