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?
machine-code
jit
llvm
Siler
la source
la source
Réponses:
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_cache
de GCC.la source