
análisis de CVE-2020-1362
WalletService corrigió bugs de Elevación de Privilegios en el último Patch Tuesday, uno de los bugs fue asignado con CVE-2020-1362. El bug aprovecha un error fuera de límites en el servicio. Aquí compartimos nuestras técnicas para explotarlo.
Realizamos análisis binario de las siguientes funciones en walletservice.dll:
La función SetGroup escribió datos controlados por el usuario en la memoria en un offset controlado por el usuario.
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 la función no verifica el rango del offset que el usuario puede controlar. Por lo tanto, aquí es donde ocurre la vulnerabilidad.
Ahora podemos escribir memoria fuera de los límites. Observando podemos encontrar que hay una función para establecer y obtener BSTR en la misma clase:
Por lo tanto, podemos modificar fácilmente el puntero a BSTR a través de oobw para obtener la capacidad de leer y escribir cualquier dirección.
Una vez que tenemos WWW (write-what-where), podemos escribir la vtable de objetos Wallet::WalletCustomProperty en el heap para controlar RIP. Al principio, intentamos modificarlo directamente con oobw, pero descubrimos que oobw no estaba alineado con 8 bytes. Por lo tanto, tuvimos que escribir dos veces para lograr el secuestro de vtable usando una condición de carrera. Pero esto puede hacer que el exploit sea inestable. Hay otros métodos para evitar esto. Pero en nuestro POC simplemente usamos otra vulnerabilidad de fuga de información (CVE-2020-1361) para filtrar la dirección del heap y usamos www para escribir la vtable directamente. Por cierto, aunque CVE-2020-1361 está marcado como una vulnerabilidad de fuga de información, en realidad se puede usar para lograr EOP. Haremos un informe sobre esto en el futuro.
Encontramos la función ATL::CComObject<CDXGIAdapter>::`vector deleting destructor en dxgi.dll que nos ayuda a pasar de ejecutar funciones arbitrarias a ejecución de código arbitrario. Esta función llama a la función loadlibraryEx y toma un puntero global como primer parámetro de loadlibraryEx. Entonces podemos lograr la ejecución de código arbitrario cargando un dll personalizado.
Se proporciona un POC de ejemplo en el directorio POC.
A través de la vulnerabilidad, podemos lograr una elevación de privilegios de medio a NT AUTHORITY\system.
Probado en Windows 10.0.18363.815, x64

Haoran Qin
Zhiniang Peng (@edwardzpeng) de Qihoo 360
10 Abr 2020: Vulnerabilidades reportadas
21 Abr 2020: MSRC investigó y confirmó el bug
14 Jul 2020: Parche publicado
17 Jul 2020: Informe publicado