
Relatório e POC para CVE-2020-0753, CVE-2020-0754 e seis vulnerabilidades de DOS no Window corrigidas.
O serviço de Relatório de Erros do Windows corrigiu 2 bugs de Elevação de Privilégio na última Patch Tuesday, os dois bugs foram atribuídos a CVE-2020-0753 e CVE-2020-0754. Ambos os bugs exploram uma condição de corrida nas operações de sistema de arquivos do serviço. No entanto, esses dois bugs não são tão fáceis de explorar devido às pequenas janelas de corrida e locais incertos de queda de arquivo. Aqui compartilhamos nossas técnicas para explorá-los.
A causa raiz dos dois bugs de corrida é apresentada em nossos relatórios, a causa real pode ser expressa como Previsível é Vulnerável. Quando o serviço WER processa arquivos temporários, ele manipula o local do arquivo C:\ProgramData\Microsoft\Windows\WER\Temp, que é um diretório com permissão de leitura/gravação para Usuários Autenticados. Isso significa que um usuário normal de IL média pode sobrescrever um arquivo criado pelo serviço WER, e até mesmo transformá-lo em um link do sistema de arquivos para danificar/excluir outros arquivos que ele não poderia tocar.
Para manter as operações de arquivo seguras, o serviço WER depende de uma API padrão chamada GetTempFileNameW e a encapsula com wersvc.dll->UtilGetTempFile. Essa API ajuda o WerSvc a gerar nomes de arquivo aleatórios não ocupados na forma de "WER****.tmp".
A parte aleatória do nome do arquivo é gerada com um número hexadecimal de 4 bytes, de 0000 a FFFF. Se um número já foi usado para criar um arquivo, a API usará outro nome de arquivo aleatório.
A estratégia claramente tem uma falha: se alguém criar 65535 arquivos com nomes de WER0000.tmp até WERFFFE.tmp, a API escolherá um número aleatório e testará o nome do arquivo para ver se existe, como WERA560.tmp. Ela descobrirá que o arquivo já existe e continuará testando de WERA560.tmp até WERFFFF.tmp. Durante o teste contínuo, aparece uma janela de preparação porque encontramos uma maneira de fazer o WerSvc travar na chamada GetTempFileNameW por 4 a 5 segundos, o que é uma grande janela de tempo. Enquanto isso, forçamos o serviço a criar um arquivo temporário com um nome fixo, que é WERFFFF.tmp.
Após o serviço criar o arquivo temporário chamado WERFFFF.tmp, a API automaticamente fecha o identificador (handle) que mantinha para o arquivo e retorna o nome do arquivo ao serviço para operações posteriores no arquivo. Esta é exatamente a posição que introduz o bug. Três condições são atendidas:
Aqui o serviço escreverá conteúdo no arquivo e o excluirá. Tanto a escrita quanto a exclusão causarão elevação de privilégio ao explorar links do sistema de arquivos e certas técnicas de exploração.
Para transformar o bug em exclusão arbitrária de arquivos, usamos criativamente múltiplas junções de diretório para finalizar a exploração. Nosso exploit contém os seguintes passos:
WER***.tmp em $pwd\1\ e criamos a junção $pwd\2\ -> $pwd\1\;$pwd\2\ e outro processo para executar continuamente o comando SetOplock $pwd\1\WERFFFF.tmp;$pwd\2\ -> \RPC CONTROL\ e depois criamos o link simbólico \RPC CONTROL\WERFFFF.tmp -> $target e \RPC CONTROL\WERFFFF.tmp.etl -> $target.A exploração detalhada e o POC estão disponíveis em WERReport-CVE-2020-0753.
Ao explorar a falha em GetTempFileNameW, obtivemos um local previsível onde o serviço operará; ao fazer uso de múltiplos níveis de junção do sistema de arquivos, tornamos a condição de corrida explorável de forma confiável.
Enquanto isso, notamos que esse tipo de bug de corrida também pode causar possível sobrescrita de arquivos, o que provavelmente leva a bugs de Elevação de Privilégio sob certas circunstâncias.
Para explicar a razão pela qual a corrupção arbitrária de arquivos (se você puder controlar uma parte muito pequena do conteúdo do arquivo: menos de 63 bytes) pode ser transformada em EoP, precisamos prestar atenção ao mecanismo de funcionamento do Windows Defender.
O Windows Defender tem um banco de dados de assinaturas de malware. Se algum arquivo contiver alguma assinatura de malware, o Defender o considerará malware e o excluirá. No entanto, esse recurso resulta em uma superfície de ataque adicional. Por exemplo, no WCTF2019, @icchy do tokyowesterns projetou um desafio de CTF do Windows chamado "Gyotaku The Flag", que usa esse recurso como um oráculo para vazar informações.
Aqui, aproveitamos esse recurso do Windows Defender para excluir arquivos arbitrários se tivermos uma corrupção arbitrária de arquivos com controle parcial do conteúdo do arquivo. Podemos simplesmente escrever uma assinatura de malware em um arquivo e acionar uma varredura padrão do Windows Defender; o arquivo será colocado na área de isolamento do Defender, que pode ser excluída por um usuário normal (ou seja, um usuário não administrador de IL média) simplesmente acionando a operação de varredura duas vezes.
Portanto, um bug de corrupção arbitrária de arquivo pode ser transformado em exclusão arbitrária de arquivo, desde que uma string de assinatura de malware possa ser colocada no arquivo alvo usando o bug.
Corrompa o arquivo alvo com um bug, colocando uma string de recurso reconhecível pelo Windows Defender nele.
Acione o Windows Defender para examinar o arquivo alvo, fazendo com que ele seja isolado.
Acione a varredura novamente; o arquivo alvo é excluído.
Ao aproveitar essa técnica, obtemos uma exclusão arbitrária de arquivos com a ajuda do Defender.
A exclusão arbitrária de arquivos pode ser explorada com muito mais facilidade para obter mais privilégios.
O Microsoft OneDrive é o pacote de aplicativos que fornece serviço de armazenamento em nuvem pessoal. Este aplicativo foi integrado ao Windows como uma opção de instalação padrão desde o Windows 8. Durante nossa pesquisa, 6 vulnerabilidades nas tarefas agendadas de manutenção do OneDrive foram encontradas e submetidas ao MSRC.
Aqui está uma tabela das vulnerabilidades que vamos expor nas tarefas agendadas relevantes do Microsoft OneDrive:
| Programa Vulnerável | Tipo | POC Fornecido |
|---|---|---|
| FileSyncConfig.exe | HardLink | sim |
| FileSyncHelper.exe | HardLink | sim |
| OneDriveFileSyncConfig.exe | SymLink | sim |
| OneDriveSetup.exe | HardLink | sim |
| OneDriveSetup.exe | HardLink | sim |
| OneDriveStandaloneUpdater.exe | HardLink | sim |