Jastes 2022. 11. 10. 12:00

Stack Smashing Protector(SSP)๋Š” BOF๋กœ๋ถ€ํ„ฐ ret ๋ณดํ˜ธ ๊ธฐ๋ฒ•์œผ๋กœ์จ,
์Šคํƒ ๋ฒ„ํผ๊ฐ€ ์กด์žฌํ•˜๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ž„์˜๋กœ ์ƒ์„ฑ๋œ ๊ฐ’์„ ๋ฒ„ํผ ๋งˆ์ง€๋ง‰์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

SSP ๋ณดํ˜ธ ๊ธฐ๋ฒ•์„ ๋ฐฐ์šธ ๋•Œ ์Šคํƒ ์นด๋‚˜๋ฆฌ์˜ ๊ฐ’์ด ์œ„์น˜ํ•œ Thread Local Storage(TLS)์— ๋Œ€ํ•˜ ์ž์„ธํžˆ ๋ด…์‹œ๋‹ค.


Thread Local Storage

์Šค๋ ˆ๋“œ์˜ ์ €์žฅ ๊ณต๊ฐ„

ELF ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์‚ดํŽด๋ณด๋ฉด, ๊ฐ ๋ชฉ์ ์„ ๊ฐ€์ง„ ์„น์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
์ฝ”๋“œ๋ฅผ ์‹คํ–‰(.text), ์ดˆ๊ธฐํ™” X ์ „์—ญ ๋ณ€์ˆ˜(.data) ๋“ฑ์ด ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด์™€ ๋‹ฌ๋ฆฌ TLS ์˜์—ญ์€ ์Šค๋ ˆ๋“œ์˜ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ณต๊ฐ„์œผ๋กœ, ๋กœ๋”(Loader)์— ์˜ํ•ด ํ• ๋‹น๋จ

init_tls ํ•จ์ˆ˜

๋กœ๋”์—์„œ TLS ์—ฌ์—ญ์„ ํ• ๋‹นํ•˜๊ณ  ์ดˆ๊ธฐํ™”ํ•˜๋Š” ํ•จ์ˆ˜์ธ init_tls ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด, _dl_allocate_tls_storage ํ•จ์ˆ˜์—์„œ TLS ์˜์—ญ์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
์ด๋ฅผ tcbp์— ์ €์žฅํ•œ ๋’ค TLS_INIT_TP ๋ฉ”ํฌ๋กœ์˜ ์ธ์ž๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.


SET_FS

TLS_INIT_TP ๋ฉ”ํฌ๋กœ

dl_allocate_tls_storage์—์„œ ํ• ๋‹นํ•œ TLS ์˜์—ญ์„ FS๋กœ ์ดˆ๊ธฐํ™” ํ•˜๋Š” TLS_INIT_TP ๋ฉ”ํฌ๋กœ์ด๋ฉฐ,
์–ด์…ˆ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด, arch_prctl ์‹œ์Šคํ…œ ์ฝœ์˜ ์ฒซ ์ธ์ž๋กœ ARCH_SET_FS์ด๋ฉฐ,
๋‘๋ฒˆ์งธ ์ธ์ž๋กœ ํ• ๋‹นํ•œ TLS ์ฃผ์†Œ๊ฐ€ ์ „๋‹ฌ๋จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

arch_prctl ์‹œ์Šคํ…œ ์ฝœ์˜ ARCH_SET_FS๋Š” ํ”„๋กœ์„ธ์Šค์˜ FS ์„ธ๊ทธ๋จผํŠธ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰
๋”ฐ๋ผ์„œ FS ์„ธ๊ทธ๋จผํŠธ ๋ ˆ์ง€์Šคํ„ฐ๋Š” TLS ์˜์—ญ์„ ๊ฐ€๋ฅดํ‚ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


Master Canary

์Šคํƒ ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ํ•จ์ˆ˜์—์„œ ๊ฐ™์€ ์นด๋‚˜๋ฆฌ ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
์ด๋Ÿฐ ํŠน์ง• ๋•Œ๋ฌธ์— ์ž„์˜ ํ•จ์ˆ˜์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ฆญ์„ ์•Œ์•„๋‚ธ๋‹ค๋ฉด ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ์‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SSP ๋™์ž‘ ์›๋ฆฌ๋ฅผ ๋˜์งš์œผ๋ฉด, ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜์˜ ํ”„๋กค๋กœ๊ทธ์—์„œ
FS:0x28์— ์œ„์น˜ํ•œ ๊ฐ’์„ ๊ฐ€์ ธ์™€ RBP ๋ฐ”๋กœ ์•ž์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค

FS ์„ธ๊ทธ๋จผํŠธ ๋ ˆ์ง€์Šคํ„ฐ๋Š” ์•ž์„œ arch_prctl ์‹œ์Šคํ…œ ์ฝœ์„ ํ†ตํ•ด _dl_allocate_tls_storage์—์„œ
ํ• ๋‹นํ•œ ์ฃผ์†Œ๋กœ, ๋ชจ๋“  ํ•จ์ˆ˜๊ฐ€ ํ•ด๋‹น ์ฃผ์†Œ์—์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ธฐ์— ๊ฐ™์€ ์นด๋‚˜๋ฆฌ ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ TLS ์ฃผ์†Œ์— 0x28 ๋ฐ”์ดํŠธ๋งŒํผ ๋–จ์–ด์ง„ ์ฃผ์†Œ์— ์œ„์น˜ํ•œ ๋žœ๋ค ๊ฐ’์„ ๋งˆ์Šคํ„ฐ ์นด๋‚˜๋ฆฌ(master Canary)!

security_init ํ•จ์ˆ˜

์ด์ „์— ํ• ๋‹นํ•œ TLS ์˜์—ญ์— ๋žœ๋คํ•œ ์นด๋‚˜๋ฆฌ ๊ฐ’์„ ์‚ฝ์ž…ํ•˜๋Š” security_init ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
_dl_setup_stack_chk_guard ํ•จ์ˆ˜๋Š” ์ปค๋„์—์„œ ์ƒ์„ฑํ•œ ๋žœ๋ค ๊ฐ’์„ ์ง€๋‹Œ
ํฌ์ธํ„ฐ _dl_random์„ ์ธ์ž๋กœ ์นด๋‚˜๋ฆฌ ์ƒ์„ฑํ•จ


์นด๋‚˜๋ฆฌ ๊ฐ’ ์ƒ์„ฑ

_dl_setup_stack_chk_guard ํ•จ์ˆ˜

security_init ํ•จ์ˆ˜์—์„œ ์ฒ˜์Œ ํ˜ธ์ถœํ•˜๋Š” _dl_setup_stack_chk_guard ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
ํ•จ์ˆ˜ ์ฝ”๋“œ๋ฅผ ๋ณด์‹œ๋ฉด, ๊ณต์šฉ์ฒด ๋ณ€์ˆ˜์ธ ret์— ์ปค๋„์—์„œ ์ƒ์„ฑํ•œ ๋žœ๋คํ•œ ๊ฐ’์„
๊ฐ€์ง„ dl_random์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ดํ›„ ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ ๋ฐ”์ดํŠธ ์˜ค๋”๋ง(Byte Ordering)์— ๋”ฐ๋ผ AND ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ,
๋ฆฌํ‹€ ์—”๋””์–ธ์˜ ๊ฒฝ์šฐ ๋ณต์‚ฌํ•œ ๊ฐ’์˜ ์ฒซ ๋ฐ”์ดํŠธ๋ฅผ NULL๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ”์ดํŠธ ์˜ค๋”๋ง(Byte Ordering)
 ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ์ˆœ์„œ(little endian, big endian)
๋” ์ •ํ™•ํ•œ ๋‚ด์šฉ์€ endian์˜ ํ˜•์‹์„ ์ดํ•ดํ•˜๋ฏ€๋กœ ์—ฌ๊ธฐ์„  ๋งํฌ๋กœ ํ™•์ธํ•ด์ฃผ์„ธ์š”
 

์ฝ”๋”ฉ๊ต์œก ํ‹ฐ์”จํ”ผ์Šค์ฟจ

4์ฐจ์‚ฐ์—…ํ˜๋ช…, ์ฝ”๋”ฉ๊ต์œก, ์†Œํ”„ํŠธ์›จ์–ด๊ต์œก, ์ฝ”๋”ฉ๊ธฐ์ดˆ, SW์ฝ”๋”ฉ, ๊ธฐ์ดˆ์ฝ”๋”ฉ๋ถ€ํ„ฐ ์ž๋ฐ” ํŒŒ์ด์ฌ ๋“ฑ

tcpschool.com


์นด๋‚˜๋ฆฌ ๊ฐ’ ์‚ฝ์ž…

_dl_setup_stack_chk_guard์—์„œ ์นด๋‚˜๋ฆฌ ๊ฐ’์„ ์ƒ์„ฑํ–ˆ๋‹ค๋ฉด, ํ•ด๋‹น ๊ฐ’์„
THREAD_SET_STACK_GUARD ๋งคํฌ๋กœ์˜ ์ธ์ž๋กœ ์ „๋‹ฌํ•ด ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๋‹น ๋งคํฌ๋กœ ์„ ์–ธ๋ถ€๋กœ, THREAD_SETMEM ๋งคํฌ๋กœ๋ฅผ ํ†ตํ•ด ๋‘ ๋ฒˆ์งธ ์ธ์ž์ธ
header.stack_guard ์œ„์น˜์— value๋ฅผ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.


tcphead_t ๊ตฌ์กฐ์ฒด

ํ• ๋‹นํ•œ TLS์˜์—ญ์€ tcphead_t ๊ตฌ์กฐ์ฒด๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”๋ฐ, stack_guard๋Š”
์Šคํƒ ์นด๋‚˜๋ฆฌ์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ THREAD_SET_STACK_GUARD๋Š” TLS+0x28 ์œ„์น˜์—
์ƒ์„ฑ๋œ ์นด๋‚˜๋ฆฌ ๊ฐ’์„ ์‚ฝ์ž…ํ•˜๋Š” ๋งคํฌ๋กœ์ž…๋‹ˆ๋‹ค.


๋””๋ฒ„๊น…

1
2
3
4
5
6
7
8
9
10
// Name: master_canary.c
// Compile: gcc -o master_canary master_canary.c -no-pie
#include <stdio.h>
#include <unistd.h>
 
int main(){
        char buf[256];
        read(0, buf, 256);
}
 
cs

์œ„ ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๊ณ  ๋””๋ฒ„๊น…์„ ํ†ตํ•ด ๋งˆ์Šคํ„ฐ ์นด๋‚˜๋ฆฌ๋ฅผ ์ฐพ์•„๋ด…์‹œ๋‹ค.

gdb์—์„  fs ์„ธ๊ทธ๋จผํŠธ ๋ ˆ์ง€์Šคํ„ฐ์˜ ์ฃผ์†Œ๋ฅผ ์œ„์™€ ๊ฐ™์ด ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋ฅผ ํ†ตํ•ด TLS ์ฃผ์†Œ์— ์žˆ๋Š” ๋งˆ์Šคํ„ฐ ์นด๋‚˜๋ฆฌ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค


๋งˆ์น˜๋ฉฐ

์Šคํƒ ์นด๋‚˜๋ฆฌ๋Š” ๋กœ๋” ๋‚ด๋ถ€์—์„œ ์ปค๋„์ด ์ƒ์„ฑํ•œ ๋žœ๋คํ•œ ๊ฐ’์„ ๊ฐ€๊ณตํ•˜์—ฌ ๋งŒ๋“ค์–ด์ง„ ๊ฐ’์ž…๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ ์นด๋‚˜๋ฆฌ ๊ฐ’์„ ๋งˆ์Šคํ„ฐ ์นด๋‚˜๋ฆฌ๋ผ๊ณ  ํ•˜๋ฉฐ,
๋ชจ๋“  ํ•จ์ˆ˜์—์„œ ๊ฐ–๊ณ ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก TLS+0x28์œ„์น˜์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

  • Thread Local Storage (TLS)
    : ์Šค๋ ˆ๋“œ์˜ ์ €์žฅ ๊ณต๊ฐ„์„ ์˜๋ฏธ

    - ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š”๋ฐ์— ์“ฐ์ž„
  • Master Canary
    : TLS ์ฃผ์†Œ์— 0x28 ๋ฐ”์ดํŠธ ๋งŒํผ ๋–จ์–ด์ง„ ์ฃผ์†Œ์— ์œ„์น˜ํ•œ ๋žœ๋คํ•œ ๊ฐ’,

    - ๋ชจ๋“  ํ•จ์ˆ˜์—์„œ ํ•ด๋‹น ๊ฐ’์„ ์Šคํƒ ์นด๋‚˜๋ฆฌ๋กœ ์‚ฌ์šฉํ•จ
  •  

์ฐธ๊ณ  ์ž๋ฃŒ

 

Background: Master Canary

์ด๋ฒˆ ์ฝ”์Šค์—์„œ๋Š” Master Canary์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

dreamhack.io

์ฐธ๊ณ  ์ด๋ฏธ์ง€