Buffer Overflow

ju0ยท2022๋…„ 3์›” 3์ผ
0
post-thumbnail

BOF์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜๊ธฐ์— ์•ž์„œ, ์ทจ์•ฝ์ (Vulnerability)๊ณผ ๊ด€๋ จ๋œ ์šฉ์–ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž

๐Ÿ“ Vulnerability

์†Œํ”„ํŠธ์›จ์–ด์—์„œ ๋กœ๊ทธ์ธ ์—†์ด ์•ก์„ธ์Šค๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ํ—ˆ๊ฐ€๋˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ์ปดํ“จํ„ฐ๋ฅผ ์†์ƒ์‹œํ‚ค๋Š” ๋“ฑ ๊ณต๊ฒฉ ์‹œ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์ปดํ“จํ„ฐ ๋™์ž‘์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” Bug ์ด๋‹ค.

๐Ÿ“ Exploit

ํ”„๋กœ๊ทธ๋žจ์— ์กด์žฌํ•˜๋Š” Bug๋ฅผ ์•…์šฉํ•˜๋Š” input์ด๋‹ค.

  • Exploitable: Bug๋ฅผ ์ด์šฉํ•ด์„œ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์žฅ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค. (๊ณต๊ฒฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋ฉด 'exploitable ํ•˜์ง€ ์•Š๋‹ค'๊ณ  ํ•œ๋‹ค.)

๐Ÿ“ Threat

์ปดํ“จํ„ฐ ๋ณด์•ˆ์—์„œ Threat์€ ์ทจ์•ฝ์„ฑ์„ ์•…์šฉํ•˜์—ฌ ๋ณด์•ˆ์„ ์œ„๋ฐ˜ํ•จ์œผ๋กœ์จ ํ”ผํ•ด๋ฅผ ์ž…ํž ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์œ„ํ—˜์ด๋‹ค.

์ทจ์•ฝ์  ๊ณต๊ฒฉ์˜ ์ข…๋ฅ˜๋Š” ๊ทธ ๊ตฌ๋ถ„ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ ์ค‘ ํ•˜๋‚˜๊ฐ€ BOF ์ทจ์•ฝ์  ๊ณต๊ฒฉ ์ด๋‹ค.


๊ทธ๋ ‡๋‹ค๋ฉด, BOF ์ทจ์•ฝ์  ๊ณต๊ฒฉ์€ ๋ฌด์—‡์ธ๊ฐ€?

๐Ÿ“ Buffer

๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๊ณณ์—์„œ ๋‹ค๋ฅธ ํ•œ ๊ณณ์œผ๋กœ ์ „์†กํ•˜๋Š” ๋™์•ˆ ์ผ์‹œ์ ์œผ๋กœ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ์˜์—ญ์„ ์˜๋ฏธํ•œ๋‹ค.

๐Ÿ“ Overflow

์‚ฌ์ „์ ์œผ๋กœ '์šฉ๋Ÿ‰์„ ์ดˆ๊ณผํ•˜์—ฌ ๋„˜์ณ ํ๋ฅธ๋‹ค'๋Š” ๋œป์˜ ์šฉ์–ด๋กœ, ํ•œ์ •๋œ ๋ฉ”๋ชจ๋ฆฌ ์šฉ๋Ÿ‰์„ ๋„˜์–ด๊ฐ€๋Š” ๊ฐ’์ด ๋“ค์–ด๊ฐˆ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

๐Ÿ’ก Buffer Overflow (BOF)

Buffer๊ฐ€ ํ˜๋Ÿฌ๋„˜์ณ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•  ๋•Œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ง€์ •ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ”๊นฅ์ชฝ์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค.


๋ฒ—์–ด๋‚œ ๋ฐ์ดํ„ฐ๋Š” ๊ฐ€๊นŒ์šด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฎ์–ด์“ฐ๊ฒŒ ๋˜๋Š”๋ฐ, ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ์— ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋˜์–ด์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.

C ๋ฐ C++์€ ๋ณ€์ˆ˜์˜ ๋ฒ”์œ„๋ฅผ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š์•„ ํŠนํžˆ Buffer Overflow์— ์ทจ์•ฝํ•˜๋‹ค. (๊ฐ’์ด Buffer๋ฅผ ์ดˆ๊ณผํ•˜๋”๋ผ๋„ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ  ์ €์žฅํ•œ๋‹ค.)

๐Ÿšซ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์— ๊ทธ์น˜์ง€ ์•Š๊ณ  ํ•ดํ‚น์— ์‚ฌ์šฉ๋œ๋‹ค๋ฉด?๐Ÿšซ

์•…์˜์ ์ธ ๊ณต๊ฒฉ์ž๋Š” ์œ„์™€ ๊ฐ™์€ ์ทจ์•ฝ์ ์„ ์•Œ๊ณ  ๋ฐ์ดํ„ฐ์˜ ๊ธธ์ด์™€ ๋‚ด์šฉ์„ ์ ์ ˆํžˆ ์กฐ์ •ํ•˜์—ฌ ์˜๋„์ ์œผ๋กœ Buffer Overflow๋ฅผ ์ผ์œผ์ผœ์„œ ํŠน์ • ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋„๋ก ํ•œ๋‹ค.


๐Ÿ’ก BOF ์ข…๋ฅ˜

Stack์— ์กด์žฌํ•˜๋Š” Buffer์— ๋Œ€ํ•œ ๊ณต๊ฒฉ์ด๋ƒ Heap์— ์กด์žฌํ•˜๋Š” Buffer์— ๋Œ€ํ•œ ๊ณต๊ฒฉ์ด๋ƒ์— ๋”ฐ๋ผ Stack BOF์™€ Heap BOF๋กœ ๊ตฌ๋ถ„๋œ๋‹ค.

  • Stack BOF
    Stack (ํ•จ์ˆ˜ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์ง€์—ญ ๋ฐ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์œ„์น˜ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ) ๊ตฌ์กฐ ์ƒ, ํ• ๋‹น๋œ Buffer๊ฐ€ ์ •์˜๋œ Buffer ํ•œ๊ณ„์น˜๋ฅผ ๋„˜๋Š” ๊ฒฝ์šฐ ๋ณต๊ท€ ์ฃผ์†Œ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ๊ณต๊ฒฉ์ž๊ฐ€ ์ž„์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰
  • Heap BOF
    Heap (malloc()๋“ฑ์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์ ์œผ๋กœ ํ• ๋‹นํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ) ๊ตฌ์กฐ ์ƒ, ์ตœ์ดˆ ์ •์˜๋œ Heap์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์ด์ฆˆ๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๋ฌธ์ž์—ด๋“ค์ด Heap์˜ Buffer์— ํ• ๋‹น๋  ์‹œ, ๊ณต๊ฒฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ๋ฐ ํ•จ์ˆ˜ ์ฃผ์†Œ ๋ณ€๊ฒฝ์œผ๋กœ ์ž„์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰

โšก ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

  • Stack

    • ํ”„๋กœ๊ทธ๋žจ์ด ์ž๋™์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ž„์‹œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์œผ๋กœ, ์ง€์—ญ๋ณ€์ˆ˜, ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฆฌํ„ด ๊ฐ’ ๋“ฑ์ด ์ž ์‹œ ์‚ฌ์šฉ๋˜์—ˆ๋‹ค๊ฐ€ ์‚ฌ๋ผ์ง€๋Š” ์ž„์‹œ์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์˜์—ญ
    • ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ƒ์„ฑ๋˜๊ณ  ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๋ฉด ๋ฐ˜ํ™˜
    • Stack์˜ ์‚ฌ์ด์ฆˆ๋Š” ๊ฐ ํ”„๋กœ์„ธ์Šค๋งˆ๋‹ค ํ• ๋‹น๋˜์ง€๋งŒ, ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋ ๋•Œ Stack ์‚ฌ์ด์ฆˆ๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ์–ด ๋Ÿฐํƒ€์ž„์‹œ ์‚ฌ์ด์ฆˆ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ
    • ๋ฉ”๋ชจ๋ฆฌ์˜ ๋†’์€ ์ฃผ์†Œ์—์„œ ๋‚ฎ์€ ์ฃผ์†Œ์˜ ๋ฐฉํ–ฅ์œผ๋กœ ์ €์žฅ
  • Heap

    • ํ•„์š”์— ์˜ํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋™์  ํ• ๋‹นํ•˜๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์œผ๋กœ, ๋™์  ๋ฐ์ดํ„ฐ ์˜์—ญ
    • ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ’์— ์˜ํ•ด์„œ๋งŒ ์ฐธ์กฐ๋˜๊ณ  ์‚ฌ์šฉ
    • ์ด ์˜์—ญ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด C์—์„œ malloc()ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ
    • ๋ฉ”๋ชจ๋ฆฌ์˜ ๋‚ฎ์€ ์ฃผ์†Œ์—์„œ ๋†’์€ ์ฃผ์†Œ์˜ ๋ฐฉํ–ฅ์œผ๋กœ ํ• ๋‹น

โšก Stack BOF

  • ๊ณต๊ฒฉ์ž๋Š” SFP ์˜์—ญ๊นŒ์ง€ ๊ฐ’์„ ๋„˜์น˜๊ฒŒ ๋ฎ์–ด ์“ด ํ›„, RET ์˜์—ญ๊นŒ์ง€ ๋„๋‹ฌ, RET ์˜์—ญ์˜ ์ฃผ์†Œ๋ฅผ ์•…์„ฑ ์ฝ”๋“œ์˜ ์ฃผ์†Œ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์‹คํ–‰๋˜๋„๋ก ์œ ๋„ํ•˜๋Š” ํ˜•ํƒœ๋กœ Stack BOF๋ฅผ ์ˆ˜ํ–‰

  • ์•…์„ฑ ์ฝ”๋“œ ๋‚ด setuid๋ฅผ ์„ค์ •ํ•˜์—ฌ root ๊ถŒํ•œ์œผ๋กœ์˜ ๊ถŒํ•œ ์ƒ์Šน ๋“ฑ ๋‹ค์–‘ํ•œ ๊ณต๊ฒฉ์— ์ด์šฉ ๊ฐ€๋Šฅ

โšก Heap BOF

  • Heap ์˜์—ญ์˜ ๋‚ฎ์€ ์ฃผ์†Œ์— ์žˆ๋Š” ๋ฒ„ํผ๊ฐ€ ๋„˜์ณ์„œ ๋‹ค๋ฅธ ๋ฒ„ํผ๋ฅผ ์นจ๋ฒ”ํ•˜์—ฌ ๋ฐœ์ƒ
  • ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์—ฐ๊ฒฐ(malloc ์ƒ์œ„ ์ˆ˜์ค€ ๋ฐ์ดํ„ฐ)์„ ๋ฎ์–ด ์”€์œผ๋กœ์จ ํ”„๋กœ๊ทธ๋žจ์˜ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ๋ฅผ ์กฐ์ž‘
  • Stack BOF ๋งŒํผ ํ”ํžˆ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ณต๊ฒฉ์€ ์•„๋‹ˆ๋‹ค.

โšก C ์–ธ์–ด BOF ์ฃผ์š” ํ•จ์ˆ˜

  • strcpy(char dst, const char src)
    • src ๋ฌธ์ž์—ด์„ dst ๋ฒ„ํผ์— ์ €์žฅ
    • src ๋ฌธ์ž์—ด ๊ธธ์ด๋ฅผ ์ฒดํฌํ•˜์ง€ ์•Š์•„, dst ๋ฒ„ํผ๋ฅผ ์ดˆ๊ณผํ•˜๋Š” BOF ๊ฐ€๋Šฅ
  • strncpy(char dst, const char src, size_t len)
    • src ๋ฌธ์ž์—ด์˜ len ๋งŒํผ์„ dst ๋ฒ„ํผ์— ์ €์žฅ
    • src ๋ฌธ์ž์—ด ๊ธธ์ด๋ฅผ ์ œํ•œํ•˜์—ฌ BOF ๋ฐฉ์ง€ ๊ฐ€๋Šฅ
  • size_t strlen(const char *str)
    • ๋ฌธ์ž์—ด(str)์˜ null ๋ฌธ์ž๋ฅผ ์ œ์™ธํ•œ ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜
  • sizeof(ํ”ผ์—ฐ์‚ฐ์ž)
    • ํ”ผ์—ฐ์‚ฐ์ž์˜ ํฌ๊ธฐ๋ฅผ ๋ฐ˜ํ™˜

โšก Buffer Overflow ๋ฐฉ์ง€๋ฒ•

  • BOF๋ฅผ ์ผ์œผํ‚ฌ ์—ฌ์ง€๊ฐ€ ์žˆ๋Š” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ž…๋ ฅ ๊ฐ’ ๊ฒ€์‚ฌ๋ฅผ ํ•œ๋‹ค. ๋ชจ๋“  ์ž…๋ ฅ์„ ๋ฐ›์•„๋“ค์ด๊ณ  ํŠน์ • ์ž…๋ ฅ์„ ์ฐจ๋‹จํ•˜๋Š” ๋ฐฉ์‹์—์„œ ํŠน์ • ์ž…๋ ฅ๋งŒ ๋ฐ›์•„๋“ค์ด๊ณ , ๋‚˜๋จธ์ง€๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ๋ฐฉ์‹์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.
  • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹œ ๋ฒ„ํผ ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ๋ฅผ ํ•œ๋‹ค.
  • BOF์— ์•ˆ์ „ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ๊ฐ์ข… BOF ๋Œ€์‘ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • BOF ์ •์  ๋ถ„์„ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋งŽ์€ ๋ถ„์„๋„๊ตฌ๊ฐ€ BOF ๊ฒฐํ•จ์„ ํƒ์ง€ํ•ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
  • BOF๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ฃผ์žฅ๋„ ์žˆ๋‹ค.

โšก BOF ๋Œ€์‘ ๊ธฐ์ˆ 

  • Stack Guard (Canary Word Method)
    ๋ฉ”๋ชจ๋ฆฌ ์ƒ ํ”„๋กœ๊ทธ๋žจ ๋ณต๊ท€ ์ฃผ์†Œ์™€ ๋ณ€์ˆ˜ ์‚ฌ์ด์— ํŠน์ • ๊ฐ’(Canary Word)๋ฅผ ์ €์žฅ, ๊ทธ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๊ฒฝ์šฐ BOF๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ ์ค‘๋‹จ
  • Stack Shield
    ๋ณต๊ท€ ์ฃผ์†Œ๋ฅผ Global RET๋ผ๋Š” ํŠน์ˆ˜ Stack์— ์ €์žฅ ํ›„, ํ•จ์ˆ˜ ์ข…๋ฃŒ ์‹œ์— ์ €์žฅ๋œ ๊ฐ’๊ณผ RET ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ๋‹ค๋ฅผ ์‹œ, BOF๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ ์ค‘๋‹จ
  • ASLR (Address Space Layout Randomization)
    ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ ๋งˆ๋‹ค ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๋‚œ์ˆ˜ํ™” ํ•˜์—ฌ ํŠน์ •์ฃผ์†Œ ํ˜ธ์ถœ ๋ฐฉ์ง€
    ํ•ด์ปค๊ฐ€ BOF์— ์‚ฌ์šฉํ•  ์—ฌ๋Ÿฌ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋“ค์„ ์ฐพ๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ

์œ„ ๊ธฐ์ˆ ๋“ค์€ ํ˜„์žฌ OS์— ๊ธฐ๋ณธ์œผ๋กœ ๋ฐ˜์˜๋˜์–ด์žˆ๋‹ค.


โšก ์‹ค์ œ์‚ฌ๋ก€

  • Heartbleed
  • Ariane 5 ๋กœ์ผ“ ํญํŒ” ์‚ฌ๊ณ 
  • ์œˆ๋„์šฐ XP
    9999๋…„ 12์›” 31์ผ ์˜คํ›„ 11์‹œ 59๋ถ„ 59์ดˆ์—์„œ 1์ดˆํ›„์ธ 10000๋…„์ด ๋˜๋ฉด, CPU์˜ ์ ์œ ์œจ์ด ๊ธ‰์ƒ์Šนํ•˜๋Š” ์˜ค๋ฅ˜

์ดํ›„์—๋Š” BOF ์ทจ์•ฝ์  ํ•ดํ‚น ์‹ค์Šต์— ๋Œ€ํ•ด ๋‹ค๋ค„๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.


Reference

0๊ฐœ์˜ ๋Œ“๊ธ€