
Prova de Conceito de Elevação de Privilégio de Usuário para Kernel no TeamViewer. CVE-2024-7479 e CVE-2024-7481. ZDI-24-1289 e ZDI-24-1290. TV-2024-1006.
Este repositório contém a prova de conceito do exploit de uma vulnerabilidade no TeamViewer que permite que um usuário não privilegiado carregue um Driver de Kernel arbitrário no sistema. Gostaria de agradecer à Zero Day Initiative pela coordenação com eles para relatar e divulgar responsavelmente a vulnerabilidade.

Os detalhes sobre a pesquisa que resultou nessas vulnerabilidades podem ser encontrados na seguinte série de três partes do blog no meu blog. Eles cobrem essas vulns em mais detalhes e também mostram onde eu falhei durante o processo. A terceira parte é a divertida :P.
Vídeos do exploit podem ser encontrados aqui:
Depois de ser capaz de falsificar (apenas uma autenticação simples, conforme detalhado no blog) um cliente TeamViewer válido ao se conectar ao serviço IPC do SYSTEM, foi possível acionar uma instalação arbitrária de driver. O TeamViewer não estava verificando a assinatura do driver que estava sendo instalado.
Assim, uma escalação de privilégio de USUÁRIO para KERNEL foi possível graças ao TeamViewer.
Uma das melhores abordagens é usar a técnica bem conhecida BYOD, Bring Your Own Vulnerable Driver para carregar um driver assinado válido no Kernel do Windows e então explorá-lo para realizar ações privilegiadas a partir do nível de usuário, como alterar o token de um processo arbitrário por um privilegiado.
Quando o TeamViewer está instalado no sistema, ele cria um serviço que roda como SYSTEM, TeamViewer_service.exe
Este serviço é um auxiliar para o cliente em algumas tarefas. Assim, o cliente não roda com privilégios elevados e algumas tarefas são delegadas ao serviço.
A comunicação com o serviço (IPC) é implementada através de sockets (usando Overlapped I/O e IoCompletionPort). Por padrão, os serviços SYSTEM do TeamViewer escutam na porta 5939/tcp em localhost.
O TeamViewer não está filtrando o parâmetro enviado pelo cliente para solicitar a instalação do driver nem a verificação de assinatura, etc.
Então a ideia é: vamos falsificar um cliente TV e pedir uma instalação de Driver VPN, mas indicando outro INF. Reutilizei o mesmo INF original do TeamViewer, mas em outro caminho (não privilegiado), renomeando o driver "ruim" para teamviewervpn.sys, já que este é o nome do driver alvo do INF original.
Isso também contorna a opção do TeamViewer Alterações exigem direitos administrativos neste computador.
Essa verificação é eficaz apenas via GUI, pois as opções do TeamViewer estão desabilitadas ao clicar no botão com um usuário não privilegiado. Mas é possível conectar ao socket e realizar o carregamento arbitrário do driver.
O exploit depende da versão por causa da mensagem IPC onde o cliente especifica seu PID e outros dados entre a versão. A versão do cliente deve corresponder à versão do serviço SYSTEM. O exploit deve ser modificado (linhas 140 a 143) no Main.cpp para a versão do TeamViewer_service.exe que está sendo alvo.
Então, basicamente, falsificamos um cliente TeamViewer conectando ao serviço SYSTEM e solicitamos a instalação de um driver arbitrário. O serviço do TeamViewer gentilmente o carrega no Kernel.
O TeamViewer tem outra mensagem IPC muito semelhante à primeira que descobri (lançada ao clicar em Instalar Driver VPN). Esta outra mensagem é para instalar o Driver de Impressora.
Então, essencialmente, CVE-2024-7479 e CVE-2024-7481 são iguais, mas o TeamViewer cometeu o mesmo erro duas vezes. As mensagens, embora diferentes, são muito semelhantes. Elas têm diferentes IDs de Método IPC.
O resultado é o mesmo, um driver arbitrário pode ser carregado.