하드웨어 보안의 최신 동향
제어 흐름 무결성을 하드웨어로 지원하는 기능에 대해, 함수에서의 복귀를 보호하는 것과 함수 포인터 등에 의한 간접 호출이나 점프를 보호하는 것의 조합으로 올바른 것은?
- A복귀는 섀도 스택이나 포인터 인증, 간접 호출이나 점프는 점프 대상의 맨 앞에 정해진 표식 명령이 있을 것을 요구하는 구조로 보호한다
- B복귀는 점프 대상의 맨 앞에 정해진 표식 명령이 있을 것을 요구하는 구조, 간접 호출이나 점프는 섀도 스택으로 보호한다
- C복귀는 KPTI(커널 페이지 테이블 격리), 간접 호출이나 점프는 IOMMU에 의한 주소 변환으로 보호한다
정답과 해설 보기
정답: A. 복귀는 섀도 스택이나 포인터 인증, 간접 호출이나 점프는 점프 대상의 맨 앞에 정해진 표식 명령이 있을 것을 요구하는 구조로 보호한다
섀도 스택은 복귀 주소를 복제와 비교하고, 포인터 인증은 복귀 주소에 붙인 인증 코드를 확인하므로, 둘 다 함수에서의 복귀를 보호합니다. 간접 호출이나 점프에 대해서는 Intel의 IBT나 Arm의 분기 대상 식별(Branch Target Identification)이 점프 대상의 맨 앞에 표식 명령(x86에서는 ENDBR64)이 있을 것을 요구하여, 함수 중간 등으로의 분기를 예외로 만듭니다. 다만 표식이 있는 곳이라면 어느 함수로든 점프할 수 있으므로, 타입이 맞는 함수로만 점프 대상을 좁히는 컴파일러의 세밀한 확인과 조합하기도 합니다. KPTI는 Meltdown에 대한 대책, IOMMU는 기기의 DMA를 제한하는 구조로, 제어 흐름은 보호하지 않습니다.