NOW Briefing
AD CS(Active Directory Certificate Services, 액티브 디렉터리 인증서 서비스)의 권한 상승 취약점 Certighost(CVE-2026-54121)는 관리자 권한 없는 일반 도메인 계정 하나만으로 도메인 컨트롤러를 사칭할 수 있게 합니다.
krbtgt의 비밀값을 빼내 도메인 전체를 장악할 수 있습니다.
Certighost: 저권한 계정을 통한 AD CS 인가 결함 (CVE-2026-54121)
■ 개요
Certighost는 AD CS의 등록(enrollment) 과정에서 동작하는 폴백(fallback) 로직을 악용하는 취약점입니다. 영향 범위는 AD CS의 Enterprise CA 역할을 올린 Windows Server 2012부터 2025까지(Server Core 포함)와 Windows 10 1607·1809이며, 기본 Machine 템플릿과 취약한 발급 경로를 쓰는 구성이 대상입니다. AD CS는 국내 상당수 엔터프라이즈 도메인에 널리 쓰이는 기본 구성요소여서 공격 표면이 넓습니다.
핵심 위험은 인증 경계의 붕괴입니다. 공격에 성공하면 저권한 사용자가 DC의 신원이 담긴 인증서를 발급받아 그 DC로 인증하고, 이어 DCSync(도메인 컨트롤러 복제 요청을 흉내 내 암호 hash를 빼오는 기법)로 krbtgt 비밀값까지 확보합니다. 별도의 관리자 권한이 필요 없고, 유효한 도메인 계정과 CA까지의 네트워크 도달성만 있으면 됩니다.
전제 조건은 낮지만 파급은 큽니다. Microsoft는 개선된 권한 검증을 적용하고 이를 부적절한 인가(Improper Authorization, CWE-285) 문제로 분류해 2026년 7월 14일 패치했습니다. 5월 14일 연구자 제보, 5월 22일 확인을 거친 정식 대응입니다. 7월 24일에는 동작하는 PoC와 기술 분석이 공개됐습니다. 아직 실제 환경 악용 보고는 없지만, 공개 PoC 존재만으로 방어 우선순위를 높여야 합니다.
■ 요약
| 항목 | 내용 |
|---|---|
| CVE ID | CVE-2026-54121 (Certighost) |
| CVSS 점수 | CVSS v3.1 8.8 / High (AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H) |
| 취약점 유형 | CWE-285: Improper Authorization, AD CS 권한 상승 |
| 영향 |
• 저권한 도메인 사용자의 DC 신원 인증서 발급 • DC 사칭 인증 후 DCSync로 krbtgt 탈취 • 도메인 전체 장악으로 확대 가능 |
| 취약 버전 | Windows Server 2012~2025(Server Core 포함), Windows 10 1607·1809, AD CS Enterprise CA 및 기본 Machine 템플릿 사용 환경 |
| 패치 버전 | 2026년 7월 14일 누적 보안 업데이트(OS별 KB 적용) |
■ 기술 분석
취약점은 등록 과정의 chase 폴백에서 발생합니다. CA가 요청 주체의 신원 정보를 직접 얻지 못할 때, 등록 프로토콜은 요청에 cdc(신원 조회를 보낼 호스트)와 rmd(조회 대상 개체)라는 속성을 담아 CA가 다른 호스트에 대신 물어보도록 허용합니다. 문제는 CA가 이 cdc 값을 요청자가 준 그대로 신뢰했다는 데 있습니다.
패치 전 코드는 요청자가 넣은 cdc 호스트를 검증 없이 따라가 SMB·LDAP로 조회했습니다. 공격자가 세운 가짜 LSA·LDAP 서비스에 CA가 접속해 DC의 신원 데이터를 받아오면, CA는 그 응답을 진짜 디렉터리 데이터처럼 사용해 DC의 objectSid와 dNSHostName을 인증서에 새겨 넣었습니다.
/* [패치 전] _LoadPrincipalObject - cdc를 검증 없이 추적 */
polGetRequestAttribute(policy, L"cdc", &bstrString);
CRequestInstance::_GetDSObject(this, policy, 1, bstrString);
// ^ chase=1 ^ 요청자가 지정한 호스트
이 검증 공백을 막기 위해 패치는 chase를 진행하기 전에 대상이 진짜 DC인지 확인하는 _ValidateChaseTargetIsDC 함수를 추가했습니다. 이 함수는 빈 값, 과도한 길이, IPv4·IPv6 리터럴, LDAP 필터 메타문자를 먼저 걸러낸 뒤 실제 디렉터리에서 해당 호스트명이 DC 계정인지 조회합니다.
/* [패치 후] chase 진행 전 DC 검증 게이트 삽입 */
CRequestInstance::_ValidateChaseTargetIsDC(this, bstrString);
CRequestInstance::_GetDSObject(this, policy, 1, bstrString);
// DC 여부 확인용 LDAP 필터:
// (&(objectCategory=computer)(dNSHostName=%s)
// (userAccountControl:1.2.840.113556.1.4.803:=8192))
검증 필터의 8192는 userAccountControl의 SERVER_TRUST_ACCOUNT 비트로, DC 계정이 갖는 값입니다. 패치된 CA는 cdc로 넘어온 호스트명과 정확히 일치하면서 이 비트가 설정된 컴퓨터 개체가 디렉터리에 단 하나 존재할 때만 chase를 계속합니다. 이후 CA는 해석한 SID를 다시 비교해 개체 치환도 막습니다.
ℹ️ INFO
이 취약점은 CA가 요청자가 준 라우팅 값을 검증하지 않는 데서 비롯합니다. 요청자가 통제하는 라우팅 값(cdc)이 CA의 디렉터리 권한 판단까지 그대로 도달합니다.
패치는 그 값을 "진짜 DC로 등록된 호스트인가"라는 기준으로 확인해 대상 검증을 되살립니다.
■ PoC
공개 exploit은 컴퓨터 계정 생성부터 악성 LSA·LDAP listener 구동, 조작된 요청 제출, 인증서 발급, PKINIT(인증서로 Kerberos 인증을 하는 방식) credential 추출까지 한 번에 자동화합니다. 다만 방어 관점에서 공격의 본질은 인증서 요청에 실리는 두 속성으로 좁혀집니다. cdc를 공격자 호스트로, rmd를 사칭할 DC로 채운 요청 하나가 전체 공격의 출발점입니다.
아래는 그 요청의 골격만 남기고 방어용으로 단순화한 예시입니다. 실제 relay, listener, credential 추출 로직은 제거했습니다.
# 방어용으로 단순화한 예시 - 실제 익스플로잇이 아닙니다.
attrs = {
"cdc": attacker_host, # CA가 신원 조회를 보낼 호스트(공격자 제어)
"rmd": target_dc_fqdn, # 사칭 대상 도메인 컨트롤러
}
# ... 악성 LSA/LDAP 리스너·Netlogon 릴레이·PKINIT 로직 생략 ...
request_certificate(ca, template="Machine", attributes=attrs)
# 발급된 인증서(.pfx)로 대상 DC를 사칭 -> 이후 DCSync로 확대
이 예시는 미검증 cdc 속성 하나가 CA의 신원 판단을 뒤집는다는 근본 원인을 보여주기 위한 것입니다.
⚠️ WARN
공개 PoC는 기본 ms-DS-MachineAccountQuota(일반 사용자가 만들 수 있는 컴퓨터 계정 수, 기본 10)만으로 새 머신 계정을 만들어 악용합니다.
별도 권한 상승 없이 저권한 계정에서 바로 실행 가능한 경로임을 전제로 대응해야 합니다.
■ 탐지 및 점검
• AD CS 인증서 요청·발급 감사 로그를 확인합니다. Event ID 4886, 4887, 4888에서 저권한 사용자가 Machine 템플릿으로 DC 관련 인증서를 요청하거나 발급받은 정황을 우선 확인합니다.
• 인증서 요청 속성에 cdc 또는 rmd 값이 포함된 요청을 별도로 탐지합니다.
• 짧은 시간 동안 새 컴퓨터 계정이 대량 생성되거나, GHOST처럼 임의성이 강한 이름의 컴퓨터 계정이 생성됐는지 확인합니다.
• DC 인증서를 이용한 PKINIT 인증이 평소와 다른 호스트나 시간대에서 발생했는지 확인합니다.
• CA 서버가 외부 또는 비정상 호스트로 445·389 포트 통신을 시도한 흔적이 있는지 네트워크 로그를 점검합니다.
✅ CHECK
패치 적용 여부와 별개로, 위 이벤트를 소급 조회해 7월 14일 이전 발급 이력에 DC 사칭 정황이 없는지 확인해야 합니다.
■ 대응 방안
• AD CS Enterprise CA가 설치된 서버에 2026년 7월 14일 누적 보안 업데이트를 적용합니다. OS 버전별 KB가 다르므로 CA 역할이 설치된 서버 기준으로 패치 여부를 확인합니다.
• 즉시 패치가 어렵다면 chase 폴백을 비활성화합니다. 관리자 권한 PowerShell에서 certutil -setreg policy\EditFlags -EDITF_ENABLECHASECLIENTDC를 실행한 뒤 Restart-Service CertSvc -Force로 서비스를 재시작합니다.
• 해당 설정은 관리자 작업, 이미지 재배포, GPO 등에 의해 다시 활성화될 수 있으므로 변경 관리 항목으로 등록해 지속적으로 확인합니다.
• 일반 사용자가 임의 컴퓨터 계정을 만들지 못하도록 ms-DS-MachineAccountQuota 값을 0으로 조정합니다.
• 운영 적용 전 스테이징(운영 반영 전 검증 환경)에서 인증서 발급 업무 영향도를 검증합니다. 일부 레거시 발급 흐름은 chase 폴백 비활성화로 영향을 받을 수 있습니다.
• 침해가 의심되면 복제 시간을 고려해 krbtgt를 두 차례 재설정하고, DC 사칭에 사용됐을 가능성이 있는 인증서를 폐기·재발급합니다.
💡 TIP
AD CS를 직접 운영하지 않는 일반 독자가 자기 환경에서 이 PoC를 실행당할 표면은 없습니다. 다만 이 사례는 "인증서 발급 경로가 곧 도메인 장악 경로"라는 점을 보여주므로, 자사 AD CS 노출 여부와 템플릿 권한을 점검하는 계기로 삼는 것이 좋습니다.
[참고 자료]
• The Hacker News - Certighost Exploit Lets Low-Privileged Users Seize Windows Domains
• H0j3n - CVE-2026-54121 기술 분석 gist



