메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

Intel Memory Protection Extensions

noriwiki


Intel Memory Protection Extensions (MPX)

Intel Memory Protection Extensions (MPX)는 Intel이 설계한 x86 아키텍처 확장으로, 런타임 시 포인터 참조의 유효 범위를 검사하여 버퍼 오버플로우와 같은 메모리 오류를 방지하는 것을 목표로 하였다. 그러나 실효성에 대한 우려와 다수의 설계적 결함으로 인해 대부분의 운영체제 및 컴파일러에서 지원이 중단되었으며, 2019년 이후 생산된 Intel 하드웨어에서는 완전히 제거되었다.

개요

Intel MPX는 포인터의 하한(lower bound) 및 상한(upper bound)을 레지스터에 저장하고, 포인터 연산 수행 시 이 범위 내에서 동작하는지를 검사한다. 이러한 구조는 하드웨어 및 소프트웨어 계층의 협업을 필요로 하며, 별도의 컴파일러 플래그 및 런타임 지원이 요구된다.

아키텍처 및 동작 방식

MPX는 다음과 같은 구성 요소로 이루어져 있다:

  • 바운드 레지스터 – BND0~BND3의 네 개의 128비트 레지스터는 각각 포인터의 하한과 상한 값을 저장한다.
  • 바운드 테이블(BT) 및 바운드 디렉토리(BD) – 주소 매핑 정보를 계층적으로 저장하며, 런타임에 포인터의 경계를 확인하는 데 사용된다.
  • 명령어 확장BNDLDX, BNDSTX 등의 명령어는 메모리에서 바운드 정보를 불러오거나 저장하는 데 사용된다.

상한 값은 1의 보수 형태로 저장되며, 관련 명령어(BNDCU, BNDMK 등)가 이를 자동 변환한다.

소프트웨어 지원

컴포넌트 지원 현황
glibc 2.35 버전부터 MPX 제거
GNU GCC 5.0에서 도입, 9.1에서 제거[1]
Intel C Compiler 15.0부터 지원
Linux 커널 3.19에서 도입, 5.6에서 제거[2]
QEMU 2.6~3.x 버전에서 지원, 4.0에서 제거
Visual Studio 2015 Update 1에서 실험적 지원[3]

한계 및 분석

여러 연구에 따르면 MPX는 다음과 같은 문제점을 가진다:

  • 낮은 성능 – 평균 50%의 오버헤드가 발생하며, 최악의 경우 최대 4배 느려진다.
  • 시간적 메모리 안전 보장 불가 – dangling pointer 등의 시간적 오류를 감지하지 못한다.
  • 스레드 안전 미보장 – 바운드 테이블 접근은 멀티스레드 환경에서 동기화되지 않는다.
  • 프로그래밍 언어 특성 미지원 – C/C++의 flexible array member, offset 연산 등을 완전히 지원하지 못한다.
  • 타 ISA 확장과의 충돌 – Intel TSX, SGX 등과의 호환성 문제로 인해 성능 및 보안 문제가 발생할 수 있다.
  • 추가적인 성능 저하 – MPX 기능이 비활성화된 CPU에서도 MPX 명령어의 존재 자체로 오버헤드가 발생한다.

보안 연구 사례

Meltdown 계열의 취약점을 활용한 실험에서는, MPX가 보호하는 배열에 대해 #BR (Bound Range Exceeded) 예외를 우회할 수 있음이 입증되었다. 연구자들은 Flush+Reload covert channel을 통해 보호된 메모리의 내용을 유출하는 데 성공하였다. 해당 연구는 MPX의 보안성이 한계가 있음을 보여주는 대표적인 사례로 간주된다.

평가

Intel MPX는 하드웨어 기반의 포인터 검증 메커니즘을 제공하였으나, 성능, 호환성, 실효성 측면에서 충분한 효과를 보이지 못하였다. 주요 컴파일러 및 운영체제는 이를 AddressSanitizer와 같은 더 가벼운 소프트웨어 기반 솔루션으로 대체하였다.

참고 문헌

같이 보기