O SimpleTor ("Simple-Tor") é um inovador emulador de aplicativos de modo de usuário X64 centrado no Windows, que aproveita vários novos recursos que foram adicionados na atualização do Windows 10 Spring (1803), também chamada "Redstone 4", com melhorias adicionais que foram feitas no Windows 10 de outubro (1809), aka "Redstone 5".
Ou seja, o SimpleTor depende de:
É uma prova de conceito sobre como os ambientes de detonação em caixa de areia mais simples e mais rápidos podem ser construídos, bem como contêineres ainda mais limitados a recursos que poderiam executar cargas de trabalho sem servidor (funções da AWS Lambdas / Azure) sem exigir um sistema operacional convidado.
O SimpleTor pode ser construído com o Visual Studio 2017 e o mais recente Windows SDK (1809). Observe que os SDKs mais antigos não podem ser usados, pois não suportam as definições mais recentes do WHVP, e que o próprio SimpleTor suporta apenas sistemas Windows 10 de 64 bits que executam compilações 17763 ou acima (Redstone 5/1809).
A janela principal do monitor que rastreia as chamadas do sistema, mostradas aqui exibindo a saída do console do aplicativo Test Guest:
A janela de registro, que pode ser usada quando houver uma afirmação/problema com o emulador (o thread da interface do usuário congelará, daí a mensagem "não respondendo"):
E, finalmente, se habilitar a bandeira FLG_SHOW_LDR_SNAPS no PEB, a janela de depuração mostra chamadas para DbgPrint do carregador (caso contrário, qualquer outra chamada do DBGPRINT apareceria independentemente):
tbd tbd adicionar links
Os desenvolvedores estão escrevendo e alavancando tecnologias de emulação há décadas, então por que escrever mais um emulador?
Primeiro, a introdução de uma API de virtualização real no coração das janelas é uma mudança dramática sub-publicada (de maneira positiva) para a natureza fechada anterior da plataforma Hyper-V. Embora houvesse APIs e IOCTLs sem documentos através da biblioteca de dispositivos de infraestrutura de virtualização (VID), uma camada Win32 suportada e estável é uma melhoria bem -vinda. O QEMU agora suporta o uso do WHVP para sua aceleração, e o VirtualBox 6.0 provavelmente também será enviado com esse suporte (ele já está implementado no repositório). Apenas o VMware fica sozinho e desafiador. Sobre esse tópico, aprender a aproveitar essa nova API não é necessariamente um tópico fácil, então eu queria aprender - e compartilhar com outras pessoas - como essas novas interfaces funcionam.
Segundo, ao olhar para as tecnologias de emulação, geralmente existem três forças motrizes modernas para seu uso:
Meu principal interesse era olhar para a terceira bala-que até agora foi alcançada com a emulação completa do sistema, com algumas implementações personalizadas que usam modelos de descrição excessiva, mas ainda trazendo muita complexidade-um caso em questão sendo a maioria dos emuladores antivírus, como o implementado no Windows Defender (veja uma ótima pesquisa aqui e [aqui] e [aqui]). Além disso, os pesquisadores familiarizados com o Qilin provavelmente já viram a multidão de ligações simples de Python que facilmente se baseiam nele, a fim de 'spin-up' rapidamente um processo do Windows usando um modelo de subscrição excessiva, aproveitando o Qemu como um emulador completo do sistema, mas ainda sem uma imagem primária do sistema operacional.
Decidi seguir outra avenida-uma espécie de implementação do 'modo de usuário do modo de usuário, onde os únicos binários mapeados no espaço de endereço do hóspede seriam o carregador operacional do host (NTDLL.dll) e o binário de alvo e o espaço de fins de que não seriam o que não foi fornecido. Sandboxing). Enquanto o emulador forneceu as estruturas de dados básicas construídas no kernel para as DLLs de carregadores e sistemas, o host poderá ser executado em velocidades nativas, com apenas transições de anel privilegiadas causando saídas.
Então, por simplicidade, um provedor de chamadas de sistema intercepta as chamadas do sistema que estão sendo feitas pela VM convidada e podem operar de uma de três maneiras:
Dependendo de onde as necessidades estão entre desempenho, complexidade, compatibilidade e segurança, são necessárias menos de 500 linhas de código para implementar o suficiente de balas 1 e 2 acima para obter um aplicativo de teste simples para carregar, exibir uma mensagem "Hello World" e sair, com muitos problemas de segurança em potencial no tratamento de suas chamadas do sistema. Uma duplicação da base de código provavelmente poderia mitigar realisticamente a maioria dos problemas de segurança nas chamadas do sistema (menos vulnerabilidades reais no kernel do OS do host - com o qual uma caixa de areia poderia mitigar).
Mas mesmo em 1000 linhas de código, como todas as chamadas do sistema são finalmente enviadas nativamente para o sistema operacional, o Simpletor se comporta mais como uma implementação 'Seccomp' no topo de um cgroup no Linux, em vez dos emuladores muito mais complexos que vemos hoje.
Por fim, vale ressaltar que há um interesse renovado no espaço de computação/contêiner em nuvem para minimizar os recursos necessários para a execução de cargas de trabalho, como o Amazon Lambdas ou as funções do Azure, que são peças de código sem servidor que são executadas em contêineres, que ainda exigem rotação de todo um sistema de operação de convidados. Com um controle mais rigoroso dos limites de segurança que o Simpletreator fornece, pode -se imaginar a capacidade de executar a JVM ou o .NET Core como um aplicativo dedicado sem exigir um sistema operacional completo.
TBD TBD
Existem 3 partes principais (para mim) sobre como o SimpleTor alcança um ambiente exclusivo de execução de convidados que torna muito mais simples executar aplicativos do Windows:
A criação de um PEB e TEB com o mesmo tipo de dados que as funções MiCreatePebOrTeb do kernel estabeleceriam, mas com bandeiras específicas para facilitar a execução do ambiente do convidado, incluindo
Criando um mapeamento de 1: 1 entre endereços de hóspedes e host e aproveitando os novos recursos "Requisitos de endereço" para bloquear as alocações nesse intervalo. Observe que, no momento, o SimpleTor mapeia a autêntica região KUSER_SHARED_DATA em 0x7FFE0000 o que significa que a passagem do tempo é "vista" pela VM convidada, graças à atualização dos campos SystemTime e InterruptTime tempo que são mantidos atualizados pelo host. Isolando essa região exigiria um cronômetro periódico para emular a atualização desse valor.
Mapeando a imagem autêntica Ntdll.dll e alavancando as chamadas do sistema do sistema operacional host para executar nativamente a maior parte do processo de carregamento, fornecendo acesso às transições de anel INT 2E , SYSCALL e INT 2C .
Além disso, de uma base de modularidade, o SimpleTor é composto por três binários:
Simpleator.exe , que implementa o monitor de depuração. Esse componente é responsável por exibir a interface do usuário para o monitor, depuração e registro do Windows, hospedando um tubo nomeado que permite que o emulador se comunique com ele e carregando o emulador com um ambiente apropriado (hoje, isso significa configurar a reserva de 256 GB de espaço de endereço, no futuro, isso também significaria a caixa de areia).Provider.dll , que implementa o provedor de chamadas do sistema para Windows 10 1809 (RS5) e Windows 10 1903 (19H1), as construções atuais suportadas.Emulator.exe , que implementa o código do emulador acelerado WHVP. É principalmente responsável por se comunicar com o monitor de depuração sobre o tubo, manipular o código de transição do anel para conversar e com o provedor de chamadas do sistema e fazer a configuração inicial do espaço de endereço e o carregamento da PE da biblioteca de carregadores Ntdll.dll e do binário do aplicativo de destino. Primeiro, você deve instalar a plataforma Windows Hypervisor, que também exige que o Hyper-V seja instalado e ativado. Você pode fazer isso usando a seguinte linha de comando:
Dism /Online /Enable-Feature /FeatureName:HypervisorPlatform
Ou lançando a GUI como abaixo:
OptionalFeatures.exe
E verificando as caixas de seleção "Hyper-V" e "Windows Hypervisor Platform", como visto na captura de tela abaixo.
Você deve ter direitos administrativos para o uso de qualquer um desses comandos.
Obviamente, verifique se o seu hardware suporta a tecnologia de virtualização de hardware (como a Intel VT-X).
Se você deseja saber mais sobre minha pesquisa ou trabalho, convido você a conferir meu blog em http://www.alex-ionsenescu.com, bem como minha empresa de treinamento e consultoria, Winsider Seminars & Solutions Inc., em http://www.windows-nalntals.com.
TBD TBD
O SimpleTor foi projetado para minimizar o tamanho e a complexidade do código - isso tem um custo de robustez e, o mais importante, a segurança. Por exemplo, na implementação atual, NtCreateFile , NtOpenFile e NtWriteFile são totalmente passados para o kernel do OS host, o que significa que uma carga útil 'maliciosa' pode substituir qualquer arquivo no disco que o processo do emulador de host tem acesso, pois não há caixa de areia adicional ao redor do host.
Além disso, observe que apenas o número mínimo estrito de chamadas do sistema foi implementado para obter o aplicativo Testapp.exe para iniciar, imprimir seu texto e sair. A execução de um aplicativo mais complexo, como Cmd.exe , exigirá significativamente mais trabalho, especialmente porque certas APIs esperam que uma conexão com o CSRSS seja feita sobre o LPC e que dados específicos sejam devolvidos. Atualmente, o SimpleTor finge que é um processo protegido por VTL-1 seguro, que limita significativamente o que algumas das APIs de convidados tentam fazer e, portanto, certas chamadas falham (como, por exemplo, algumas das pessoas ao redor do local).
A emulação e a modificação mais complexas do espaço de endereço do hóspede seriam necessárias para desbloquear esse uso da API.
O Simpletador não faz muita verificação de erro, validação e manipulação de exceções. Não é um software robusto projetado para uso da produção, mas uma base de código de referência .
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.