IDENTITY SECURITY

Two Active Directory Bugs Turn Write Access on One Account into Domain Admin

KerberLoss hides a duplicate service principal name behind invisible Unicode and breaks Kerberos authentication for any service an attacker picks. ResetNightmare walks a username collision through the Kerberos change-password protocol and comes out the other side as Domain Admin.

Matt Lucas  |  August 6, 2026  |  7 min
Editorial hero illustration
CVEs in this postCVE-2021-42282CVE-2026-25177CVE-2026-27912Live detections →All RedEye CVEs →
2
CVEs, both rated Important
1
Object you need write access to
464
The port that skips validation
0
Admin rights required to start
Detected by CaverLive detection for 3 CVEs in the RedEye Intel Feed →
TL;DR

What: Semperis researcher Shai Laron found two Active Directory flaws. KerberLoss (CVE-2026-25177, patched March 10) smuggles a duplicate service principal name past Active Directory's uniqueness check using Unicode characters that are invisible in every management GUI, letting an attacker capture service tickets and break authentication to a service of their choosing. ResetNightmare (CVE-2026-27912, patched April 14) chains a username collision, a ticket request, and the Kerberos change-password protocol into an instant promotion from ordinary user to Domain Admin. Neither needs administrative privilege to begin. Both need write access to exactly one object.

Most privilege escalation research assumes you already have a foothold worth something. These two do not. The entry requirement for both is a permission that gets handed out casually and audited almost never: write access over a single user or computer object. A helpdesk delegation, a stale service account with rights it kept after a project ended, a group that once needed to rename machines. That is the whole starting position.

KerberLoss: the uniqueness check that could not see

Active Directory has enforced service principal name uniqueness since the fix for CVE-2021-42282. Register an SPN that already exists elsewhere and the write is refused, because a duplicate lets you intercept tickets meant for someone else.

Laron found that the check and the lookup disagree about what a string is. Insert a zero-width character, U+200C ZERO WIDTH NON-JOINER for instance, into the SPN you are registering. The uniqueness check treats your value as different from the existing one, so the write succeeds. The LDAP server, resolving the name later, ignores that class of character entirely and hands back your object instead.

From there the KDC does exactly what it is supposed to do with a matching SPN: it issues service tickets encrypted with the key of the account that owns it, which is now the attacker's. The real service receives tickets it cannot decrypt. Authentication to it fails, for everyone, until someone works out why.

The character does not render. Not in Active Directory Users and Computers, not in the attribute editor, not in a PowerShell console. An administrator comparing the malicious SPN against the legitimate one sees two identical strings and a service that will not authenticate.

Why this reads as a denial of service and not a downgrade

The practical effect is that a chosen service stops working, domain-wide, and the cause is invisible to normal inspection. Against a domain controller service, a certificate authority, or the SQL instance behind a production application, that is an outage with no obvious root cause and no error message pointing at the real problem.

ResetNightmare: the 2021 fix only covered one door

The 2021 patch for CVE-2021-42282 added a field called PAC_REQUESTOR_SID to Kerberos tickets. Its job is to record who actually asked for the ticket, so that a ticket bearing an administrator's name but issued to somebody else can be caught and rejected during a service ticket request.

ResetNightmare is four steps:

  1. With write access over any user object, set that object's userPrincipalName to match a Domain Admin's sAMAccountName.
  2. Request a ticket-granting ticket using the NT-ENTERPRISE name type, presenting the admin's name and your own credentials. The domain controller issues a TGT carrying the admin's name, with your SID recorded in PAC_REQUESTOR_SID, exactly as the 2021 fix intended.
  3. Use that ticket against the Kerberos Change Password protocol on port 464 to reset the real Domain Admin's password. This is the flaw: the change-password path processes the request without performing the PAC_REQUESTOR_SID validation that a service ticket request would have performed. The name on the ticket is enough.
  4. Request a fresh TGT as the genuine Domain Admin, using the password you just set.

The 2021 fix was real. It was applied to the door everyone was watching. RFC 3244 password changes went through a different door, and that one was never checked.

One precondition worth knowing, because it is the only thing standing between an attacker and a five-minute domain takeover: the target account's password must be older than the domain's minimum password age, which defaults to one day.

Both are rated Important. Read that carefully.

Microsoft classified both as Important rather than Critical, and both are elevation of privilege rather than remote code execution. That rating describes the mechanism, not the outcome. The outcome of ResetNightmare is Domain Admin, from a starting position that thousands of organisations have handed out to a helpdesk group and forgotten about. If your patch prioritisation is driven by severity labels alone, these two are the argument against that policy.

Do this week

How to hunt it

Both attacks are visible in directory-object modification auditing, if it is turned on. The events that matter:

The zero-width check is the one to build first. It is cheap, it is specific, and it catches the primitive rather than the exploit, which means it still works when someone finds the next way to use the same trick.

Detection content

We publish Sigma rules for both, free, in the RedEye Intel Feed: STIX 2.1 over TAXII 2.1, subscribable from any TIP. CVE-2026-25177 covers the zero-width SPN write. CVE-2026-27912 covers the UPN write and the privileged-reset tail. Both carry the field lists and the false-positive notes, because a rule without its tuning notes is someone else's alert fatigue.

Both rules are complete and deployable: selectors, field lists, and the tuning notes, because a rule without its false-positive guidance is somebody else's alert fatigue. They target the domain controller Security channel, so point them at a lake that carries 5136, 4724 and 4768 and they run as written. Our own demo lake holds network and host telemetry rather than directory events, which changes nothing about the rules and everything about what we can demo on our own data.

The platform side of this is Caver, and the honest version of the pitch is unglamorous: this hunt needs directory-object auditing retained long enough to look backwards through, because the SPN write that starts KerberLoss may predate the outage it causes by weeks. Retention is the whole game, and retention is a cost problem before it is a detection problem.

Credit

Both vulnerabilities were found and disclosed by Shai Laron at Semperis, reported to MSRC in November and December 2025 and patched in March and April 2026. Their full write-up carries the protocol detail this summary compresses, including the SPN lookup ordering and the exact LDAP filter behaviour, and is worth reading in the original.

Questions about your exposure?

RedEye Security provides assessments for organizations that need to understand their real risk.

Talk to us