You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Performance degradation when SharpHound attempts to resolve unresolvable SIDs #203
When running SharpHound from a non-domain-joined Windows machine using supplied credentials, if target objects in the domain contain unresolvable SIDs (e.g., due to stale entries from broken two-way trusts), the tool repeatedly attempts to resolve them.
The machine executing SharpHound is not joined to the domain
Some AD objects contain SIDs from a previously trusted domain (e.g., due to removed two-way trust)
unresolvable SID (from a previously trusted domain) was present on many AD objects.
Total object count is large (e.g., 500,000+ objects)
Screenshot
non-domain-joined
domain-joined
Observed Behavior
SharpHound attempts to resolve unknown or external SIDs via DirectoryContext using GetDomain(...)
Each failed resolution logs: System.DirectoryServices.ActiveDirectory.ActiveDirectoryOperationException: Current security context is not associated with an Active Directory domain or forest.
Comparison Results
Scenario
Cache
Execution Time
Domain-joined host
❌ / ✅
13 mins
Non-domain host, same creds
✅
30 mins
Non-domain host, same creds
❌
90 mins
Is it possible to add unresolvable SID cache to avoid repeated requests or disable try get unresolvable SID?
To accurately simulate SharpHound performance degradation caused by unresolved or stale ACL SIDs (typically from removed trusts or deleted users), I suggest the following setup:
✅ Recommended Procedure
Establish a Two-Way Trust Between Domains
Set up a two-ways trust between two domains (e.g., corp.local and lab.local).
Inject Cross-Domain ACL Entries
While the trust is still active, inject a large number of ACLs (~10,000 entries) into objects in lab.local.
Each ACL should grant rights (e.g., GenericAll) to SIDs from corp.local.
Use tools like BadBlood to populate the domain with users, groups, and computers. Then assign ACLs referencing foreign domain users either manually or through scripting.
Break the Trust Relationship
Remove the trust between corp.local and lab.local.
The injected ACLs will remain in lab.local, but their associated SIDs from corp.local will no longer resolve via LDAP, simulating real-world stale SID conditions.
Run SharpHound from an External Machine
From a machine not joined to lab.local, execute SharpHound against the lab.local domain using the DCOnly collection method.
Activity
ktstrader commentedon Jun 27, 2025
Hi @NexKosh! Would you be able to provide steps to reproduce this issue for testing purposes?
NexKosh commentedon Jun 28, 2025
Hi @ktstrader 👋
To accurately simulate SharpHound performance degradation caused by unresolved or stale ACL SIDs (typically from removed trusts or deleted users), I suggest the following setup:
✅ Recommended Procedure
Establish a Two-Way Trust Between Domains
corp.localandlab.local).Inject Cross-Domain ACL Entries
lab.local.GenericAll) to SIDs fromcorp.local.Break the Trust Relationship
corp.localandlab.local.lab.local, but their associated SIDs fromcorp.localwill no longer resolve via LDAP, simulating real-world stale SID conditions.Run SharpHound from an External Machine
lab.local, execute SharpHound against thelab.localdomain using theDCOnlycollection method.fix: Early exit for domains we know are unresolvalbe per #203