NX 비트(NX bit, Never eXecute bit, 실행 방지 비트)는 프로세서 명령어나 코드 또는 데이터 저장을 위한 메모리 영역을 따로 분리하는 CPU의 기술이다. 이 기능은 하버드 아키텍처 프로세서에서 보통 쓰인다. 그러나 NX 비트는 기본적인 폰 노이만 구조 프로세서에서 보안을 목적으로 많이 쓰인다.
NX 특성으로 지정된 모든 메모리 구역은 데이터 저장을 위해서만 사용되며, 프로세서 명령어가 그 곳에 상주하지 않음으로써 실행되지 않도록 만들어 준다. 실행 보호라는 일반 기술은 특정한 종류의 악성 소프트웨어를 컴퓨터에 들어오지 못하게 막는 데 사용된다. 악성 소프트웨어의 경우 자신의 코드를 다른 프로그램의 자료 기억 영역에 심어 놓은 다음 이 구역 안에서 자신의 코드를 실행하게 만들며, 이를 버퍼 오버플로 공격이라고 한다.
인텔은 eXecute Disable의 약자인 XD 비트로 광고하기로 결정하였다. 그러나 인텔의 XD 비트와 AMD의 NX 비트는 같은 기능을 수행하며 이름만 다른 것이다.
하드웨어 배경
80286 이후의 x86 프로세서들은 세그먼트 수준으로 추가된 비슷한 기능을 제공한다. 그러나 이러한 제어 구조는 너무 빈약하여 쓸모가 없다. 특히 플랫 메모리 모델(Flat memory model)을 사용하는 현대의 소프트웨어의 경우에는 그렇다. 완전한 세그먼트가 아닌, 각 페이지마다 실행을 제어할 수 있는 새로운 구조가 필요하게 되었다.
페이지 수준의 구조는 썬의 SPARC, 알파, IBM의 파워PC와 같은 다른 다양한 프로세서 아키텍처에서 여러 해 동안 사용되었다. 2001년에 인텔은 IA-64 아키텍처를 사용하는 자사의 아이테니엄 (Merced) 프로세서에 비슷한 기능을 추가하였지만, 당시 사람들이 애용하던 x86 프로세서 계열(펜티엄, 셀러론, 제온 등)에는 도입하지 않았다. x86 아키텍처의 경우, AMD는 애슬론 64와 옵테론과 같은 AMD64 계열 프로세서에 NX 비트를 도입하였다. NX 비트라는 용어는 다른 프로세서의 비슷한 기술을 서술할 때에도 흔히 쓰이게 되었다.
AMD가 이 기능을 AMD64 명령어 세트에 도입하기로 결정한 뒤, 인텔은 후반 프레스캇 코어의 x86 기반의 펜티엄 4 프로세서부터 이와 비슷한 기능을 도입하였다.
구체적으로 말해, NX 비트는 페이지 테이블 안에 있는 64비트 엔트리의 비트 숫자 63(최상위 비트)을 일컫는다. 이 비트가 0으로 설정된 경우, 코드는 그 페이지에서 실행될 수 있다. 1로 설정된 경우, 코드는 그 페이지에서 실행될 수 없으며 어떠한 것도 그 데이터에 상주할 수 없다. 또한 물리 주소 확장 (PAE) 페이지 테이블 포맷으로만 사용될 수 있다는 것도 잊어서는 안 된다. 왜냐하면 x86의 원래 32비트 페이지 테이블 포맷은 분명히 비트 63이 존재하지 않기 때문이다.
소프트웨어 구현
하드웨어로 이 기능을 구현하기 앞서, 여러 운영 체제는 소프트웨어를 통해 이 기능을 가상으로 구현하였다. 이를테면 W^X 또는 Exec Shield를 들 수 있다.
NX 비트의 이점을 이용하고 이를 가상으로 구현하는 기능을 포함하는 운영 체제는 스택과 히프 메모리 영역이 실행되지 못하게 막으며, 실행 가능한 메모리를 기록하지 못하게 막는다. 특히 새서 웜과 블래스터 웜과 같은 코드를 실행하고 거부하는 특정한 버퍼 오버플로의 이용을 막는 데 도움을 준다. 이러한 공격은 쓰기 가능, 실행 가능이 되기 위한 메모리 일부 (보통 스택)에 따라 달라진다. 쓰기나 실행이 불가한 경우, 공격은 실패로 끝난다.
운영 체제로의 도입
수많은 운영 체제는 NX 정책을 포함하고 있으며, 그 운영 체제들 가운데 일부는 NX 에뮬레이션을 사용한다. 일부 기술의 경우, 각 기술이 지원하는 주된 기능을 다음과 같이 요약하고 있다.
- 하드웨어 지원 프로세서: (CPU 아키텍처의 쉼표 구분 목록)
- 에뮬레이션: (아니오) 또는 (아키텍처 독립) 또는 (CPU 아키텍처의 쉼표 구분 목록)
- 기타 지원: (없음) 또는 (CPU 아키텍처의 쉼표 구분 목록)
- 표준 분배: (아니오) 또는 (예) 또는 (이 기술을 지원하는 버전이나 배포의 쉼표 구분 목록)
- 공개일: (처음 공개된 날)
아키텍처 독립 에뮬레이션을 공급하는 기술은 하드웨어적으로 지원하지 않는 모든 프로세서에서 사용할 수 있다. "기타 지원"는 NX 비트가 분명히 존재하지 않는 프로세서를 위한 것이다.
FreeBSD
FreeBSD는 2007년 4월 6일 이후로 NX를 지원하지 않는다.
OS X
인텔 기반 OS X은 애플로부터 NX 비트를 지원한다. (처음 공개한 인텔 기반의 10.4.4 뒤로).
리눅스
리눅스 커널은 NX 비트를 지원하는 CPU(이를테면 현재 팔리는 64비트 AMD, 인텔, VIA, 트랜스메타 CPU)의 기본 하드웨어 NX를 지원하고 있다.
x86_64 CPU 위의 64비트 모드에서 이 기능에 대한 지원이 2004년에 앤디 클린에 의해 추가되었고, 같은 해에 인고 몰나는 64비트 CPU 위의 32 비트 모드에서 NX 비트에 대한 지원을 추가하였다. 이러한 기능들은 안정화된 리눅스 커널(2004년 8월에 공개한 2.6.8 이후)에서 사용할 수 있다.
32비트 x86 CPU와 64비트 x86 호환 CPU에서 실행되는 32비트 x86 커널 위의 NX 비트의 이용은 매우 중요하다. 왜냐하면 32비트 x86 커널은 보통 AMD64나 IA-64가 제공하는 NX 비트를 예측하지 못하기 때문이다. NX 사용 가능화 패치는 "NX 비트"를 사용할 수 있는 환경을 갖추었을 경우 이러한 커널이 NX 비트를 사용할 수 있게 도와 준다.
일부 데스크톱 리눅스 배포판, 이를테면 페도라 코어 6, 우분투 리눅스, 오픈수세는 32 비트 모드에서 NX 비트 접근에 요구되는 HIGHMEM64 옵션을 기본 커널에서 켜 놓지 않는다. 그 까닭은 NX 비트 사용에 필요한 PAE 모드를 켜 놓고 (PAE를 지원하지 않는) 펜티엄 프로 이전, 셀러론 M, 펜티엄 M 프로세서를 사용할 경우, 시동에 실패하기 때문이다. PAE를 지원하지 않는 다른 프로세서는 AMD K6 이전, 트랜스메타 크루소, VIA C3 이전, 그리고 Geode GX/LX가 있다. 페도라 코어 6은 PAE, NX를 지원하는 커널 PAE 패키지를 제공하지 않는다.
실행 방지 기능은 다른 비 x86 프로세서에도 존재한다.
같이 보기
외부 링크