
Analisi di divulgazione per CVE-2026-92744, una RCE non autenticata nell'agente Windows di Delinea Privilege Manager tramite un validatore di certificati WCF vuoto, con analisi della causa principale e riproduzione.
CVE-2026-92744 · write-up di divulgazione 株式会社CyberCrew (CyberCrew Inc.)
| Campo | Valore |
|---|---|
| CVE ID | CVE-2026-92744 (CNA: Delinea, Inc.) |
| Titolo | Vulnerabilità di esecuzione di codice remota non autenticata nell'agente Delinea Privilege Manager |
| Classe | CWE-306 Autenticazione mancante per funzione critica (primaria); CWE-295 Validazione non corretta dei certificati (meccanismo) |
| Affetto | Privilege Manager Windows Core agent 10.1.0 → 12.0.5796 e 13.0.0 → 13.0.1058 |
| Corretto in | Agent 12.0.5804 (v12) e 13.0.2064 (v13); distribuito con Privilege Manager 13.0.2, 28 ott 2026 |
| CVSS pubblicato | 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 |
| La nostra valutazione | 9.8 Critico (rete, dedotto) / 7.8 Alto (locale, dimostrato) — vedi §6 |
| Ricercatori | Isuka Sanuj (lead) · Ishan Nim (contributor) — entrambi 株式会社CyberCrew |
| Caso del fornitore | #01416021 (correlato: 01418441) |
| Build testata | 13.0.1041.338 (PMAgents_13_0_1041.exe), SHA-256 9ED7660B9D994620B3ECADC524EB10122C42E3A932CCFD2988F16A5D76FF0457, Authenticode valido (CN=Delinea Inc.) |
| Stato | Segnalato il 14 set 2026 · corretto, pubblicato e riconoscimento ai ricercatori applicato dal fornitore — chiuso |
L'agente Privilege Manager Windows espone un endpoint di callback duplex WCF sulla TCP 5593, associato a tutte le interfacce, con una regola firewall in ingresso che il programma di installazione apre per i profili Dominio, Privato e Pubblico. L'endpoint richiede nominalmente un certificato client, ma il validatore che dovrebbe verificarlo — AmsServerCertValidator.Validate() — ha un corpo vuoto, e il contratto dichiara ProtectionLevel.None, rimuovendo la firma a livello di messaggio. L'effetto netto è che ogni operazione sul contratto accetta un chiamante che presenta un certificato generato dal chiamante stesso pochi secondi prima.
Due di queste operazioni si concatenano in un compromesso completo:
OnRegistrationComplete scrive certificati forniti dall'attaccante in LocalMachine\Ams — l'archivio che l'agente usa per verificare le firme delle policy — e rimuove quelli legittimi.OnClientTaskQueued induce l'agente a recuperare un comando dal server configurato e a eseguirlo in un runspace PowerShell come nt authority\system, con ExecutionPolicy.Bypass impostato esplicitamente.La catena completa è stata riprodotta end-to-end su un'installazione pulita predefinita in Windows Sandbox (Windows 11 build 26200) il 12 set 2026, producendo una prova di esecuzione catturata come nt authority\system. Non sono state richieste credenziali, accesso locale preventivo né interazione dell'utente.
Poiché lo scopo stesso del prodotto è decidere quali processi possono essere eseguiti con privilegi elevati, non si tratta semplicemente di esecuzione di codice su un host — è il controllo della decisione di sicurezza stessa.
La scoperta è stata segnalata a Delinea il 14 set 2026, corretta nella release del 28 ott 2026 e associata a CVE-2026-92744 (pubblicata il 29 ott 2026). A seguito di una richiesta di riconoscimento, Delinea ha aggiunto al registro pubblico il riconoscimento concordato ai ricercatori. La divulgazione è ora chiusa. Vedi §8–§10.
| Prodotto | Affetto | Corretto |
|---|---|---|
| Privilege Manager Windows Core agent (v12) | 10.1.0 → 12.0.5796 | 12.0.5804 |
| Privilege Manager Windows Core agent (v13) | 13.0.0 → 13.0.1058 | 13.0.2064 |
La correzione è stata distribuita con Privilege Manager 13.0.2 il 28 ott 2026. Per i clienti che non possono aggiornare immediatamente, la mitigazione documentata da Delinea consiste nel bloccare la TCP 5593 in ingresso (indicata come priva di perdita di funzionalità; gli agenti tornano a prelevare gli aggiornamenti dal server secondo una pianificazione).
L'agente viene eseguito come System e ospita il listener di callback su tutte le interfacce, con la regola firewall creata dal programma di installazione che copre il profilo Pubblico:
--- 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 configurazione in esame era quella predefinita del programma di installazione, senza alcuna modifica: nulla era stato indebolito:
HKLM\SOFTWARE\Policies\Arellia\AMS
BaseUrl = https://localhost/TMS/
InstallCode = testinstallcode
BaseUrlOverride = https://localhost/TMS/
ValidateServerCertificate e ValidateCertChain sono entrambi assenti (impostazione predefinita installata). L'endpoint presenta un certificato autofirmato intestato all'host (CN=7D20AF86-E474-4).
Una singola classe di validatore con un Validate() vuoto governa tre decisioni di fiducia:
internal class AmsServerCertValidator : X509CertificateValidator
{
public override void Validate(X509Certificate2 certificate)
{
}
}
| Sito | Percorso regolato |
|---|---|
_serviceHost.Credentials.ClientCertificate.Authentication.CustomCertificateValidator | chiamanti di callback in ingresso |
AgentRegistration2Client.CreateClient(...) | registrazione in uscita |
ClientBaseFactory.CreateClient<ClientItems2Client, ...> | recupero policy in uscita |
L'host in ingresso collega quel validatore come modalità di validazione personalizzata, che sostituisce la validazione della catena predefinita di WCF con il metodo vuoto:
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 rimuove la firma dei messaggi, lasciando il certificato client come unico controllo del chiamante — e quel controllo è il metodo vuoto sopra. Tutte e quattro le operazioni dichiarate sono state confermate raggiungibili da un chiamante con certificato autofirmato (OnRegistrationComplete, OnClientTaskQueued, OnApplicablePolicyChange, OnBadRegistration — tutti accepted=True).
OnRegistrationComplete)Al completamento della registrazione l'agente acquisisce ogni certificato nella risposta del server e lo salva nello store Ams senza alcuna costruzione della catena, senza pinning e senza confronto con certificati precedentemente noti:
foreach (string serverCertificate in platformDetails.ServerCertificates)
{
byte[] raw = Convert.FromBase64String(serverCertificate);
ICertificate2 certificate2 = _cert2Factory.Create(raw);
list.Add(certificate2);
}
_certMgr.SaveServerCertificates(list);