- Matthew Dunwoody (Mandiant) vừa hỏi cộng đồng threat hunting: đã ai bắt được attacker dùng combo COM Handler + Scheduled Task để persist chưa?
- Đây là kỹ thuật public từ 2016, không cần admin, chạy trong dllhost.exe — và phần lớn EDR vẫn miss nó.
TL;DR
Ngày 25/04, Matthew Dunwoody — Principal Threat Hunter tại Mandiant (Google Cloud) — đặt câu hỏi mở trên X: "Đã ai từng thấy attacker abuse COM Handler để persist chưa? Kiểu drop một DLL có interface phù hợp, đăng ký handler, rồi tạo/sửa scheduled task để execute nó?"
Câu hỏi này đáng chú ý vì kỹ thuật được Matt Nelson (enigma0x3) public từ 2016, có sẵn trong MITRE ATT&CK T1546.015, và vẫn được commodity RAT (RemcosRAT, AsyncRAT) sử dụng. Việc một threat hunter cấp Mandiant hỏi cộng đồng cho thấy: in-the-wild sighting của combo này còn ít được report — và đó chính xác là vùng xám đáng săn.
Combo này hoạt động thế nào
Hai mảnh ghép Windows-native:
- COM hijacking: ghi đè CLSID dưới
HKCU\Software\Classes\CLSID\{GUID}\InprocServer32. VìHKEY_CLASSES_ROOTlà merged view củaHKLM+HKCUvới HKCU thắng, một user thường có thể override entry mà system tin tưởng. - Scheduled Task với Custom Handler: trong XML schema của task, action có thể là
<ComHandler><ClassId>...</ClassId></ComHandler>thay vì<Exec>. Khi task trigger, Task Scheduler load CLSID đó vào COM surrogate processdllhost.exe.
Kết hợp: drop DLL độc, đăng ký CLSID độc trong HKCU, rồi tạo task ComHandler trỏ tới CLSID đó (hoặc hijack CLSID của task có sẵn). Mỗi lần task trigger — payload chạy trong dllhost.exe ký bởi Microsoft, không có command line khả nghi để alert.
Tại sao defender phải care
Persistence là thứ defender soi nhiều nhất, nhưng combo này né được phần lớn baseline:
- Không cần admin — standard user privileges là đủ. Cả phishing payload chạy lần đầu cũng làm được.
- Không có process mới khả nghi — payload load vào
dllhost.exe /Processid:{...}, một binary signed Microsoft chạy thường xuyên trong mọi máy. - Native log gần như mù — Windows Security log không log CLSID resolution. Event 4698 (task created) có log task, nhưng action trông "sạch" vì là CLSID chứ không phải command line.
- EDR rule generic miss — nhiều rule chỉ alert
schtasks.exe /createvới binary lạ, hoặc child process từ task. ComHandler không tạo child, không gọischtasksnếu attacker dùng API trực tiếp.
Số liệu kỹ thuật cần nhớ
| Property | Giá trị |
|---|---|
| MITRE ID | T1546.015 (Event Triggered Execution: COM Hijacking) |
| Privilege required | Standard user (non-admin) |
| Surrogate process | C:\Windows\System32\dllhost.exe |
| Hive ưu tiên | HKCU thắng HKLM trong HKCR merge |
| Registry key core | HKCU\Software\Classes\CLSID\{GUID}\InprocServer32 |
| Task action XML | <ComHandler><ClassId>{GUID}</ClassId></ComHandler> |
| Public từ | 2016-05 (enigma0x3) |
Một ví dụ kinh điển từ research của Nelson: task \Microsoft\Windows\WindowsUpdate\Automatic App Update có ComHandler CLSID {A6BA00FE-40E8-477C-B713-C64A14F18ADB}. Trigger: user logon. Hijack CLSID này trong HKCU = persistence mỗi lần user đăng nhập, dưới danh nghĩa Windows Update.
So với các persistence khác
| Technique | Privilege | Stealth | EDR visibility |
|---|---|---|---|
| Run / RunOnce keys | User | Thấp | Cao |
Scheduled Task <Exec> | User | Trung | Cao (4698 + cmdline) |
Scheduled Task <ComHandler> | User | Cao | Thấp |
| Service install | Admin | Trung | Cao |
| WMI event subscription | Admin | Cao | Trung |
ComHandler là điểm "best of both" — predictable trigger của scheduled task, ghép với stealth của COM dllhost surrogate.
Ai đã dùng (và đang dùng)
- Padodor/Berbew (Trojan stealer) — một trong những family đầu tiên abuse COM hijacking in-the-wild, có report từ 2014.
- RemcosRAT, AsyncRAT — theo VirusTotal blog 2024, CLSID
{89565275-A714-4a43-912E-978B935EDCCC}được nhiều mẫu commodity RAT abuse. - SpecterOps 2025 — research mới nhắm vào CLSID dùng bởi Edge WebView2 (instance bởi Chrome, Teams, Citrix Workspace, Edge), restrict payload chỉ chạy trong process trình duyệt → bypass EDR rule generic.
- Red team thực chiến — combo này là default trong nhiều operator playbook khi cần userland persistence không-admin.
Limitations & cách hunt
Giới hạn của attacker:
- Chỉ trigger khi task trigger (logon, schedule, event). Không "luôn luôn online" như service.
- Task chạy SYSTEM context đọc HKLM, không đọc HKCU user → standard user không hijack được task SYSTEM.
- Sysmon Event ID 7 (Image loaded) sẽ log DLL load vào
dllhost.exe— defender có telemetry sẽ thấy.
Threat hunting playbook:
- List tất cả scheduled task có ComHandler:
Get-ScheduledTask | Where-Object { $_.Actions.ClassId } | Select TaskName, TaskPath, @{n='ClassId';e={$_.Actions.ClassId}} - Với mỗi ClassId, check có entry override trong
HKCU\Software\Classes\CLSID\không. Nếu CLSID có cả HKLM lẫn HKCU vàInprocServer32trỏ đi đâu khác nhau → red flag. - Sysmon: alert Event ID 12/13 (registry create/modify) cho path
HKCU\Software\Classes\CLSID\*\InprocServer32. - Sysmon Event ID 7: alert DLL không-Microsoft load vào
dllhost.exevới arg/Processid:{GUID}. - Cờ phụ: scheduled task không có security descriptor (yaxser flag) — không phải ai cũng quen check, nhưng Microsoft luôn set SD cho task của họ.
Tool có sẵn: Get-ScheduledTaskComHandler.ps1 của enigma0x3, Splunk research có signature "Powershell COM Hijacking InprocServer32 Modification".
What's next
Câu hỏi của Dunwoody không phải tu từ — nó signals rằng Mandiant đang chủ động hunt cho IOC của combo này. Khả năng cao trong vài tháng tới sẽ có report từ Mandiant/GTI public một campaign cụ thể, hoặc artifact pack mới cho Velociraptor / Hayabusa target chuyên ComHandler.
Defender nên làm gì ngay tuần này: chạy script enum ComHandler trên endpoint mẫu, tạo Sysmon rule cho HKCU CLSID write, và tune EDR allow-list để alert (không block) bất kỳ DLL không-Microsoft nào load vào dllhost.exe. Persistence ở vùng xám chỉ stealthy khi không ai nhìn — nhìn rồi thì nó là một trong những signal sạch nhất bạn có.
Nguồn: MITRE T1546.015, enigma0x3, SpecterOps, bohops, VirusTotal.