Empaquetar malware con Rosetta 2 en Apple Silicon

Fuentes: Packing malware in Rosetta 2

Este artículo técnico, basado en una charla de SummerCon, explica cómo aprovechar las características internas de Rosetta 2 —el traductor de binarios x86_64 a ARM64 incluido en macOS para Apple Silicon— para empaquetar y ejecutar código no firmado dentro de procesos legítimos. El autor describe el funcionamiento de Rosetta 2: el daemon oahd-helper comprueba cachés AOT (ahead-of-time) en /var/db/oah/ al lanzar un binario Intel; si no existen, los traduce estáticamente y guarda el resultado. Para llamadas indirectas que no puede traducir, inserta stubs que se resuelven en tiempo de ejecución mediante JIT, apoyándose en árboles rojo-negro de instrucciones originales. La investigación aprovecha tres debilidades clave: Rosetta 2 permite cargar bibliotecas dinámicas sin firma mediante DYLD_INSERT_LIBRARIES (mecanismo análogo a LD_PRELOAD en Linux) en procesos firmados; no mapea ciertas tablas de load commands del binario x86 original, eludiendo comprobaciones habituales de Gatekeeper; y mantiene registros no documentados como ACTLR_EL1 que replican el modelo de memoria x86. Además, procesos hijos creados con posix_spawn() heredan la preferencia arquitectónica. El autor enumera superficies de ataque concretas: inyección de código vía dlopen, manipulación de cachés AOT con stubs de función, evasión de Gatekeeper y rutas de ejecución x86_ARM controladas por uname del kernel. También señala que Apple endurecerá este escenario al eliminar Rosetta 2 en la próxima versión mayor de macOS, reemplazándolo por herramientas como el Game Porting Toolkit y máquinas virtuales Linux. Como caso práctico, reutiliza un hack previo sobre AssaultCube para localizar el valor de vida del jugador y modificarlo mediante una biblioteca inyectada. El texto concluye con posibles líneas de investigación pendientes, como MAP_JIT y shellcode.