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?
machine-code
jit
llvm
Siler
źródło
źródło
Odpowiedzi:
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.źródło