JIT de code machine et bit de désactivation d'exécution

10

Comment le code machine généré par l'exécution (comme la sortie d'un JIT) est-il réellement exécuté par la CPU si la CPU / OS a un bit de désactivation d'exécution?

Pour autant que je sache, de nombreux processeurs et systèmes d'exploitation modernes incluent la prise en charge d'un bit NX (y compris Intel et ARM), ce qui empêche l' exécution du code machine stocké à toute adresse autre que la section de code d'un binaire compilé. De toute évidence, il s'agit d'un bel avantage de sécurité, car il empêche les attaques par injection de code shell.

Mais comment les moteurs JIT, comme LLVM, qui génèrent dynamiquement du code machine, peuvent-ils contourner cela?

Siler
la source
Jetez un œil aux implémentations de Memory :: allocateMappedMemory pour voir comment cela se fait dans LLVM. - Pour * nix - Pour Windows
zr01

Réponses:

6

Sous Linux et de nombreux systèmes Posix, une application peut modifier la protection d'une certaine plage de l' espace d'adressage du processus dans la mémoire virtuelle à l'aide des appels système mmap (2) et mprotect (2) .

Le moteur JIT pourrait donc les utiliser (probablement avant l' émission du code machine, mais peut-être après ).

BTW, sur certaines architectures, vous devrez peut-être informer le cache du processeur des nouveaux segments de code machine disponibles, par exemple __builtin_clear_cachede GCC.

Basile Starynkevitch
la source