제어 흐름 무결성(Control-Flow Integrity)란?

프로그램의 실행 흐름이 본래의 프로그램에서 일어날 수 있는 경로(제어 흐름 그래프)에서 벗어나지 않도록 하는 대책의 총칭. 함수에서의 복귀를 보호하는 섀도 스택이나 포인터 인증, 간접 호출이나 점프의 대상을 정해진 표식이 있는 곳으로 제한하는 Intel의 IBT나 Arm의 분기 대상 식별 등의 하드웨어 기능과, 컴파일러가 넣는 점프 대상 확인이 있다. 복귀 주소나 함수 포인터를 바꿔 써서 기존 코드의 조각을 잇는 공격을 어렵게 한다.

일본어 명칭: 制御フロー完全性

제어 흐름 무결성(Control-Flow Integrity)은(는) 하드웨어 보안의 최신 동향 등 1개 분야의 연습 문제 1개에 나와요.

분야: 하드웨어 보안의 최신 동향

도전해 보기: 제어 흐름 무결성(Control-Flow Integrity) 관련 문제

제어 흐름 무결성을 하드웨어로 지원하는 기능에 대해, 함수에서의 복귀를 보호하는 것과 함수 포인터 등에 의한 간접 호출이나 점프를 보호하는 것의 조합으로 올바른 것은?

  1. A복귀는 섀도 스택이나 포인터 인증, 간접 호출이나 점프는 점프 대상의 맨 앞에 정해진 표식 명령이 있을 것을 요구하는 구조로 보호한다
  2. B복귀는 점프 대상의 맨 앞에 정해진 표식 명령이 있을 것을 요구하는 구조, 간접 호출이나 점프는 섀도 스택으로 보호한다
  3. C복귀는 KPTI(커널 페이지 테이블 격리), 간접 호출이나 점프는 IOMMU에 의한 주소 변환으로 보호한다
정답과 해설 보기

정답: A. 복귀는 섀도 스택이나 포인터 인증, 간접 호출이나 점프는 점프 대상의 맨 앞에 정해진 표식 명령이 있을 것을 요구하는 구조로 보호한다

섀도 스택은 복귀 주소를 복제와 비교하고, 포인터 인증은 복귀 주소에 붙인 인증 코드를 확인하므로, 둘 다 함수에서의 복귀를 보호합니다. 간접 호출이나 점프에 대해서는 Intel의 IBT나 Arm의 분기 대상 식별(Branch Target Identification)이 점프 대상의 맨 앞에 표식 명령(x86에서는 ENDBR64)이 있을 것을 요구하여, 함수 중간 등으로의 분기를 예외로 만듭니다. 다만 표식이 있는 곳이라면 어느 함수로든 점프할 수 있으므로, 타입이 맞는 함수로만 점프 대상을 좁히는 컴파일러의 세밀한 확인과 조합하기도 합니다. KPTI는 Meltdown에 대한 대책, IOMMU는 기기의 DMA를 제한하는 구조로, 제어 흐름은 보호하지 않습니다.

제어 흐름 무결성(Control-Flow Integrity)이(가) 나오는 문제 (1)

  1. 제어 흐름 무결성을 하드웨어로 지원하는 기능에 대해, 함수에서의 복귀를 보호하는 것과 함수 포인터 등에 의한 간접 호출이나 점프를 보호하는 것의 조합으로 올바른 것은?

관련 용어

함수 포인터(Function Pointer) 섀도 스택(Shadow Stack) 복귀 주소(return address) 포인터 인증(PAC) KPTI Meltdown IOMMU DMA(직접 메모리 접근) 기밀 컴퓨팅(Confidential Computing) 레이저 오류 주입(Laser Fault Injection)

용어집으로 돌아가기