
analyse de CVE-2020-1362
WalletService a corrigé des bugs d'élévation de privilèges lors du dernier Patch Tuesday, l'un des bugs étant identifié comme CVE-2020-1362. Le bug exploite une faille hors limites dans le service. Nous partageons ici nos techniques pour l'exploiter.
Nous avons effectué une analyse binaire des fonctions suivantes dans walletservice.dll :
La fonction SetGroup écrit des données contrôlées par l'utilisateur dans la mémoire à un offset contrôlé par l'utilisateur.
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;
}
Nous pouvons remarquer que la fonction ne vérifie pas la plage de l'offset que l'utilisateur peut contrôler. C'est donc là que se situe la vulnérabilité.
Nous pouvons maintenant écrire en mémoire hors limites. En observant, nous constatons qu'il existe des fonctions pour définir et obtenir un BSTR dans la même classe :
Nous pouvons donc facilement modifier le pointeur vers le BSTR via oobw pour obtenir la capacité de lire et d'écrire à n'importe quelle adresse.
Une fois que nous disposons de WWW (write-what-where), nous pouvons écrire la vtable des objets Wallet::WalletCustomProperty sur le tas pour contrôler RIP. Au début, nous avons essayé de la modifier directement avec oobw, mais nous avons constaté que oobw n'était pas aligné sur 8 octets. Nous avons donc dû écrire deux fois pour réaliser le détournement de vtable en utilisant une condition de course. Mais cela peut rendre l'exploit instable. Il existe d'autres méthodes pour contourner ce problème. Cependant, dans notre POC, nous utilisons simplement une autre vulnérabilité de fuite d'informations (CVE-2020-1361) pour divulguer l'adresse du tas et utilisons www pour écrire directement la vtable. Au fait, bien que CVE-2020-1361 soit marquée comme une vulnérabilité de fuite d'informations, elle peut en réalité être utilisée pour obtenir une élévation de privilèges. Nous publierons une analyse à ce sujet à l'avenir.
Nous avons trouvé la fonction ATL::CComObject<CDXGIAdapter>::`vector deleting destructor dans dxgi.dll pour nous aider à passer de l'exécution de fonctions arbitraires à l'exécution de code arbitraire. Cette fonction appelle la fonction loadlibraryEx et prend un pointeur global comme premier paramètre de loadlibraryEx. Nous pouvons alors obtenir l'exécution de code arbitraire en chargeant une DLL personnalisée.
Un exemple de POC est fourni dans le répertoire POC.
Grâce à cette vulnérabilité, nous pouvons élever nos privilèges de medium à NT AUTHORITY\system.
Testé sur Windows 10.0.18363.815, x64

Haoran Qin
Zhiniang Peng (@edwardzpeng) de Qihoo 360
10 avr. 2020 : Vulnérabilités signalées
21 avr. 2020 : MSRC a enquêté et confirmé le bug
14 juil. 2020 : Correctif publié
17 juil. 2020 : Analyse publiée