
Exploit de Execução Remota de Código na Biblioteca RPC
CVE-2022-26809 - weakness in a core Windows component (RPC) earned a CVSS score of 9.8 not without a reason, as the attack does not require authentication and can be executed remotely over a network, and can result in remote code execution (RCE) with the privileges of the RPC service, which depends on the process hosting the RPC runtime. That critcal bug, with a bit of luck, allows to gain access to unpatched Windows host running SMB. The vulnerability can be exploited both from outside the network in order to breach it as well as between machines in the network.
A CVE afirmou que as vulnerabilidades estão no runtime RPC do Windows, que é implementado em uma biblioteca chamada rpcrt4.dll. Essa biblioteca de runtime é carregada em processos cliente e servidor que utilizam o protocolo RPC para comunicação. Comparamos as versões 10.0.22000.434 (Março) e 10.0.22000.613 (corrigida) e identificamos uma lista de mudanças.
As funções OSF_SCALL::ProcessResponse e OSF_CCALL::ProcessReceivedPDU são semelhantes em natureza; ambas processam pacotes RPC, mas uma é executada no lado do servidor e a outra no lado do cliente (SCALL e CCALL). Ao fazer diffing de OSF_SCALL::ProcessReceivedPDU, notamos dois blocos de código que foram adicionados na nova versão.


Olhando para o código corrigido, vimos que após QUEUE::PutOnQueue uma nova função era chamada. Inspecionando a nova função e mergulhando em seu código, descobrimos que ela verifica estouros de inteiros. Em outras palavras, a nova função no patch foi adicionada para verificar se uma variável inteira permanecia dentro de uma faixa de valores esperada.

Aprofundando no código vulnerável em OSF_SCALL:GetCoalescedBuffer, notamos que o bug de estouro de inteiro poderia levar a um estouro de buffer no heap, onde dados são copiados para um buffer muito pequeno para armazená-los. Isso, por sua vez, permite que dados sejam escritos fora dos limites do buffer, no heap. Quando explorado, esse primitivo nos leva à execução remota de código!
A mesma chamada para verificar estouro de inteiro foi adicionada em outras funções também:
OSF_CCALL::ProcessResponse OSF_SCALL::GetCoalescedBuffer OSF_CCALL::GetCoalescedBuffer
A vulnerabilidade de estouro de inteiro e a função que a previne existem em ambos os fluxos de execução do lado do cliente e do servidor.
Ainda em desenvolvimento, sem previsão.