W^X
W^XW^X("Write xor execute", 발음 W xor X)는 운영 체제 및 가상 시스템의 보안 기능이다.프로세스 또는 커널의 주소 공간에 있는 모든 페이지는 쓰기 가능하거나 실행 가능하지만 둘 다 실행 가능하지는 않은 메모리 보호 정책이다.이러한 보호가 없으면 프로그램은 데이터를 위한 메모리 영역에 CPU 명령어(데이터 "W"로)를 작성한 다음 실행 가능한 "X"로 실행하거나 "RX"를 읽기 실행한다.만약 기억의 작가가 악의적이면 이것은 위험할 수 있다.W^X는 실행 가능한 공간 보호의 일반 개념을 엄격하게 사용하기 위한 Unix와 유사한 용어로서, 을 통해 제어된다.mprotect
시스템 호출
W^X는 Sun의 SPARC와 SPARC64, AMD의 AMD64, Hewlett-Packard의 PA-RISC, HP의 (원래 디지털 장비 Corporation의) 알파, ARM 등 미세한 페이지 권한을 지원하는 프로세서에서 비교적 간단하다.
W^X는 파일 시스템 쓰기/실행 권한에도 적용되어 파일 쓰기 취약성(메모리와 동일)과 공격자 지속성을 완화하였다.[1]파일 사용 권한에 대한 제한을 적용하면 메모리 매핑된 파일에 의해 야기되는 W^X 시행의 격차를 줄일 수 있다.[2][3]임의의 네이티브 코드의 사용을 전면 금지하면 컴퓨터의 기존 코드를 통해 노출되지 않는 커널과 CPU 취약성도 줄일 수 있다.[4]
호환성.
일부 초기 Intel 64 프로세서는 W^X에 필요한 NX 비트가 부족했지만 이는 이후 칩에서 나타났다.Intel i386과 같은 보다 제한된 프로세서에서 W^X는 CS 코드 세그먼트 제한을 "모래 속의 선"으로 사용할 것을 요구하고 있는데, 이는 실행이 허용되지 않고 데이터가 위치한 주소 공간의 지점이며, 그 아래에는 허용되고 실행 가능한 페이지가 배치되는 지점이다.이 계획은 Exec Shield에서 사용되었다.[5]
일반적으로 데이터를 코드에서 분리하기 위해 링커 변경이 필요하다(링커 및 라이브러리 런타임 기능에 필요한 트램폴린 등).일반적으로 혼합이 가능한 스위치를 호출한다.execstack
Unix와 유사한 시스템에서[6]
또한 W^X는 적시 컴파일에 사소한 문제를 일으킬 수 있는데, 이 컴파일은 통역사가 즉석에서 기계 코드를 생성한 다음 그것을 실행하는 것을 포함한다.Firefox를 포함한 대부분의 사람들이 사용하는 간단한 해결책은 통역이 기계 코드 작성을 마친 후, 다음을 사용하여 페이지를 실행 가능하게 만드는 것이다.VirtualProtect
Windows 또는mprotect
Unix-likes로.다른 솔루션은 동일한 메모리 영역을 RW와 RX의 두 페이지로 매핑하는 것을 포함한다.[7]어떤 해결책이 더 안전한지에 대한 단순한 합의는 없다: 후자 접근방식의 지지자들은 쓰기 가능한 페이지를 허용하면 W^X의 포인트를 잃게 된다고 믿는다(SELinux 정책이라는 이름의 그러한 운영을 통제하는 SELinux 정책이 존재한다).allow_execmod
) 그리고 그 어드레스 스페이스 레이아웃 무작위화는 두 페이지를 같은 프로세스에 넣는 것을 안전하게 만들 것이다.전자의 접근법을 지지하는 사람들은 후자의 접근방식은 두 페이지가 분리된 두 개의 프로세스에 주어질 때에만 안전하며, 프로세스 간 통신은 호출하는 것보다 비용이 더 많이 들 것이라고 믿는다.mprotect
.
역사
W^X는 2003년 5월에 출시된 OpenBSD 3.3에서 처음 구현되었다.2004년에 마이크로소프트는 윈도우 XP에 DEP(데이터 실행 방지)라는 유사한 기능을 도입했다.리눅스용 PaX 및 Exec Shield 패치, NetBSD의 PaX 구현 등 다른 운영 체제에서도 유사한 기능을 사용할 수 있다.Red Hat Enterprise Linux(및 자동으로 Cent)의 경우OS) 버전 5 또는 Linux 커널 2.6.18-8에 의해 SELinux는allow_execmem
,allow_execheap
그리고allow_execmod
비활성화된 경우 W^X를 제공하는 정책
W^X(또는 DEP)는 대부분의 존재 동안 사용자랜드 프로그램만 보호했지만, 2012년에 마이크로소프트는 이를 x86 및 ARM 아키텍처의 윈도 커널로 확장했다.[8]2014년 말과 2015년 초에 AMD64 아키텍처의 OpenBSD 커널에 W^X가 추가되었다.[9]2016년 초 NetB에서 W^X가 완전히 구현되었다.SD의 AMD64 커널과 부분적으로 i386 커널에.
2016년 Firefox 46을 시작으로 Firefox의 자바스크립트용 가상 머신도 W^X 정책을 구현한다.[7]
로 시작.2021년 NET 6.0, .NET는 이제 W^X를 사용한다.[10]
참조
- ^ "Enforce execve() restrictions for API > 28".
- ^ "Zack's Kernel News".
- ^ "S.A.R.A. a new stacked LSM".
- ^ "Hardening the Linux Kernel (series 2.0.x)".
- ^ "i386 W^X". April 17, 2003. Retrieved June 19, 2014.
- ^ Linux 시스템 관리 설명서 –
- ^ a b "W^X JIT-code enabled in Firefox". Retrieved April 29, 2016.
- ^ "Exploit mitigation improvements in Win8".
- ^ "W^X protection for the AMD64 kernel".
- ^ "What's new in .NET 6". docs.microsoft.com. Microsoft. Retrieved November 9, 2021.