Sysmon Event ID 10: Process Access — LSASS, GrantedAccess, CallTrace
Published
One process opened a handle to another — Sysmon records which process asked, which process it opened, the access rights it was granted and the call stack that made the request.
Logged to: Microsoft-Windows-Sysmon/Operational, on the machine where it happened; filtered in a Sysmon configuration by the <ProcessAccess> element.
Microsoft's description
Event ID 10: ProcessAccess
The process accessed event reports when a process opens another process, an operation that’s often followed by information queries or reading and writing the address space of the target process. This enables detection of hacking tools that read the memory contents of processes like Local Security Authority (Lsass.exe) in order to steal credentials for use in Pass-the-Hash attacks. Enabling it can generate significant amounts of logging if there are diagnostic utilities active that repeatedly open processes to query their state, so it generally should only be done so with filters that remove expected accesses.
Source: Microsoft's Sysmon documentation
Every field of event 10
| Field | What it tells you |
|---|---|
| SourceImage | The process that opened the other one. For LSASS access, anything outside the expected security and system tools deserves a look. |
| TargetImage | The process that was opened. C:\Windows\System32\lsass.exe is the target that matters most, because it holds credential material. |
| GrantedAccess | The access rights granted, as a hexadecimal mask of Windows process access rights. 0x0010 is PROCESS_VM_READ (read memory) and 0x1000 PROCESS_QUERY_LIMITED_INFORMATION, so 0x1010 is a handle able to read memory — what credential dumping needs. |
| CallTrace | The call stack of the request, as module+offset entries separated by |. Entries marked UNKNOWN come from memory that no loaded module backs, a sign of injected code. |
| SourceUser | The account the source process runs as. |
| SourceProcessGUID | Joins the event to the source process's creation (event 1, where it is ProcessGuid), which has its command line and parent. |
| TargetProcessGUID | The opened process's GUID, for the same join on the target side. |
| SourceThreadId | The thread in the source process that opened the handle. |
| RuleName | — |
| UtcTime | — |
| SourceProcessId | — |
| TargetProcessId | — |
| TargetUser | — |
Field names and order from Sysmon's manifest (schema 4.90), checked on every build.
What it records
Microsoft’s description: the process accessed event “reports when a process opens another process, an operation that’s often followed by information queries or reading and writing the address space of the target process. This enables detection of hacking tools that read the memory contents of processes like Local Security Authority (Lsass.exe) in order to steal credentials for use in Pass-the-Hash attacks.”
The event pairs a source and a target: SourceImage, SourceProcessGUID, SourceProcessId, SourceThreadId and SourceUser on one side, TargetImage, TargetProcessGUID, TargetProcessId and TargetUser on the other. GrantedAccess is the access mask Windows granted, built from the rights in Microsoft’s process security and access rights table, and CallTrace is the stack of the call that opened the handle.
Because almost every security product, backup agent and system component opens other processes, Microsoft advises enabling the event only “with filters that remove expected accesses”. A typical configuration limits it to lsass.exe as the target:
<ProcessAccess onmatch="include">
<TargetImage condition="end with">lsass.exe</TargetImage>
</ProcessAccess>
When it matters
| Reading | Meaning |
|---|---|
| TargetImage is lsass.exe and GrantedAccess includes 0x0010 (PROCESS_VM_READ), e.g. 0x1010, 0x1410, 0x143a | A handle that can read LSASS memory — credential dumping (T1003.001) |
| GrantedAccess 0x1fffff (PROCESS_ALL_ACCESS) on lsass.exe | Full access to LSASS, which few legitimate programs ask for |
| SourceImage in a user, temp or public folder, or rundll32.exe / powershell.exe opening lsass.exe | A dumping tool, a dump through comsvcs.dll, or a script |
| CallTrace contains UNKNOWN | The request came from code not backed by a module — injected or unpacked in memory |
| GrantedAccess with PROCESS_VM_WRITE (0x0020) and PROCESS_CREATE_THREAD (0x0002) on another process | The rights needed to inject code (T1055); look for event 8 next |
The masks are additive, so read them as bits: test for the 0x0010 bit rather than matching a fixed list, which attackers can step around by asking for slightly different rights. In hexadecimal that bit is set exactly when the second digit from the right is odd (0x1010, 0x1410, 0x143a, 0x1fffff all have it; 0x1000 and 0x1400 do not).
How to investigate
Handles to LSASS that can read its memory, from programs other than the usual Windows components:
Event
| where TimeGenerated > ago(7d)
| where Source == "Microsoft-Windows-Sysmon" and EventID == 10
| extend D = parse_xml(EventData).DataItem.EventData.Data
| mv-apply d = D on (summarize f = make_bag(bag_pack(tostring(d["@Name"]), tostring(d["#text"]))))
| extend SourceImage = tostring(f.SourceImage), TargetImage = tostring(f.TargetImage),
GrantedAccess = tostring(f.GrantedAccess), CallTrace = tostring(f.CallTrace), Account = tostring(f.SourceUser)
| where TargetImage endswith "\\lsass.exe"
// PROCESS_VM_READ (0x0010) is set when the second hex digit from the right is odd.
| where GrantedAccess matches regex @"(?i)^0x[0-9a-f]*[13579bdf][0-9a-f]$"
| where SourceImage !startswith "C:\\Windows\\System32\\"
| project TimeGenerated, Computer, Account, SourceImage, GrantedAccess, UnbackedCode = CallTrace has "UNKNOWN", CallTrace
Every source that opened LSASS, ranked by how rare it is across the estate:
Event
| where TimeGenerated > ago(30d)
| where Source == "Microsoft-Windows-Sysmon" and EventID == 10
| extend D = parse_xml(EventData).DataItem.EventData.Data
| mv-apply d = D on (summarize f = make_bag(bag_pack(tostring(d["@Name"]), tostring(d["#text"]))))
| extend SourceImage = tostring(f.SourceImage), TargetImage = tostring(f.TargetImage), GrantedAccess = tostring(f.GrantedAccess)
| where TargetImage endswith "\\lsass.exe"
| summarize Hosts = dcount(Computer), Events = count(), Masks = make_set(GrantedAccess, 10) by SourceImage
| order by Hosts asc
For each suspicious source, follow SourceProcessGUID to its process creation event for the command line, parent and hashes, then to the logon session through LogonId and the 4624. Treat the accounts that were logged on to the host as exposed: their credentials may have been read. The Sigma rule for LSASS access expresses the same check for other SIEMs, and the free analyzer flags LSASS access in a Sysmon export.
Read a Sysmon log without a SIEM
Copy Microsoft-Windows-Sysmon%4Operational.evtx from C:\Windows\System32\winevt\Logs (or wevtutil epl Microsoft-Windows-Sysmon/Operational sysmon.evtx) and open it in the EVTX viewer: every event in a table, event 10 filterable, with the analyzer's checks for LSASS access, remote threads and suspicious command lines. Nothing is uploaded.
Related events
- Sysmon Event ID 1 Process creation
- Sysmon Event ID 8 CreateRemoteThread
- Sysmon Event ID 7 Image loaded
- Security Event ID 4688 A new process has been created
- Security Event ID 4624 An account was successfully logged on
Detect it
Frequently Asked Questions
- What does GrantedAccess 0x1010 mean in Sysmon Event ID 10?
- It combines two Windows process access rights from Microsoft's table, PROCESS_QUERY_LIMITED_INFORMATION (0x1000) and PROCESS_VM_READ (0x0010). A handle with PROCESS_VM_READ can read the target's memory, which is what a tool needs to extract credentials from lsass.exe; that is why 0x1010 on an LSASS target is a well-known credential-dumping signal.
- What is GrantedAccess 0x1fffff?
- PROCESS_ALL_ACCESS, every right on the process, which Microsoft defines as the standard rights plus SYNCHRONIZE plus all process-specific rights. Legitimate tools rarely need full access to lsass.exe, so a 0x1fffff handle to it from an unexpected program is worth investigating.
- Why does Sysmon Event ID 10 produce so many events?
- Microsoft warns that enabling it "can generate significant amounts of logging if there are diagnostic utilities active that repeatedly open processes to query their state", and recommends filters that remove expected accesses. Most configurations log only accesses to a few targets such as lsass.exe, or only specific GrantedAccess values.
- What does UNKNOWN in the CallTrace mean?
- An entry of the call stack points into memory that no loaded DLL or executable backs. Code running from such memory was usually injected or unpacked at run time, so an UNKNOWN frame in a call that opened lsass.exe is a strong sign of in-memory malware.
Find every Sysmon 10 that matters
Open a Sysmon .evtx or XML export in the free browser analyzer: LSASS access, remote thread injection, process tampering, suspicious command lines and reverse-shell ports are flagged, with the events behind each. Nothing is uploaded.
Investigating something right now? LogTriage checks every address in the file against threat intelligence and writes the incident report: 10 analyses a month free. The incident pack adds the in-depth AI analysis and files up to 100 MB: 25 analyses for $19, one payment, no subscription. Pricing
Every query on this site's reference pages, the Sigma rules and a cheat sheet in one download: the Incident Response Kit, $29 once.