
Análise da CVE-2020-1362
O WalletService corrigiu falhas de Elevação de Privilégio na última Patch Tuesday, uma das falhas foi atribuída à CVE-2020-1362. A falha explora um bug de acesso fora dos limites no serviço. Aqui compartilhamos nossas técnicas para explorá-lo.
Conduzimos análise binária das seguintes funções em walletservice.dll:
A função SetGroup escreveu dados controlados pelo usuário na memória em um offset também controlado pelo usuário.
signed __int64 __fastcall Wallet::WalletCustomProperty::SetGroup(__int64 this, int a2, int a3, int a4)
{
signed __int64 result; // rax
result = 0i64;
if ( a2 == 1 )
{
if ( a3 & 0xFFFFFFDF )
return 0x80070057i64;
}
else if ( a3 == 0x20 )
{
return 0x80070057i64;
}
if ( a4 == -1 )
{
*(_DWORD *)(this + 8i64 * a2 + 0x74) = 0;
*(_DWORD *)(this + 8i64 * a2 + 0x78) = 0x7FFFFFFF;
}
else
{
*(_DWORD *)(this + 8i64 * a2 + 0x74) = a3;
*(_DWORD *)(this + 8i64 * a2 + 0x78) = a4;
}
return result;
}
Podemos notar que a função não verifica o intervalo do offset que o usuário pode controlar. Portanto, é aqui que a vulnerabilidade ocorre.
Agora podemos escrever memória fora dos limites. Observando, podemos perceber que existe uma função para definir e obter BSTR na mesma classe:
Portanto, podemos facilmente modificar o ponteiro para BSTR através do oobw para obter a capacidade de ler e escrever em qualquer endereço.
Uma vez que temos WWW (write-what-where), podemos escrever a vtable dos objetos Wallet::WalletCustomProperty no heap para controlar o RIP. No início, tentamos modificá-la diretamente com oobw, mas descobrimos que o oobw não estava alinhado com 8 bytes. Então tivemos que escrever duas vezes para conseguir o sequestro de vtable usando condição de corrida. Mas isso pode tornar o exploit instável. Existem outros métodos para contornar isso. Porém, em nosso POC, usamos outra vulnerabilidade de vazamento de informações (CVE-2020-1361) para vazar o endereço do heap e usamos o www para escrever a vtable diretamente. A propósito, embora a CVE-2020-1361 seja marcada como uma vulnerabilidade de vazamento de informações, ela pode ser usada para alcançar EOP. Faremos um writeup sobre ela no futuro.
Encontramos a função ATL::CComObject<CDXGIAdapter>::vector deleting destructor`` em dxgi.dll para nos ajudar a passar da execução de funções arbitrárias para execução arbitrária de código. Essa função chama a função loadlibraryEx e usa um ponteiro global como primeiro parâmetro de loadlibraryEx. Então podemos alcançar execução arbitrária de código carregando uma dll personalizada.
Um POC de exemplo é fornecido no diretório POC.
Através da vulnerabilidade, podemos alcançar elevação de privilégio de médio para NT AUTHORITY\system.
Testado no Windows 10.0.18363.815, x64

Haoran Qin
Zhiniang Peng (@edwardzpeng) da Qihoo 360
10 Abr 2020: Vulnerabilidades reportadas
21 Abr 2020: MSRC investigou e confirmou a falha
14 Jul 2020: Correção lançada
17 Jul 2020: Writeup publicado