Timing Attack

Timing Attack์€ ํŠน์ • ๋™์ž‘์— ๊ฑธ๋ฆฌ๋Š” "์‹คํ–‰์‹œ๊ฐ„"์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์•”ํ˜ธ ๊ฐ’ ๋“ฑ์„ ์ถ”์ ํ•˜๋Š” ๊ณต๊ฒฉ ๊ธฐ๋ฒ•์ด๋‹ค.

์ด๋ ‡๊ฒŒ ๋ญ”๊ฐ€ ๋ถ€์ˆ˜์ ์ธ ์š”์†Œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ„์ ‘์ ์œผ๋กœ ์ถ”์ •ํ•˜๋Š” ๊ณต๊ฒฉ๋ฒ•๋“ค์„ side-channel attack์ด๋ผ๊ณ  ํ•œ๋‹ค.




์˜ˆ์ œ

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜๋“œ์ฝ”๋”ฉ๋œ ํŒจ์Šค์›Œ๋“œ๋กœ ์ธ์ฆ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ด๋ณด๊ฒ ๋‹ค.

def is_authorized(token):
    if token == 'q1w2e3r4':
        return True
    else:
        return False

๊ทธ๋ƒฅ ๋ดค์„ ๋•Œ๋Š” ๋ณ„ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๊ณ  ์—ฌ๊ธธ ์ˆ˜๋„ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋ณด์•ˆ์ ์ธ ๊ด€์ ์—์„œ, ํŽธ์ง‘์ฆ์ ์ธ ๊ด€์ ์œผ๋กœ ๋ดค์„ ๋•Œ๋Š” ์ด ๋˜ํ•œ ์ทจ์•ฝ์ ์œผ๋กœ ์—ฌ๊ฒจ์งˆ ์ˆ˜ ์žˆ๋‹ค.

is_authorized('q1aaaa')
is_authorized('asdf')

์™œ๋ƒ๋ฉด, ๋“ค์–ด๊ฐ€๋Š” ๊ฐ’์— ๋”ฐ๋ผ์„œ ์ฒ˜๋ฆฌ์‹œ๊ฐ„์ด ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ž˜ ์ƒ๊ฐํ•ด๋ณด๋ฉด, ๋ฌธ์ž์—ด ๋น„๊ต๋ผ๋Š” ๊ฒƒ๋„ ๊ฒฐ๊ตญ ๋ฌธ์ž ํ•˜๋‚˜ํ•˜๋‚˜์”ฉ ์ˆœ์„œ๋Œ€๋กœ ๋น„๊ตํ•˜๋Š” ๋ฃจํ”„๋‹ค.

q1aaaa์„ ๋„ฃ์—ˆ์„ ๋•Œ๋Š” q, 1๊นŒ์ง€ ๋น„๊ตํ•˜๊ณ  ๋‚˜์„œ a๋ฅผ ๋งŒ๋‚˜๊ณ  ๋ฃจํ”„๋ฅผ ํƒˆ์ถœํ•  ๊ฒƒ์ด๊ณ , asdf๋Š” ๋ฃจํ”„์— ์ง„์ž…ํ•˜์ž๋งˆ์ž ๋ฃจํ”„๋ฅผ ํƒˆ์ถœํ•  ๊ฒƒ์ด๋‹ค.
๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ๊ฐ’์— ๋”ฐ๋ผ์„œ ๋ฃจํ”„๋ฅผ ๋„๋Š” ํšŸ์ˆ˜๊ฐ€ ๋‹ฌ๋ผ์ง€๊ณ , ๊ทธ์— ๋”ฐ๋ผ์„œ ์‹คํ–‰๋˜๋Š” ๋ช…๋ น์–ด์˜ ๊ฐœ์ˆ˜๋„ ๋‹ฌ๋ผ์ง€๊ณ , ์ฒ˜๋ฆฌ์‹œ๊ฐ„๋„ ๋‹ฌ๋ผ์ง„๋‹ค.

ํƒ€์ด๋ฐ ์–ดํƒ์€ ์ด๋ฅผ ํ†ตํ•ด์„œ ์ผ์น˜ํ•˜๋Š” ๊ฐ’ ํŒจํ„ด์„ ์ถ”์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค.

๋ธŒ๋ฃจํŠธํฌ์Šค ๋Œ๋ฆฌ๋“ฏ์ด ๊ณ„์† ๋Œ๋ฆฌ๋‹ค๊ฐ€, ์ฒ˜๋ฆฌ์‹œ๊ฐ„์ด ๋” ์˜ค๋ž˜๊ฑธ๋ฆฌ๋Š” ์กฐํ•ฉ์„ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž๋ถ€ํ„ฐ ์ฒœ์ฒœํžˆ ์Œ“์•„๋‚˜๊ฐ€๋‹ค๋ณด๋ฉด ์–ธ์  ๊ฐ€๋Š” q1w2e3r4๋ผ๋Š” ๊ฒฐ๋ก ์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.




ํ•ด๊ฒฐ์ฑ…

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€, ์–ด๋–ค ๊ฐ’์ด ๋“ค์–ด์™€๋„ ์ผ์ •ํ•œ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๊ฒŒ๋” ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
์ด๋ฅผ ์ƒ์ˆ˜ ์‹œ๊ฐ„ ๋น„๊ต(const time compare)๋ผ๊ณ  ํ•œ๋‹ค.

์ƒ์ˆ˜์‹œ๊ฐ„ ๋น„๊ต์˜ ๊ตฌํ˜„์ฒด๋“ค์€ ๋ณดํ†ต ์•”ํ˜ธํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์— ํฌํ•จ๋˜์–ด์žˆ๋‹ค.
๋Œ€ํ‘œ์ ์œผ๋กœ Python์˜ ๋‚ด์žฅ ๋ชจ๋“ˆ์—๋„ hmac.compare_digest๋ผ๋Š” ๊ตฌํ˜„์ด ์žˆ๋‹ค.




ํ•˜์ง€๋งŒ...

์‚ฌ์‹ค ์ด๋Ÿฐ ํ˜•ํƒœ์˜ ๋‹จ์ˆœํ•œ ์‚ฌ์šฉ์‚ฌ๋ก€๋Š” ์‚ฌ์‹ค ๋งŽ์ง€ ์•Š๋‹ค.

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

๊ฒŒ๋‹ค๊ฐ€ ๋Œ€๋ถ€๋ถ„์˜ ํŒจ์Šค์›Œ๋“œ์šฉ ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์€ ์˜๋„์ ์œผ๋กœ ๋А๋ฆฌ๊ฒŒ ๋™์ž‘ํ•˜๊ฒŒ๋” ๋งŒ๋“ค์–ด์ ธ์žˆ๋‹ค. ํ•ด์‹ฑ ํƒ€์ž„์˜ ๋ชจ์ˆ˜๊ฐ€ ๋Œ€์ฒด๋กœ ๋ฌธ์ž์—ด์˜ ๋น„๊ต๋ณด๋‹ค ์••๋„์ ์œผ๋กœ ํฌ๊ธฐ ๋•Œ๋ฌธ์— ์ธก์ •์„ ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ๋„ ํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ์‹ค์ œ ์‹œ์Šคํ…œ๋“ค์—์„œ ํƒ€์ด๋ฐ ๊ณต๊ฒฉ์€ ๊ณต๊ฒฉ์ž์—๊ฒŒ ๋งค์šฐ ๋น„ํšจ์œจ์ ์ธ ๊ณต๊ฒฉ ๋ฐฉ๋ฒ•์ด ๋  ํ™•๋ฅ ์ด ๋งค์šฐ ๋†’๋‹ค. ๋‹จ์ˆœ ๋ธŒ๋ฃจํŠธํฌ์Šค๋ณด๋‹ค ๋‚˜์„ ๊ฒƒ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.



์ฐธ์กฐ
https://en.m.wikipedia.org/wiki/Timing_attack
https://stackoverflow.com/questions/27028284/is-comparing-strings-in-mysql-vulnerable-to-timing-attacks
https://sqreen.github.io/DevelopersSecurityBestPractices/timing-attack/python