์ƒŒ๋“œ๋ฐ•์Šค ์Šคํฌ๋ฆฝํŠธ์—์„œ ์‹œ์Šคํ…œ ๋ช…๋ น ํ˜ธ์ถœ์„ ํ—ˆ์šฉํ•˜๋Š” Python์˜ ์ทจ์•ฝ์„ฑ

Python 2.7์— ๋“ฑ์žฅํ•˜๊ณ  2012๋…„์— ์‹๋ณ„๋˜์—ˆ์œผ๋ฉฐ Python 3์—์„œ ์•„์ง ์ˆ˜์ •๋˜์ง€ ์•Š์€ ์˜ค๋žซ๋™์•ˆ ์•Œ๋ ค์ง„ ๋ฒ„๊ทธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Python ์ฝ”๋“œ ์‹คํ–‰ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฒ„๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠน๋ณ„ํžˆ ์—ฐ๊ฒฐ๋œ Python ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ ํ•ด์ œ๋œ ํ˜ธ์ถœ์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Python์˜ ๋ฉ”๋ชจ๋ฆฌ(Use-After-Free). ์ฒ˜์Œ์—๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ณด์•ˆ ์œ„ํ˜‘์„ ์ผ์œผํ‚ค์ง€ ์•Š์œผ๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์ธ์œ„์ ์œผ๋กœ ์ƒ์„ฑ๋œ ๋งค์šฐ ๋“œ๋ฌธ ๊ฒฝ์šฐ์—๋งŒ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋น„์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

kn32๋ผ๋Š” ๊ฐ€๋ช…์„ ์‚ฌ์šฉํ•˜๋Š” ๋ณด์•ˆ ์—ฐ๊ตฌ์›์ด ์ด ๋ฌธ์ œ์— ๊ด€์‹ฌ์„ ๊ฐ–๊ฒŒ ๋˜์—ˆ๊ณ  os.system๊ณผ ๊ฐ™์€ ๋ฉ”์„œ๋“œ์— ์ง์ ‘ ์•ก์„ธ์Šคํ•˜์ง€ ์•Š๊ณ ๋„ ์‹œ์Šคํ…œ ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—… ์ต์Šคํ”Œ๋กœ์ž‡์„ ์ค€๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ต์Šคํ”Œ๋กœ์ž‡์€ ์ˆœ์ˆ˜ Python์œผ๋กœ ๊ตฌํ˜„๋˜๋ฉฐ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๊ณ  "code.__new__" ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์„ค์น˜ํ•˜์ง€ ์•Š๊ณ  ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ›„ํฌ ์ค‘ "builtin.__id__"๋งŒ ์‚ฌ์šฉ๋˜๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ธˆ์ง€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ค์šฉ์ ์ธ ์ธก๋ฉด์—์„œ ์ œ์•ˆ๋œ ์ฝ”๋“œ๋Š” Python ์ฝ”๋“œ์˜ ์‹คํ–‰์„ ํ—ˆ์šฉํ•˜์ง€๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ˜ธ์ถœ์„ ์ œํ•œํ•˜๋Š” ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค ๋ฐ ํ™˜๊ฒฝ(์˜ˆ: ํ•™์Šต ํ™˜๊ฒฝ, ์˜จ๋ผ์ธ ์…ธ, ๋‚ด์žฅ ์ฒ˜๋ฆฌ๊ธฐ ๋“ฑ)์—์„œ ๊ฒฉ๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์šฐํšŒํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. os.system๊ณผ ๊ฐ™์€ ์•ก์„ธ์Šค ๋ฐฉ๋ฒ•์„ ํ—ˆ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

์ œ์•ˆ๋œ ์ฝ”๋“œ๋Š” CPython์˜ ์ทจ์•ฝ์ ์„ ์•…์šฉํ•˜์—ฌ ์ž‘๋™ํ•˜๋Š” os.system ํ˜ธ์ถœ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ต์Šคํ”Œ๋กœ์ž‡์€ x3-86 ์‹œ์Šคํ…œ์˜ ๋ชจ๋“  ๋ฒ„์ „์˜ Python 64์—์„œ ์ž‘๋™ํ•˜๋ฉฐ PIE, RELRO ๋ฐ CET ๋ณด์•ˆ ๋ชจ๋“œ๊ฐ€ ํ™œ์„ฑํ™”๋œ ์ƒํƒœ์—์„œ๋„ Ubuntu 22.04์—์„œ ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค. ์ž‘์—…์€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ CPython ์ฝ”๋“œ์— ์žˆ๋Š” ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜์˜ ์ฃผ์†Œ์— ๋Œ€ํ•œ Python ์ฝ”๋“œ ์ •๋ณด๋ฅผ ์–ป๋Š” ๊ฒƒ์œผ๋กœ ์ถ•์†Œ๋ฉ๋‹ˆ๋‹ค. ์ด ์ฃผ์†Œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” CPython์˜ ๊ธฐ๋ณธ ์ฃผ์†Œ์™€ ๋กœ๋“œ๋œ libc ์ธ์Šคํ„ด์Šค์˜ system() ํ•จ์ˆ˜ ์ฃผ์†Œ๊ฐ€ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์— ๋ฌธ์ž์—ด "/bin/sh"์— ๋Œ€ํ•œ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜ ํฌ์ธํ„ฐ์˜ ๋Œ€์ฒด์™€ ํ•จ๊ป˜ ํŠน์ • ์‹œ์Šคํ…œ ์ฃผ์†Œ๋กœ์˜ ์ง์ ‘ ์ ํ”„๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

์ƒŒ๋“œ๋ฐ•์Šค ์Šคํฌ๋ฆฝํŠธ์—์„œ ์‹œ์Šคํ…œ ๋ช…๋ น ํ˜ธ์ถœ์„ ํ—ˆ์šฉํ•˜๋Š” Python์˜ ์ทจ์•ฝ์„ฑ


์ถœ์ฒ˜ : opennet.ru

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€