
Разбор раскрытия CVE-2026-92744 — неаутентифицированного RCE в Windows-агенте Delinea Privilege Manager через пустой валидатор сертификатов WCF, с анализом первопричины и воспроизведением.
CVE-2026-92744 · отчёт о раскрытии 株式会社CyberCrew (CyberCrew Inc.)
| Поле | Значение |
|---|---|
| CVE ID | CVE-2026-92744 (CNA: Delinea, Inc.) |
| Название | Уязвимость неаутентифицированного удалённого выполнения кода в агенте Delinea Privilege Manager |
| Класс | CWE-306 Отсутствие аутентификации для критической функции (основной); CWE-295 Некорректная проверка сертификата (механизм) |
| Затронуто | Privilege Manager Windows Core agent 10.1.0 → 12.0.5796 и 13.0.0 → 13.0.1058 |
| Исправлено в | Agent 12.0.5804 (v12) и 13.0.2064 (v13); поставлено с Privilege Manager 13.0.2, 28 окт. 2026 |
| Опубликованный CVSS | 8.7 High (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 |
| Наша оценка | 9.8 Critical (сетевой, предполагаемый) / 7.8 High (локальный, продемонстрированный) — см. §6 |
| Исследователи | Isuka Sanuj (ведущий) · Ishan Nim (участник) — оба 株式会社CyberCrew |
| Дело у вендора | #01416021 (связанное: 01418441) |
| Тестируемая сборка | 13.0.1041.338 (PMAgents_13_0_1041.exe), SHA-256 9ED7660B9D994620B3ECADC524EB10122C42E3A932CCFD2988F16A5D76FF0457, Authenticode действителен (CN=Delinea Inc.) |
| Статус | Сообщено 14 сен. 2026 · исправлено, опубликовано, и вендор применил указание авторства исследователя — закрыто |
Агент Privilege Manager для Windows предоставляет дуплексную callback-конечную точку WCF на TCP 5593, привязанную ко всем интерфейсам, с правилом входящего брандмауэра, которое установщик открывает для профилей Domain, Private и Public. Конечная точка номинально требует клиентский сертификат, но валидатор, который должен его проверять — AmsServerCertValidator.Validate() — имеет пустое тело, а контракт объявляет ProtectionLevel.None, что убирает подпись на уровне сообщений. Итоговый эффект состоит в том, что каждая операция контракта принимает вызывающего, предъявляющего сертификат, сгенерированный им секундами ранее.
Две из этих операций в совокупности приводят к полной компрометации:
OnRegistrationComplete записывает предоставленные атакующим сертификаты в LocalMachine\Ams — хранилище, которое агент использует для проверки подписей политик — и удаляет легитимные.OnClientTaskQueued заставляет агента получить команду с настроенного сервера и выполнить её в runspace PowerShell от имени nt authority\system, с явно установленным ExecutionPolicy.Bypass.Полная цепочка была воспроизведена от начала до конца на чистой установке по умолчанию в Windows Sandbox (Windows 11 сборка 26200) 12 сен. 2026, с получением зафиксированного доказательства выполнения от имени nt authority\system. Не требовалось ни учётных данных, ни предварительного локального доступа, ни взаимодействия с пользователем.
Поскольку всё назначение продукта — решать, какие процессы могут выполняться с повышенными правами, это не просто выполнение кода на хосте — это контроль над самим решением о безопасности.
Находка была сообщена Delinea 14 сен. 2026, исправлена в выпуске от 28 окт. 2026 и получила идентификатор CVE-2026-92744 (опубликовано 29 окт. 2026). По запросу об указании авторства Delinea добавила согласованное упоминание исследователя в публичную запись. Раскрытие теперь закрыто. См. §8–§10.
| Продукт | Затронуто | Исправлено |
|---|---|---|
| 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 |
Исправление поставлено с Privilege Manager 13.0.2 28 окт. 2026. Для клиентов, которые не могут немедленно обновиться, документированная мера защиты Delinea — блокировать входящий TCP 5593 (указано, что это не приводит к потере функциональности; агенты переходят к получению обновлений с сервера по расписанию).
Агент работает как System и размещает callback-слушатель на всех интерфейсах, при этом созданное установщиком правило брандмауэра охватывает профиль 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
Тестируемая конфигурация была конфигурацией установщика по умолчанию в исходном виде — ничего не было ослаблено:
HKLM\SOFTWARE\Policies\Arellia\AMS
BaseUrl = https://localhost/TMS/
InstallCode = testinstallcode
BaseUrlOverride = https://localhost/TMS/
ValidateServerCertificate и ValidateCertChain оба отсутствуют (установлено значение по умолчанию). Конечная точка предъявляет самоподписанный сертификат, названный по имени хоста (CN=7D20AF86-E474-4).
Единственный класс валидатора с пустым методом Validate() управляет тремя решениями о доверии:
internal class AmsServerCertValidator : X509CertificateValidator
{
public override void Validate(X509Certificate2 certificate)
{
}
}
| Сайт | Управляемый путь |
|---|---|
_serviceHost.Credentials.ClientCertificate.Authentication.CustomCertificateValidator | вызывающие стороны входящего обратного вызова |
AgentRegistration2Client.CreateClient(...) | исходящая регистрация |
ClientBaseFactory.CreateClient<ClientItems2Client, ...> | исходящая выборка политики |
Входящий хост подключает этот валидатор как пользовательский режим проверки, который заменяет стандартную проверку цепочки WCF пустым методом:
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 отключает подпись сообщений, оставляя клиентский сертификат единственной проверкой вызывающей стороны — и эта проверка представляет собой пустой метод выше. Все четыре объявленные операции были подтверждены как доступные для вызывающей стороны с самоподписанным сертификатом (OnRegistrationComplete, OnClientTaskQueued, OnApplicablePolicyChange, OnBadRegistration — все accepted=True).
OnRegistrationComplete)При завершении регистрации агент принимает каждый сертификат из ответа сервера и сохраняет его в хранилище Ams без построения цепочки, без pinning и без сравнения с ранее известными сертификатами:
foreach (string serverCertificate in platformDetails.ServerCertificates)
{
byte[] raw = Convert.FromBase64String(serverCertificate);
ICertificate2 certificate2 = _cert2Factory.Create(raw);
list.Add(certificate2);
}
_certMgr.SaveServerCertificates(list);