SimpleAtor ("Simple-Eater") es un innovador emulador de aplicaciones de modo de usuario de Windows Centric X64 que aprovecha varias características nuevas que se agregaron en Windows 10 Spring Update (1803), también llamada "Redstone 4", con mejoras adicionales que se realizaron en Windows 10 de octubre de actualización (1809), aka "Redstone 5".
A saber, Simpleator confía en:
Se entiende como una prueba de concepto sobre cuán más simples y más rápidos se podrían construir entornos de detonación de sandboxed más rápidos, así como contenedores aún más limitados por recursos que podrían ejecutar cargas de trabajo sin servidor (funciones de lambdas / azure de AWS) sin requerir un sistema de operación de invitados.
Simpleator se puede construir con Visual Studio 2017 y el último SDK de Windows (1809). Tenga en cuenta que los SDK más antiguos no se pueden utilizar, ya que no admiten las definiciones WHVP más nuevas, y ese simpligo en sí solo admite los sistemas Windows 10 de 64 bits que se ejecutan en 17763 o superiores (Redstone 5 /1809).
La ventana del monitor principal que traza las llamadas del sistema, que se muestra aquí que muestra la salida de la consola de la aplicación de invitado de prueba:
La ventana de registro, que se puede usar cuando hay una afirmación/problema con el emulador (el hilo de la interfaz de usuario se congelará, de ahí el mensaje "no respondiendo"):
Y finalmente, si habilita el indicador FLG_SHOW_LDR_SNAPS en el PEB, la ventana de depuración muestra las llamadas a DbgPrint desde el cargador (de lo contrario, cualquier otra llamada DBGPrint aparecería independientemente):
TBD TBD Agregar enlaces
Los desarrolladores han estado escribiendo y aprovechando las tecnologías de emulación durante décadas, entonces, ¿por qué escribir otro emulador más?
Primero, la introducción de una API de virtualización real en el corazón de Windows es un cambio dramático (de manera positiva) poco publicitada (de manera positiva) a la naturaleza cerrada anterior de la plataforma Hyper-V. Si bien hubo API y IOCTL indocumentados a través de la biblioteca del dispositivo de infraestructura de virtualización (VID), una capa Win32 compatible y estable es una mejora bienvenida. QEMU ya ahora admite el uso de WHVP para su aceleración, y Virtualbox 6.0 probablemente también se enviará con este soporte (ya se implementa en el repositorio). Solo VMware está solo y desafiante. Sobre este tema, aprender a aprovechar esta nueva API no es necesariamente un tema fácil, por lo que quería aprender, y compartir con otros, cómo funcionan estas nuevas interfaces.
En segundo lugar, al observar las tecnologías de emulación, generalmente hay tres fuerzas impulsoras modernas para su uso:
Mi principal interés era mirar la tercera bala, que hasta ahora se ha logrado con la emulación completa del sistema, con algunas implementaciones personalizadas que usan modelos de subconcripción, pero aún traen mucha complejidad, un caso en el punto de ser la mayoría de los emuladores antivirus, como el que implementa en Windows Defender (ver algunas grandes investigaciones [aquí] y [aquí]). Además, los investigadores familiarizados con Qilin probablemente ya hayan visto la multitud de enlaces simples de Python que se basan fácilmente en él para 'spink up' un proceso de Windows utilizando un modelo excesivo de suscripción al aprovechar QEMU como un emulador del sistema completo pero sin una imagen del sistema operativo primario.
Decidí seguir otra vía: una especie de implementación de 'Windows en modo de usuario', donde los únicos binarios asignados en el espacio de direcciones de los invitados serían el cargador del sistema operativo del host (ntdll.dll) y el binario de destino, y donde un espacio de direcciones de 256 GB se proporcionaría que no tendrá acceso nativo 1: 1 entre las virtudes virtuales de invitados y las mapeaciones del host, en un 'sandboxed' procesado (Nota: Nota: Nota que no tenga el acceso 1: 1 de los invitados de invitados de invitado. Sandboxing). Mientras el emulador proporcionaría las estructuras de datos básicas construidas en el núcleo para el cargador y las DLL del sistema, el host podría ejecutarse a velocidades nativas, con solo transiciones de anillo privilegiadas que causan salidas.
Luego, por simplicidad, un proveedor de llamadas del sistema intercepta las llamadas del sistema que están realizando la VM invitada y puede operar de una de las tres maneras:
Dependiendo de dónde se encuentren las necesidades entre el rendimiento, la complejidad, la compatibilidad y la seguridad, se necesitan menos de 500 líneas de código para implementar suficientes balas 1 y 2 anteriores para obtener una aplicación de prueba simple para cargar, mostrar un mensaje de "hola mundo" y salir, con muchos problemas potenciales de seguridad en el manejo de sus llamadas del sistema. Una duplicación de la base de código probablemente podría mitigar de manera realista la mayoría de los problemas de seguridad en las llamadas del sistema (menos vulnerabilidades reales en el kernel del sistema operativo host, que una caja de arena podría mitigar).
Pero incluso a 1000 líneas de código, dado que todas las llamadas del sistema se envían de forma nativa al sistema operativo, Simpleator se comporta más como una implementación de 'SECComp' además de un Cloup en Linux, en lugar de los emuladores mucho más complejos que vemos hoy.
Finalmente, vale la pena señalar que hay un renovado interés en el espacio de contenedores/computación en la nube para minimizar los recursos necesarios para ejecutar cargas de trabajo como Amazon Lambdas o funciones de Azure, que son piezas de código sin servidor que se ejecutan en contenedores, que aún requieren girar un sistema operativo invitado completo. Con un control más estricto de los límites de seguridad que proporciona Simpleator, uno podría imaginar la capacidad de ejecutar el núcleo JVM o .NET como una aplicación dedicada sin requerir un sistema operativo invitado completo.
TBD TBD
Hay 3 partes principales interesantes (para mí) sobre cómo SimpleAtor logra un entorno de ejecución de invitados único que hace que sea mucho más simple ejecutar aplicaciones de Windows:
La creación de un PEB y TEB con el mismo tipo de datos que se establecerían las funciones de MiCreatePebOrTeb del kernel, pero con banderas específicas para facilitar la ejecución del entorno de invitados, incluido
Creación de una asignación 1: 1 entre las direcciones de invitado y host, y aprovechando las nuevas características de "Requisitos de dirección" para bloquear las asignaciones a ese rango. Tenga en cuenta que en este momento, SimpleAtor mapea la auténtica región KUSER_SHARED_DATA en 0x7FFE0000 lo que significa que la VM invitada "se ve" gracias a la actualización de los campos SystemTime e InterruptTime que el huésped mantiene actualizado. Aislar esta región requeriría un temporizador periódico para emular la actualización de este valor.
Mapeo de la imagen auténtica Ntdll.dll y aprovechando las llamadas del sistema del sistema operativo host para ejecutar de forma nativa la mayor parte del proceso de carga, proporcionando acceso a las transiciones de anillo INT 2E , SYSCALL e INT 2C .
Además, desde una base de modularidad, Simpleator está compuesto por tres binarios:
Simpleator.exe que implementa el monitor de depuración. Este componente es responsable de mostrar la interfaz de usuario para el monitor, depurar y registrar ventanas, alojando una tubería con nombre que permite que el emulador se comunique con él, y cargar el emulador con un entorno apropiado (hoy, esto significa configurar la reserva de espacio de direcciones de 256 GB, en el futuro, esto también significaría el sandbox).Provider.dll que implementa el proveedor de llamadas del sistema para Windows 10 1809 (RS5) y Windows 10 1903 (19H1), las compilaciones actuales admitidas.Emulator.exe que implementa el código de emulador acelerado real de WHVP. Es principalmente responsable de comunicarse con el monitor de depuración sobre la tubería, manejar el código de transición del anillo para hablar con el proveedor de llamadas del sistema, y hacer la configuración del espacio de direcciones inicial y la carga de PE de la biblioteca de cargadores Ntdll.dll y el binario de aplicación de destino. Primero, debe instalar la plataforma Windows Hypervisor, que también requiere que Hyper-V se instale y habilite. Puede hacerlo utilizando la siguiente línea de comandos:
Dism /Online /Enable-Feature /FeatureName:HypervisorPlatform
O al lanzar la GUI a continuación:
OptionalFeatures.exe
Y luego verificar las casillas de verificación "Hyper-V" y "Windows Hypervisor Platform", como se ve en la captura de pantalla a continuación.
Debe tener derechos administrativos para el uso de cualquiera de estos comandos.
Obviamente, asegúrese de que su hardware admita la tecnología de virtualización de hardware (como Intel VT-X).
Si desea saber más sobre mi investigación o trabajo, te invito a ver mi blog en http://www.alex-ionescu.com, así como mi empresa de capacitación y consultoría, Winsider Seminars & Solutions Inc., en http://www.windows-internals.com.
TBD TBD
Simpleator está diseñado para minimizar el tamaño y la complejidad del código: esto tiene un costo de robustez y, lo más importante, la seguridad. Por ejemplo, en la implementación actual, NtCreateFile , NtOpenFile y NtWriteFile se transmiten por completo al kernel del sistema operativo host, lo que significa que una carga útil 'maliciosa' podría sobrescribir cualquier archivo en el disco al que el proceso del emulador del host tiene acceso, ya que no hay una caja de arena adicional en torno al host.
Además, tenga en cuenta que solo se implementó el estricto número mínimo de llamadas del sistema para que la aplicación Testapp.exe se inicie, imprima su texto y salga. Ejecutar una aplicación más compleja como Cmd.exe requerirá significativamente más trabajo, especialmente porque ciertas API esperan que se realice una conexión con CSRS sobre LPC y para que los datos particulares se devuelvan de regreso. Actualmente, Simpleator finge que es un proceso protegido seguro de VTL-1, que limita significativamente lo que algunas de las API de invitados intentan hacer y, por lo tanto, ciertas llamadas directas (como, por ejemplo, algunos de los que están cerca de locales).
Se requeriría una emulación y modificación más compleja del espacio de direcciones del invitado para desbloquear dicho uso de API.
Simpleator no hace muchos errores de comprobación, validación y manejo de excepciones. No es un software robusto diseñado para el uso de producción, sino más bien una base de código de referencia .
Copyright 2018 Alex Ionescu. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided
that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and
the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions
and the following disclaimer in the documentation and/or other materials provided with the
distribution.
THIS SOFTWARE IS PROVIDED BY ALEX IONESCU ``AS IS'' AND ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ALEX IONESCU
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
The views and conclusions contained in the software and documentation are those of the authors and
should not be interpreted as representing official policies, either expressed or implied, of Alex Ionescu.