Unsigned or Oddly Signed Modules
A process loads DLLs, modules of code that run inside it, and every program loads some of Windows' own, which Microsoft signs, many through a catalogue rather than inside the file. SigmaHQ flags an unsigned module loaded into lsass.exe, the Local Security Authority, which holds credentials, and lsass.exe under added LSA protection refuses any plug-in without a Microsoft signature. An unsigned or oddly signed DLL in a trusted process usually means code running with everything its host holds, which in lsass.exe is the credentials. List the modules with their paths and signers first, using a check that reads catalogue signatures.
Normal and Suspicious
A clean machine sits beside a suspicious one, and the pointer marks where to look.
Normal
A clean Windows 11 install
| Name | Path | Signed By |
|---|---|---|
kernel32.dll | C:\ | Microsoft Windows |
Suspicious
srv-fin-01,
| Name | Path | Signed By |
|---|---|---|
lsaext.dll | C:\ | Not signed |
| Signed ByNot signed, inside lsass.exe: Windows' own modules there are signed by Microsoft. Unsigned or Oddly Signed Modules | ||
Look Inside
Why It Matters
A DLL runs with everything its host process holds, so an unsigned module inside lsass.exe can read credentials. Windows' own modules are signed by Microsoft, many through a catalogue, a signed file that lists their hashes, rather than inside the file.
How to Confirm It
Work through these in order. Each step names the page that shows how.
- List the modules with their paths and signers (ListDLLs, Process Explorer's DLL view, Windows.System.DLLs), using a check that reads catalogue signatures.Loaded DLLs
- For lsass.exe, read CodeIntegrity events 3065 and 3066 (audit mode, on by default from Windows 11 version 22H2) and 3033 and 3063 (enforced) in the Microsoft-Windows-CodeIntegrity/Operational log. They name plug-ins that fail its signing or shared-section rules.Loaded DLLs
- In a memory image, set the loader's three lists against every region that starts with an MZ header, using windows.malware.ldrmodules. A region in no list is a lead, not a verdict, since the process's own executable is missing from the initialisation list and resource files from all three.Loaded DLLs
- Extract the DLL with windows.dlllist and its dump option, or take the file on disk, and check its signature and hash offline. Volatility lists modules but does not check signatures.Dumping a Process and Memory
What Defenders See
Each record names its log and what must be switched on to get it.
| Record and Where It Lands | What to Read | How to Turn It On |
|---|---|---|
7 Image loaded (opens in a new tab)Microsoft-Windows-Sysmon/OperationalIt is written on any Windows computer running Sysmon. | Image, ImageLoaded, Signed, Signature and SignatureStatus for each load. It is off by default and needs a filtered configuration.Loaded DLLs shows how to read it. | Run Sysmon with ImageLoad events in its configuration. They are off by default. |
| Device | Which module loaded into which process. It has no signature columns, so join Device | The Defender for Endpoint sensor on the device |
| Device | IsSigned, IsTrusted, Signer and Is | The Defender for Endpoint sensor on the device |
3066 A code integrity check determines that a process, usually LSASS.exe, attempts to load a driver that doesn't meet the Microsoft signing level requirements. However, due to the system policy currently set, the image is allowed to load (opens in a new tab)Microsoft-Windows-CodeIntegrity/OperationalIt is written on any computer that audits LSA protection. That audit is on by default from Windows 11 version 22H2. | In audit mode, lsass.exe loaded a plug-in or driver that does not meet Microsoft's signing level, and enforcement would refuse it.Loaded DLLs shows how to read it. | Turn on audit mode for added LSA protection, which allows the load and logs it. |
3065 A code integrity check determines that a process, usually LSASS.exe, attempts to load a driver that doesn't meet the security requirements for shared sections. However, due to the system policy currently set, the image is allowed to load (opens in a new tab)Microsoft-Windows-CodeIntegrity/OperationalIt is written on any computer that audits LSA protection. That audit is on by default from Windows 11 version 22H2. | In audit mode, a plug-in or driver with shared sections, which Microsoft says is logged together with 3066.Loaded DLLs shows how to read it. | Turn on audit mode for added LSA protection, which allows the load and logs it. |
3033 A code integrity check determines that a process, usually LSASS.exe, attempts to load a driver that doesn't meet the Microsoft signing level requirements (opens in a new tab)Microsoft-Windows-CodeIntegrity/OperationalIt is written on any computer that runs lsass.exe as a protected process. | Under enforcement, a protected lsass.exe refused a plug-in or driver that does not meet Microsoft's signing level.Loaded DLLs shows how to read it. | Turn on added LSA protection, which then refuses the plug-in or driver. |
3063 A code integrity check determines that a process, usually LSASS.exe, attempts to load a driver that doesn't meet the security requirements for shared sections (opens in a new tab)Microsoft-Windows-CodeIntegrity/OperationalIt is written on any computer that runs lsass.exe as a protected process. | Under enforcement, a protected lsass.exe refused a plug-in or driver that breaks the shared sections rules.Loaded DLLs shows how to read it. | Turn on added LSA protection, which then refuses the plug-in or driver. |
What It Looks Like
This record is decoded field by field, with what each value means.
| Field, as the Record Writes It | What It Tells You |
|---|---|
ImageC:\ | The process that loaded the module, the Local Security Authority. Whatever it loads can read the credentials it holds. |
ImageLoadedC:\ | The DLL, in System32, where LSA plug-ins live. The folder looks right, so the signature has to decide. |
Signedfalse | No signature vouches for it. A protected lsass |
- False Positives
Windows DLLs signed through a catalogue look unsigned to a check that reads only embedded signatures.
Smart card drivers, cryptographic plug-ins and password filters load their own signed modules into lsass.exe, so check the signer is that vendor and that you run the product.
- Blind Spots
A protected lsass.exe refuses tools that are not protected, so a live module list for it can come back empty. Rely on CodeIntegrity events and image load records.
Sysmon logs image loads only when its configuration asks, and a DLL loaded before the sensor started has no record.
Hunt It
The same hunt is written for four tools, so pick the one you use. Defender XDR and Sentinel queries are in KQL, which you paste into Advanced hunting in the Defender portal or into Sentinel's Logs page. Splunk queries are in SPL, for its Search page, and Velociraptor queries are in VQL, which you run as a hunt.
Needs Defender for Endpoint. Smart card and other LSA plug-in vendors sign their own modules, so a non-Microsoft signer is a lead to check, not a finding. A module with no certificate record may only be unchecked.
// Modules in lsass.exe and other core processes that are unsigned, untrusted, not Microsoft's or have no certificate record, rarest firstlet certs = DeviceFileCertificateInfo | where Timestamp > ago( 30d) | summarize arg_max( Timestamp, IsSigned, IsTrusted, Signer, IsRootSignerMicrosoft) by SHA1 | project SHA1, IsSigned, IsTrusted, Signer, IsRootSignerMicrosoft;DeviceImageLoadEvents| where Timestamp > ago( 30d)| where InitiatingProcessFileName in~ ( "lsass.exe", "winlogon.exe", "services.exe", "spoolsv.exe") and isnotempty( SHA1)| join kind= leftouter certs on SHA1| where isnull( IsSigned) or not( IsSigned) or not( IsTrusted) or not( IsRootSignerMicrosoft)| summarize Loads = count( ), Devices = dcount( DeviceName), FirstSeen = min( Timestamp) by FileName, FolderPath, SHA1, Signer, IsSigned, IsTrusted, InitiatingProcessFileName| order by Devices asc, FirstSeen descIn a Memory Image
Volatility 3 reads a memory image, and each of its plugins below shows part of this sign.
windows.dlllist(documentation, opens in a new tab)Memory Image A Volatility 3 plugin. It is one check run on a saved copy of a Windows machine's memory. dlllist means DLL list. Each process's modules from its loader list, with paths. Its dump option extracts them for an offline signature check.windows.(documentation, opens in a new tab)Memory Image A Volatility 3 plugin from its malware group. It checks a memory image for code that hides, or code put into a process. ldrmodules means loader modules. Every region in the process that starts with an MZ header, private memory included, and whether each loader list names it. One in no list is a lead.malware. ldrmodules windows.verinfo(documentation, opens in a new tab)Memory Image A Volatility 3 plugin. It is one check run on a saved copy of a Windows machine's memory. The version numbers in each mapped module, to set against the build's own. It prints no signer or original name.
Rules to Compare With
Security vendors publish detection rules anyone can read. These look for the same thing, so compare your own with them.
Show the 5 Public Rules
- Unsigned Image Loaded Into LSASS Process (opens in a new tab) SigmaHQ: Flags lsass.exe loading an unsigned module.
- Unsigned DLL Loaded by Windows Utility (opens in a new tab) SigmaHQ: Flags rundll32.exe or regsvr32.exe loading an unsigned DLL.
- Potential Masquerading as System32 DLL (opens in a new tab) Elastic: Flags DLLs with default System32 names that are unsigned or signed by someone other than Microsoft.
- Windows Unsigned DLL Side-Loading (opens in a new tab) Splunk: Flags unsigned DLLs loaded from System32 or SysWOW64, from Sysmon event 7.
- Windows Unsigned MS DLL Side-Loading (opens in a new tab) Splunk: Flags unsigned DLLs mimicking Microsoft ones that a program outside the system folders loads, from Sysmon event 7.
How to Prevent It
Each control helps prevent it, and its line says what it does here.
- Added LSA protection (opens in a new tab) LSA plug-ins must carry a Microsoft signature, so an unsigned one fails to load into lsass.exe. Check it in the Registry: LSA Protection (RunAsPPL)
- KnownDLLs (opens in a new tab) Windows loads each listed DLL from its own copy, whatever sits earlier in the search order. Check it in the Registry: KnownDLLs
- Secure Boot, which turns AppInit_DLLs off (opens in a new tab) With Secure Boot on, a DLL listed in AppInit_DLLs does not load, which closes one route into every interactive program. Check it in the Registry: AppInit_DLLs
Sources
- Microsoft Learn: Configure added LSA protection (plug-in signing, CodeIntegrity events) (opens in a new tab)
- Microsoft Learn: 4610(S) An authentication package has been loaded by the Local Security Authority (msv1_0.dll at each start) (opens in a new tab)
- Microsoft Sysinternals: Sysmon (event 7, image loaded, off by default) (opens in a new tab)
- Microsoft Learn: DeviceImageLoadEvents table (opens in a new tab)
- Microsoft Learn: DeviceFileCertificateInfo table (opens in a new tab)
- Microsoft Sysinternals: ListDLLs (opens in a new tab)
- Microsoft Learn: catalogue files and digital signatures (opens in a new tab)
- Volatility 3: windows.malware.ldrmodules (opens in a new tab)
MITRE ATT&CK is a free public catalogue of the techniques attackers use. Each technique has an ID, such as T1055 for Process Injection, so defenders can name the same behaviour the same way. This red flag can point to these techniques.
- T1574.001 (opens in a new tab) Hijack Execution Flow: DLL
- T1129 (opens in a new tab) Shared Modules
- T1553.002 (opens in a new tab) Subvert Trust Controls: Code Signing