Procure vulnerabilidade. Execução de código arbitrário em máquinas virtuais NVIDIA GeForce NOW

Introdução



No contexto da pandemia do coronavírus, a popularidade dos serviços em nuvem aumentou, permitindo que você jogue videogames. Esses serviços fornecem o poder de computação necessário para executar jogos e transmitir a jogabilidade para os dispositivos dos usuários em tempo real. A vantagem mais óbvia de tal sistema é que os jogadores não precisam ter um hardware poderoso. Para iniciar o serviço ao cliente e passar o tempo do auto-isolamento, bastará uma máquina bastante econômica: todos os cálculos ocorrem em um servidor remoto.



Uma dessas plataformas em nuvem é GeForce NOW da NVIDIA. De acordo com o Google Trends, as pesquisas mundiais por esse serviço atingiram o pico em fevereiro. Isso se correlaciona com o início de restrições em muitos países da Ásia, Europa, América do Norte e do Sul e outras regiões. Ao mesmo tempo, para a Rússia, onde o regime de auto-isolamento começou mais tarde, em março, vemos um quadro semelhante, mas com um atraso correspondente.



Dado o grande interesse na GeForce NOW, decidimos considerar essa plataforma do ponto de vista da segurança.



Explorando a plataforma



No momento de nossa pesquisa, o GeForce NOW estava disponível em duas versões - gratuita e por assinatura. A diferença é que, ao usar o serviço gratuitamente, você deve esperar até que um ambiente virtual gratuito esteja disponível. No caso da opção paga, a máquina virtual começa com uma prioridade maior, e o jogador normalmente não precisa esperar. Em termos de segurança, as duas versões do serviço são iguais. Para qualquer violação das regras de uso da plataforma, o tempo de execução da nuvem é imediatamente desligado e a conta do jogador infrator pode ser bloqueada.



O menu contém uma lista de jogos suportados pelo serviço. Para jogar, você precisa de uma conta de uma das lojas de conteúdo digital à qual este ou aquele jogo já esteja vinculado (se for pago, será necessário comprá-lo com antecedência). Neste estudo, estamos analisando a combinação de loja GeForce NOW e Steam.



Quando você clica no botão "Play" na janela principal do aplicativo, um ambiente virtual remoto é iniciado e transmitido em tempo real do lado do servidor para o dispositivo do usuário.



Se o jogo selecionado já tiver sido adquirido, ele será executado no modo de tela inteira, e outros recursos do ambiente virtual não devem estar disponíveis para o usuário. No entanto, se as configurações do jogo permitirem que você selecione o modo de operação em janela, então temos a oportunidade de acessar a biblioteca do Steam. Outra forma de entrar nisso é escolher um jogo que ainda não está na biblioteca.







Já está claro que podemos executar código arbitrário se explorarmos uma vulnerabilidade em um jogo suportado pelo serviço. A única limitação é que o exploit deve ser entregue pela rede. Vários cenários são possíveis aqui. Por exemplo, se a exploração cria um módulo executável no disco, o serviço pode teoricamente impedir a execução da carga útil, rastreando a criação do arquivo executável como o usuário do quiosque (este é um usuário padrão nas máquinas virtuais do serviço GeForce NOW). Por outro lado, se o shellcode for executado como resultado da exploração de uma vulnerabilidade, o serviço não será capaz de se defender.



Para conduzir uma exploração completa do ambiente da máquina virtual, não precisamos ter acesso a cmd.exe ou powershell.exe. Mas como você consegue isso? Depois de vagar um pouco pelo menu da biblioteca Steam, encontramos uma forma que permitirá que você execute um arquivo exe executável arbitrário já disponível no sistema. Para fazer isso, usaremos a função "Adicionar um jogo de terceiros ...".







Normalmente, adicionar cmd.exe à biblioteca como um jogo de terceiros não seria um problema. No entanto, no GeForce NOW, esse recurso está desabilitado e clicar no botão Browse na imagem abaixo não leva a nada. No entanto, você pode escolher um dos aplicativos existentes (e ao mesmo tempo ver quais programas são instalados nas entranhas da máquina virtual). Por exemplo, vamos escolher o arquivador 7-Zip (outros programas também são ótimos).







Depois de adicionar 7-Zip à biblioteca Steam, os parâmetros do programa podem ser alterados. Aqui, corrigimos o caminho para o arquivo cmd.exe de que precisamos. Feito! Lançamos nosso "jogo" terceirizado e obtemos um shell funcional:







agora podemos olhar ao redor e descobrir onde estamos. Inicie o winver:







como se viu, a máquina virtual de serviço está em execução no Windows Server 2019.



Como resultado, já podemos fazer o que não é fornecido por padrão com as máquinas virtuais GeForce NOW. Mas o que mais podemos fazer e quão perigoso será?



De acordo com o FAQ na página NVIDIA Vulnerability Reporting, obter acesso ao cmd.exe em uma VM de serviço GeForce NOW não é uma vulnerabilidade. Isso se deve ao fato de que em um ambiente virtual o usuário possui direitos mínimos, e também há filtragem de aplicativos iniciados. Portanto, por exemplo, após iniciar o powershell.exe, o tempo de execução irá parar imediatamente.



Portanto, para que nossa pesquisa seja levada a sério, precisamos resolver dois problemas:



1) entregar a carga útil para a máquina virtual e

2) iniciá-la ignorando a lista de permissões de aplicativos.



No processo de resolução do primeiro problema, tentamos LOLBINs populares para download, como regsvr32, bitsadmin, etc. Em todos os casos, a máquina virtual travou:







Mas a decisão veio sozinha. GeForce NOW é um serviço para jogos (incluindo multijogador) onde um cliente de jogo pode se conectar a um servidor de jogo e baixar sons, modelos, mapas e outros arquivos de lá. Portanto, precisamos escolher um jogo que entregará um arquivo arbitrário ao cliente. Ao mesmo tempo, não precisamos nos preocupar com a extensão do arquivo, já que temos acesso ao shell e podemos mover o arquivo baixado para onde possamos usá-lo.



Mas e quanto à lista de permissões de aplicativos? Afinal, mesmo que consigamos colocar um aplicativo de terceiros em uma máquina virtual, ao iniciar irá travar. Uma solução para esse problema é encontrar um aplicativo da lista confiável, para o qual podemos implementar o sequestro de DLL. O objetivo mais óbvio é a jogabilidade.



Então, vamos tentar implementar essa ideia usando o exemplo de Counter-Strike: Source (daqui em diante iremos abreviá-lo como CS: S). A primeira coisa que fazemos é criar nosso próprio servidor CS: S, que servirá um arquivo dll sob a forma de, digamos, um modelo (d.mdl). Em seguida, lançamos o GeForce NOW para jogar CS: S e vamos para o nosso servidor, a partir do qual um arquivo "modelo" previamente preparado é carregado na máquina virtual. Agora, minimizamos o jogo e executamos cmd.exe. Mova o arquivo d.mdl para "Counter-Strike Source / bin / user32.dll" e reinicie o jogo com o comando do console. Sucesso: executamos código arbitrário no contexto de um processo confiável.



E eles até gravaram um vídeo:







Conclusão



Apesar do fato de que os ataques aos usuários do serviço são potencialmente possíveis, eles ainda são improváveis. Além disso, os riscos para outros usuários do serviço serão mínimos. O fato é que para cada nova sessão de jogo, um ambiente virtual limpo é lançado no GeForce NOW. Depois que o jogador termina a sessão, a máquina virtual é desligada e "reiniciada". Portanto, mesmo que a vulnerabilidade seja explorada com êxito, o código malicioso só poderá funcionar enquanto a máquina virtual comprometida estiver em execução. E, para atacar outros usuários, os invasores precisarão sair do ambiente virtual usando um exploit, como escape de máquina virtual. Esses exploits são raros e difíceis de implementar. Mas, se for bem-sucedido, não são apenas os usuários individuais que estão em risco, mas todosque lançou uma sessão de jogo após o comprometimento inicial do serviço por meio de uma das máquinas virtuais GeForce NOW.



No entanto, um cenário de ataque mais simples e realista é usar uma máquina virtual comprometida para minerar criptomoedas, conduzir ataques DDoS e realizar outras atividades ilegais que requerem capacidade de computação.



Após nosso contato, a NVIDIA confirmou o problema e lançou uma correção para seu serviço.



Cronologia dos eventos:



18.04.2020 — NVIDIA

20.04.2020 — NVIDIA PSIRT

13.05.2020 — NVIDIA PSIRT ,

21.08.2020 — NVIDIA PSIRT , 30.08

02.09.2020 —

03.09.2020 — NVIDIA

04.09.2020 — NVIDIA

07.09.2020 — .



All Articles