사이버 보안

CHERI, 정밀한 소프트웨어 격리를 위한 포인터 보안을 재정의하다

David Chisnall은 CHERI 아키텍처가 하드웨어 기능을 사용해 포인터를 보호하고 메모리 경계와 권한을 강제함으로써, 대대적인 재작성 없이 C 및 C++로 작성된 소프트웨어에 공간적·시간적 보안을 제공하는 방식을 설명한다. 또한 이 발표는 전통적인 RPC 메커니즘에 전적으로 의존하는 대신 데이터 구조를 직접 공유하면서 시스템 구성 요소 간에 정밀한 격리를 구축할 가능성과 이 메커니즘을 연결한다.

2026-08-16
5 분 읽기
12 조회수
فريق تحرير certi.news
CHERI, 정밀한 소프트웨어 격리를 위한 포인터 보안을 재정의하다

David Chisnall은 소프트웨어 격리에서 가장 어려운 과제가 두 워크로드를 서로 완전히 분리하는 데 있는 것이 아니라, 통신하고 데이터를 공유해야 하는 구성 요소를 격리하는 데 있다고 본다. InfoQ를 통해 공개된 발표에서 Chisnall은 CHERI 아키텍처가 보안 기능과 확장 포인터 개념을 결합해 포인터에 하드웨어 보호를 제공하고, 동일한 주소 공간 안에서 메모리 안전성과 정밀한 격리를 지원하는 방식을 설명한다.

Chisnall은 SCI Semiconductor의 공동 창립자이자 시스템 엔지니어링 디렉터이며, 케임브리지대학교 방문 연구원이기도 하다. 이 발표는 CHERI의 연구 작업과 소프트웨어 및 하드웨어 구현을 바탕으로 하며, CheriBSD와 ARM Morello 확장부터 마이크로컨트롤러를 대상으로 하는 CHERIoT까지 다룬다. 또한 그가 표준화를 위한 작업이 최종 단계에 있다고 말한 RVY라는 RISC-V 기반도 포함한다.

포인터가 하드웨어로 보호되는 개체가 되다

CHERI는 전통적인 의미에서 독립적인 명령어 집합을 제공하는 것이 아니라, 여러 아키텍처에 맞게 조정할 수 있는 일련의 개념을 제공한다. 이는 SIMD 개념이 여러 확장 기능을 통해 구현되는 방식과 유사하다. 이 관점에서 포인터는 더 이상 메모리의 주소를 나타내는 단순한 숫자가 아니라, 주소와 객체의 경계, 권한 집합, 그리고 해당 값이 유효한 포인터인지 나타내는 하드웨어 태그를 포함하는 권한이 된다.

이러한 권한은 단방향 특성을 강제한다. 경계를 좁히거나 권한을 제거할 수는 있지만, 포인터 자체에서 이를 확장하거나 복원할 수는 없다. 또한 하드웨어는 포인터를 로드·저장·분기 작업에 사용하기 전에 포인터가 유효하고 태그가 지정되어 있는지 확인한다. 프로그램이 데이터로 취급된 값을 사용하거나 이를 조작해 주소를 생성하려고 하면, 해당 값이 자동으로 사용할 수 있는 포인터로 변환되는 대신 작업이 실패한다.

발표에 따르면 이 설계는 공격자가 제어하는 값으로 포인터를 덮어쓰는 행위처럼 메모리 악용 공격에서 흔히 나타나는 여러 단계를 직접 방어한다. 또한 포인터의 위치를 미리 알 필요 없이 memcpy와 같은 일반적인 복사 작업을 수행할 수 있다. 권한 공간의 일부를 덮어쓰면 포인터 태그가 값과 함께 이동하거나 삭제되기 때문이다.

축소할 수 있는 경계와 권한

CHERI 권한에는 읽기와 쓰기 권한, 그리고 데이터 안에 존재하는 포인터를 다루기 위한 별도의 권한이 포함된다. Chisnall은 이러한 정밀성이 복잡한 구조체 안의 데이터를 읽을 수 있는 권한은 프로그램에 부여하되, 그 안에 새 포인터를 저장할 수 있는 능력은 부여하지 않는 방식 등을 가능하게 한다고 설명한다. 이를 통해 단일 객체를 피상적으로 보호하는 대신 전체 데이터 트리에 걸쳐 읽기 전용 뷰를 제공할 수 있다.

또한 sealing 메커니즘을 사용하면 커널이 관리하는 변환 테이블이 반드시 필요하지 않은 상태에서 핸들이나 파일 디스크립터와 유사한 안전한 opaque 포인터를 만들 수 있다. 권한은 타입 코드로 봉인되며, 봉인된 동안에는 수정하거나 역참조하거나 분기·로드·저장에 사용할 수 없다. 소유자에게 반환되었을 때에도 타입 코드가 일치해야만 봉인을 해제할 수 있다.

메모리의 공간적·시간적 안전성

경계 초과 오류가 발생하면 CHERI는 C 언어에서 정의되지 않은 동작을 결정적인 하드웨어 중단으로 바꿀 수 있다. Chisnall은 14개 요소로 구성된 배열에서 14번 요소에 접근하는 예를 제시한다. 전통적인 시스템에서는 이 접근이 반환 주소를 덮어쓸 가능성이 있지만, CHERI 시스템에서는 포인터가 배열의 경계로 제한되어 있으므로 작업이 트랩을 발생시킨다.

이 주장은 공간적 안전성에만 국한되지 않는다. CHERIoT에서는 포인터 태그와 각 할당 단위마다 하나의 비트를 포함하는 섀도 메모리를 사용해 해제된 메모리와 연결된 포인터를 무효화한다. 권한을 레지스터로 로드할 때 로드 필터가 블록의 상태를 확인하고 메모리가 해제된 경우 태그를 지울 수 있다. 또한 주기적인 하드웨어 메커니즘이 메모리를 검사하고 더 이상 살아 있지 않은 객체를 가리키는 포인터의 태그를 제거하므로, 무효화 주기가 완료된 뒤 메모리를 재사용할 수 있다.

메모리 안전성에서 정밀한 격리로

Chisnall이 설명하는 CHERI 프로젝트의 원래 목표는 전통적인 프로세스 격리의 한계를 넘어서는 정밀한 격리를 구축하는 것이었다. 각 구성 요소를 별도의 프로세스에 격리하면 페이지 테이블, RPC 메커니즘, 데이터 직렬화 및 복사와 관련된 비용이 발생한다. 수십 개의 격리 영역에는 이를 감당할 수 있지만, 예를 들어 브라우저가 이미지와 오디오 디코더 또는 JavaScript JIT 실행기와 같은 구성 요소를 위해 수천 개 또는 수만 개의 샌드박스를 실행해야 하는 경우에는 적합성이 떨어진다.

CHERI 모델에서는 실행 레지스터에 존재하는 권한에서 접근할 수 있는 메모리 집합을 보호 영역으로 간주할 수 있다. 동일한 주소 공간 안의 두 영역이 일부 데이터를 공유하면서 다른 부분은 격리된 상태로 유지할 수 있다. 공유는 특정 권한에서 시작되며 복잡한 데이터 구조와 그 구조에서 접근할 수 있는 모든 대상으로 확장될 수 있기 때문이다.

더 큰 시스템에서 발표는 coexecve 호출을 통한 점진적 경로를 설명한다. 이 호출은 새로운 주소 공간을 만들지 않고 새 프로세스를 생성한 다음, 새 프로세스가 접근할 수 있는 대상을 결정하는 루트 권한 집합을 고정한다. 반면 CHERIoT는 실시간 운영체제 안에서 권한을 엄격하게 분리하며, 구획 간 컨텍스트 전환과 호출을 담당하는 전환 구성 요소를 사용한다. 발표에 따르면 이 구성 요소의 크기는 약 350개 명령어다.

Chisnall이 제시하는 결론은 메모리 보호와 격리가 코드 규칙을 전부 다시 작성하거나 모든 구성 요소를 별도의 프로세스로 분리하는 방식에 의존해서는 안 된다는 것이다. C 모델을 기존 방식에 가깝게 유지하면서 포인터와 접근 권한을 하드웨어가 이해하고 통제하도록 하면, 메모리 오류를 줄이고 더 감사 가능한 공유를 구축하는 점진적인 경로를 제공할 수 있다. 구현 세부 사항은 대형 시스템과 마이크로컨트롤러 사이에서 서로 다르며, 이 발표는 CHERI에 대한 발표자의 직접적인 경험과 관점을 반영할 뿐 모든 보안 문제가 자동으로 제거된다는 일반적인 표준을 의미하지는 않는다.

뉴스 출처
InfoQ - Architecture Articles
원문 보기 ↗
ف
작성자

فريق تحرير certi.news

같은 카테고리

추천 기사

모든 뉴스 보기