CFG(Control Flow Guard) 보호기법

수갱22·2024년 4월 11일
0

WHS

목록 보기
4/4

1. CFG(Control Flow Guard)

Control Flow Guard(CFG)는 메모리 손상 취약성에 대응하기 위해 Microsoft에서 도입한 보안 기능이며, 프로그램이 진행되는 도중 예상치 못한 주소로 이동(제어 흐름 납치)하는 것을 방지하는 보호 기법이다. Windows 8.1 Preview에서 처음으로 소개됐으며 현재는 Windows 10 Technical preview와 Windows 8.1 Updated에서 개선 및 활성화되었다.

2. CFG 작동 방식

(1) 컴파일 단계

  • 컴파일러는 CFG를 활성화한 코드에 대해, 각 간접 호출 지점에 대한 검사 코드를 삽입한다. 코드에서는 호출이 실행되기 전에 해당 호출의 대상 주소가 유효한 함수를 가리키고 있는지 확인한다. 유효한 호출 대상들의 목록은 "Guard CF Function Table"에 등록되어 있으며, 이는 프로그램의 실행 파일에 포함한다.
    (2) 로드 단계
  • 운영 체제는 프로그램을 메모리에 로드할 때, CFG Bitmap을 생성하고, 이 Bitmap을 사용하여 각 함수의 주소가 유효한 호출 대상인지 여부를 표시한다. CFG 보호가 활성화된 프로그램은, 간접 호출이 발생할 때마다 CFG Bitmap을 참조하여 호출 대상이 유효한지 확인한다. 이 과정은 "ntdll!LdrpValidateUserCallTarget" 함수를 통해 수행한다.
    (3) 런타임 검사
  • 각 간접 호출 시, 컴파일러에 의해 삽입된 검사 코드가 실행되어, "ntdll!LdrpValidateUserCallTarget" 함수를 호출한다. 이 함수는 호출 대상 주소가 CFG Bitmap에 등록된 유효한 주소인지 확인한다. 호출 대상이 유효하지 않다고 판단되면, 운영 체제는 프로그램을 종료시키거나 오류를 발생시킨다.

3. CFG 우회 기법

(1) Guard CF Check Function Pointer 우회

  • "Guard CF Check Function Pointer"를 조작하여, 모든 주소가 유효한 것으로 간주되게 만든다. 이 포인터는 유효성 검사 함수를 가리키며, 이를 우회함수로 변경하면 CFG 검사를 무력화시킬 수 있다. 실제로 이 포인터를 "ret" 명령어가 있는 주소로 변경하면, 모든 호출 대상이 유효한 것으로 간주되어 CFG 검사를 우회할 수 있다.

(2) 읽기 전용 메모리 쓰기 권한 추기
CFG 우회를 위해서는 종종 읽기 전용 메모리 영역에 쓰기 작업이 필요로 한다. JScript9의 "CustomHeap::Heap"을 사용하여 읽기 전용 메모리를 쓰기 가능하게 만드는 방법이 있다. 이 방법은 "CustomHeap::Heap::EnsurePageReadWrite" 함수를 호출하여 페이지 보호 속성을 변경함으로써, Guard CF Check Function Pointer를 포함한 읽기 전용 메모리 영역에 쓰기 작업을 수행할 수 있다.

profile
Cyber Security

0개의 댓글

관련 채용 정보