
analisi di CVE-2020-1362
WalletService ha risolto bug di elevazione dei privilegi nell'ultimo Patch Tuesday, uno dei bug è stato assegnato con CVE-2020-1362. Il bug sfrutta un bug out-of-bounds nel servizio. Qui condividiamo le nostre tecniche per sfruttarlo.
Abbiamo condotto un'analisi binaria delle seguenti funzioni in walletservice.dll:
La funzione SetGroup scriveva dati controllati dall'utente in un offset di memoria controllato dall'utente.
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;
}
Possiamo notare che la funzione non controlla l'intervallo dell'offset che l'utente può controllare. Quindi è qui che si verifica la vulnerabilità.
Ora possiamo scrivere memoria fuori dai limiti. Osservando possiamo scoprire che c'è una funzione per impostare e ottenere BSTR nella stessa classe:
Quindi possiamo facilmente modificare il puntatore a BSTR tramite oobw per ottenere la capacità di leggere e scrivere qualsiasi indirizzo.
Una volta ottenuto WWW (write-what-where), possiamo scrivere la vtable degli oggetti Wallet::WalletCustomProperty sull'heap per controllare RIP. All'inizio, abbiamo provato a modificarlo direttamente con oobw, ma abbiamo scoperto che oobw non era allineato a 8 byte. Quindi abbiamo dovuto scrivere due volte per ottenere il vtable hijack usando una race condition. Ma questo potrebbe rendere l'exploit instabile. Ci sono altri metodi per aggirare questo problema. Ma nel nostro POC usiamo un'altra vulnerabilità di info leak (CVE-2020-1361) per divulgare l'indirizzo dell'heap e usiamo www per scrivere la vtable direttamente. BTW, sebbene CVE-2020-1361 sia contrassegnata come vulnerabilità di info leak, in realtà può essere utilizzata per ottenere EOP. Ne scriveremo un writeup in futuro.
Abbiamo trovato la funzione ATL::CComObject<CDXGIAdapter>::`vector deleting destructor in dxgi.dll per aiutarci a passare dall'esecuzione di funzioni arbitrarie all'esecuzione arbitraria di codice. Questa funzione chiama la funzione loadlibraryEx e prende un puntatore globale come primo parametro di loadlibraryEx. Quindi possiamo ottenere l'esecuzione arbitraria di codice caricando una DLL personalizzata.
Un esempio di POC è fornito nella directory POC.
Attraverso la vulnerabilità, possiamo ottenere un'elevazione dei privilegi da medium a NT AUTHORITY\system.
Testato su Windows 10.0.18363.815, x64

Haoran Qin
Zhiniang Peng (@edwardzpeng) di Qihoo 360
10 Apr 2020: Vulnerabilità segnalate
21 Apr 2020: MSRC ha investigato e confermato il bug
14 Lug 2020: Patch rilasciata
17 Lug 2020: Writeup pubblicato