
Análise de divulgação da CVE-2026-92744, uma RCE não autenticada no agente Windows do Delinea Privilege Manager por meio de um validador de certificado WCF vazio, com análise de causa raiz e reprodução.
CVE-2026-92744 · relatório de divulgação 株式会社CyberCrew (CyberCrew Inc.)
| Campo | Valor |
|---|---|
| ID CVE | CVE-2026-92744 (CNA: Delinea, Inc.) |
| Título | Vulnerabilidade de execução remota de código não autenticada no agente Delinea Privilege Manager |
| Classe | CWE-306 Autenticação Ausente para Função Crítica (principal); CWE-295 Validação de Certificado Imprópria (mecanismo) |
| Afetado | Agente Privilege Manager Windows Core 10.1.0 → 12.0.5796 e 13.0.0 → 13.0.1058 |
| Corrigido em | Agente 12.0.5804 (v12) e 13.0.2064 (v13); distribuído com Privilege Manager 13.0.2, 28 Out 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 |
| Nossa avaliação | 9.8 Crítico (rede, inferido) / 7.8 Alto (local, demonstrado) — ver §6 |
| Pesquisadores | Isuka Sanuj (líder) · Ishan Nim (colaborador) — ambos 株式会社CyberCrew |
| Caso do fornecedor | #01416021 (relacionado: 01418441) |
| Build testado | 13.0.1041.338 (PMAgents_13_0_1041.exe), SHA-256 9ED7660B9D994620B3ECADC524EB10122C42E3A932CCFD2988F16A5D76FF0457, Authenticode válido (CN=Delinea Inc.) |
| Status | Reportado em 14 Set 2026 · corrigido, publicado e crédito ao pesquisador aplicado pelo fornecedor — encerrado |
O agente Privilege Manager Windows expõe um endpoint de callback duplex WCF na TCP 5593, vinculado a todas as interfaces, com uma regra de firewall de entrada que o instalador abre para os perfis Domain, Private e Public. O endpoint nominalmente exige um certificado de cliente, mas o validador que deveria verificá-lo — AmsServerCertValidator.Validate() — tem corpo vazio, e o contrato declara ProtectionLevel.None, removendo a assinatura da camada de mensagem. O efeito líquido é que toda operação no contrato aceita um chamador apresentando um certificado que o próprio chamador gerou segundos antes.
Duas dessas operações encadeiam-se em comprometimento total:
OnRegistrationComplete grava certificados fornecidos pelo atacante em LocalMachine\Ams — o armazenamento que o agente usa para verificar assinaturas de política — e remove os legítimos.OnClientTaskQueued leva o agente a buscar um comando do seu servidor configurado e executá-lo em um runspace PowerShell como nt authority\system, com ExecutionPolicy.Bypass explicitamente definido.A cadeia completa foi reproduzida de ponta a ponta em uma instalação limpa padrão no Windows Sandbox (Windows 11 build 26200) em 12 Set 2026, produzindo uma prova capturada de execução como nt authority\system. Nenhuma credencial, acesso local prévio ou interação do usuário foi necessária.
Como o propósito inteiro do produto é decidir quais processos podem ser executados com elevação, isto não é meramente execução de código em um host — é o controle da própria decisão de segurança.
A descoberta foi reportada à Delinea em 14 Set 2026, corrigida na versão de 28 Out 2026 e atribuída a CVE-2026-92744 (publicada em 29 Out 2026). Após uma solicitação de crédito, a Delinea adicionou ao registro público o reconhecimento acordado ao pesquisador. A divulgação está agora encerrada. Ver §8–§10.
| Produto | Afetado | Corrigido |
|---|---|---|
| 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 |
A correção foi distribuída com o Privilege Manager 13.0.2 em 28 Out 2026. Para clientes que não podem atualizar imediatamente, a mitigação documentada pela Delinea é bloquear a TCP 5593 de entrada (indicada como não causando perda de funcionalidade; os agentes passam a buscar atualizações do servidor em um agendamento).
O agente é executado como System e hospeda o listener de callback em todas as interfaces, com a regra de firewall criada pelo instalador cobrindo o 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
A configuração em teste era o padrão original do instalador — nada foi enfraquecido:
HKLM\SOFTWARE\Policies\Arellia\AMS
BaseUrl = https://localhost/TMS/
InstallCode = testinstallcode
BaseUrlOverride = https://localhost/TMS/
ValidateServerCertificate e ValidateCertChain estão ambos ausentes (padrão da instalação). O endpoint apresenta um certificado autoassinado nomeado para o host (CN=7D20AF86-E474-4).
Uma única classe de validador com um Validate() vazio governa três decisões de confiança:
internal class AmsServerCertValidator : X509CertificateValidator
{
public override void Validate(X509Certificate2 certificate)
{
}
}
| Site | Caminho governado |
|---|---|
_serviceHost.Credentials.ClientCertificate.Authentication.CustomCertificateValidator | chamadores de callback de entrada |
AgentRegistration2Client.CreateClient(...) | registro de saída |
ClientBaseFactory.CreateClient<ClientItems2Client, ...> | busca de política de saída |
O host de entrada conecta esse validador como um modo de validação personalizado, que substitui a validação de cadeia padrão do WCF pelo método vazio:
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 remove a assinatura de mensagens, deixando o certificado do cliente como a única verificação do chamador — e essa verificação é o método vazio acima. Todas as quatro operações declaradas foram confirmadas como alcançáveis por um chamador autoassinado (OnRegistrationComplete, OnClientTaskQueued, OnApplicablePolicyChange, OnBadRegistration — todas accepted=True).
OnRegistrationComplete)Na conclusão do registro, o agente ingere todos os certificados na resposta do servidor e os salva no armazenamento Ams sem construção de cadeia, sem pinning e sem comparação com certificados previamente conhecidos:
foreach (string serverCertificate in platformDetails.ServerCertificates)
{
byte[] raw = Convert.FromBase64String(serverCertificate);
ICertificate2 certificate2 = _cert2Factory.Create(raw);
list.Add(certificate2);
}
_certMgr.SaveServerCertificates(list);
O único catch cobre base64 malformado. SaveServerCertificates abre LocalMachine\Ams em modo leitura-gravação e remove todos os certificados ausentes da lista do atacante antes de adicionar os seus. Reproduzido duas vezes em instalações limpas separadas: