
Exploit d'exécution de code à distance dans la bibliothèque RPC
CVE-2022-26809 - une faille dans un composant central de Windows (RPC) a obtenu un score CVSS de 9,8 non sans raison, car l'attaque ne nécessite pas d'authentification et peut être exécutée à distance via un réseau, et peut entraîner une exécution de code à distance (RCE) avec les privilèges du service RPC, qui dépend du processus hébergeant le runtime RPC. Ce bug critique, avec un peu de chance, permet d'accéder à un hôte Windows non patché exécutant SMB. La vulnérabilité peut être exploitée aussi bien depuis l'extérieur du réseau pour le pénétrer qu'entre les machines du réseau.
La CVE indique que les vulnérabilités se situent dans le runtime RPC de Windows, qui est implémenté dans une bibliothèque nommée rpcrt4.dll. Cette bibliothèque runtime est chargée à la fois dans les processus client et serveur utilisant le protocole RPC pour la communication. Nous avons comparé les versions 10.0.22000.434 (Mars) et 10.0.22000.613 (patchée) et avons extrait une liste de modifications.
Les fonctions OSF_SCALL::ProcessResponse et OSF_CCALL::ProcessReceivedPDU sont de nature similaire ; toutes deux traitent des paquets RPC, mais l'une s'exécute côté serveur et l'autre côté client (SCALL et CCALL). En différenciant OSF_SCALL::ProcessReceivedPDU, nous avons remarqué deux blocs de code qui ont été ajoutés à la nouvelle version.


En regardant le code patché, nous avons vu qu'après QUEUE::PutOnQueue, une nouvelle fonction était appelée. En inspectant cette nouvelle fonction et en plongeant dans son code, nous avons compris qu'elle vérifie les dépassements d'entiers. En d'autres termes, la nouvelle fonction dans le patch a été ajoutée pour vérifier qu'une variable entière restait dans une plage de valeurs attendue.

En approfondissant le code vulnérable dans OSF_SCALL:GetCoalescedBuffer, nous avons remarqué que le bug de dépassement d'entier pouvait conduire à un dépassement de tampon du tas (heap buffer overflow), où les données sont copiées dans un tampon trop petit pour les contenir. Cela permet alors d'écrire des données en dehors des limites du tampon, sur le tas. Exploitée, cette primitive nous mène à une exécution de code à distance !
Un même appel pour vérifier le dépassement d'entier a été ajouté dans d'autres fonctions également :
OSF_CCALL::ProcessResponse OSF_SCALL::GetCoalescedBuffer OSF_CCALL::GetCoalescedBuffer
La vulnérabilité de dépassement d'entier et la fonction qui la prévient existent dans les flux d'exécution côté client et côté serveur.
Toujours en développement, pas de date prévue.