CHERI란?

Capability Hardware Enhanced RISC Instructions의 약자. 포인터를 주소에 더해 가리킬 수 있는 범위와 권한을 가진 케이퍼빌리티로 바꾸어, 범위 밖 접근이나 포인터 위조를 하드웨어로 막는 명령어 집합 확장. 케임브리지 대학과 SRI 인터내셔널이 연구를 진행해 왔다. Arm은 이를 바탕으로 한 시제품 프로세서 Morello를 2020년대 전반에 연구자에게 제공했다.

일본어 명칭: CHERI

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

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

케이퍼빌리티의 내용

기존 포인터는 단순한 주소이며, 어디를 가리키고 있는지 확인하는 구조가 하드웨어에는 없었습니다. CHERI의 케이퍼빌리티는 주소에 더해 가리켜도 되는 범위의 하한과 상한, 읽기·쓰기·실행 등의 권한을 가집니다. 64비트 주소의 경우 범위를 압축한 형태로 나타내어 128비트에 담고, 다시 메모리 밖에 1비트의 태그를 하나 더 가집니다. CPU는 로드나 스토어 때마다 범위와 권한을 확인하고 벗어나면 예외를 일으키므로, 버퍼 오버플로 같은 오류가 그 자리에서 멈춥니다.

위조를 막는 태그

태그는 올바른 명령으로 케이퍼빌리티를 만들거나 기존 케이퍼빌리티에서 범위를 좁혔을 때만 붙습니다. 케이퍼빌리티를 일반 데이터로 바꿔 쓰면 태그가 사라지며, 태그가 없는 값은 포인터로 사용할 수 없습니다. 범위나 권한은 넓힐 수 없고 좁힐 수만 있으므로, 프로그램은 자신이 받은 것 이상의 권한을 만들어 낼 수 없습니다. 이 성질을 이용하면 하나의 프로그램 안을 작은 구획으로 나누고 구획별로 사용할 수 있는 범위를 제한하는 사용법(구획화)도 가능합니다.

보급을 위한 과제

포인터의 크기가 2배가 되므로 메모리 사용량이나 캐시 효율에 영향이 있으며, 포인터를 정수로 다루는 식으로 작성된 소프트웨어는 수정이 필요합니다. 연구에서는 C나 C++의 많은 프로그램이 작은 수정으로 동작한다는 것이 제시되어 왔습니다. 2020년대 중반 시점에서는 연구용 시제품이나 일부 마이컴용 구현이 중심이며, 일반 PC나 스마트폰의 CPU에는 탑재되어 있지 않습니다.

도전해 보기: CHERI 관련 문제

CHERI라고 불리는 명령어 집합 확장에서 쓰이는 케이퍼빌리티(capability)의 설명으로 올바른 것은?

  1. A포인터 값을 CPU 안의 키로 암호화한 뒤 메모리에 두고 사용할 때마다 복호화함으로써, 다른 프로그램이나 OS가 포인터 값을 읽을 수 없게 한다
  2. B프로그램의 실행 파일에 붙인 전자 서명을 명령을 하나 실행할 때마다 CPU가 확인하여, 서명이 없는 명령을 실행하지 않게 한다
  3. C포인터에 접근해도 되는 범위와 권한을 갖게 하고, 메모리상에서는 소프트웨어가 바꿔 쓸 수 없는 1비트 태그로 올바르게 만들어진 것인지를 구별한다
정답과 해설 보기

정답: C. 포인터에 접근해도 되는 범위와 권한을 갖게 하고, 메모리상에서는 소프트웨어가 바꿔 쓸 수 없는 1비트 태그로 올바르게 만들어진 것인지를 구별한다

CHERI에서는 주소만 있는 포인터 대신 주소, 가리킬 수 있는 범위의 상한과 하한, 읽기·쓰기나 실행 권한을 하나로 묶은 케이퍼빌리티를 사용합니다(64비트 주소의 경우 압축하여 128비트에 담고, 별도로 1비트 태그를 가집니다). CPU는 접근할 때마다 범위와 권한을 확인하므로, 배열의 범위 밖 읽기·쓰기 같은 메모리 안전성 오류를 하드웨어로 막을 수 있습니다. 태그는 올바른 명령으로 케이퍼빌리티를 만들었을 때만 붙고 일반 데이터로 바꿔 쓰면 사라지므로, 포인터를 위조할 수 없습니다. 케임브리지 대학 등이 연구를 진행했으며, Arm은 이를 바탕으로 한 Morello라는 시제품 프로세서와 평가용 보드를 2020년대 전반에 연구자에게 제공했습니다.

자주 묻는 질문

CHERI와 MTE(메모리 태깅 확장)의 차이는 무엇인가요?

MTE는 메모리와 포인터에 붙인 4비트 태그를 비교하여 오류를 확률적으로 찾아내는 구조입니다. CHERI는 포인터 자체에 범위와 권한을 갖게 하여 범위 밖 접근을 결정적으로 막습니다. MTE는 기존 소프트웨어에 도입하기 쉽고, CHERI는 더 강한 보증을 주는 대신 명령어 집합이나 소프트웨어의 변경이 커집니다.

CHERI를 사용하면 메모리 안전성 문제는 모두 사라지나요?

범위 밖 접근이나 포인터 위조는 막을 수 있지만, 해제한 뒤의 메모리 사용을 막으려면 할당 구조에 별도의 고안이 필요합니다. 또한 논리 오류나 올바르게 부여한 권한의 남용은 막을 수 없습니다. 다른 대책과 조합하여 사용합니다.

해설 속 CHERI

CHERI이(가) 나오는 문제 (1)

  1. CHERI라고 불리는 명령어 집합 확장에서 쓰이는 케이퍼빌리티(capability)의 설명으로 올바른 것은?

관련 용어

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

용어집으로 돌아가기