Keyboard class filter driver registered under the class key
A kernel-mode keylogger reads keystrokes by inserting itself into the keyboard device stack, which means writing its service name into the UpperFilters or LowerFilters value of the keyboard class key {4D36E96B-E325-11CE-BFC1-08002BE10318}. This rule is the registry-and-driver half of MITRE's analytic; the API half it opens with (SetWindowsHookEx, GetKeyState, polling loops) is not observable in any log source the strategy lists, because none of them record API calls and a global hook installation produces no process-access event either. The match is on the class key path alone, so it fires on any write to the filter list and cannot tell which driver was added — Sysmon renders a REG_MULTI_SZ value as "Binary Data" in Details, so the new entry is not in the event. Sysmon registry events are also not collected unless the running configuration includes this path; the widely used community configurations filter most of HKLM out. UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0089, not hand-written and not tested by its author. Any lab result is on this rule's own page.Full descriptionShow less
The detection
The 4 SIEM queries below are previews produced by Siemphony’s own translator, not pySigma, and none has been executed against a real backend — review before you deploy.
detection.yml
title: Keyboard class filter driver registered under the class keyid: e0be112a-7e06-4413-98e3-6db79c45c84cstatus: experimentaldescription: | A kernel-mode keylogger reads keystrokes by inserting itself into the keyboard device stack, which means writing its service name into the UpperFilters or LowerFilters value of the keyboard class key {4D36E96B-E325-11CE-BFC1-08002BE10318}. This rule is the registry-and-driver half of MITRE's analytic; the API half it opens with (SetWindowsHookEx, GetKeyState, polling loops) is not observable in any log source the strategy lists, because none of them record API calls and a global hook installation produces no process-access event either. The match is on the class key path alone, so it fires on any write to the filter list and cannot tell which driver was added — Sysmon renders a REG_MULTI_SZ value as "Binary Data" in Details, so the new entry is not in the event. Sysmon registry events are also not collected unless the running configuration includes this path; the widely used community configurations filter most of HKLM out. UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0089, not hand-written and not tested by its author. Any lab result is on this rule's own page.references: - https://attack.mitre.org/techniques/T1056/001 - https://attack.mitre.org/detectionstrategies/DET0089author: Siemphony pipeline (machine-derived from MITRE ATT&CK v19.2)date: 2026-08-16tags: - attack.collection - attack.credential-access - attack.t1056.001logsource: category: registry_set product: windowsdetection: selection: TargetObject|contains: - '\Control\Class\{4D36E96B-E325-11CE-BFC1-08002BE10318}\UpperFilters' - '\Control\Class\{4D36E96B-E325-11CE-BFC1-08002BE10318}\LowerFilters' condition: selectionfalsepositives: - "OEM keyboard, hotkey and touchpad packages, which write the filter list while installing or updating their driver. This is the largest source of benign hits, and it clusters in imaging and driver-update windows rather than appearing continuously, so the change window is what separates it from adversary activity rather than anything in the event." - "Virtualisation guest additions, VDI and remote-access agents, which install a keyboard filter so that input can be redirected into the session. These appear once per build on the affected fleet." - "Security and accessibility products that legitimately own the keyboard stack — anti-keylogger and credential-guard style agents, kiosk lockdown software, on-screen keyboards, smartcard and biometric middleware. A keystroke-encrypting security agent is structurally the same registration as a keylogger." - "Because Sysmon reports a multi-string value as binary data, a write that merely reorders or removes existing entries is indistinguishable from one that adds a driver, and the rule alerts on both. Pair this with the service-creation event for the named driver before treating a hit as confirmed."level: highSentinel · KQL
Run this as a search.
DeviceRegistryEvents| where (RegistryKey contains "\\Control\\Class\\{4D36E96B-E325-11CE-BFC1-08002BE10318}\\UpperFilters" or RegistryKey contains "\\Control\\Class\\{4D36E96B-E325-11CE-BFC1-08002BE10318}\\LowerFilters")
Splunk · SPL
Run this as a search.
index=* (TargetObject="*\\Control\\Class\\{4D36E96B-E325-11CE-BFC1-08002BE10318}\\UpperFilters*" OR TargetObject="*\\Control\\Class\\{4D36E96B-E325-11CE-BFC1-08002BE10318}\\LowerFilters*")Elastic · ES|QL
Run this as a search.
FROM logs-*| WHERE (TO_LOWER(registry.path) LIKE "*\\\\control\\\\class\\\\{4d36e96b-e325-11ce-bfc1-08002be10318}\\\\upperfilters*" OR TO_LOWER(registry.path) LIKE "*\\\\control\\\\class\\\\{4d36e96b-e325-11ce-bfc1-08002be10318}\\\\lowerfilters*")
Wazuh · XML rule
Deploy to your manager — this is a rule, not a search.
<group name="sigma,windows,registry_set,"> <!-- Rule ids must be unique on your manager; 100000+ is the user range. --> <rule id="100000" level="12"> <!-- Set <if_sid> to the decoder/base rule for windows so this only evaluates relevant events. --> <field name="TargetObject" type="pcre2">(?i)(\\Control\\Class\\\{4D36E96B-E325-11CE-BFC1-08002BE10318\}\\UpperFilters|\\Control\\Class\\\{4D36E96B-E325-11CE-BFC1-08002BE10318\}\\LowerFilters)</field> <description>Keyboard class filter driver registered under the class key</description> <mitre> <id>T1056.001</id> </mitre> </rule></group>
Verdicts · reactions · comments
Community
Verdicts from engineers who actually deployed it, and the conversation around it.
Nobody has run this in a real environment and said what happened.
Verdicts from engineers who deployed it
0 castNo verdicts reported yet. The first one is worth more than the tenth — say what you ran it against.
Log in to report a verdict.
Log in to join the discussion.
No comments yet. Someone who deploys this will have something to say about it.