System Hacking/보호기법

Fortify

zz! 2025. 9. 22. 20:30
728x90

어떤 프로그램 리눅스에서 소스를 빌드를 하다가 흔히 만나는 오류 중 하나가 있다.

undefined reference to `__memset_chk'

bof 와 같은 메모리 관련 취약점을 막기 위해 gcc 같은 컴파일러에서 제공하는 보호기법

소스코드에서 잠재적인 취약점을 탐지하고 런타임에 추가 검사를 통해 보안 향상을 한다.

bof가 감지되면 프로그램을 종료한다.

 

Fortify의 동작 방식은 buffer overflow가 발생할 때 감지할 수 있는 특정 C 라이브러리 함수의 향상된 버전을 제공하는 방식으로 작동한다. strcpy, memcpy, sprintf, memset, fprintf 등의 함수를 사용하면 컴파일 과정에서 __strcpy_chk, _-memcpy_chk로 변경한다.

취약한 함수가 호출되면 fortify는 사용중인 버퍼의 크기를 확인하고 오버런 되지 않도록 한다.

만약 overflow 등이 발생하면 fortify는 추가 손상을 방지하기 위해 즉시 프로그램을 종료한다.

 

옵션

0 : Fortify 비활성화

-O2 -U_FORTIFY_SOURCE

1 : 기본 Fortify 보호

-O2 -D_FORTIFY_SOURCE=1

2 : 강화된 Fortify 보호

-O2 -D_FORTIFY_SOURCE=2

 

-O2 가 최적화 옵션이고, _FORTIFY_SOURCE 는 컴파일러 최적화 수준에 따라 보호를 제공한다.

최적화가 없으면 fortify 가 비활성화 된다. 그러니까 예제 코드 짜서 함 볼려고 해도 최적화가 있어야 하므로, 

위에 이런 코드를 짜도 do_overflow 부분은 컴파일러가 최적화 하므로 저건 없애고 컴파일이 된다.

그러니까 한번 실습으로 봐보고 싶으면 다른 예제 코드로 보는 것이 좋을듯

아래 글 작성하시는 분이 잘 정리를 하셨다.

https://k0n9.tistory.com/entry/Fortify-mitigation#google_vignette

728x90