
Analyse de divulgation pour CVE-2026-92744, une RCE non authentifiée dans l'agent Windows de Delinea Privilege Manager via un validateur de certificat WCF vide, avec analyse de la cause racine et reproduction.
CVE-2026-92744 · note de divulgation 株式会社CyberCrew (CyberCrew Inc.)
| Champ | Valeur |
|---|---|
| ID CVE | CVE-2026-92744 (CNA : Delinea, Inc.) |
| Titre | Vulnérabilité d'exécution de code à distance non authentifiée de l'agent Delinea Privilege Manager |
| Classe | CWE-306 Authentification manquante pour une fonction critique (principale) ; CWE-295 Validation de certificat incorrecte (mécanisme) |
| Affecté | Agent Privilege Manager Windows Core 10.1.0 → 12.0.5796 et 13.0.0 → 13.0.1058 |
| Corrigé dans | Agent 12.0.5804 (v12) et 13.0.2064 (v13) ; livré avec Privilege Manager 13.0.2, 28 oct. 2026 |
| CVSS publié | 8.7 Élevé (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 |
| Notre évaluation | 9.8 Critique (réseau, déduit) / 7.8 Élevé (local, démontré) — voir §6 |
| Chercheurs | Isuka Sanuj (responsable) · Ishan Nim (contributeur) — tous deux 株式会社CyberCrew |
| Dossier fournisseur | #01416021 (associé : 01418441) |
| Build testé | 13.0.1041.338 (PMAgents_13_0_1041.exe), SHA-256 9ED7660B9D994620B3ECADC524EB10122C42E3A932CCFD2988F16A5D76FF0457, Authenticode valide (CN=Delinea Inc.) |
| Statut | Signalé le 14 sept. 2026 · corrigé, publié et crédit chercheur appliqué par le fournisseur — clos |
L'agent Privilege Manager Windows expose un point de terminaison de rappel duplex WCF sur TCP 5593, lié à toutes les interfaces, avec une règle de pare-feu entrante que l'installateur ouvre pour les profils Domaine, Privé et Public. Le point de terminaison exige nominalement un certificat client, mais le validateur censé le vérifier — AmsServerCertValidator.Validate() — a un corps vide, et le contrat déclare ProtectionLevel.None, supprimant la signature au niveau du message. L'effet net est que chaque opération du contrat accepte un appelant présentant un certificat qu'il a généré quelques secondes plus tôt.
Deux de ces opérations s'enchaînent pour aboutir à une compromission totale :
OnRegistrationComplete écrit des certificats fournis par l'attaquant dans LocalMachine\Ams — le magasin que l'agent utilise pour vérifier les signatures de stratégie — et supprime les certificats légitimes.OnClientTaskQueued pousse l'agent à récupérer une commande depuis son serveur configuré et à l'exécuter dans un espace d'exécution PowerShell en tant que nt authority\system, avec ExecutionPolicy.Bypass explicitement défini.La chaîne complète a été reproduite de bout en bout sur une installation par défaut propre dans Windows Sandbox (Windows 11 build 26200) le 12 sept. 2026, produisant une preuve d'exécution capturée en nt authority\system. Aucun identifiant, accès local préalable ni interaction utilisateur n'étaient requis.
Comme la raison d'être même du produit est de décider quels processus peuvent s'exécuter avec élévation, il ne s'agit pas simplement d'une exécution de code sur un hôte — c'est le contrôle de la décision de sécurité elle-même.
La découverte a été signalée à Delinea le 14 sept. 2026, corrigée dans la version du 28 oct. 2026 et associée à CVE-2026-92744 (publiée le 29 oct. 2026). À la suite d'une demande de crédit, Delinea a ajouté la reconnaissance du chercheur convenue à l'enregistrement public. La divulgation est désormais close. Voir §8–§10.
| Produit | Affecté | Corrigé |
|---|---|---|
| Agent Privilege Manager Windows Core (v12) | 10.1.0 → 12.0.5796 | 12.0.5804 |
| Agent Privilege Manager Windows Core (v13) | 13.0.0 → 13.0.1058 | 13.0.2064 |
Le correctif a été livré avec Privilege Manager 13.0.2 le 28 oct. 2026. Pour les clients qui ne peuvent pas mettre à niveau immédiatement, l'atténuation documentée par Delinea consiste à bloquer le TCP 5593 entrant (présentée comme n'entraînant aucune perte de fonctionnalité ; les agents reviennent à la récupération des mises à jour depuis le serveur selon une planification).
L'agent s'exécute en tant que System et héberge l'écouteur de rappel sur toutes les interfaces, la règle de pare-feu créée par l'installateur couvrant le profil 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 configuration testée était celle par défaut de l'installateur, intacte — rien n'a été affaibli :
HKLM\SOFTWARE\Policies\Arellia\AMS
BaseUrl = https://localhost/TMS/
InstallCode = testinstallcode
BaseUrlOverride = https://localhost/TMS/
ValidateServerCertificate et ValidateCertChain sont tous deux absents (valeur par défaut installée). Le point de terminaison présente un certificat auto-signé nommé d'après l'hôte (CN=7D20AF86-E474-4).
Une seule classe de validateur avec une méthode Validate() vide régit trois décisions de confiance :
internal class AmsServerCertValidator : X509CertificateValidator
{
public override void Validate(X509Certificate2 certificate)
{
}
}
| Site | Chemin gouverné |
|---|---|
_serviceHost.Credentials.ClientCertificate.Authentication.CustomCertificateValidator | appelants de rappel entrants |
AgentRegistration2Client.CreateClient(...) | enregistrement sortant |
ClientBaseFactory.CreateClient<ClientItems2Client, ...> | récupération de stratégie sortante |
L'hôte entrant câble ce validateur en tant que mode de validation personnalisé, ce qui remplace la validation de chaîne par défaut de WCF par la méthode vide :
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 supprime la signature des messages, laissant le certificat client comme seule vérification de l'appelant — et cette vérification est la méthode vide ci-dessus. Les quatre opérations déclarées ont été confirmées accessibles par un appelant auto-signé (OnRegistrationComplete, OnClientTaskQueued, OnApplicablePolicyChange, OnBadRegistration — tous accepted=True).
OnRegistrationComplete)À la fin de l'enregistrement, l'agent ingère chaque certificat de la réponse du serveur et l'enregistre dans le magasin Ams sans construction de chaîne, sans épinglage et sans comparaison avec des certificats connus précédemment :
foreach (string serverCertificate in platformDetails.ServerCertificates)
{
byte[] raw = Convert.FromBase64String(serverCertificate);
ICertificate2 certificate2 = _cert2Factory.Create(raw);
list.Add(certificate2);
}
_certMgr.SaveServerCertificates(list);