포인터 인증(PAC)란?

Armv8.3-A에서 추가된 구조. 포인터 값과 문맥 값으로부터 CPU 안의 키로 짧은 인증 코드(PAC)를 계산하여 포인터의 사용하지 않는 상위 비트에 넣고, 사용하기 직전에 전용 명령으로 확인한다. 맞지 않으면 사용할 수 없는 주소로 바꾸므로, 복귀 주소나 함수 포인터를 바꿔 쓰는 공격을 어렵게 한다. 인증 코드의 길이는 가상 주소의 폭 등의 설정으로 정해진다.

일본어 명칭: ポインタ認証(PAC)

포인터 인증(PAC)은(는) 하드웨어 보안의 최신 동향 등 1개 분야의 연습 문제 2개에 나와요.

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

도전해 보기: 포인터 인증(PAC) 관련 문제

Arm의 포인터 인증(PAC) 구조로 올바른 것은?

  1. A포인터를 사용할 때마다 시스템 콜로 OS에 문의하여, 그 포인터가 올바른 값인지를 확인받는다
  2. B포인터 값과 문맥 값으로부터 CPU 안의 키로 짧은 인증 코드를 계산하여 포인터의 상위 비트에 넣고, 사용하기 전에 확인한다
  3. C포인터의 모든 비트를 CPU 안의 키로 암호화한 뒤 메모리에 저장하고, 읽어 낼 때마다 CPU 안에서 복호화한 뒤 사용한다
정답과 해설 보기

정답: B. 포인터 값과 문맥 값으로부터 CPU 안의 키로 짧은 인증 코드를 계산하여 포인터의 상위 비트에 넣고, 사용하기 전에 확인한다

64비트 포인터 중 가상 주소에 쓰이지 않는 상위 비트에, 포인터 값과 문맥 값(예를 들어 스택 포인터)으로부터 CPU 안의 키로 계산한 인증 코드를 넣습니다. 함수의 복귀 주소 등을 사용하기 직전에 전용 명령으로 다시 계산하여 비교하고, 맞지 않으면 사용할 수 없는 주소로 바꾸므로, 스택의 복귀 주소를 바꿔 쓰는 공격(ROP 등)이 어려워집니다. 키는 소프트웨어에서 읽을 수 없으므로, 공격자는 바꿔 쓴 포인터에 맞는 인증 코드를 만들 수 없습니다. 다만 인증 코드의 길이는 가상 주소의 폭 등의 설정으로 정해지며, 대부분 십수 비트 이하로 짧기 때문에, 여러 번 추측할 수 있는 상황에서는 우연히 일치할 확률을 고려해야 합니다.

해설 속 포인터 인증(PAC)

포인터 인증(PAC)이(가) 나오는 문제 (2)

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

관련 용어

복귀 주소(return address) 포인터(Pointer) 스택 포인터(stack pointer) 제어 흐름 무결성(Control-Flow Integrity) 함수 포인터(Function Pointer) 섀도 스택(Shadow Stack) KPTI Meltdown IOMMU DMA(직접 메모리 접근)

용어집으로 돌아가기