Mejoras en el emulador userspace de ARMv7 'stinkarm': simplificación de memoria y endurecimiento

Fuentes: Making stinkarm stink way less, or more?

El proyecto 'stinkarm', un emulador en espacio de usuario del conjunto de instrucciones ARMv7-A escrito desde cero en Rust, ha recibido una serie de mejoras sustanciales con el objetivo de simplificar su código y reforzar su seguridad. El autor detalla tres ejes principales de trabajo. En primer lugar, la traducción de direcciones de invitado a anfitrión, que antes se apoyaba en un árbol B con un mapa de segmentos por dirección base, se ha sustituido por un único bloque contiguo de 4 GiB reservado con mmap: ahora mapear los segmentos del ELF se reduce a copiar sus bytes en la región reservada y las lecturas de la CPU comprueban límites con un único desplazamiento aritmético, eliminando las búsquedas y reduciendo la indirección. En segundo lugar, se ha añadido una capa de 'hardening' que evita que direcciones del invitado —incluido el puntero nulo y regiones fuera de la memoria asignada— alcancen memoria del anfitrión al traducir llamadas a write(2), mediante la comprobación in_bounds y la exclusión de la primera página (4 KiB) reservada como NULL_PAGE_SIZE; el autor incluye varios programas ARMv7 de prueba para validar estos casos. En tercer lugar, el decodificador de instrucciones se ha rediseñado para que sólo el opcode sea objeto de descodificación, expresando el resto de campos como patrones declarativos en una lista de reglas en tiempo de compilación (DECODE_RULES) mediante una pequeña DSL en macros de Rust, lo que facilita añadir nuevos opcodes. El conjunto sigue soportando únicamente un subconjunto mínimo (ldr, mov y svc) con sandboxing de syscalls, pero las refactorizaciones allanan el camino para ampliar la cobertura de instrucciones y endurecer el aislamiento entre invitado y anfitrión.