Segurança em Máquinas Virtuais
Uma das consultas mais freqüentes que eu recebo é em relação à segurança do uso de virtualização, com programas como o Microsoft Virtual PC e o Virtual Server. São muito comuns dúvidas do tipo "se uma máquina virtual for invadida ela pode comprometer a segurança do servidor?".
Neste post vou explicar como funciona o modelo de segurança do Microsoft Virtual PC e Virtual Server, nossos softwares de virtualização, e responder a estas perguntas em forma de FAQ no final.
(Para mais detalhes técnicos sobre virtualização, veja o meu post anterior. E as informações aqui valem para os softwares de virtualização da Microsoft, outros gerenciadores de máquinas virtuais como VMWare e o Xen podem ter modelos de segurança diferentes).
O Virtual PC e o Virtual Server são softwares gerenciadores de máquinas virtuais. Eles permitem que um sistema (chamado sistema host) possa rodar sobre ele uma ou mais "máquinas virtuais", que são sistemas inteiros com a sua própria configuração de hardware, BIOS e sistema operacional. Gerenciadores de máquinas virtuais permitem por exemplo que se monte por xemplo um ambiente inteiro de teste com vários sistemas usando um único hardware, ou a consolidação de vários servidores distintos em um servidor físico, ou o rápido provisionamento de um servidor simplesmente criando uma máquina virtual.
O modelo de segurança destes softwares é baseado na seguinte premissa:
O que quer que esteja rodando em uma máquina virtual, ela não pode comprometer a segurança do sistema host.
Ou seja, mesmo que uma máquina virtual seja invadida, infectada, comprometida e esteja inteiramente sob controle de um indivíduo malicioso, isso não deve representar uma ameaça para o sistema host. As máquinas virtuais devem ser completamente isoladas do sistema operacional que roda embaixo delas.
Este isolamento é feito através de uma técnica chamada ring compression. Os processadores padrão x86 possuem tem quatro níveis de prioridade para execução de código, númerados de 0 a 3. Código rodando no nível 0 pode executar qualquer instrução na CPU, enquanto no nível 3 (o mais restrito) existem várias instruções que não podem ser executadas. Esses níveis de prioridade ganharam o nome de "anéis" (rings) devido a forma como eram ilustrados no manual de programação do chip 80386.
O Windows e a maior parte dos sistemas operacionais para x86 somente usam os níveis 0 e 3, sendo o nível 0 para o kernel e o nível 3 para o modo usuário (o OS/2 é uma exceção, e é por isso que é tão dificil virtualizá-lo). O retrato de um sistema normal seria como na figura abaixo:
O gerenciador de memória virtual (virtual machine manager ou VMM) roda dentro do kernel do sistema host ou não-virtual, e ao criar uma máquina virtual ele move o kernel do sistema virtual para rodar no nível 1 ao invés do nível 0. O kernel da máquina virtual pensa que está rodando no nível 0 mas está na verdade rodando no nível 1, e isso permite que o VMM monitore a execução da máquina virtual e gerencie o acesso a memória e periféricos, eventualmente emule em software as instruções que somente podem ser chamadas no verdadeiro nível 0. A figura abaixo ilustra isso:
O isolamento entre os diversos nívels de proteção, garantido pela arquitetura do chip, impede que instruções da máquina virtual comprometam o kernel do sistema host. Este isolamento no entanto não é total, e existem em tese dois caminhos onde a máquina virtual interage com o sistema host:
- Existem instruções que somente podem ser chamadas no nível 0, e quando estas instruções são chamadas pelo kernel do sistema virtualizado elas tem que ser capturadas e emuladas em software pelo VMM.
- Um pacote de software chamado de "VM Additions" roda no kernel da máquina virtual para facilitar a integração entre as máquinas virtuais e o sistema host, realizando funções como sincronização de hora, mapeamento de pastas, sincronização da posição do mouse, etc. Isto é feito através de um canal de comunicação disponível entre o kernel do sistema virtual e o gerenciador de máquinas virtuais.
No Virtual PC e no Virtual Server um extenso trabalho envolvendo modelagem de ameaças, revisão de código e testes de penetração foram feitos para assegurar que estes dois caminhos não possam ser usados para atacar o sistema host a partir de uma máquina virtual. Obviamente é impossível dizer que isso é 100% seguro, mas até hoje nunca foi descoberto um canal de ataque e acreditamos que é muito improvável que um venha a ser encontrado.
FAQ:
1. Se uma máquina virtual for invadida, é possível que ele venha a comprometer a máquina host?
Não. Como vimos acima, a arquitetura do Virtual PC e o Virtual Server foram feitas para isolar o sistema hospedeiro de qualquer código malicioso rodando nas máquinas virtuais.
2. Mas você disse que um canal seria teoricamente possível usando os "VM Additions".
É teoricamente possível mas todo o esforço foi feito para proteger esse canal. Não acreditamos que seja um canal que ofereça risco significativo. Mas em casos mais críticos (por exemplo, em uma máquina virtual usada para analisar código malicioso ou destinada a ser um honeypot) você pode optar por não instalar os VM Additions.
3. E existe isolamento entre duas máquinas virtuais rodando no mesmo servidor?
Sim. Uma máquina virtual invadida ou comprometida não deve ser uma ameaça nem para o sistema host nem para nenhuma outra máquina virtual que esteja rodando no mesmo sistema.
4. Os drivers de hardware instalados nas máquinas virtuais não poderiam ser também usados como canal para um ataque?
Em tese não. Eles também rodam junto com o restante do kernel da máquina virtual no ring 1, e estão isolados do kernel do sistema host rodando em ring 0.
5. E o contrário? E se o sistema host for invadido?
Neste caso a segurança de todas as máquinas virtuais rodando naquele sistema pode ser facilmente comprometido. É possivel proteger o sistema host contra as máquinas virtuais (ou seja, o ring 0 do ring 1), mas não o contrário.
6. É possível o sistema operacional que está rodando dentro da máquina virtual descrobrir que está rodando em uma máquina virtual?
Sim, na arquitetura atual não é possível esconder que ele está dentro de uma máquina virtual, rodando em ring 1. Isso poderá mudar nas novas arquiteturas de virtualização por hardware, como o Intel VT e o AMD "Pacifica", e as implicações disto para a segurança serão tema de um outra nota no futuro.
Comments
Anonymous
January 01, 2003
Em um post anterior eu falei aqui sobre como rootkits e outros softwares maliciosos podem subverter oAnonymous
January 01, 2003
Oi Michel, Obrigado pelo comentário. Sobre este interessante ataque que você mencionou (o "Blue Pill"), eu escrevi o seguinde comentário: http://blogs.technet.com/fcima/archive/2006/08/14/446792.aspx. Abraços,
- Fernando Cima
- Anonymous
August 14, 2006
Parabéns pelo post Cima, grande profundidade e informações de extrema necessidade para o nosso dia-a-dia.
Abraços
Hélio Sá Moreira
Microsoft MVP - Most Valuable Professional - Anonymous
August 14, 2006
Obrigado Hélio. Vou falar um pouco mais sobre virtualização em um próximo post. - Anonymous
October 17, 2006
Achei interessante o seu artigo, isso mostra o comprometimento da Microsoft com segurança. Mas li este artigo [1] que já comenta sobre alguns proof of concept de ataques para VMs [1] http://searchservervirtualization.techtarget.com/tip/0,289483,sid94_gci1220291,00.html?track=NL-654&ad=566881&asrc=EM_NLN_628380&uid=998671