Skip to main content
cd ../config-traps
risk/register/sid-history-attribute-the-post-migration-escalation-path.html
Active Directory Trust Securityhigh severityActive Directory

SID History Attribute: The Post-Migration Escalation Path

Severity
high
Reviewed
14 Jul 2026
Remediation
~20 minutes
Overview

A migrated Active Directory account can carry forward its old domain's privileged group SIDs long after the source domain is decommissioned. Kerberos still honours those SIDs inside the PAC, and neither group membership reviews nor standard trust audits reliably catch it.

Operational summary

At a glance

Symptom
A migrated account authenticates and its Kerberos PAC includes a retained privileged SID from the decommissioned source domain.
Likely cause
ADMT migrations write sIDHistory to target accounts while trusts remain without SID filtering enforced.
Impact
Compromised or migrated accounts inherit source-domain privileged group rights invisibly, bypassing target-domain group membership reviews entirely.
Verification signal
Re-run the detection test and a controlled negative-path test.
Safe correction
Enforce SID filtering with netdom quarantine on all trusts and clear sIDHistory once the migration coexistence window ends.
Rollback or recovery
Restore the exported configuration if the new control blocks required production traffic, then narrow the policy before redeployment.

The Trap

The sIDHistory attribute retained on user and computer objects after an ADMT (Active Directory Migration Tool) migration, with no SID filtering enforced on the trust used to carry out the move.

The Default State

The standard ADMT migration wizard ships with “migrate objects’ SIDs to target domain” enabled, which writes the source domain’s account SID into sIDHistory on the target object so existing resource ACLs keep working during coexistence. Trusts built for the migration, whether temporary forest trusts or long-lived two-way trusts, are frequently created with netdom trust and left without the /quarantine:yes flag, so SID filtering is never applied. Intra-forest domain consolidations are worse still: SID filtering only operates at a trust boundary, so a same-forest migration has no mechanism at all to constrain sIDHistory values once they are written.

The Blast Radius

When a domain controller builds the Kerberos PAC (Privilege Attribute Certificate) for authentication, it includes every SID in sIDHistory alongside current group memberships. A migrated account that shows up as a plain member of Domain Users in the target domain can still authenticate with the authorisation power of Domain Admins or Enterprise Admins from the retired source domain, because that SID never left sIDHistory. Any resource ACL still referencing the old domain’s privileged SID silently grants access. Worse, an attacker who compromises a domain controller or exploits an unfiltered trust can inject arbitrary sIDHistory values (a documented DCSync-adjacent escalation), forging membership in a privileged group that was never granted through normal delegation. Standard BloodHound sweeps and access reviews that walk group membership miss this entirely, because the escalation lives in an attribute nobody re-checks after go-live.

The Lead Mechanic Fix

Audit first: Get-ADUser -Filter {SIDHistory -like '*'} -Properties SIDHistory against every domain that has ever run a migration. Enforce SID filtering on every external and forest trust with netdom trust <TrustingDomain> /domain:<TrustedDomain> /quarantine:yes, which blocks SIDs outside the trusted domain’s namespace at the trust boundary. Intra-forest migrations get no such protection, so treat sIDHistory as a time-boxed migration artefact: clear it with Set-ADUser -Identity <user> -Clear SIDHistory or an ldifde delete once the coexistence window closes, and re-ACL any resource still referencing the legacy domain SID before the attribute is removed, so access no longer depends on it at all.

03

Apply the safer control

Before you change production

Confirm the affected scope, export the current configuration, and test the replacement control in a non-production environment first.

Fix commands and configuration

Get-ADUser -Filter {SIDHistory -like '*'} -Properties SIDHistory
netdom trust <TrustingDomain> /domain:<TrustedDomain> /quarantine:yes
Set-ADUser -Identity <user> -Clear SIDHistory
04

Verify, roll back or escalate

Verify

Re-run the detection test and a controlled negative-path test. Confirm the unsafe behaviour is blocked while approved traffic still succeeds.

Rollback

Restore the exported configuration if the new control blocks required production traffic, then narrow the policy before redeployment.

Escalate

Escalate when the blast radius is uncertain, the control cannot be tested safely, or remediation requires an outage or security exception.

After remediation

Further reading stays below the corrective workflow and is selected by platform, category and shared technical keywords.

Discover more

Connected KBY resources