MTE(메모리 태깅 확장)란?

Arm의 Memory Tagging Extension의 약자. Armv8.5-A에서 추가되었다. 메모리의 16바이트마다 4비트 태그를 붙이고, 포인터의 상위 비트에도 4비트 태그를 넣어, 접근할 때마다 둘이 일치하는지를 CPU가 확인한다. 해제한 뒤의 메모리 사용이나 범위 밖 접근을 적은 부담으로 확률적으로 찾아낼 수 있다.

일본어 명칭: MTE(メモリタギング拡張)

MTE(메모리 태깅 확장)은(는) 하드웨어 보안의 최신 동향 등 1개 분야의 연습 문제 1개에 나와요.

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

태그를 비교하는 구조

메모리를 할당할 때 할당 라이브러리는 영역의 16바이트마다 메모리 쪽 태그를 설정하고, 같은 값을 포인터의 상위 비트(주소 변환에 쓰이지 않는 부분)에 넣어 돌려줍니다. CPU는 로드나 스토어 때마다 포인터의 태그와 접근 대상 메모리의 태그를 비교하고, 다르면 오류로 취급합니다. 영역을 해제할 때 태그를 바꿔 붙이면, 오래된 포인터로 해제된 영역에 접근하는 오류를 찾아낼 수 있습니다. 메모리 쪽 태그는 데이터와는 다른 곳에 저장됩니다.

확률적 검출

태그는 4비트이므로 16가지밖에 없고, 무작위로 고른 태그가 우연히 일치할 확률은 1/16입니다. 즉 한 번의 잘못된 접근을 놓칠 확률은 약 6%이고, 약 94%는 찾아낼 수 있습니다. 이웃한 영역에는 반드시 다른 태그를 붙이는 등의 할당 방법으로, 이웃 영역으로의 넘침은 확실히 찾아내도록 할 수 있습니다. 태그를 저장하기 위해 메모리 용량의 4/128 = 3.125% 정도가 추가로 필요합니다.

검사 모드

오류를 찾으면 바로 예외를 일으키는 동기 모드는 어느 명령에서 잘못되었는지를 알 수 있으므로 개발이나 중요한 처리에 적합하지만, 부담이 약간 커집니다. 오류를 기록해 두고 나중에 모아서 알리는 비동기 모드는 부담이 작아, 많은 기기에서 동작시키면서 오류를 모으는 데 적합합니다. 용도에 따라 개발 중의 검사와 출하 후 기기에서의 공격 방지 양쪽에 사용됩니다.

도전해 보기: MTE(메모리 태깅 확장) 관련 문제

Arm의 MTE(메모리 태깅 확장)에서는 메모리의 16바이트마다 4비트 태그를 붙이고, 포인터의 상위 비트에도 4비트 태그를 넣어, 접근할 때마다 둘이 일치하는지를 CPU가 확인한다. 해제한 영역을 가리키는 오래된 포인터로 그 영역에 접근하는 오류를 생각한다. 영역을 다시 할당할 때의 새 태그가 16가지 중에서 균일하게 무작위로 선택된다고 하면, 태그가 우연히 일치하여 오류를 놓칠 확률은?

  1. A1/16(약 6.3%)
  2. B1/4(25%)
  3. C15/16(약 93.8%)
정답과 해설 보기

정답: A. 1/16(약 6.3%)

태그는 4비트이므로 가질 수 있는 값은 2⁴ = 16가지입니다. 새 태그가 16가지 중에서 균일하게 선택된다면, 오래된 포인터의 태그와 우연히 일치할 확률은 1/16 = 6.25%(약 6.3%)이고, 나머지 15/16의 경우는 불일치로 검출됩니다. 한 번의 접근으로도 약 94%의 확률로 발견되므로, 많은 기기에서 동작시키면서 오류를 찾아내거나 공격을 어렵게 할 수 있습니다. 할당할 때 이웃한 영역에는 반드시 다른 태그를 붙이도록 하면, 이웃 영역으로의 넘침은 확실하게 검출할 수 있습니다.

자주 묻는 질문

MTE는 어디에서 사용되고 있나요?

2020년대 중반 시점에서 일부 스마트폰 SoC 등이 지원하고 있으며, OS나 메모리 할당 라이브러리에서 개발용 검사나 공격을 어렵게 하기 위한 활성화가 진행되고 있습니다. 지원하는 하드웨어와 소프트웨어 양쪽이 필요합니다.

MTE가 있으면 메모리 오류를 이용한 공격은 막을 수 있나요?

많은 오류를 찾아내어 공격을 어렵게 하지만, 태그가 우연히 일치할 가능성이 있고, 태그 값을 추측당하거나 유출되면 효과가 떨어집니다. 검출은 확률적이므로, 결정적인 보증이 필요한 경우에는 CHERI 같은 구조나 메모리 안전한 언어의 사용과 조합합니다.

MTE(메모리 태깅 확장)이(가) 나오는 문제 (1)

  1. Arm의 MTE(메모리 태깅 확장)에서는 메모리의 16바이트마다 4비트 태그를 붙이고, 포인터의 상위 비트에도 4비트 태그를 넣어, 접근할 때마다 둘이 일치하는지를 CPU가 확인한다. 해제한 영역을 가리키는 오래된 포인터로 그 영역에 접근하는 오류를 생각한다. 영역을 다시 할당할 때의 새 태그가 16가지 중에서 균일하게 무작위로 선택된다고 하면, 태그가 우연히 일치하여 오류를 놓칠 확률은?

관련 용어

포인터(Pointer) 기밀 컴퓨팅(Confidential Computing) 레이저 오류 주입(Laser Fault Injection) 로직 로킹(Logic Locking) 섀도 스택(Shadow Stack) 수론 변환(Number-Theoretic Transform) 일시적 실행 공격(Transient Execution Attack) 제어 흐름 무결성(Control-Flow Integrity) 포인터 인증(PAC) Arm CCA(Confidential Compute Architecture)

용어집으로 돌아가기