EDR-Freeze cho thấy một chân lý đơn giản: kẻ tấn công luôn nhắm vào những giải pháp ngăn chặn chúng. Endpoint agent vì thế trở thành nhóm mục tiêu hàng đầu vì EDR chính là lớp phòng thủ quan trọng bảo vệ trực tiếp trên thiết bị người dùng.
Chỉ cần bị tạm dừng hoặc suy yếu, chúng sẽ mở ra một “khoảng trống” để tin tặc tự do di chuyển trong hệ thống, đánh cắp thông tin đăng nhập hoặc cài đặt mã độc với rủi ro bị phát hiện thấp hơn rất nhiều. Đây cũng là lý do tại sao hầu hết những cuộc tấn công ransomware hoặc APT đều tìm cách xử lý EDR ngay từ giai đoạn đầu tiên trước khi triển khai bước tiếp theo.
EDR-Freeze là gì?
EDR-Freeze là một công cụ thử nghiệm mới, tự động hóa quy trình khởi tạo một tiến trình dumper và sử dụng cơ chế minidump để tạm ngừng hoạt động của các phần mềm EDR, antivirus. Sau khi tạm dừng, công cụ giữ tiến trình EDR ở trạng thái bị “đóng băng”. Kết quả là các runtime hook của agent bị vô hiệu hóa, tạo điều kiện cho kẻ tấn công thực hiện các bước tiếp theo mà không bị phát hiện.
Những điểm nổi bật của EDR-Freeze
Chạy ở chế độ người dùng (user-mode), không cần driver
EDR-Freeze không phụ thuộc vào BYOVD (Bring Your Own Vulnerable Driver) hay driver kernel tuỳ chỉnh để vô hiệu hoá cơ chế bảo vệ của agent, nó hoạt động ở chế độ người dùng và tận dụng các thành phần hợp pháp của hệ điều hành (Windows Error Reporting / WerFaultSecure.exe). Điều này tạo điều kiện thuận lợi cho kẻ tấn công chỉ cần họ có quyền trên máy chủ.
Nhắm vào các tiến trình được bảo vệ thông qua cơ chế PPL (Protected Process Light)
PoC có chứa đoạn mã để khởi tạo một tiến trình con chạy ở mức bảo vệ PPL. Mục đích là để tiến trình dumper được khởi chạy như tiến trình con có khả năng thao tác tới những tiến trình EDR vốn được bảo vệ bằng PPL. Đây chính là chìa khóa chính giúp kẻ tấn công có thể nhắm tới các agent endpoint hiện đại. Tuy nhiên việc tạo tiến trình ở mức PPL đòi hỏi kết hợp các thuộc tính khởi tạo tiến trình đặc biệt (ví dụ PROC_THREAD_ATTRIBUTE_PROTECTION_LEVEL
) và API tạo tiến trình mở rộng.
Không cần khai thác kernel để ngừng giám sát
EDR-Freeze lợi dụng hành vi của API tạo minidump (MiniDumpWriteDump
/ WER). Khi Windows tạo một minidump bằng MiniDumpWriteDump
(hoặc qua Windows Error Reporting), hệ thống tạm dừng các luồng trong tiến trình mục tiêu để snapshot trạng thái nhất quán của bộ nhớ trong lúc lấy thông tin. PoC lợi dụng đúng hành vi này rồi ngăn không cho tiến trình dumper khôi phục các luồng đó, khiến tiến trình EDR tiếp tục bị treo. EDR-Freeze đã biến đặc tính đó thành một công cụ để làm suy yếu khả năng giám sát.
Đọc thêm: Làm sao để phòng thủ trước Android Kernel Remote Code Execution Vulnerability?
Tác động về mặt vận hành
Nếu kẻ tấn công có thể tạm dừng một tiến trình EDR trong một khoảng thời gian dù rất ngắn, họ sẽ có thể thực hiện các hoạt động nhạy cảm như trích xuất thông tin xác thực (LSASS dump), thiết lập persistence, chuẩn bị payload hay di chuyển ngang với khả năng bị phát hiện thấp.
Tóm lại, PoC này mang lại cho kẻ tấn công rất nhiều điều, nó chứng minh một kỹ thuật thực tế không phải lúc nào cũng cần phải khai thác ở mức kernel khi muốn nhắm tới những cơ chế bảo vệ mà các nhà cung cấp triển khai.
Vì EDR-Freeze tận dụng hoàn toàn các công cụ và API gốc của Windows, nó dễ dàng tích hợp vào quy trình tấn công thực tế của tội phạm mạng không cần driver tùy chỉnh hay khai thác phức tạp. Điều này khiến nó vừa khó phát hiện, vừa dễ dùng trong các chiến dịch tấn công. Đặc biệt trong các cuộc tấn công ransomware, giai đoạn thu thập credential là một bước quan trọng.
Trước đây, kẻ tấn công thường dựa vào các công cụ như Mimikatz hoặc dump tiến trình LSASS để lấy mật khẩu. Các EDR hiện đại đã có cơ chế phòng thủ khá hiệu quả với những kỹ thuật này. Tuy nhiên, nếu dùng EDR-Freeze để đóng băng agent EDR, kẻ tấn công có thể vô hiệu hóa tạm thời các biện pháp bảo vệ đó và tiến hành dump credential một cách thuận lợi hơn.
Phân tích chuyên sâu về EDR-Freeze
ARC Labs đã phân tích mã nguồn của công cụ và các hoạt động chính của công cụ như sau:
Công cụ tạo một handle trỏ tới một file dump tạm (mặc định là t.txt
) và đánh dấu handle này là có thể kế thừa. Đồng thời nó tạo thêm một sự kiện hủy cũng được đánh dấu là có thể kế thừa.
PoC khởi chạy WerFaultSecure.exe (trình tạo dump của Windows Error Reporting) ở mức Protected Process Light bằng cách sử dụng các thuộc tính khởi tạo tiến trình mở rộng. Mục đích để WerFault có thể thao tác trực tiếp với các tiến trình vốn được bảo vệ, điều mà một tiến trình ở user-mode thông thường không làm được. Quá trình này được hỗ trợ bởi một module phụ trợ có tên PPLProcessCreator.
PoC chuyển các handle có thể kế thừa cho tiến trình dumper thông qua tham số dòng lệnh (ví dụ: /encfile <handle>
, /cancel <handle>
), đồng thời gửi/pid
và /tid
để chỉ định tiến trình và luồng mục tiêu. Việc truyền handle như trên cho phép dumper ghi trực tiếp vào handle đó thay vì mở file theo đường dẫn giúp các thao tác ghi dump có thể tránh một số kiểm tra dựa trên tên hoặc đường dẫn file. PoC gán cứng tham số "/type 268310"
(chú thích trong mã là // dump full
) , cho biết PoC yêu cầu tạo full-dump thay vì chỉ một minidump rút gọn. Công cụ cũng luôn truyền /h
để chạy dumper ở chế độ không giao diện (headless).
Khi dumper bắt đầu tạo dump, nó sẽ tạm dừng các luồng trong tiến trình mục tiêu để chụp một snapshot nhất quán. PoC chạy một luồng giám sát song song, luồng này chờ đến khi tiến trình mục tiêu đã ở trạng thái bị tạm dừng, rồi tạm dừng chính tiến trình dumper (hoặc dùng cách khác để ngăn dumper hoàn tất việc tạo dump).
Kết quả là tiến trình mục tiêu vẫn bị giữ ở trạng thái paused. Sau khi hoàn tất các thao tác cần thiết, PoC kết thúc tiến trình dumper, lúc đó tiến trình mục tiêu được phép khôi phục và tiếp tục chạy bình thường.
Để dọn dẹp dấu vết, PoC cũng xóa file tạm t.txt
sau khi hoàn tất (thông qua lệnh DeleteFileW(L"t.txt")
), vì vậy các dấu vết trên ổ đĩa thường chỉ xuất hiện trong thời gian ngắn
Các module chính và các hàm liên quan
Module PPLProcessCreator
PoC thiết lập thuộc tính khởi tạo tiến trình bằng cách gọi InitializeProcThreadAttributeList và UpdateProcThreadAttribute(…, PROC_THREAD_ATTRIBUTE_PROTECTION_LEVEL, …) để yêu cầu hệ điều hành khởi tạo tiến trình con ở mức bảo vệ cụ thể (ví dụ PROTECTION_LEVEL_ANTIMALWARE_LIGHT một giá trị PPL). Sau khi gán thuộc tính này vào STARTUPINFOEX, PoC gọi CreateProcessW với cờ EXTENDED_STARTUPINFO_PRESENT | CREATE_PROTECTED_PROCESS và đặt bInheritHandles = TRUE. Kết quả là PoC khởi chạy một tiến trình dumper ở chế độ PPL và tiến trình này kế thừa các handle (file dump và cancel event) do tiến trình mẹ tạo.
Modules ProcessMisc
- Bật quyền debug
- Hàm
EnableDebugPrivilege()
sẽ gọiAdjustTokenPrivileges
để kích hoạt đặc quyền SeDebugPrivilege. - Quyền này cho phép tiến trình hiện tại có thể mở hoặc liệt kê các tiến trình hệ thống.
- Hàm
- Liệt kê tiến trình và luồng
- Gọi
NtQuerySystemInformation(SystemProcessInformation)
để lấy thông tin toàn bộ tiến trình và luồng. - Dùng dữ liệu này để:
- Tìm luồng chính của tiến trình mục tiêu.
- Kiểm tra xem luồng có đang ở trạng thái bị suspend hay không.
- Gọi
- Cung cấp các primitive điều khiển tiến trình
SuspendProcessByPID
: resolve lấy địa chỉ hàmNtSuspendProcess
và gọi nó để tạm dừng tiến trình, sau khi đã mở tiến trình với quyền PROCESS_SUSPEND_RESUME.TerminateProcessByPID
: dừng hẳn một tiến trình theo PID.
Các giá trị và tham số cần quan tâm
"/type 268310"
tác giả repo chú thích là// dump full
. Giá trị số này được gán cứng vào dòng lệnh khi gọi dumper.t.txt
PoC tạo một tệp tạm có tênt.txt
trong thư mục làm việc hiện tại của tiến trình và đánh dấu handle của nó là có thể kế thừa, sau đó công cụ cố gắng xóa tệp này sau khi hoàn tất. Vì đường dẫn là tương đối và tệp bị xóa khi kết thúc, file này thường tồn tại trong thời gian ngắn và có thể xuất hiện ở các thư mục khác nhau tùy cách khởi chạy công cụ."/encfile"
và"/cancel"
dumper nhận các định danh handle thông qua các cờ này, công cụ sử dụng hàmHandleToDecimal(...)
để chuyển giá trị handle thô thành dạng số thập phân và truyền nó trên dòng lệnh."/h"
cho biết dumper chạy ở chế độ headless, tức chạy tự động không cần tương tác người dùng.- Các công cụ trong repo bao gồm: PPL helper (tạo tiến trình ở mức PPL), process helper (bật đặc quyền, suspend/terminate tiến trình, v.v.) và logic luồng giám sát. Toàn bộ kho mã giúp tự động hoá việc canh thời điểm và điều phối race condition cần thiết để “đóng băng” tiến trình mục tiêu.
Tại sao EDR-Freeze không chỉ là gọi WerFaultSecur đơn thuần?
Một vài nhận định ban đầu cho rằng EDR-Freeze chỉ là một wrapper gọi WerFaultSecure.exe
kèm vài tham số dòng lệnh, nhưng thực tế PoC còn thực hiện thêm nhiều bước phụ trợ. những bước này làm cho kỹ thuật trở nên khả thi hơn khi tấn công các mục tiêu.
- PoC không cho dumper mở file theo tên mà tạo một handle tới file, đánh dấu handle đó là có thể kế thừa và truyền handle cho tiến trình dumper. Dumper sau đó ghi trực tiếp vào handle được truyền mà không cần mở file theo đường dẫn.
- Nhiều tiến trình EDR được bảo vệ bằng cơ chế PPL và chỉ khi một “dumper” chạy ở mức bảo vệ tương ứng thì mới được phép thao tác trên tiến trình đó. Vì vậy trong Poc có chứa mã để tạo một tiến trình ở mức PPL, nếu không có bước này thì lời gọi
WerFaultSecure.exe
chạy ở user-mode bình thường thường không thể truy cập tiến trình PPL. - PoC chạy một luồng giám sát song song với tiến trình dumper. Luồng này liên tục kiểm tra trạng thái của tiến trình mục tiêu và phát hiện khi nào thao tác tạo dump đã tạm dừng các luồng của target. Ngay khi xác nhận target bị suspended, luồng giám sát tạm dừng luôn tiến trình dumper khiến tiến trình mục tiêu vẫn bị giữ ở trạng thái paused. Sau khi kẻ tấn công hoàn tất các hành động cần làm trong môi trường hiện tại, PoC sẽ kết thúc tiến trình dumper để cho tiến trình mục tiêu được khôi phục.
Các dấu hiệu giúp phát hiện EDR-Freeze
- Poc tạo tiến trình với
WerFaultSecure.exe
được khởi chạy kèm với các token dòng lệnh như/encfile
,/cancel
và/type 268310
(cùng với/pid
và/h
) là một mẫu hành vi rất đặc trưng cho flow tạo full-dump. Việc tìm kiếm đồng thời những token trên sẽ giúp giảm false positives đáng kể. Lưu ý: dù việc chạyWerFaultSecure.exe
với các tham số dòng lệnh là tương đối hiếm, nhưng ARC Labs vẫn phát hiện một số hoạt động hợp lệ sử dụng các tham số làm đầu vào. Vì vậy, cần kết hợp đối chiếu các số PID nhạy cảm và số lần thực thiWerFaultSecure.exe
thành công để tránh nhầm lẫn giữa hoạt động hợp pháp và đáng ngờ. - Khi một tiến trình cố gắng truy cập vào tiến trình EDR/AV (như
MsMpEng.exe
,MsSense.exe
hoặc các binary agent khác) với quyềnPROCESS_SUSPEND_RESUME
(0x0800 / 2048), hành vi này sẽ được ghi nhận là một sự kiện ProcessAccess. Sysmon (Event ID 10 – ProcessAccess) hoặc logProcessAccess
từ Microsoft Defender sẽ ghi lại trường AccessMask/GrantedAccess, trong đó bạn sẽ thấy giá trị0x0800
nếu tiến trình yêu cầu quyền tạm dừng. - Việc tạo và xóa file
t.txt
(chỉ tồn tại trong thời gian ngắn) trong mã PoC, filet.txt
được gán cố định làm file tạm. Do đó, bạn nên theo dõi các chuỗi hoạt động tạo file rồi xóa file trên máy (ở bất kỳ thư mục nào). Vì file này được tạo với đường dẫn tương đối và sẽ bị xóa ngay sau đó, cách hiệu quả nhất để phát hiện là phải ghi nhận sự kiện tạo và xóa file (qua Sysmon hoặc Windows file auditing). - PoC sử dụng
PROC_THREAD_ATTRIBUTE_PROTECTION_LEVEL
vàCREATE_PROTECTED_PROCESS
để tạo các tiến trình được khởi tạo với thuộc tính bảo vệ PPL. Nếu telemetry của bạn tiết lộ mức bảo vệ của tiến trình (một số EDR có cung cấp), hãy đặt cảnh báo cho những tiến trình lạ được tạo với mức PPL (ví dụANTIMALWARE_LIGHT
) trừ các nhị phân chính thức của nhà cung cấp EDR. - Agent heartbeat / telemetry gaps: khi tiến trình EDR bị treo, cơ chế heartbeat hoặc luồng telemetry của agent sẽ bị ngắt quãng. Để phát hiện chính xác hơn, nên đối chiếu việc mất heartbeat với sự kiện khởi tạo
WerFaultSecure.exe
và các sự kiệnProcessAccess
. - Thay đổi đặc quyền: công cụ này tự động kích hoạt SeDebugPrivilege thông qua việc call API. Việc phát hiện một tiến trình không tin cậy thực hiện nâng đặc quyền (hoặc chỉnh sửa token) là một tín hiệu bổ trợ quan trọng để nhận diện hành vi bất thường.
Bài học rút ra
Kẻ tấn công luôn nhắm vào những phần mềm giám sát và bảo vệ hệ thống. Nếu tạm dừng agent, họ có một khoảng thời gian ngắn để thực hiện hành vi. Việc chỉ bảo vệ ở mức kernel là chưa đủ vì cơ chế hiện nay chỉ cần chạy ở user-mode và tận dụng các thành phần gốc của hệ điều hành.
Hai yêu cầu bắt buộc đối với đội phòng thủ:
- Thu thập đúng dữ liệu giám sát (telemetry): Bao gồm các thuộc tính khi tạo tiến trình, protection levels, các sự kiện file tạm thời, quyền tạm dừng, thay đổi đặc quyền và Agent heartbeat.
- Không phụ thuộc vào một công cụ duy nhất: Hãy kết hợp telemetry từ endpoint với khả năng tương quan của SIEM, thêm các watchdog giám sát agent, và sử dụng playbook phản ứng nhanh để gắn kết các tín hiệu lại với nhau.
Điểm mấu chốt: Đừng chỉ dựa vào một sản phẩm để bảo vệ. Hãy tăng cường hệ thống giám sát và quy trình phản ứng của bạn ngay từ bây giờ.
Đây cũng là lý do CyStack Endpoint được thiết kế để giám sát liên tục, phát hiện bất thường và tự động ứng phó, giúp doanh nghiệp duy trì khả năng phòng thủ ngay cả trước những kỹ thuật tinh vi như EDR-Freeze.
Theo ARC Labs