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:

  1. COM hijacking: ghi đè CLSID dưới HKCU\Software\Classes\CLSID\{GUID}\InprocServer32. Vì HKEY_CLASSES_ROOT là merged view của HKLM + HKCU với HKCU thắng, một user thường có thể override entry mà system tin tưởng.
  2. 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 process dllhost.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 /create với binary lạ, hoặc child process từ task. ComHandler không tạo child, không gọi schtasks nếu attacker dùng API trực tiếp.

Số liệu kỹ thuật cần nhớ

PropertyGiá trị
MITRE IDT1546.015 (Event Triggered Execution: COM Hijacking)
Privilege requiredStandard user (non-admin)
Surrogate processC:\Windows\System32\dllhost.exe
Hive ưu tiênHKCU thắng HKLM trong HKCR merge
Registry key coreHKCU\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

TechniquePrivilegeStealthEDR visibility
Run / RunOnce keysUserThấpCao
Scheduled Task <Exec>UserTrungCao (4698 + cmdline)
Scheduled Task <ComHandler>UserCaoThấp
Service installAdminTrungCao
WMI event subscriptionAdminCaoTrung

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:

  1. List tất cả scheduled task có ComHandler:
    Get-ScheduledTask | Where-Object { $_.Actions.ClassId } | Select TaskName, TaskPath, @{n='ClassId';e={$_.Actions.ClassId}}
  2. 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à InprocServer32 trỏ đi đâu khác nhau → red flag.
  3. Sysmon: alert Event ID 12/13 (registry create/modify) cho path HKCU\Software\Classes\CLSID\*\InprocServer32.
  4. Sysmon Event ID 7: alert DLL không-Microsoft load vào dllhost.exe với arg /Processid:{GUID}.
  5. 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.