하드웨어 보안의 최신 동향
Arm의 포인터 인증(PAC) 구조로 올바른 것은?
- A포인터를 사용할 때마다 시스템 콜로 OS에 문의하여, 그 포인터가 올바른 값인지를 확인받는다
- B포인터 값과 문맥 값으로부터 CPU 안의 키로 짧은 인증 코드를 계산하여 포인터의 상위 비트에 넣고, 사용하기 전에 확인한다
- C포인터의 모든 비트를 CPU 안의 키로 암호화한 뒤 메모리에 저장하고, 읽어 낼 때마다 CPU 안에서 복호화한 뒤 사용한다
정답과 해설 보기
정답: B. 포인터 값과 문맥 값으로부터 CPU 안의 키로 짧은 인증 코드를 계산하여 포인터의 상위 비트에 넣고, 사용하기 전에 확인한다
64비트 포인터 중 가상 주소에 쓰이지 않는 상위 비트에, 포인터 값과 문맥 값(예를 들어 스택 포인터)으로부터 CPU 안의 키로 계산한 인증 코드를 넣습니다. 함수의 복귀 주소 등을 사용하기 직전에 전용 명령으로 다시 계산하여 비교하고, 맞지 않으면 사용할 수 없는 주소로 바꾸므로, 스택의 복귀 주소를 바꿔 쓰는 공격(ROP 등)이 어려워집니다. 키는 소프트웨어에서 읽을 수 없으므로, 공격자는 바꿔 쓴 포인터에 맞는 인증 코드를 만들 수 없습니다. 다만 인증 코드의 길이는 가상 주소의 폭 등의 설정으로 정해지며, 대부분 십수 비트 이하로 짧기 때문에, 여러 번 추측할 수 있는 상황에서는 우연히 일치할 확률을 고려해야 합니다.