Studying Security

Master Canary 본문

개념 정리

Master Canary

J4guar 2022. 5. 18. 22:29
728x90
반응형

Thread Local Storage(TLS)

thread의 저장 공간(thread의 전역 변수를 저장하기 위한 공간으로 Loader에 의해서 할당)을 의미합니다. 

init_tls 함수

Loader에서 TLS영역을 할당하고 초기화하는 함수입니다.

_dl_allocate_tls_storage 함수에서 TLS영역을 할당하고 이를 tcbp에 저장한 뒤 TLS_INIT_TP매크로의 인자를 전달합니다.

<init_tls>

TLS 영역은 _dl_allocate_tls_storage 함수에서 __libc_memalign 함수를 호출하여 할당됩니다.

SET_FS

TLS_INIT_TP 매크로 = dl_allocate_tls_storage에서 할당한 TLS 영역을 FS로 초기화 합니다.

arch_prctl 시스템 콜의 첫 번째 인자로 ARCH_SET_FS, 두 번째 인자로 할당한 TLS 주소가 전달됩니다.

arch_prctl시스템 콜의 ARCH_SET_FS는 프로세스의 FS 세그먼트 레지스터를 초기화하는 작업을 수행하는 명령어입니다. 따라서 FS 세그먼트 레지스터는 TLS 영역을 가리키게 됩니다.

<TLS_INIT_TP>

Master Canary

master canary는 main 함수가 호출되기 전에 랜덤으로 생성된 canary를 전역 변수로 사용되는 Thread Local Storage(TLS)에 저장합니다.

Stack Smashing Protector(SSP) 보호기법이 적용되어 있다면 스택 버퍼를 사용하는 모든 함수는 TLS 주소에서 0x28 바이트 만큼 떨어진 공간에 위치한 랜덤한 값인 Master Canary를 참조하기 때문에 모두 같은 canary 값을 사용하는 것입니다.

FS 세그먼트 레지스터는 앞서 arch_prctl 시스템 콜을 통해 _dl_allocate_tls_storage에서 할당한 주소입니다.

TLS의 tcbhead_t 구조체

security_init

security_init 함수는 _dl_setup_stack_chk_guard에서 _dl_random을 인자로 생성한 랜덤한 canary 값을 설정합니다.

THREAD_SET_STACK_GUARD 매크로는 TLS 영역의 header.stack_guard에 canary 값을 삽입하는 역할을 합니다.

_dl_setup_stack_chk_guard(_dl_random)

공용체 변수인 ret에 커널에서 생성한 랜덤한 값을 갖는 dl_random의 데이터를 복사합니다.

이후 바이너리의 Byte Ordering에 따라 AND 연산을 수행하는데, 리틀 엔디언의 경우 복사한 값의 첫 바이트를 NULL로 변환합니다. (canary의 첫 바이트가 NULL인 이유)

THREAD_SET_STACK_GUARD

TLS + 0x28 위치에 생성된 canary의 값을 삽입하는 매크로

만약 master canary를 공격자가 원하는 값으로 조작한다면 fs:0x28을 참조하여 비교하는 SSP 보호기법을 우회할 수 있습니다.

 

pthread_create로 thread를 생성하게 되면 master canary인 tcbhead_t 구조체의 stack_guard를 복사하여 사용합니다.

또한 thread 함수의 스택은 TLS 영역과 인접한 영역에 할당됩니다.

따라서 만약 stack buffer overflow 취약점이 존재하면 TLS 영역에 있는 master canary 값을 overwrite할 수 있습니다.

<__pthread_create_2_1>

gdb에서 $fs_base+0x28로 해당 주소로 접근이 가능합니다.

 

Reference

반응형

'개념 정리' 카테고리의 다른 글

Bypass SECCOMP  (0) 2022.05.20
SECCOMP  (0) 2022.05.20
__environ  (0) 2022.05.11
_rtld_global  (0) 2022.04.28
SigReturn Oriented Programming (SROP)  (0) 2022.04.14
Comments