
Exploit de ejecución remota de código en la RPC Library
CVE-2022-26809 - una debilidad en un componente central de Windows (RPC) obtuvo una puntuación CVSS de 9.8, no sin razón, ya que el ataque no requiere autenticación y puede ejecutarse de forma remota a través de una red, y puede resultar en ejecución remota de código (RCE) con los privilegios del servicio RPC, que dependen del proceso que aloja el runtime de RPC. Este error crítico, con un poco de suerte, permite obtener acceso a un host Windows sin parchear que ejecute SMB. La vulnerabilidad puede explotarse tanto desde fuera de la red para violarla como entre máquinas dentro de la red.
El CVE indicó que las vulnerabilidades residen en el runtime de RPC de Windows, que se implementa en una biblioteca llamada rpcrt4.dll. Esta biblioteca runtime se carga tanto en procesos cliente como servidor que utilizan el protocolo RPC para la comunicación. Comparamos las versiones 10.0.22000.434 (marzo) y 10.0.22000.613 (parcheada) y seleccionamos una lista de cambios.
Las funciones OSF_SCALL::ProcessResponse y OSF_CCALL::ProcessReceivedPDU son similares en naturaleza; ambas procesan paquetes RPC, pero una se ejecuta en el lado del servidor y la otra en el lado del cliente (SCALL y CCALL). Al hacer diff de OSF_SCALL::ProcessReceivedPDU, notamos dos bloques de código que se agregaron en la nueva versión.


Al observar el código parcheado, vimos que después de QUEUE::PutOnQueue se llamó a una nueva función. Inspeccionándola y sumergiéndonos en su código, dedujimos que verifica desbordamientos de enteros. En otras palabras, la nueva función en el parche se agregó para verificar que una variable entera se mantuviera dentro de un rango de valores esperado.

Al profundizar en el código vulnerable en OSF_SCALL::GetCoalescedBuffer, notamos que el error de desbordamiento de enteros podría provocar un desbordamiento del búfer en el montón, donde los datos se copian en un búfer demasiado pequeño para contenerlos. Esto, a su vez, permite que los datos se escriban fuera de los límites del búfer, en el montón. ¡Cuando se explota, esta primitiva nos lleva a la ejecución remota de código!
Se agregó una misma llamada para verificar desbordamientos de enteros en otras funciones también:
OSF_CCALL::ProcessResponse OSF_SCALL::GetCoalescedBuffer OSF_CCALL::GetCoalescedBuffer
La vulnerabilidad de desbordamiento de enteros y la función que la previene existen tanto en los flujos de ejecución del lado del cliente como del lado del servidor.
Aún en desarrollo, sin fecha estimada.