Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
도구/GitHubGitHub/isukasanuj/cve-2026-92744
Privilege EscalationVulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingAuthenticationPapers & ResearchRed Teaming
GitHubisukasanuj/cve-2026-92744

CVE-2026-92744

CVE-2026-92744에 대한 공개 보고서로, 빈 WCF 인증서 검증기를 통해 Delinea Privilege Manager Windows 에이전트에서 발생하는 인증 없는 RCE에 관한 근본 원인 분석과 재현 내용을 다룹니다.

23일 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
저장소 보기

Delinea Privilege Manager 에이전트 — 인증되지 않은 원격 코드 실행

CVE-2026-92744 · 공개 보고서 株式会社CyberCrew (CyberCrew Inc.)

필드값
CVE IDCVE-2026-92744 (CNA: Delinea, Inc.)
제목Delinea Privilege Manager 에이전트 인증되지 않은 원격 코드 실행 취약점
분류CWE-306 중요 기능에 대한 인증 누락 (주요); CWE-295 부적절한 인증서 검증 (메커니즘)
영향받는 버전Privilege Manager Windows Core 에이전트 10.1.0 → 12.0.5796 및 13.0.0 → 13.0.1058
수정된 버전에이전트 12.0.5804 (v12) 및 13.0.2064 (v13); Privilege Manager 13.0.2와 함께 2026년 10월 28일 배포
공개된 CVSS8.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.)
상태2026년 9월 14일 보고 · 벤더에 의해 수정, 공개 및 연구자 크레딧 적용됨 — 종료

1. 요약

Privilege Manager Windows 에이전트는 TCP 5593에서 모든 인터페이스에 바인딩된 WCF 듀플렉스 콜백 엔드포인트를 노출하며, 설치 프로그램이 Domain, Private 및 Public 프로필에 대해 인바운드 방화벽 규칙을 엽니다. 이 엔드포인트는 명목상 클라이언트 인증서를 요구하지만, 이를 검사해야 할 검증기인 AmsServerCertValidator.Validate()는 본문이 비어 있으며, 계약은 ProtectionLevel.None을 선언하여 메시지 계층 서명을 제거합니다. 그 결과, 계약의 모든 작업은 호출자가 몇 초 전에 생성한 인증서를 제시하더라도 이를 수락합니다.

이 중 두 작업이 연쇄되어 완전한 침해로 이어집니다:

  • OnRegistrationComplete는 공격자가 제공한 인증서를 LocalMachine\Ams에 기록하며 — 이는 에이전트가 정책 서명을 검증하는 데 사용하는 저장소입니다 — 정당한 인증서를 제거합니다.
  • OnClientTaskQueued는 에이전트가 구성된 서버에서 명령을 가져와 PowerShell 런스페이스에서 nt authority\system으로, ExecutionPolicy.Bypass가 명시적으로 설정된 상태로 실행하도록 유도합니다.

전체 체인은 2026년 9월 12일 Windows Sandbox(Windows 11 빌드 26200)의 깨끗한 기본 설치 환경에서 처음부터 끝까지 재현되었으며, nt authority\system 실행 증명이 캡처되었습니다. 자격 증명, 사전 로컬 접근 권한 또는 사용자 상호작용이 필요하지 않았습니다.

이 제품의 목적 자체가 어떤 프로세스가 승격되어 실행될 수 있는지를 결정하는 것이므로, 이는 단순히 호스트에서의 코드 실행이 아니라 보안 결정 자체에 대한 통제입니다.

이 발견은 2026년 9월 14일 Delinea에 보고되었고, 2026년 10월 28일 릴리스에서 수정되었으며, CVE-2026-92744가 할당되었습니다(2026년 10월 29일 공개). 크레딧 요청에 따라 Delinea는 합의된 연구자 감사의 말을 공개 기록에 추가했습니다. 이 공개는 이제 종료되었습니다. §8–§10을 참조하십시오.


2. 영향받는 버전 및 수정된 버전

제품영향받는 버전수정된 버전
Privilege Manager Windows Core 에이전트 (v12)10.1.0 → 12.0.579612.0.5804
Privilege Manager Windows Core 에이전트 (v13)13.0.0 → 13.0.105813.0.2064

수정 사항은 2026년 10월 28일 Privilege Manager 13.0.2와 함께 배포되었습니다. 즉시 업그레이드할 수 없는 고객을 위해 Delinea가 문서화한 완화 조치는 인바운드 TCP 5593 차단입니다(기능 손실이 없다고 명시되어 있으며, 에이전트는 일정에 따라 서버에서 업데이트를 가져오는 방식으로 대체됩니다).


3. 기술 분석

3.1 노출된 엔드포인트 및 공격 표면

에이전트는 System으로 실행되며 모든 인터페이스에서 콜백 리스너를 호스팅하고, 설치 프로그램이 생성한 방화벽 규칙은 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)를 제시합니다.

3.2 근본 원인: 빈 인증서 검증기

빈 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();

3.3 콜백 계약

[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).

3.4 신뢰 저장소 탈취 (OnRegistrationComplete)

등록 완료 시 에이전트는 서버 응답에 포함된 모든 인증서를 수집하여 체인 빌드도, 피닝도, 이전에 알려진 인증서와의 비교도 없이 Ams 저장소에 저장합니다:

foreach (string serverCertificate in platformDetails.ServerCertificates)
{
    byte[] raw = Convert.FromBase64String(serverCertificate);
    ICertificate2 certificate2 = _cert2Factory.Create(raw);
    list.Add(certificate2);
}
_certMgr.SaveServerCertificates(list);

유일한 catch는 잘못된 형식의 base64만 처리합니다. SaveServerCertificates는 LocalMachine\Ams를 읽기-쓰기로 열고, 공격자의 목록에 없는 모든 인증서를 제거한 뒤 공격자의 인증서를 추가합니다. 별도의 깨끗한 설치 환경에서 두 번 재현됨:

[16:21:46] LocalMachine\Ams before: 0 cert(s):
[16:21:52] attacker cert: 13E298FDE814B0B34B1BBB83631BF54276FCF2FC CN=attacker.invalid
[16:21:53] --- INVOKING OnRegistrationComplete with our certificate ---
[16:21:54]   call returned without exception
[16:22:06] LocalMachine\Ams after: 1 cert(s): 13E298FDE814B0B34B1BBB83631BF54276FCF2FC

삽입된 인증서는 자체 서명되었으며, CN=attacker.invalid이고 호출 몇 초 전에 생성되었으며, 에이전트, 해당 서버 또는 신뢰할 수 있는 어떤 CA와도 관계가 없습니다. 이로 인해 공격자가 에이전트가 정책상 신뢰할 서명의 권한자가 되며, 이것이 다음 단계에서 RequireSignedClientItems를 무력화하는 원인입니다.

3.5 코드 실행 프리미티브 (OnClientTaskQueued → AgentController.RunTask)

런타임에 임의로 만들어낸 CommandId GUID로 작업을 큐에 넣으면, 에이전트가 구성된 서버에서 해당 명령을 가져오도록 유도됩니다. 이 GUID는 어떤 데이터베이스, 구성 파일, 파일에도 존재하지 않습니다. 에이전트가 이를 알 수 있는 유일한 방법은 인증되지 않은 호출뿐입니다:

[18:03:10] --- calling OnClientTaskQueued (unauthenticated) ---
[18:03:12]   call returned without exception
[18:03:22]   MARKER SEEN after 10s

리스너에서 관찰된 요청 시퀀스:

18:03:10  POST /TMS/Agent/AgentRegistration4.svc
18:03:17  POST /TMS/Agent/AgentRegistration4.svc
18:03:17  POST /TMS/Agent/ClientItems2.svc      <- went to fetch the command
18:03:22  POST /TMS/Agent/AgentRegistration4.svc <- reported the result

AgentController.RunTask의 실행 프리미티브 — 에이전트가 보고한 예외는 표시된 줄에서 발생하며, 바로 뒤의 문장들이 PowerShell runspace를 구성합니다:

if (!ClientItemManager.RegisterInterest(taskInstance.CommandId))
    ClientItemManager.RefreshClientItems();
clientItem = ClientItemManager.GetRawClientItem(taskInstance.CommandId);
...
if (clientItem == null)
    throw new Exception($"Failed to get ClientCommand {taskInstance.CommandId}");   // <-- reached here

RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create();
Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);
runspace.Open();
...
runspaceDispatcher.SetExecutionPolicy(ExecutionPolicy.Bypass, ExecutionPolicyScope.Process);
runspaceDispatcher.ImportModule("Arellia.Agent");
...
AgentPowershellScriptContract agentPowershellScriptContract =
    (AgentPowershellScriptContract)clientItem.InnerContract;
pSCommand.AddScript(agentPowershellScriptContract.Script);
도구 다운로드