-
Notifications
You must be signed in to change notification settings - Fork 453
detection Lateral Movement via BitLocker COM Hijacking #3801
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Draft
AAtashGar
wants to merge
20
commits into
splunk:develop
Choose a base branch
from
AAtashGar:rule/bitlocker
base: develop
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Draft
Changes from 10 commits
Commits
Show all changes
20 commits
Select commit
Hold shift + click to select a range
4de4fdf
detection(experimental): Lateral Movement via BitLocker COM Hijacking…
AAtashGar 1439e50
Rule status changed from experimental to Production.
AAtashGar 2605c64
Merge branch 'develop' into rule/bitlocker
patel-bhavin 95bbfa4
Update lateral_movement_via_bitlocker_com_hijacking.yml and fix status
AAtashGar 3fdda4e
2 drilldown_searches added
AAtashGar 8553887
Merge branch 'develop' into rule/bitlocker
patel-bhavin a2b6ad4
Merge branch 'develop' into rule/bitlocker
patel-bhavin c75c510
Delete macro filter file
AAtashGar f6ffe69
Modify author and type in lateral movement detection
AAtashGar 522c9f1
Enhance BitLocker COM Hijacking detection story
AAtashGar d53026d
Refactor lateral movement detection for BitLocker COM hijacking
AAtashGar 6e8d570
Delete stories/bitlocker_com_hijacking_lateral_movement.yml
AAtashGar 229a6cb
Merge branch 'develop' into rule/bitlocker
patel-bhavin 9bd7ce6
YAML parsing error fixed
AAtashGar 63c4d7a
fix: Validation Issues
AAtashGar 0a133b7
fix tests section
AAtashGar fd52328
Merge branch 'develop' into rule/bitlocker
patel-bhavin a77da35
Merge branch 'develop' into rule/bitlocker
nasbench 5a55867
Merge branch 'develop' into rule/bitlocker
patel-bhavin 16b2f3b
Merge branch 'develop' into rule/bitlocker
patel-bhavin File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Some comments aren't visible on the classic Files Changed page.
There are no files selected for viewing
139 changes: 139 additions & 0 deletions
139
detections/endpoint/lateral_movement_via_bitlocker_com_hijacking.yml
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,139 @@ | ||
| name: Lateral Movement via BitLocker COM Hijacking | ||
| id: 990d5907-c022-4358-9ada-f6e5e69514e8 | ||
| version: 1 | ||
| date: '2025-09-28' | ||
| author: Ali Atashgar (AAtashGar), Github Community | ||
| status: production | ||
| description: |- | ||
| This detection identifies potential lateral movement activities | ||
| using BitLocker COM hijacking techniques. It monitors for changes | ||
| to the Remote Registry service, new registry values in CLSID paths, | ||
| handle operations on CLSIDs, and executions of specific processes like | ||
| baaupdate.exe and BdeUISrv.exe. These events are correlated by host to | ||
| detect sequences indicative of this attack vector. | ||
| type: TTP | ||
| references: | ||
| - https://medium.com/@seripallychetan/bitlocker-com-hijack-a-new-frontier-in-lateral-movement-tactics-ac5039b18dc6 | ||
| - https://ipurple.team/2025/08/04/lateral-movement-bitlocker/ | ||
| search: | | ||
| (`wineventlog_security`) OR (`wineventlog_system`) \ | ||
| EventCode IN (7040, 4657, 4663, 4688) | ||
| [ search `wineventlog_system` EventCode=7040 service="Remote Registry" | ||
| | fields ComputerName | ||
| | dedup ComputerName | ||
| ] | ||
| | where | ||
| (EventCode=7040 AND service="Remote Registry") OR | ||
| (EventCode=4657 AND Operation_Type="New registry value created" | ||
| AND Object_Name LIKE "%CLSID%") OR | ||
| (EventCode=4663 AND Object_Name LIKE "%CLSID%") OR | ||
| (EventCode=4688 AND ( | ||
| (process_name="baaupdate.exe" AND parent_process_name="explorer.exe") OR | ||
| (process_name="BdeUISrv.exe" AND parent_process_name="svchost.exe") | ||
| )) | ||
| | eval srvchngstsTime=if(EventCode=7040, _time, null) | ||
| | eval regvlsetTime=if(EventCode=4657, _time, null) | ||
| | eval reghandleTime=if(EventCode=4663, _time, null) | ||
| | eval procexecTime=if(EventCode=4688, _time, null) | ||
| | eval ServiceMessage=if(EventCode=7040, Message, null) | ||
| | eval ProcessName_4663=if(EventCode=4663, process, null) | ||
| | eval CLSID_Path=if(EventCode IN (4657, 4663), Object_Name, null) | ||
nasbench marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| | stats | ||
| values(srvchngstsTime) AS srvchngstsTime | ||
| values(regvlsetTime) AS regvlsetTime | ||
| values(reghandleTime) AS reghandleTime | ||
| values(procexecTime) AS procexecTime | ||
| values(ServiceMessage) AS ServiceMessage | ||
| values(CLSID_Path) AS CLSID_Path | ||
| values(New_Value_Type) AS New_Value_Type | ||
| values(New_Value) AS New_Value | ||
| values(Access_Mask) AS AccessMask | ||
| values(ProcessName_4663) AS ProcessName_4663 | ||
| values(parent_process_id) AS parent_process_id | ||
| values(parent_process_name) AS parent_process_name | ||
| values(process_id) AS process_id | ||
| values(process_name) AS process_name | ||
| values(TimeDiff1) AS TimeDiff_Service_to_Registry | ||
| values(TimeDiff2) AS TimeDiff_Registry_to_Handle | ||
| values(TimeDiff3) AS TimeDiff_Handle_to_Process | ||
| count(eval(EventCode=7040)) AS SrvEvts | ||
| count(eval(EventCode=4657)) AS RegEvts | ||
| count(eval(EventCode=4663)) AS HdlEvts | ||
| count(eval(EventCode=4688)) AS ProcEvts | ||
| by ComputerName | ||
|
||
| | where SrvEvts>0 AND RegEvts>0 AND HdlEvts>0 AND ProcEvts>0 | ||
| | where isnotnull(CLSID_Path) | ||
| | eval srvchngstsTime=strftime(srvchngstsTime, "%Y-%m-%d %H:%M:%S") | ||
| | eval regvlsetTime=strftime(regvlsetTime, "%Y-%m-%d %H:%M:%S") | ||
| | eval reghandleTime=strftime(reghandleTime, "%Y-%m-%d %H:%M:%S") | ||
| | eval procexecTime=strftime(procexecTime, "%Y-%m-%d %H:%M:%S") | ||
| | table | ||
| ComputerName | ||
| srvchngstsTime | ||
| ServiceMessage | ||
| regvlsetTime | ||
| CLSID_Path | ||
| New_Value_Type | ||
| New_Value | ||
| reghandleTime | ||
| ProcessName_4663 | ||
| AccessMask | ||
| procexecTime | ||
| parent_process_id | ||
| parent_process_name | ||
| process_id | ||
| process_name | ||
| | rename | ||
| ComputerName AS "Host" | ||
| CLSID_Path AS "CLSID Path" | ||
| srvchngstsTime AS "Service Change Time" | ||
| ServiceMessage AS "Service Message" | ||
| regvlsetTime AS "Registry Change Time" | ||
| New_Value_Type AS "Registry Value Type" | ||
| New_Value AS "Registry Value" | ||
| reghandleTime AS "Handle Creation Time" | ||
| AccessMask AS "Access Mask" | ||
| ProcessName_4663 AS "Process Accessing Registry" | ||
| procexecTime AS "Process Execution Time" | ||
| parent_process_name AS "Parent Process" | ||
| process_name AS "Process Name" | ||
| parent_process_id AS "Parent Process ID" | ||
| process_id AS "Process ID" | ||
| | sort - "Service Change Time" | ||
| | `lateral_movement_via_bitlocker_com_hijacking_filter` | ||
| how_to_implement: |- | ||
| Ensure Windows Event Logs are being ingested into Splunk, | ||
| particularly from the Security channel (wineventlog). | ||
| This detection requires fields like EventCode, ComputerName, | ||
| service, Operation_Type, Object_Name, process_name, parent_process_name, | ||
| Message, process, New_Value_Type, New_Value, Access_Mask, parent_process_id, | ||
| and process_id. Use Sysmon or Endpoint data models for enhanced coverage. | ||
nasbench marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| known_false_positives: |- | ||
| Legitimate administrative activities may trigger this detection, | ||
| such as software installations or system configurations involving | ||
| Remote Registry and BitLocker components. Tune based on environment. | ||
| drilldown_searches: | ||
| - name: View the detection results for - "$Host$" | ||
| search: '%original_detection_search% | search Host = "$Host$"' | ||
| earliest_offset: $info_min_time$ | ||
| latest_offset: $info_max_time$ | ||
| - name: View risk events for the last 7 days for - "$Host$" | ||
| search: '| from datamodel Risk.All_Risk | search normalized_risk_object="$Host$" | ||
| starthoursago=168 | stats count min(_time) as firstTime max(_time) | ||
| as lastTime values(search_name) as "Search Name" values(risk_message) as "Risk | ||
| Message" values(analyticstories) as "Analytic Stories" values(annotations._all) | ||
| as "Annotations" values(annotations.mitre_attack.mitre_tactic) as "ATT&CK Tactics" | ||
| by normalized_risk_object | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)`' | ||
| earliest_offset: $info_min_time$ | ||
| latest_offset: $info_max_time$ | ||
| tags: | ||
| analytic_story: | ||
| - BitLocker COM Hijacking Lateral Movement | ||
nasbench marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| asset_type: Endpoint | ||
| mitre_attack_id: | ||
| - T1546.015 | ||
| product: | ||
| - Splunk Enterprise | ||
| - Splunk Enterprise Security | ||
| - Splunk Cloud | ||
| security_domain: endpoint | ||
nasbench marked this conversation as resolved.
Show resolved
Hide resolved
|
||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,59 @@ | ||
| name: BitLocker COM Hijacking Lateral Movement | ||
| id: 9d1f4a2b-6e3c-4f7d-8a9b-1c5e7f8d3e4f | ||
| version: 1 | ||
| date: '2025-11-23' | ||
| author: Ali Atashgar (AAtashGar), Github Community | ||
| status: production | ||
| description: | | ||
| This Analytic Story focuses on detecting lateral movement via exploitation of BitLocker COM Hijacking | ||
| (MITRE ATT&CK Technique **T1546.015** – Event Triggered Execution: Component Object Model Hijacking) | ||
| a technique observed in 2025 campaigns. Attackers modify registry values under HKCU associated with | ||
| a specific BitLocker-related CLSID (`{A7A63E5C-3877-4840-8727-C1EA9D7A4D50}`) | ||
| hijacking legitimate BitLocker processes such as `baaupdate.exe` or `BdeUISrv.exe`. | ||
| This allows malicious code to execute in the context of a high-privilege system process | ||
| facilitating lateral movement across Windows environments—especially | ||
| after gaining initial access to an endpoint. | ||
|
|
||
| The detection correlates the following suspicious behaviors on the same host: | ||
| - Registry handle operations (e.g., SetInformation, | ||
| CreateFile) targeting the hijacked CLSID key in HKCU | ||
| - Subsequent execution of BitLocker-related binaries (baaupdate.exe, BdeUISrv.exe) | ||
| shortly after the registry modification | ||
| - Anomalous child processes or unusual command-line arguments | ||
| spawned from these legitimate processes | ||
|
|
||
| Monitoring these patterns can serve as an early indicator of COM hijacking | ||
| attempts for lateral movement | ||
| particularly in environments where BitLocker is enabled or attackers already | ||
| have foothold access. | ||
|
|
||
| MITRE ATT&CK Mappings: | ||
| - T1546.015: Event Triggered Execution: Component Object Model Hijacking | ||
| - TA0008: Lateral Movement | ||
|
|
||
| Recommendations: | ||
| - Enable continuous monitoring of sensitive CLSID registry modifications | ||
| (especially under HKCU\Software\Classes\CLSID) | ||
| - Combine with EDR telemetry to detect anomalous process execution chains | ||
| involving BitLocker components | ||
| - Consider restricting write access to relevant registry paths where feasible | ||
| narrative: | | ||
| In August 2025, a novel lateral movement technique was published that abuses | ||
| the BitLocker Network Unlock COM object | ||
| (CLSID {A7A63E5C-3877-4840-8727-C1EA9D7A4D50}). | ||
| Attackers enable RemoteRegistry,write a malicious DLL path to InprocServer32 | ||
| under HKCU\Software\Classes\CLSID for logged-on users, and trigger execution | ||
| via baaupdate.exe (from explorer.exe) or BdeUISrv.exe (from svchost.exe). | ||
| This analytic story provides detection for this advanced persistence and | ||
| lateral movement technique. | ||
| references: | ||
| - https://ipurple.team/2025/08/04/lateral-movement-bitlocker/ | ||
| - https://github.com/rtecCyberSec/BitlockMove | ||
| tags: | ||
| category: | ||
| - Adversary Tactics | ||
| product: | ||
| - Splunk Enterprise | ||
| - Splunk Enterprise Security | ||
| - Splunk Cloud | ||
| usecase: Advanced Threat Detection |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This can be optimized by moving the filter early as well as adding conditions to the subsearch to look only for changes to the status of the service to Enabled from Disabled.
Also the field you are using are not the XML fields but the General view field. Which we do not recommend using.
Now for the condition, you are filtering for any CLSID which is not the case of the attack. But instead it targets specific CLSID. You should filter on those.
Also keep in mind that EID 4663/4657 requires a dedicated SACL in the key/value to trigger.
You need better filtering to avoid non-related matches.