Khám phá các kỹ thuật chống phân tích mới của phần mềm độc hại GuLoader

09:42 | 25/12/2023

Các nhà nghiên cứu tại công ty an ninh mạng Elastic Security Labs (Singapore) cho biết đã phát hiện các kỹ thuật mới được sử dụng bởi phần mềm độc hại GuLoader để khiến việc phân tích trở nên khó khăn hơn. Một trong những thay đổi này là việc bổ sung các ngoại lệ vào tính năng VEH (Vectored Exception Handler) trong một chiến dịch tấn công mạng mới đây.

Tổng quan

Được phát hiện lần đầu tiên vào cuối năm 2019, GuLoader (còn gọi là CloudEyE) là một trình tải xuống phần mềm độc hại dựa trên shellcode tiên tiến được sử dụng để phân phối nhiều loại payload, chẳng hạn như trình đánh cắp thông tin, đồng thời kết hợp các kỹ thuật chống phân tích tinh vi để né tránh phát hiện bởi các giải pháp bảo mật truyền thống.

Mặc dù chức năng cốt lõi của GuLoader không thay đổi đáng kể trong vài năm qua, thế nhưng tin tặc vẫn cập nhật liên tục về kỹ thuật che giấu mã nguồn khiến việc phân tích phần mềm độc hại này trở thành một quá trình tốn nhiều thời gian và tài nguyên. GuLoader thường lây nhiễm thông qua các chiến dịch lừa đảo, trong đó nạn nhân bị đánh lừa tải xuống và cài đặt phần mềm độc hại thông qua các email chứa kho lưu trữ ZIP hoặc liên kết chứa tệp Visual Basic Script (VBScript).

Vào cuối năm 2022, công ty an ninh mạng CrowdStrike (Mỹ) chia sẻ rằng kỹ thuật chống phân tích shellcode của GuLoader cố gắng ngăn chặn các nhà nghiên cứu thực hiện việc phân tích mã độc trên môi trường ảo hóa bằng cách quét toàn bộ bộ nhớ quy trình để tìm bất kỳ chuỗi nào có liên quan đến máy ảo.

Công ty an ninh mạng Check Point (Israel) vào tháng 9/2023 đã tiết lộ rằng GuLoader được quảng cáo là một công cụ mã hóa khiến cho các giải pháp chống virus hoàn toàn không thể phát hiện được payload của nó. Một trong những thay đổi mới đối với phần mềm độc hại này là cải tiến kỹ thuật chống phân tích tập trung vào VEH. Tính năng này cung cấp cho các ứng dụng Windows khả năng chặn và xử lý các ngoại lệ trước khi chúng được chuyển qua tiến trình ngoại lệ tiêu chuẩn.

Nên nhớ rằng cơ chế này trước đây đã được trình bày chi tiết bởi hãng bảo mật McAfee (Mỹ) vào tháng 5/2023, trong đó nhấn mạnh GuLoader sử dụng VEH chủ yếu để làm xáo trộn luồng thực thi và làm chậm quá trình phân tích. Phương pháp này bao gồm việc phá vỡ luồng thực thi mã thông thường bằng cách cố ý đưa ra một số lượng lớn ngoại lệ.

Shellcode ban đầu

Trong mẫu phân tích của Elastic Security Labs, GuLoader được đóng gói sẵn bên trong NSIS (Nullsoft Scriptable Install System) - Phần mềm tạo ra trình cài đặt dựa trên script-driven dành cho Microsoft Windows và được hỗ trợ bởi Nullsoft. Khi NSIS được giải nén, các thành phần chính bao gồm:

- Tập lệnh NSIS: Tệp của tập lệnh này đề cập đến tất cả các khía cạnh cài đặt và cấu hình khác nhau.

- System.dll: Tệp này được nhúng vào một thư mục tạm thời để thực thi shellcode GuLoader.

Hình 1. Trích xuất tệp System.dll

Có thể thực hiện một phương pháp nhanh chóng để xác định tệp lưu trữ shellcode bằng cách theo dõi các sự kiện ReadFile từ công cụ Process Monitor sau khi thực thi GuLoader. Trong trường hợp này, có thể thấy shellcode được đọc từ một tệp tên là Fibroms.Hag như Hình 2.

Hình 2. Shellcode được đọc từ tệp Fibroms.Hag

GuLoader thực thi shellcode thông qua các lệnh callback bằng cách sử dụng các hàm API Windows khác nhau. Lý do chính của điều này là để tránh bị phát hiện tập trung vào các API Windows truyền thống được sử dụng để chèn các tiến trình, chẳng hạn như CreateRemoteThread hoặc WriteProcessMemory. Các nhà nghiên cứu đã quan sát thấy hai hàm EnumResourceTypesA và CallWindowProcW được GuLoader sử dụng.

Hình 3. Lệnh gọi hàm EnumResourceTypesA bên trong GuLoader

Trong Hình 4, bằng cách xem lại thư viện MSDN (Microsoft Developer Network) cho EnumResourceTypesA, có thể thấy tham số thứ hai chờ đợi một con trỏ tới hàm callback. Shellcode mới được đặt vào đối số này.

Hình 4. Tham số hàm EnumResourceTypesA

Hình 5. Shellcode từ lệnh gọi tham số thứ hai EnumResourceTypesA

Trong các mẫu độc hại gần đây được phân tích, GuLoader đã tăng độ phức tạp và tinh vi của nó khi triển khai shellcode ban đầu bằng cách sử dụng Junk code (đây là một kỹ thuật để thêm các hướng dẫn vô nghĩa hoặc không liên quan vào chương trình, nhằm gây khó khăn hơn cho trình dịch ngược) và bước nhảy khác nhau. Kỹ thuật dịch ngược của trình tải xuống có thể yêu cầu xử lý một quá trình xáo trộn mã (code obfuscation) lâu dài để phá vỡ kiến trúc disassembly và kiểm soát luồng trong một số công cụ, khiến việc tìm ra điểm khởi đầu thực sự của shellcode GuLoader trở nên khó khăn.

Một phương pháp để tìm lệnh gọi ban đầu có thể tận dụng chế độ xem biểu đồ (graph view) bên trong x64dbg và sử dụng cách tiếp cận từ dưới lên trên để tìm kiếm hướng dẫn call eax.

Cập nhật VEH 

Như đã đề cập, một trong những kỹ thuật mới của GuLoader tập trung vào VEH. Các họ phần mềm độc hại thường sử dụng kỹ thuật này để gây khó khăn cho các nhà phân tích và công cụ theo dõi mã độc.

GuLoader bắt đầu bằng cách thêm VEH thông qua hàm RtlAddVectoredExceptionHandler. Trong suốt quá trình thực thi shellcode, có mã được cố ý đặt để kích hoạt các ngoại lệ khác nhau này. Khi những ngoại lệ được kích hoạt, VEH sẽ kiểm tra các điểm dừng (breakpoint) của phần cứng.

Nếu không tìm thấy, GuLoader sẽ sửa đổi EIP trực tiếp thông qua cấu trúc CONTEXT bằng cách sử dụng khóa XOR một byte (thay đổi trên mỗi mẫu) với địa chỉ offset một byte từ nơi ngoại lệ xảy ra. Dưới đây là nội dung dịch ngược VEH trong mẫu phân tích của các nhà nghiên cứu.

Hình 6. Dịch ngược VEH

Mặc dù kỹ thuật này không mới nhưng GuLoader vẫn tiếp tục bổ sung thêm các ngoại lệ theo thời gian. Gần đây Elastic Security Labs đã quan sát thấy hai trường hợp ngoại lệ được thêm vào trong vài tháng qua, bao gồm: EXCEPTION_PRIV_INSTRUCTION và EXCEPTION_ILLEGAL_INSTRUCTION. Cùng tìm hiểu hai trường hợp ngoại lệ này để theo dõi tiến trình làm việc của VEH.

Ngoại lệ EXCEPTION_PRIV_INSTRUCTION

Ngoại lệ đầu tiên, EXCEPTION_PRIV_INSTRUCTION xảy ra khi cố gắng thực hiện một lệnh đặc quyền không được phép trong tập lệnh của bộ xử lý. Một số hướng dẫn nhất định, như ví dụ Hình 7 với WRSMR yêu cầu các đặc quyền từ kernel, vì vậy khi chương trình được chạy từ chế độ người dùng (user mode), nó sẽ kích hoạt ngoại lệ do các quyền không chính xác.

Hình 7. EXCEPTION_PRIV_INSTRUCTION được kích hoạt bởi lệnh wrmsr

Ngoại lệ EXCEPTION_ILLEGAL_INSTRUCTION

Ngoại lệ thứ hai được gọi khi một chương trình cố gắng thực thi một lệnh CPU không hợp lệ hoặc không xác định. Trong mẫu phân tích, khi các nhà nghiên cứu chạy các lệnh ảo hóa của Intel như vmclear hoặc vmxon, điều này sẽ gây ra một ngoại lệ.

Hình 8. EXCEPTION_ILLEGAL_INSTRUCTION được kích hoạt bởi lệnh vmclear

Khi một ngoại lệ xảy ra, GuLoader VEH trước tiên sẽ xác định mã ngoại lệ nào chịu trách nhiệm cho ngoại lệ đó. Phần mềm độc hại sau đó kiểm tra mọi điểm dừng phần cứng bằng cách duyệt qua bản ghi CONTEXT được tìm thấy bên trong cấu trúc EXCEPTION_POINTERS. Nếu tìm thấy điểm dừng phần cứng trong các thanh ghi gỡ lỗi khác nhau, GuLoader sẽ trả về giá trị 0 vào bản ghi CONTEXT, điều này sẽ khiến shellcode bị lỗi.

Hình 9. GuLoader giám sát các điểm dừng phần cứng

Nếu không có điểm dừng phần cứng, khi sử dụng lệnh cuối với vmclear, phần mềm độc hại sẽ truy xuất byte 0x8A.

Hình 10. Truy xuất byte 0x8A

Sau đó, bằng cách sử dụng byte này, nó sẽ thực hiện thao tác XOR với một byte được mã hóa cứng khác. Trong trường hợp này là byte 0xB8, với giá trị offset 0x32 (0xB8^0x8A), GuLoader sẽ sửa đổi địa chỉ EIP trực tiếp từ bản ghi CONTEXT bằng cách thêm 0x32 vào địa chỉ trước đó (0x7697630) đã gây ra ngoại lệ dẫn đến mã tiếp theo được thực thi từ địa chỉ 0x7697662.

Luồng điều khiển

Để làm cho việc theo dõi luồng điều khiển trở nên dễ dàng hơn, các nhà phân tích có thể vượt qua VEH bằng cách theo dõi quá trình thực thi, ghi nhật ký (log) các ngoại lệ và vá shellcode bằng thuật toán sửa đổi EIP đã thảo luận trước đó.

Đối với quy trình này, các nhà nghiên cứu đã sử dụng công cụ TinyTracer. Điều này sẽ cho phép các nhà phân tích nắm bắt các địa chỉ khác nhau đã kích hoạt ngoại lệ, vì vậy, sử dụng ví dụ trên với vmclear, địa chỉ 0x7697630 đã tạo ra một lệnh gọi ngoại lệ KiUserExceptionDispatcher, một chức năng chịu trách nhiệm xử lý các ngoại lệ ở chế độ người dùng.

Kết luận

GuLoader có nhiều tính năng khác nhau có thể phá vỡ cấu trúc disassembly, cản trở luồng điều khiển và gây khó khăn cho việc phân tích của các nhà nghiên cứu. Dựa trên những thay đổi của phần mềm độc hại này, rất có thể các hành vi trong tương lai sẽ yêu cầu các chiến lược mới và có sự khác biệt.

GuLoader không phải là dòng phần mềm độc hại duy nhất nhận được các bản cập nhật liên tục. Một ví dụ đáng chú ý khác là DarkGate, một trojan truy cập từ xa (RAT) cho phép kẻ tấn công xâm phạm hoàn toàn hệ thống của nạn nhân. Được bán dưới dạng phần mềm dịch vụ độc hại (MaaS) bởi một tài khoản có tên RastaFarEye trên các diễn đàn ngầm với mức phí hàng tháng là 15.000 USD, phần mềm độc hại này sử dụng email lừa đảo có chứa các liên kết để phân phối vectơ lây nhiễm ban đầu: VBScript hoặc Microsoft Software Installer (MSI).