์ฌ๋ฌ๋ถ์ด ์๋ ๊ฐ์ฅ ํฐ ์ ์๋ ๋ฌด์์ธ๊ฐ์? ํดํน ์๋ ค์ค๊ฒ 4ํ: Integer Overflow '์ฌ๋ฌ๋ถ์ด ์๋ ๊ฐ์ฅ ํฐ ์ ์๋ ๋ฌด์์ธ๊ฐ์?' ๋ผ๋ ์ง๋ฌธ์ ๋ฐ์ผ๋ฉด ์ด๋ค ์๊ฐ์ด ๋์๋์? ๐
์์ฃผ ๋ฐ๋ณด๊ฐ์ ์ง๋ฌธ์ด๋ค์!! ๐ ํ์ง๋ง ์์ง ์๊ฐ๋ฝ์ผ๋ก ์๋ฅผ ์ธ๋ ์ ๊ธฐ๋ค์๊ฒ ๋ฌผ์ด๋ณด๋ฉด 10, ๋ฐ๊ฐ๋ฝ๊น์ง ์ ์ ์๋ ์ ๊ธฐ๋ค์ 20์ด๋ผ๊ณ ๋ตํ ๊ฑฐ์์. ๊ทธ๋ ๋ค๋ฉด ๊ณผ์ฐ ์ฐ๋ฆฌ ๋๋ํ ์ปดํจํฐ์๊ฒ ๋ฌผ์ด๋ณธ๋ค๋ฉด ๋ญ๋ผ๊ณ ๋ตํด์ค๊น์? ๋ ๊ฑฐ๊ธฐ์ 1์ ๋ํ๋ฉด ์ด๋ค ์ผ์ด ์ผ์ด๋๊ฒ ๋๋ ๊ฑธ๊น์? ๐ค Integer Overflow๊ฐ ๋ญ์์? ์ ์๊ฐ ํ๋ฌ ๋์น๋ค๊ณ ์? ๐ฑ ๋ค, buffer overflow์ ๋๊ฐ์ด ๋์ฒํ๋ฌ์ overflow๊ฐ ๋ฐ์ํ๋ ๋ด์! ์ด๋ฒ์ ์ ์๋ก์. ๐ง
integer overflow๋ ํ๋ก๊ทธ๋จ์์ ์ ์ธ๋ ์ ์ ์๋ฃํ์ ๋ฒ์๋ณด๋ค ํฐ ์ ์๋ฅผ ์ ์ฅํ๋ ค๊ณ ํ ๋ ๋ฐ์ํฉ๋๋ค. ์ ์ ์๋ฃํ์ ๋ฐ๋ผ์ ์ ์ฅํ ์ ์๋ ๋ฒ์๊ฐ ๋ค๋ฅธ ๊ฒ์ ์๊ณ ๊ณ์ ๊ฐ์? unsigned int์ ์ต๋๊ฐ 4294967295์์ 1์ ๋ํ๋ฉด ์ด๋ป๊ฒ ๋ ์ง ์์ํด๋ณธ ๋ค์ ๊ฐ์ด ๊ณต๋ถํด๋ด์! ์์์ค.... ๐ญ๐ญ๐ญ ์ปดํจํฐ๊ฐ ์ ์๋ฅผ ์ด๋ป๊ฒ ์ ์ฅํ๊ธธ๋ integer overflow๊ฐ ๋ฐ์ํ๋์? ์ฌ๋์ ์ญ์ง๋ฒ์ ์ต์ํ์ง๋ง ์ปดํจํฐ๋ 1 ์ 0 ์ค ํ๋์ ์ ๋ณด๋ง ์ ์ฅํ๋ bit๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ด์ง๋ฒ์ผ๋ก ์ ์๋ฅผ ํํํด์. ๊ทธ๋ฆฌ๊ณ ์๋ฃํ์ ๋ถํธ๊ฐ ์์ด์ ์์์ ์์๋ฅผ ํํํ ์ ์๋ signed , ๋ถํธ๊ฐ ์์ด์ ์์๋ง ํํํ๋ unsigned ๋ก ๋๋ ์ง๊ฒ ๋ฉ๋๋ค.๊ฐ๋จํ 4๋นํธ๋ง์ผ๋ก integer overflow๊ฐ ์ด๋ค ์์ผ๋ก ์ผ์ด๋๋์ง ์์๋ณผ๊ฒ์! ๐ง ์ฐธ๊ณ ๋ก ์ด์ง์๋ฅผ ์ธ ๋๋ ์ญ์ง์์ ๊ตฌ๋ณํ๊ธฐ ์ํด ์์ 0b๋ฅผ ๋ถ์
๋๋ค.
๋ถํธ๊ฐ ์๋ 4๋นํธ๋ก ์ ์ฅํ ์ ์๋ ๊ฐ์ฅ ํฐ ์๋ 15(0b1111)๋ค์. ์ด๋ 1์ ๋ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
16(0b10000)์ด์ง๋ง 4๋นํธ๊น์ง๋ง ์ ์ฅํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ ๋นํธ๋ ๋ฒ๋ ค์ง๊ณ 0(0b0000)๋ง ๋จ์ 0์ด ๋ฉ๋๋ค!๐ฑ 2์ ๋ํ๋ฉด 1(0b0001), 3์ ๋ํ๋ฉด 2(0b0010), 4์ ๋ํ๋ฉด 3(0b0011)...์ด๋ ๊ฒ ๋ค์ ์ธ์ด๋๊ฐ๋ ๊ฑฐ์ฃ .
๋ง์ฐฌ๊ฐ์ง๋ก 32๋นํธ์ธ unsigned int ๋ฅผ ๋ณด๋ฉด ์ ์ฅํ ์ ์๋ ๊ฐ์ฅ ํฐ ์๋ 4294967295๋ก 1์ ๋ํ๋ฉด ๊ฒฐ๊ตญ 0์ด ๋์ด๋ฒ๋ ค์. ์ด๋์? ์์ํ๊ฒ๊ณผ ๋น์ทํ๊ฐ์? ๐ญ๐ญ๐ญ์ ์๋ง์... 3์ 0b0011์ด๋ผ๊ณ ์ ์ฅํ ๋, -3์ ๊ทธ๋ผ ์ด๋ป๊ฒ ์ ์ฅํ๋๊ฑฐ์์? ์์๋ Two's complement๋ฅผ ์ด์ฉํด ๋ณํํ์ฌ ์ ์ฅํ ์ ์๋ต๋๋ค. ๊ฐ๋จํ๊ฒ ์ค๋ช
ํ๋ฉด ๋ถํธ๋ฅผ ๋นผ๊ณ ์ด์ง์๋ก ๋ณํํ ๋ค์, 0๊ณผ 1์ ๋ฐ๊ฟ์ฃผ๊ณ 1์ ๋ํด์ฃผ๋ ๊ฑฐ์์.
-3 โ 3 โ 0b0011 โ 0b1100 โ 0b1101 -3์ 0b1101์ด๋ค์. 0b1101์ 13 ์๋๊ฐ ํท๊ฐ๋ฆฌ๋ ๋ถ๋ ๋ง์ ๊ฒ ๊ฐ์์. ์ด๋ป๊ฒ ๋ ์ผ์ผ๊น์? ๐ฃ ๋ถํธ๊ฐ ์๋ 4๋นํธ์์ ์ ์๋ฅผ ์ ์ฅํ ๋๋ -8๋ถํฐ 7๊น์ง๋ง ๊ฐ๋ฅํฉ๋๋ค. 13์ ์์ ์ ์ฅํ์ง ๋ชปํ๋ค๋ ๊ฑฐ์์! unsigned char ์ ๋ฒ์๊ฐ 0~225์ธ๋ฐ ๋นํด signed char ๋ -128~127๊น์ง๋ก ๋ถํธ๋ ์์ง๋ง ์ ๋๊ฐ์ ๋ฐ์ผ๋ก ์ค์ด๋๋ ์ด์ ์
๋๋ค.๋ถํธ๊ฐ ์๋ signed ์ ์์ ๊ฒฐ๋ก ์ ์ต๋๊ฐ์ ์ด๊ณผํ๋ฉด ์์๊ฐ ๋ฉ๋๋ค. 4bit์ ์ต๋๊ฐ์ธ 7์์ 1์ ๋ํ๋ฉด -8์ด ๋๋ค์! ๐๊ทธ๋ผ ์ ์ธ๋ ์ ์ ์๋ฃํ์ ๋ฒ์๋ณด๋ค ์์ ์ ์๋ฅผ ์ ์ฅํ๋ ค๊ณ ํ ๋๋ ์ด๋ป๊ฒ ๋๋์? integer overflow์ ๋ฐ๋๊ฐ๋
์ธ integer underflow๊ฐ ๋ฐ์ํด์. signed int ์ ์ต์๊ฐ -2147483648์์ 1์ ๋นผ๋ฉด 2147483647๊ฐ ๋๊ณ , unsigned int ์ ์ต์๊ฐ์ธ 0์์ 1์ ๋นผ๋ฉด 4294967295์ด ๋์ ๋๋ค ๋ค์ ์ต๋๊ฐ์ด ๋ฉ๋๋ค.integer overflow๊ฐ ์ ์ค์ํ๊ฐ์? ๐
integer overflow๋ Buffer Overflow์ฒ๋ผ ํ๋ก๊ทธ๋จ์ ์คํ ํ๋ฆ์ ๋ฐ๊พธ๋ ๋ฑ์ ์ง์ ์ ์ธ Exploit์๋ ์ฌ์ฉ๋์ง ์์์. ํ์ง๋ง โผ๏ธ ์ค์ํ ๋ณ์์์ ์์ํ์ง ๋ชปํ ๊ฐ์ผ๋ก integer overflow๊ฐ ๋ฐ์ํ๋ฉด Buffer Overflow, out-of-bounds ๋ฑ์ ๋๋ค๋ฅธ ์ทจ์ฝ์ ์ผ๋ก ์ด์ด์ง๊ธฐ ๋๋ฌธ์ ์ฃผ์ํด์ผ ํฉ๋๋ค!! ์ด์ ๋ฒ์ ์ OpenSSL์์ integer overflow๊ฐ ๋ ๋ค๋ฅธ ์ทจ์ฝ์ ์ผ๋ก ์ด์ด์ง ๋ถ๋ถ์ ๊ฐ์ ธ์์ด์.
์๋ ์๋ต ์ธ์ฆ ์ฝ๋๋ก, ์ฌ์ฉ์๊ฐ ์ ์ดํ ์ ์๋
unsigned int ๋ณ์ nresp ๋ ์ผ๋ง๋ ๋ง์ ์๋ต์ ๊ธฐ๋ํ๋์ง ์๋ฒ์๊ฒ ์๋ ค์ฃผ๊ธฐ ์ํด ์ฌ์ฉ๋์์ต๋๋ค. ์ฌ๊ธฐ์๋ ์ด๋ค ๋ฌธ์ ์ ์ด ์์์๊น์?response = xmalloc(nresp*sizeof(char*)); ์์ reponse ๋ฅผ ํ ๋นํ ๋ nresp ๊ฐ๊ณผ sizeof(char*) ์ธ 4๋ฅผ ๊ณฑํ๊ฒ ๋ฉ๋๋ค.๋ฐ๋ก ์ด๋โผ๏ธ ๋ง์ฝ
nresp ์ ๊ฐ์ด 1073741856์ด๋ฉด nresp*sizeof(char*) ์ฐ์ฐ์ ๊ฒฐ๊ณผ๊ฐ unsigned int ์ ์ต๋๊ฐ์ธ 4294967295๋ณด๋ค 129๋งํผ ํฐ 4294967424๊ฐ ๋์ด ๊ฒฐ๊ตญ xmalloc ์ ์ธ์๋ก 128์ด ๋ค์ด๊ฐ๋ฒ๋ฆฌ๋ค์ ๐response ์ 128๋ฐ์ดํธ๊ฐ ํ ๋น๋์ง๋ง ๋ค์ for loop์์ 1073741856 ๋งํผ์ ๋ฌธ์์ด์ ๋ฐ์ Buffer Overflow๊ฐ ๋ฐ์ํ์ฌ ๊ณต๊ฒฉ์๊ฐ ์์ ์ฝ๋๋ฅผ ์คํํ๋๋ฐ ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค. ๐ฟ์ต๊ทผ์ ๋ฐ๊ฒฌ๋ Integer Overflow๊ฐ ๊ถ๊ธํ๋ค๋ฉด ์ด๋ฒ ์ฃผ ์์์ผ(8์ 23์ผ)์ ์
๋ก๋๋ Hackyboiz์ [ํ๋ฃจํ์ค] CVE-2021โ20082: Integer Overflow to RCE โ ManageEngine Asset Explorer Agent ๋ ๋ด์ฃผ์ธ์. ๐ Integer Overflow๋ฅผ ์ด๋ป๊ฒ ๋ง์ ์ ์๋์?
์ธ์ด์ ๋ฐ๋ผ interget overflow๋ฅผ ๋ฐฉ์งํ๊ณ ๋ฐ๊ฒฌํ๋๋ฐ ๋์์ด ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ๋ด์ฅํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ด์. C++์ ๊ฒฝ์ฐ SafeInt ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ interget overflow๊ฐ ๋ฐ์ํ๋ฉด ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๋ฉฐ Python์ ์์ฒด์ ์ผ๋ก interget overflow๊ฐ ๋ฐ์ํ์ง ์๋ Arbitrary-precision arithmetic ์ฐ์ฐ์ ์ฌ์ฉํฉ๋๋ค.
๊ทธ ์ธ์ ์ ์ ์๋ฃํ์ ๋ฒ์๋ฅผ ํ์ธํ์ฌ ์ฌ์ฉํ๊ณ , ์ฐ์ฐ์ ์ ์ํ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ฒฐ๊ณผ๊ฐ์ ๊ฒ์ฌํ๋ ๊ฒ์ผ๋ก ๋ฐฉ์งํ ์ ์์ต๋๋ค. ๋ํ ์ธ๋ถ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ ์ ํ ๋ฒ์ ๋ด์ ์กด์ฌํ๋์ง ๊ผญ ํ์ธํด์ฃผ์ธ์! ์ซ์๋ ์ญ์ ํท๊ฐ๋ ค์ ํ์๋ณด๋ค ๊ธ์ด ๊ธธ์ด์ก๋ค์. ๐ข ๋๊น์ง ์ฝ์ด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค! ๐ฅบ
ํดํน ๊ฐ๋ฅด์ณ์ค๊ฒ๋ ๋ค์ ์ฃผ์ ๋ ์ฌ๋ฏธ์๋ ์ทจ์ฝ์ ์ผ๋ก ์ฐพ์์ฌ๊ฒ์! ์ค๋ ์ ํด๋๋ฆฐ ๋ด์ฉ์ด ๋ง์์ ๋์
จ๋์? ์ฃผ์ ์น๊ตฌ๋ค์๊ฒ ๋ด์ค๋ ํฐ๋ฅผ ์ถ์ฒํด์ฃผ์ธ์! ๋ค์์ฃผ์๋ ์์ฐฌ ๋ด์ฉ์ผ๋ก ๋์์ค๊ฒ ์ต๋๋ค. ๐ ํน์ ๋ง์์ ์๋๋ ๋ถ๋ถ์ด ์์๋์? ์ฌ๊ธฐ์์ ํผ๋๋ฐฑ์ ์ ๋ฌํด์ฃผ์ธ์! ์ฌ๋ฌ๋ถ์ ์๊ฒฌ๋ค์ ์ ๊ทน ๋ฐ์ํด์ ๋์ฑ ์ ์ตํ ๋ด์ค๋ ํฐ๋ฅผ ๋ง๋ค์ด๊ฐ๋๋ก ํ๊ฒ ์ต๋๋ค. ๐ ๊ตฐ์๋ ํดํน์ฐ๊ตฌ์ |