머신 코드 JIT 및 실행 비활성화 비트


10

CPU / OS에 Execution Disable 비트가있는 경우 런타임 생성 머신 코드 (예 : JIT 출력과 같은)는 실제로 CPU에 의해 어떻게 실행됩니까?

내가 아는 한, 많은 최신 프로세서와 운영 체제에는 NX 비트 (Intel 및 ARM 포함)에 대한 지원이 포함되어 있어 컴파일 된 바이너리의 코드 섹션 이외의 다른 주소에 저장된 머신 코드가 실행되는 것을 방지합니다 . 분명히 이것은 쉘 코드 주입 공격을 막기 때문에 좋은 보안 이점입니다.

그러나 기계 코드를 동적으로 생성하는 LLVM과 같은 JIT 엔진은 어떻게이 문제를 해결합니까?


LLVM에서 어떻게 수행되는지 보려면 Memory :: allocateMappedMemory의 구현을 살펴보십시오. - * nix에서 스크립트를 들어 - Windows의
zr01

답변:


6

Linux 및 많은 Posix 시스템에서 응용 프로그램은 mmap (2)mprotect (2) syscalls를 사용하여 가상 메모리 의 일부 프로세스 주소 공간 에 대한 보호를 변경할 수 있습니다 .

따라서 JIT 엔진은 이것을 사용할 수 있습니다 (아마도 기계 코드가 방출 되기 전 이지만 아마도 후에 ).

BTW, 일부 아키텍처에서는 CPU 캐시에 __builtin_clear_cacheGCC 와 같은 새로 사용할 수있는 머신 코드 세그먼트에 대해 알려야 할 수도 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.