
Análisis de divulgación de CVE-2026-92744, una RCE no autenticada en el agente de Windows de Delinea Privilege Manager mediante un validador de certificados WCF vacío, con análisis de causa raíz y reproducción.
CVE-2026-92744 · informe de divulgación 株式会社CyberCrew (CyberCrew Inc.)
| Campo | Valor |
|---|---|
| ID de CVE | CVE-2026-92744 (CNA: Delinea, Inc.) |
| Título | Vulnerabilidad de ejecución remota de código no autenticada en el agente de Delinea Privilege Manager |
| Clase | CWE-306 Autenticación faltante para función crítica (principal); CWE-295 Validación de certificado incorrecta (mecanismo) |
| Afectados | Agente Privilege Manager Windows Core 10.1.0 → 12.0.5796 y 13.0.0 → 13.0.1058 |
| Corregido en | Agente 12.0.5804 (v12) y 13.0.2064 (v13); distribuido con Privilege Manager 13.0.2, 28 oct 2026 |
| CVSS publicado | 8.7 Alto (CVSS 4.0) — CVSS:4.0/AV:N/AC:H/AT:P/PR:H/UI:A/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H |
| Nuestra evaluación | 9.8 Crítico (red, inferido) / 7.8 Alto (local, demostrado) — véase §6 |
| Investigadores | Isuka Sanuj (líder) · Ishan Nim (colaborador) — ambos de 株式会社CyberCrew |
| Caso del proveedor | #01416021 (relacionado: 01418441) |
| Compilación probada | 13.0.1041.338 (PMAgents_13_0_1041.exe), SHA-256 9ED7660B9D994620B3ECADC524EB10122C42E3A932CCFD2988F16A5D76FF0457, Authenticode válido (CN=Delinea Inc.) |
| Estado | Reportado el 14 sep 2026 · corregido, publicado y crédito al investigador aplicado por el proveedor — cerrado |
El agente de Privilege Manager para Windows expone un endpoint de callback dúplex WCF en TCP 5593, enlazado a todas las interfaces, con una regla de firewall de entrada que el instalador abre para los perfiles Domain, Private y Public. El endpoint requiere nominalmente un certificado de cliente, pero el validador que se supone debe comprobarlo — AmsServerCertValidator.Validate() — tiene un cuerpo vacío, y el contrato declara ProtectionLevel.None, eliminando la firma de la capa de mensaje. El efecto neto es que toda operación del contrato acepta a un llamador que presente un certificado generado por él mismo segundos antes.
Dos de esas operaciones se encadenan hasta el compromiso total:
OnRegistrationComplete escribe certificados proporcionados por el atacante en LocalMachine\Ams — el almacén que el agente usa para verificar las firmas de políticas — y elimina los legítimos.OnClientTaskQueued impulsa al agente a obtener un comando de su servidor configurado y ejecutarlo en un espacio de ejecución de PowerShell como nt authority\system, con ExecutionPolicy.Bypass establecido explícitamente.La cadena completa se reprodujo de extremo a extremo en una instalación limpia por defecto en Windows Sandbox (Windows 11 compilación 26200) el 12 sep 2026, produciendo una prueba de ejecución capturada como nt authority\system. No se requirieron credenciales, acceso local previo ni interacción del usuario.
Dado que el propósito entero del producto es decidir qué procesos pueden ejecutarse con privilegios elevados, esto no es meramente ejecución de código en un host — es el control de la propia decisión de seguridad.
El hallazgo se reportó a Delinea el 14 sep 2026, se corrigió en la versión del 28 oct 2026 y se le asignó CVE-2026-92744 (publicado el 29 oct 2026). Tras una solicitud de crédito, Delinea añadió al registro público el reconocimiento acordado a los investigadores. La divulgación está ahora cerrada. Véanse §8–§10.
| Producto | Afectadas | Corregidas |
|---|---|---|
| Agente Privilege Manager Windows Core (v12) | 10.1.0 → 12.0.5796 | 12.0.5804 |
| Agente Privilege Manager Windows Core (v13) | 13.0.0 → 13.0.1058 | 13.0.2064 |
La corrección se distribuyó con Privilege Manager 13.0.2 el 28 oct 2026. Para los clientes que no puedan actualizar de inmediato, la mitigación documentada por Delinea es bloquear el TCP 5593 entrante (se indica que no causa pérdida de funcionalidad; los agentes recurren a obtener actualizaciones del servidor según una programación).
El agente se ejecuta como System y aloja el listener de callback en todas las interfaces, con la regla de firewall creada por el instalador que cubre el perfil Public:
--- listeners ---
:::5593 pid=4 proc=System <- all interfaces (http.sys)
--- firewall ---
[Domain, Private, Public] Arellia Agent (SSTP-In) | dir=Inbound action=Allow port=5593 prog=System
La configuración bajo prueba era la predeterminada del instalador original — no se debilitó nada:
HKLM\SOFTWARE\Policies\Arellia\AMS
BaseUrl = https://localhost/TMS/
InstallCode = testinstallcode
BaseUrlOverride = https://localhost/TMS/
ValidateServerCertificate y ValidateCertChain están ambos ausentes (valor predeterminado instalado). El endpoint presenta un certificado autofirmado con el nombre del host (CN=7D20AF86-E474-4).
Una única clase de validador con un Validate() vacío rige tres decisiones de confianza:
internal class AmsServerCertValidator : X509CertificateValidator
{
public override void Validate(X509Certificate2 certificate)
{
}
}
| Sitio | Ruta gobernada |
|---|---|
_serviceHost.Credentials.ClientCertificate.Authentication.CustomCertificateValidator | llamadores de callback entrantes |
AgentRegistration2Client.CreateClient(...) | registro saliente |
ClientBaseFactory.CreateClient<ClientItems2Client, ...> | obtención de políticas saliente |
El host entrante conecta ese validador como un modo de validación personalizado, lo que reemplaza la validación de cadena predeterminada de WCF con el método vacío:
wSHttpBinding.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
wSHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
wSHttpBinding.Security.Message.EstablishSecurityContext = false;
...
_serviceHost.Credentials.ClientCertificate.Authentication.CertificateValidationMode
= X509CertificateValidationMode.Custom;
_serviceHost.Credentials.ClientCertificate.Authentication.CustomCertificateValidator
= new AmsServerCertValidator();
[ServiceContract(Namespace = "http://schemas.arellia.com/agent/services/",
Name = "IAgentRegistration",
SessionMode = SessionMode.NotAllowed,
ProtectionLevel = ProtectionLevel.None)]
public interface IAgentRegistrationCallback
{
void OnRegistrationComplete(PlatformRegistration platformDetails);
void OnApplicablePolicyChange(ClientItemDigest[] applicablePolicyDigests);
void OnClientTaskQueued(PendingTaskExecutionInstance[] pendingTasks);
void OnBadRegistration(Guid suggestedNewId);
}
ProtectionLevel.None elimina la firma de mensajes, dejando el certificado de cliente como la única verificación del llamante — y esa verificación es el método vacío anterior. Se confirmó que las cuatro operaciones declaradas eran accesibles por un llamante autofirmado (OnRegistrationComplete, OnClientTaskQueued, OnApplicablePolicyChange, OnBadRegistration — todas accepted=True).
OnRegistrationComplete)Al completarse el registro, el agente ingiere cada certificado en la respuesta del servidor y lo guarda en el almacén Ams sin construcción de cadena, sin pinning y sin comparación con certificados previamente conocidos:
foreach (string serverCertificate in platformDetails.ServerCertificates)
{
byte[] raw = Convert.FromBase64String(serverCertificate);
ICertificate2 certificate2 = _cert2Factory.Create(raw);
list.Add(certificate2);
}
_certMgr.SaveServerCertificates(list);