Em um novo relatório do pesquisador de segurança da PwC no Reino Unido, Wietze Beukema, descobrimos que quase 300 executáveis ​​no Windows 10 são vulneráveis ​​ao sequestro de DLL.

"Acontece que quase 300 executáveis ​​na pasta System32 estão vulneráveis ​​ao sequestro de DLL do caminho relativo. Você sabia que, com um VBScript simples, alguns desses EXEs podem ser usados ​​para elevar essas execuções, ignorando completamente o UAC?" explicou Beukema.

A vulnerabilidade mencionada aqui é o sequestro de DLL de caminho relativo, que é quando um invasor pode fazer com que um executável legítimo do Windows carregue uma DLL arbitrária de sua escolha, provavelmente com intenção maliciosa.

O problema de sequestro de DLLs

Os ataques de sequestro de DLLs podem ser úteis para um invasor qualificado, pois concedem recursos como execução arbitrária de código, escalonamento de privilégios e persistência no sistema de destino.

As várias técnicas de sequestro de DLL cobertas pela postagem do blog da Beukema incluem substituição de DLL, proxy de DLL, sequestro de ordem de pesquisa de DLL, sequestro de DLL fantasma, redirecionamento de DLL, substituição de WinSxS DLL e sequestro de DLL de caminho relativo.

Para demonstrar o sequestro de DLL de caminho relativo na prática, a Beukema se concentrou nas bibliotecas presentes na pasta "C:WindowsSystem32" em uma máquina com Windows 10 (v1909).

Ele copiou o processo legítimo do winstat.exe para a pasta de downloads em seu sistema. Em seguida, ele executou a ferramenta de monitoramento de processos, procmon, para entender melhor as DLLs que o EXE está procurando durante a execução.

DLLs
DLLs

Isso nos permite identificar todas as DLLs consultadas por cada aplicativo, que serão todos os possíveis candidatos a DLL seqüestráveis. Mas não se segue automaticamente que todos esses também sejam carregados (e, portanto, executados).

"A maneira mais confiável de descobrir quais DLLs estão carregadas corretamente é compilar nossa própria versão da DLL e fazê-la gravar em um arquivo exclusivo após o carregamento bem-sucedido. Se repetirmos a abordagem acima para todos os executáveis ​​e DLLs de destino, isso resultará em uma coleção de arquivos que informam quais DLLs são confirmadas vulneráveis ​​ao sequestro de DLL."

O que representa um desafio para o invasor, no entanto, é compilar uma versão personalizada da DLL que pode ser iniciada pelo executável, sem problemas. Para obter um entendimento confiável de uma estrutura DLL legítima, a Beukema recomenda o uso de ferramentas como o DLL Export Viewer para análise.

Essa ferramenta fornece informações sobre a estrutura da DLL que estamos tentando recompilar, enumerando todos os nomes de funções externas que seriam duplicadas em uma exploração de sequestro de DLL.

O pesquisador forneceu uma lista abrangente de bibliotecas que são boas candidatas a ataques de sequestro.

Ele acrescentou: "estes não são meros alvos teóricos, são testados e confirmados como funcionando. A lista inclui 287 executáveis ​​e 263 DLLs únicas."

Um CSV com uma lista completa dessas bibliotecas foi fornecido via GitHub.

Técnicas de detecção e prevenção

Beukema apresenta alguns métodos de prevenção que podem ser usados ​​para impedir tais ataques, como procurar atividade na pasta simulada do windows, caso um esteja presente em sua máquina.

Além disso, ajustar as configurações do UAC para "sempre notificar" pode ajudar a evitar ataques como esse, caso o usuário final seja experiente o suficiente para entender o que está prestes a ser executado.

Outra estratégia é monitorar instâncias de criação e carregamento de DLL a partir de caminhos de arquivo inesperados:

"Você pode procurar a criação ou o carregamento de qualquer uma das DLLs mencionadas anteriormente a partir de caminhos inesperados, principalmente em locais temporários como %appdata%.

Afinal, o nome do aplicativo (legítimo) que carrega as DLLs pode ser alterado, mas os nomes de arquivos das DLLs são sempre corrigidos."

Ao criar aplicativos, sugere Beukema, os desenvolvedores devem aplicar o uso de caminhos absolutos e não relativos para carregar DLLs, entre várias outras técnicas.

Nada disso sozinho pode ser suficientemente infalível. No entanto, quando aplicadas adequadamente em conjunto, medidas preventivas, como as explicadas pelo pesquisador, podem impedir os ataques de seqüestro de DLL a longo prazo.