
Write-up zu CVE-2020-1362
Im letzten Patch Tuesday hat WalletService Rechteerweiterungsfehler behoben, einer der Fehler wurde mit CVE-2020-1362 gekennzeichnet. Der Fehler nutzt einen Out-of-Bounds-Fehler im Dienst aus. Hier teilen wir unsere Techniken, um ihn auszunutzen.
Wir haben eine binäre Analyse der folgenden Funktionen in walletservice.dll durchgeführt:
Die SetGroup-Funktion schrieb benutzergesteuerte Daten an eine benutzergesteuerte Speicherposition.
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;
}
Wir können feststellen, dass die Funktion den Bereich des Offsets, den der Benutzer kontrollieren kann, nicht überprüft. Hier liegt also die Schwachstelle.
Wir können nun Speicher außerhalb der Grenzen beschreiben. Durch Beobachtung stellen wir fest, dass es eine Funktion zum Setzen und Abrufen von BSTR in derselben Klasse gibt:
So können wir den Zeiger auf BSTR einfach durch oobw modifizieren, um die Fähigkeit zu erhalten, jede Adresse zu lesen und zu schreiben.
Sobald wir WWW (Write-What-Where) haben, können wir die vtable von Wallet::WalletCustomProperty-Objekten auf dem Heap beschreiben, um RIP zu kontrollieren. Anfangs versuchten wir, sie direkt mit oobw zu modifizieren, aber wir stellten fest, dass oobw nicht auf 8 Byte ausgerichtet war. Also müssen wir zweimal schreiben, um einen vtable-Hijack mittels Race Condition zu erreichen. Das kann den Exploit jedoch instabil machen. Es gibt andere Methoden, dies zu umgehen. In unserem POC verwenden wir jedoch eine andere Information-Leak-Schwachstelle (CVE-2020-1361), um die Heap-Adresse preiszugeben, und nutzen WWW, um die vtable direkt zu überschreiben. Übrigens, obwohl CVE-2020-1361 als Information-Leak-Schwachstelle markiert ist, kann sie tatsächlich zur Erreichung von EOP verwendet werden. Wir werden in Zukunft eine Ausarbeitung dazu veröffentlichen.
Wir haben die Funktion ATL::CComObject<CDXGIAdapter>::`vector deleting destructor in dxgi.dll gefunden, die uns hilft, von beliebigen Funktionsaufrufen zur beliebigen Codeausführung zu gelangen. Diese Funktion ruft die loadlibraryEx-Funktion auf und übergibt einen globalen Zeiger als ersten Parameter von loadlibraryEx. Dann können wir durch Laden einer benutzerdefinierten DLL eine beliebige Codeausführung erreichen.
Ein Beispiel-POC wird im Verzeichnis POC bereitgestellt.
Durch die Schwachstelle können wir eine Rechteerweiterung von mittleren Rechten auf NT AUTHORITY\system erreichen.
Getestet unter Windows 10.0.18363.815, x64

Haoran Qin
Zhiniang Peng (@edwardzpeng) von Qihoo 360
10. April 2020: Schwachstellen gemeldet
21. April 2020: MSRC untersuchte und bestätigte den Fehler
14. Juli 2020: Patch veröffentlicht
17. Juli 2020: Ausarbeitung veröffentlicht