Project Zero detalla como escalar privilegios en Windows con un registro COM colgante
CVE-2026-66804 es un arreglo incompleto: la clase CrossDevice apunta a un DLL inexistente en una ruta escribible por cualquier usuario y permite cargar codigo como SYSTEM.

Un objeto COM registrado en Windows apunta a un DLL que no existe. Esa es toda la vulnerabilidad. Microsoft la ha corregido en CVE-2026-66804, y Project Zero cuenta ahora con detalle como se explotaba: basta con colocar un DLL propio en una ruta que cualquier usuario puede crear para que un proceso con privilegios lo cargue y ejecute codigo como SYSTEM.
El fallo es en realidad un arreglo incompleto de CVE-2026-50343, al que Calif puso el nombre de "Dark Elevator". Aquel se aprovechaba de permisos flojos en una clave del registro para registrar la clase como plugin de instalacion y conseguir que InstallService la cargara en memoria. Cuando Microsoft cerro esa via, el origen del problema se quedo sin tocar.
El registro colgante
La clase CrossDevice, con CLSID {E9F83CF2-E0C0-4CA7-AF01-E90C70BEF496}, esta registrada en la clave de clases del sistema: la ve cualquier usuario y tambien los servicios. Su servidor in-process deberia ser %PROGRAMDATA%\CrossDevice\CrossDevice.Streaming.Source.dll. El caso es que ese archivo no esta. Y la ruta cae dentro de C:\ProgramData, un directorio donde cualquier usuario local puede crear carpetas. Dejar ahi un DLL con el nombre esperado basta para que la clase quede lista para instanciarse.
Lo que faltaba era el como: llevar ese DLL hasta un proceso privilegiado. La respuesta vuelve a ser el custom marshaling de COM. Cuando se pasa un objeto COM como parametro a un metodo fuera de proceso, el runtime lo serializa en una estructura OBJREF. Si el objeto implementa IMarshal, puede elegir por valor el CLSID que se usara al deserializar, y ese CLSID no tiene por que coincidir con el objeto enviado. Basta devolver el CLSID colgante desde GetUnmarshalClass para que el servicio de destino cargue el DLL.
Microsoft lleva desde Windows 8 con una mitigacion: EOAC_NO_CUSTOM_MARSHAL al llamar a CoInitializeSecurity, y despues COMGLB_UNMARSHALING_POLICY_STRONG a traves de IGlobalOptions. Los flags viven en combase!gCapabilities y combase!g_GLBOPT_UnmarshalingPolicy, asi que se pueden leer en caliente para buscar que servicios no las aplican.
El autor encontro uno: Shell Create Object Handler, CLSID 135fd325-45b7-4c30-89f8-4386961669f0, que corre como nt authority\system y no activa la mitigacion. Tiene la particularidad de no ser instanciable de forma directa, lo que lo hace menos obvio. El codigo de la tecnica esta en el repositorio de califio.
Que implica
Para quien administra parques Windows el aviso es doble: aplicar el parche de CVE-2026-66804 y asumir que las mitigaciones de custom marshaling no estan activas en todos los servicios privilegiados del sistema. Un registro COM que apunta a un DLL inexistente en una ruta escribible no es un detalle cosmetico; es una via de elevacion esperando el segundo ingrediente.

