JIT kodu maszynowego i bit wyłączenia wykonania

10

W jaki sposób generowany w środowisku wykonawczym kod maszynowy (taki jak dane wyjściowe JIT) jest faktycznie wykonywany przez CPU, jeśli CPU / OS ma bit wyłączania wykonywania?

O ile mi wiadomo, wiele nowoczesnych procesorów i systemów operacyjnych obsługuje bit NX (w tym Intel i ARM), co uniemożliwia wykonanie kodu maszynowego przechowywanego pod dowolnym adresem innym niż sekcja kodu skompilowanego pliku binarnego. Jest to oczywiście dobra zaleta bezpieczeństwa, ponieważ zapobiega atakom polegającym na wstrzykiwaniu kodu powłoki.

Ale w jaki sposób omijają to silniki JIT, takie jak LLVM, które dynamicznie generują kod maszynowy?

Siler
źródło
Spójrz na implementacje Memory :: replaceateMappedMemory, aby zobaczyć, jak to się robi w LLVM. - Dla * nix - Dla Windows
zr01

Odpowiedzi:

6

W systemie Linux i wielu systemach Posix aplikacja może zmienić ochronę pewnego zakresu przestrzeni adresowej procesu w pamięci wirtualnej za pomocą wywołań systemowych mmap (2) i mprotect (2) .

Tak więc silnik JIT mógłby ich użyć (prawdopodobnie przed emisją kodu maszynowego, ale być może po nim).

BTW, w niektórych architekturach może być konieczne poinformowanie pamięci podręcznej procesora o nowo dostępnych segmentach kodu maszynowego, np __builtin_clear_cache. GCC.

Basile Starynkevitch
źródło