์—ฌ๋Ÿฌ๋ถ„์ด ์•„๋Š” ๊ฐ€์žฅ ํฐ ์ •์ˆ˜๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?


ํ•ดํ‚น ์•Œ๋ ค์ค„๊ฒŒ
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 ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๊ทธ ์™ธ์— ์ •์ˆ˜ ์ž๋ฃŒํ˜•์˜ ๋ฒ”์œ„๋ฅผ ํ™•์ธํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ณ , ์—ฐ์‚ฐ์— ์ •์ˆ˜ํ˜• ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ฒฐ๊ณผ๊ฐ’์„ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์™ธ๋ถ€๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ ์ ˆํ•œ ๋ฒ”์œ„ ๋‚ด์— ์กด์žฌํ•˜๋Š”์ง€ ๊ผญ ํ™•์ธํ•ด์ฃผ์„ธ์š”!

์ˆซ์ž๋Š” ์—ญ์‹œ ํ—ท๊ฐˆ๋ ค์„œ ํ‰์†Œ๋ณด๋‹ค ๊ธ€์ด ๊ธธ์–ด์กŒ๋„ค์š”. ๐Ÿ˜ข ๋๊นŒ์ง€ ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๐Ÿฅบ
ํ•ดํ‚น ๊ฐ€๋ฅด์ณ์ค„๊ฒŒ๋Š” ๋‹ค์Œ ์ฃผ์— ๋” ์žฌ๋ฏธ์žˆ๋Š” ์ทจ์•ฝ์ ์œผ๋กœ ์ฐพ์•„์˜ฌ๊ฒŒ์š”!
์˜ค๋Š˜ ์ „ํ•ด๋“œ๋ฆฐ ๋‚ด์šฉ์ด ๋งˆ์Œ์— ๋“œ์…จ๋‚˜์š”?
์ฃผ์œ„ ์นœ๊ตฌ๋“ค์—๊ฒŒ ๋‰ด์Šค๋ ˆํ„ฐ๋ฅผ ์ถ”์ฒœํ•ด์ฃผ์„ธ์š”!
๋‹ค์Œ์ฃผ์—๋„ ์•Œ์ฐฌ ๋‚ด์šฉ์œผ๋กœ ๋Œ์•„์˜ค๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜™
ํ˜น์‹œ ๋งˆ์Œ์— ์•ˆ๋“œ๋Š” ๋ถ€๋ถ„์ด ์žˆ์—ˆ๋‚˜์š”? ์—ฌ๊ธฐ์—์„œ ํ”ผ๋“œ๋ฐฑ์„ ์ „๋‹ฌํ•ด์ฃผ์„ธ์š”!
์—ฌ๋Ÿฌ๋ถ„์˜ ์˜๊ฒฌ๋“ค์„ ์ ๊ทน ๋ฐ˜์˜ํ•ด์„œ ๋”์šฑ ์œ ์ตํ•œ ๋‰ด์Šค๋ ˆํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜ƒ
๊ตฐ์ž๋™ ํ•ดํ‚น์—ฐ๊ตฌ์†Œ
hackyboizteam@gmail.com
์„œ์šธ์‹œ ๊ด‘์ง„๊ตฌ ๊ตฐ์ž๋™ 134-33 3์ธต
์ˆ˜์‹ ๊ฑฐ๋ถ€ Unsubscribe