Simpleator ("Simple-Adator") est un émulateur d'application en mode utilisateur X64 innovant centré sur Windows qui exploite plusieurs nouvelles fonctionnalités qui ont été ajoutées dans Windows 10 Spring Update (1803), également appelée "Redstone 4", avec des améliorations supplémentaires qui ont été apportées à Windows 10 octobre (1809), aka "Redstone 5".
À savoir, Simpleator s'appuie sur:
Il est conçu comme une preuve de concept sur la construction des environnements de détonation sablées plus simples et plus rapides, ainsi que des conteneurs encore plus limités en ressources qui pourraient exécuter des charges de travail sans serveur (fonctions AWS Lambdas / Azure) sans nécessiter de système d'exploitation invité.
Simpleator peut être construit avec Visual Studio 2017 et le dernier SDK Windows (1809). Notez que les SDK plus anciens ne peuvent pas être utilisés, car ils ne prennent pas en charge les nouvelles définitions WHVP, et que Simpleator lui-même ne prend en charge que les systèmes Windows 10 de 64 bits exécutant les builds 17763 ou plus (Redstone 5/1809).
La fenêtre du moniteur principal qui retrace les appels système, affichés ici affichant la sortie de la console de l'application d'invité de test:
La fenêtre Registre, qui peut être utilisée lorsqu'il y a une affirmation / problème avec l'émulateur (le thread d'interface utilisateur se figera, d'où le message "Not Responing"):
Et enfin, si l'activation de l'indicateur FLG_SHOW_LDR_SNAPS dans le PEB, la fenêtre de débogage affiche des appels à DbgPrint à partir du chargeur (sinon, tous les autres appels DBGPrint apparaîtraient malgré tout):
TBD TBD Ajouter des liens
Les développeurs écrivent et tirent parti des technologies d'émulation depuis des décennies, alors pourquoi écrire un autre émulateur?
Premièrement, l'introduction d'une API de virtualisation réelle au cœur des fenêtres est un passage dramatique sous-publié (de manière positive) vers la nature fermée précédente de la plate-forme Hyper-V. Bien qu'il y ait eu des API et IOCTL sans papiers via la bibliothèque de dispositif d'infrastructure de virtualisation (VID), une couche Win32 prise en charge et stable est une amélioration bienvenue. Déjà, QEMU prend désormais en charge l'utilisation de WHVP pour son accélération, et VirtualBox 6.0 sera probablement également expédié avec ce support (il est déjà implémenté dans le référentiel). Seul VMware est seul et provocant. Sur ce sujet, apprendre à tirer parti de cette nouvelle API n'est pas nécessairement un sujet facile, donc je voulais apprendre - et partager avec les autres - comment ces nouvelles interfaces fonctionnent.
Deuxièmement, lorsque vous envisagez des technologies d'émulation, il y a généralement trois forces motrices modernes pour son utilisation:
Mon principal intérêt était de regarder la troisième balle - qui jusqu'à présent a été réalisée avec une émulation complète du système, avec certaines implémentations personnalisées qui utilisent des modèles de surscription, mais apportant toujours beaucoup de complexité - un exemple étant les émulateurs les plus antivirus, tels que celui mis en œuvre dans Windows Defender (voir de grandes recherches [ici] et [ici]). En outre, les chercheurs familiers avec Qilin ont probablement déjà vu la multitude de liaisons Python simples qui s'y construisent facilement afin de «rotation» rapidement un processus Windows en utilisant un modèle de sur-subsscription en tirant parti de Qemu comme émulateur de système complet, mais pourtant sans image de système d'exploitation primaire.
J'ai décidé de poursuivre une autre avenue - une sorte d'implémentation «Windows en mode utilisateur», où les seuls binaires mappés dans l'espace d'adresse invité seraient le chargeur de système d'exploitation de l'hôte (ntdll.dll) et l'accès binaire cible, et où un espace d'adressage de 256 Go serait fourni qui aurait un accès natif 1: 1 entre les cartographies virtuelles des invités et les mappages de l'hôte, dans un processus «à base de sable» »(je n’aurait pas encore été mis en œuvre, dans un processus de sable» (je n’ai pas mis en place dans un processus de sable »(je n’ai pas mis en place dans un processus de sandbox" (je n’ai pas encore mis en œuvre les applications. Sandboxing). Tant que l'émulateur fournirait les structures de données construites au noyau de base pour le chargeur et les DLL système, l'hôte pourrait fonctionner à des vitesses natives, avec seulement des transitions annulaires privilégiées provoquant des sorties.
Ensuite, pour simplifier, un fournisseur d'appels système intercepte les appels système qui sont effectués par la machine virtuelle invitée et peuvent fonctionner de trois manières:
Selon l'endroit où les besoins se trouvent entre les performances, la complexité, la compatibilité et la sécurité, moins de 500 lignes de code sont nécessaires pour implémenter suffisamment de balles 1 et 2 ci-dessus pour obtenir une application de test simple pour charger, afficher un message "Hello World" et sortir, avec de nombreux problèmes de sécurité potentiels dans la gestion de ses appels système. Un doublement de la base de code pourrait probablement atténuer de manière réaliste la plupart des problèmes de sécurité dans les appels du système (moins les vulnérabilités réelles du noyau du système d'exploitation hôte - contre lequel un bac à sable pourrait atténuer).
Mais même à 1000 lignes de code, puisque tous les appels système sont finalement envoyés nativement au système d'exploitation, Simpleator se comporte plus comme une implémentation `` SecComp '' en plus d'un CGROUP sur Linux, plutôt que les émulateurs beaucoup plus complexes que nous voyons aujourd'hui.
Enfin, il convient de souligner qu'il y a un regain d'intérêt pour l'espace de cloud computing / contenerisation pour minimiser les ressources nécessaires pour exécuter des charges de travail telles que les fonctions Amazon Lambdas ou Azure, qui sont des pièces de code sans serveur qui s'exécutent dans des conteneurs, qui nécessitent toujours une rotation d'un système d'exploitation invité entier. Avec un contrôle plus strict des limites de sécurité que Simpleator fournit, on pourrait imaginer la possibilité d'exécuter le noyau JVM ou .NET en tant qu'application dédiée sans nécessiter de système d'exploitation invité complet.
TBD TBD
Il y a 3 principales pièces intéressantes (pour moi) sur la façon dont Simpleator réalise un environnement d'exécution invité unique qui rend beaucoup plus simple à exécuter les applications Windows:
La création d'un PEB et de TEB avec le même type de données que les fonctions MiCreatePebOrTeb du noyau se mettraient en place, mais avec des drapeaux spécifiques pour faciliter l'exécution dans l'environnement invité, y compris
Création d'une cartographie 1: 1 entre les adresses invitées et hôtes et tirant parti des nouvelles fonctionnalités "Requirements d'adresse" pour verrouiller les allocations à cette plage. Notez qu'à l'heure actuelle, Simpleator mappe la région authentique KUSER_SHARED_DATA à 0x7FFE0000 ce qui signifie que le passage du temps est `` vu '' par la machine virtuelle invitée grâce à la mise à jour des champs SystemTime et InterruptTime qui sont tenus à jour par l'hôte. L'isolement de cette région nécessiterait un temporisateur périodique pour imiter la mise à jour de cette valeur.
Mappage de l'image Ntdll.dll authentique et tirant parti des appels du système du système d'exploitation hôte pour exécuter nativement la majeure partie du processus de chargement, donnant un accès aux transitions RING INT 2E , SYSCALL et INT 2C .
De plus, à partir d'une base de modularité, Simpleator est composé de trois binaires:
Simpleator.exe qui implémente le moniteur de débogage. Ce composant est responsable de l'affichage de l'interface utilisateur pour le moniteur, le débogage et l'enregistrement des fenêtres, l'hébergement d'un tuyau nommé qui permet à l'émulateur de communiquer avec lui et de charger l'émulateur avec un environnement approprié (aujourd'hui, cela signifie configurer la réservation d'espace d'adresse de 256 Go, à l'avenir, cela signifierait également le sable).Provider.dll qui met en œuvre le fournisseur d'appels système pour Windows 10 1809 (RS5) et Windows 10 1903 (19H1), les versions actuelles prises en charge.Emulator.exe qui implémente le code d'émulateur accéléré réel WHVP. Il est principalement responsable de la communication avec le moniteur de débogage sur le tuyau, de la gestion du code de transition de l'anneau pour parler et depuis le fournisseur d'appels système, et effectuer la configuration initiale de l'espace d'adresse et le chargement PE de la bibliothèque de chargeur Ntdll.dll et du binaire de l'application cible. Tout d'abord, vous devez installer la plate-forme Hyperviseur Windows, qui nécessite également que Hyper-V soit installé et activé. Vous pouvez le faire soit en utilisant la ligne de commande suivante:
Dism /Online /Enable-Feature /FeatureName:HypervisorPlatform
Ou en lançant l'interface graphique comme ci-dessous:
OptionalFeatures.exe
Puis vérifier les cases "Hyper-V" et "Windows Hypervisor Platform", comme le montre la capture d'écran ci-dessous.
Vous devez avoir des droits administratifs pour l'utilisation de l'une de ces commandes.
De toute évidence, assurez-vous que votre matériel prend en charge la technologie de virtualisation matérielle (comme Intel VT-X).
Si vous souhaitez en savoir plus sur mes recherches ou mes travaux, je vous invite à consulter mon blog sur http://www.alex-ionescu.com ainsi que ma société de formation et de conseil, Winsider Seminars & Solutions Inc., à http://www.windows-internals.com.
TBD TBD
Simpleator est conçu pour minimiser la taille et la complexité du code - cela a un coût de robustesse et, surtout, de la sécurité. Par exemple, dans l'implémentation actuelle, NtCreateFile , NtOpenFile et NtWriteFile sont entièrement transmis au noyau OS hôte, ce qui signifie qu'une charge utile `` malveillante '' pourrait écraser tous les fichiers sur le disque auquel le processus d'émulateur d'hôte a accès, car il n'y a pas de sable supplémentaire autour de l'hôte.
En outre, notez que seul le nombre minimum strict d'appels système a été implémenté pour que l'application Testapp.exe lance, imprime son texte et quitte. L'exécution d'une application plus complexe telle que Cmd.exe nécessitera beaucoup plus de travail, d'autant plus que certaines API s'attendent à ce qu'une connexion à CSRS soit établie sur le LPC et pour que des données particulières soient retournées. Actuellement, Simpleator prétend qu'il s'agit d'un processus protégé par VTL-1 sécurisé, ce qui limite considérablement ce que certaines API invitées tentent de faire, et donc certains appels se bloquent directement (tels que, par exemple, certains de ceux autour de la région).
Une émulation et une modification plus complexes de l'espace d'adressage de l'invité seraient nécessaires pour débloquer une telle utilisation de l'API.
Simpleator ne fait pas beaucoup de vérification des erreurs, de validation et de gestion des exceptions. Ce n'est pas un logiciel robuste conçu pour une utilisation en production, mais plutôt une base de code de référence .
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.