Skip to main content

Ẩn mình sau vỏ bọc OpenAI và Windows Update: Chiến dịch gián điệp mạng tinh vi của NetamLoader

Updated 27 min readMarkdown
Ẩn mình sau vỏ bọc OpenAI và Windows Update: Chiến dịch gián điệp mạng tinh vi của NetamLoader

Tóm Tắt Chiến Dịch

Trong nửa đầu năm 2026, đội ngũ nghiên cứu an ninh mạng toàn cầu Kaspersky GReAT phát hiện một chiến dịch gián điệp mạng tinh vi sử dụng một framework độc hại chưa từng được ghi nhận mang tên NetamLoader. Mục tiêu của chiến dịch là các thực thể chính phủ tại Châu Á vận hành một bản phân phối hệ điều hành Windows 10 được tùy biến riêng (custom government OS build). Đáng chú ý, toàn bộ chuỗi lây nhiễm được thiết kế nhằm ngụy trang hoàn hảo dưới vỏ bọc các gói cập nhật hệ điều hành và công cụ quản trị bản vá của bên thứ ba, cho thấy dấu hiệu rõ ràng của một cuộc tấn công chuỗi cung ứng (supply-chain attack) hoặc xâm nhập hạ tầng phân phối phần mềm nội bộ.

Thay vì khai thác các lỗ hổng zero-day trong kernel, kẻ tấn công kết hợp một chuỗi các kỹ thuật "Living off the Land" (LotL) bậc thầy trên nền tảng .NET Framework và ngôn ngữ đánh dấu XAML (Extensible Application Markup Language). Mã độc lạm dụng kỹ thuật AppDomainManager Injection để nạp assembly ký bởi Microsoft, kích hoạt lỗi thiết kế trong DataCacheFactoryConfiguration thông qua tệp fabric.config, từ đó giải mã và kích hoạt lỗ hổng giải tuần tự hóa (BinaryFormatter deserialization) bằng kỹ thuật TypeConfuseDelegate. Đáng kinh ngạc hơn, toàn bộ logic mã độc sau đó được biểu diễn dưới dạng các đoạn mã XAML đa tầng, tự giải mã động bằng khóa AES sinh ra từ hàm băm SHA-256 của chính dòng lệnh tiến trình (environmental keying), vượt qua AMSI bằng cách hoán đổi bảng con trỏ hàm ảo (VTable) mà không sửa đổi trang nhớ của DLL, ngắt ETW telemetry, và tách rời cây tiến trình sang dllhost.exe thông qua Remote COM RPC.

Bối Cảnh Phát Hiện & Dấu Vết Hệ Điều Hành Chuyên Dụng

Sự việc bắt đầu từ một cảnh báo bất thường từ mạng lưới tình báo mối đe dọa Kaspersky Security Network (KSN). Cảnh báo ghi nhận một tệp cấu hình .config lạ kích hoạt cơ chế AppDomainManager Injection được đóng gói bên trong tệp nén CAB mang mã băm:

C:\Windows\SoftwareDistribution\Download\e4537a1762fcafd2fd96bfc825bad34f9db9a24d

Đường dẫn trên thuộc thư mục chuẩn của dịch vụ Windows Update (SoftwareDistribution\Download), nơi lưu trữ tạm thời các bản cập nhật trước khi được cài đặt vào hệ thống. Trong quá trình điều tra ban đầu, hầu hết các tệp thực thi bên trong kho lưu trữ CAB đều là các thành phần hợp lệ, mang chữ ký số hợp lệ của tiện ích quản trị bản vá bên thứ ba Patch My PC, và ngay cả các tệp .dll của .NET đi kèm cũng đều có chữ ký số của chính Microsoft. Chỉ có một tệp tài nguyên duy nhất là Resources.resx mang nội dung nhị phân bị xáo trộn.

Một dấu hiệu đặc biệt quan trọng hé lộ mục tiêu thực sự của chiến dịch nằm ở hành vi dọn dẹp nhật ký của mã độc. Trong giai đoạn sau của chuỗi tấn công, mã độc tiến hành rà soát và lọc bỏ dòng nhật ký trong các tệp tin theo mẫu:

%WINDIR%\Logs\CmitUpdateAgent\20????\20??????

Chuỗi định danh CmitUpdateAgent gắn liền với thành phần cập nhật phần mềm của các bản phân phối hệ điều hành Windows 10 được phát triển, tùy biến riêng cho các tổ chức chính phủ tại một quốc gia Châu Á. Điều này khẳng định kẻ tấn công đã nghiên cứu kỹ lưỡng môi trường vận hành nội bộ của nạn nhân, nắm rõ quy trình cập nhật tự động và cấu trúc thư mục của hệ điều hành chuyên biệt này để cấy gói cài đặt độc hại.

Timeline Sự Kiện & Chu Kỳ Chiến Dịch

Thời điểm Sự kiện & Diễn biến kỹ thuật
27/09/2023 Kẻ tấn công đăng ký tên miền C2 openaigpt4v[.]com qua nhà cung cấp Cloudflare, thiết lập vỏ bọc ngụy trang dịch vụ trí tuệ nhân tạo.
Nửa đầu 2026 Mã độc xuất hiện trên hệ thống của một cơ quan chính phủ Châu Á. KSN ghi nhận cảnh báo liên quan đến tệp cấu hình nạp assembly bất thường qua AppDomainManager.
Tháng 10/2026 Đội ngũ Kaspersky GReAT giải mã hoàn chỉnh cấu trúc nạp XAML đa tầng, công bố phân tích toàn diện về NetamLoader tại hội nghị Security Analyst Summit (SAS).
29/10/2026 Securelist chính thức công bố báo cáo kỹ thuật; các trang tin an ninh mạng quốc tế (TechNadu, CyberSecurityNews) cảnh báo về nguy cơ tấn công chuỗi cung ứng nhắm vào hệ điều hành chính phủ.
04/11/2026 FPT IS SOC hoàn tất phân tích đối chiếu TTPs, thiết lập các hunting rule phát hiện hành vi lạm dụng AppDomainManager và bypass AMSI qua VTable.

Phân Tích Kỹ Thuật Chi Tiết

Chuỗi lây nhiễm của NetamLoader trải qua 5 giai đoạn lồng ghép với cấu trúc mô-đun hóa cao độ. Thay vì thực thi trực tiếp mã nhị phân độc hại trên đĩa, mã độc sử dụng các lớp nạp XAML trung gian để giải mã từng thành phần trong bộ nhớ. Toàn cảnh kiến trúc chuỗi tấn công được thể hiện chi tiết qua sơ đồ dòng chảy dưới đây:

Giai đoạn 1: Đột nhập thư mục Windows Update & Kích hoạt AppDomainManager Injection

Mã độc xuất hiện dưới dạng một gói CAB mang mã định danh SHA-1 đặt tại thư mục tải về của Windows Update. Khi được giải nén vào đường dẫn C:\Windows\SoftwareDistribution\Download\Install\, gói lưu trữ bao gồm 7 tệp tin:

  • PatchMyPC-ScriptRunner.exe: Tệp thực thi hợp lệ thuộc công cụ quản lý bản vá Patch My PC.
  • PatchMyPC-ScriptRunner.exe.config: Tệp cấu hình .NET bị kẻ tấn công can thiệp.
  • fabric.config: Tệp cấu hình phụ trợ phục vụ nạp tài nguyên.
  • Resources.resx: Tệp tài nguyên chứa payload tuần tự hóa độc hại.
  • Các tệp thư viện liên kết động (.NET assembly) chính thống được ký bởi Microsoft (Microsoft.HostIntegration.Connectors.dll...).

Quá trình kích hoạt bắt đầu khi tiến trình PatchMyPC-ScriptRunner.exe được chạy cùng tham số dòng lệnh:

C:\Windows\SoftwareDistribution\Download\Install\PatchMyPC-ScriptRunner.exe -updatepackage -applicationid=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Do PatchMyPC-ScriptRunner.exe là một ứng dụng viết trên nền .NET CLR, trước khi hàm Main() của chương trình được gọi, CLR sẽ tự động tìm kiếm và nạp tệp cấu hình đi kèm PatchMyPC-ScriptRunner.exe.config nằm cùng thư mục. Kẻ tấn công đã khai thác kỹ thuật AppDomainManager Injection bằng cách khai báo:

Cấu hình này chỉ thị CLR nạp lớp Microsoft.ApplicationServer.Caching.DataCacheFactoryConfiguration từ assembly Microsoft.HostIntegration.Connectors.dll. Do đây là assembly chuẩn của Microsoft mang chữ ký số xịn, các giải pháp phòng thủ endpoint thông thường sẽ hoàn toàn bỏ qua việc giám sát tệp tin này.

Lạm dụng fabric.config & Lỗ hổng Deserialization TypeConfuseDelegate

Lớp DataCacheFactoryConfiguration là một thành phần cấu hình thuộc Windows Server AppFabric Cache Client. Khi được nạp, hàm khởi tạo của lớp này có một cơ chế mặc định: tự động tìm kiếm và đọc tệp cấu hình mang tên fabric.config trong thư mục hiện hành.

Tệp fabric.config được kẻ tấn công chuẩn bị sẵn với nội dung:

Thuộc tính className yêu cầu DataCacheFactoryConfiguration khởi tạo đối tượng System.Resources.ResXResourceSet từ thư viện System.Windows.Forms và truyền tham số Resources.resx vào constructor của nó.

Bên trong Resources.resx, kẻ tấn công nhúng một đối tượng nhị phân được mã hóa Base64 vốn được tuần tự hóa bằng lớp BinaryFormatter. Khi ResXResourceSet phân tích cú pháp tệp, nó tự động gọi BinaryFormatter.Deserialize(). Đây là điểm mấu chốt kích hoạt kỹ thuật tấn công kinh điển TypeConfuseDelegate — lợi dụng sự nhầm lẫn kiểu dữ liệu của delegate trong .NET để ép buộc CLR thực thi một delegate trỏ tới System.Windows.Markup.XamlReader.Parse().

Thông qua lời gọi XamlReader.Parse(), đoạn mã XAML đầu tiên (XAML-1) ẩn giấu trong đối tượng nhị phân chính thức được nạp vào bộ nhớ.

XAML-1 & Kỹ thuật Environmental Keying khóa chặt theo dòng lệnh

XAML thường được biết đến là ngôn ngữ đánh dấu giao diện cho WPF, nhưng nhờ hai đối tượng System.Windows.Data.ObjectDataProvider và System.Windows.ResourceDictionary, kẻ tấn công có thể biểu diễn logic thực thi lệnh phức tạp tương đương mã nguồn C# thuần túy mà không cần biên dịch thành PE binary.

Đoạn mã XAML-1 đóng vai trò là một loader giải mã tầng tiếp theo, nhưng áp dụng kỹ thuật Environmental Keying vô cùng tinh vi:

  1. Thu thập dòng lệnh: XAML-1 truy xuất chuỗi lệnh thực thi đầy đủ của tiến trình cha PatchMyPC-ScriptRunner.exe, sau đó chuyển toàn bộ thành chữ thường (ToLower()).
  2. Sinh khóa giải mã: Mã độc tính toán giá trị băm SHA-256 của chuỗi dòng lệnh đó để làm khóa AES.
  3. Giải mã tầng 2: Dữ liệu Base64 nhúng trong XAML-1 được tách lấy 16 byte đầu tiên làm vector khởi tạo (IV), phần còn lại được giải mã bằng thuật toán AES với khóa vừa sinh ra. Kết quả giải mã chính là đoạn mã XAML thứ hai (XAML-2).
  4. Nạp bộ nhớ: XAML-2 được đưa vào bộ nhớ thông qua API System.Windows.Markup.XamlReader.Load().
  5. Cơ chế chống dò quét: Nếu quá trình giải mã phát sinh bất kỳ ngoại lệ nào (ví dụ: sandbox phân tích chạy file mà không truyền đúng tham số -updatepackage -applicationid=...), mã độc lập tức gọi lệnh Environment.Exit(0) để âm thầm kết thúc tiến trình, triệt tiêu mọi thông báo lỗi hay crash dump có thể khiến chuyên gia bảo mật chú ý.

Giai đoạn 2: XAML-2-1 — Kỹ thuật AMSI Bypass bằng hoán đổi con trỏ VTable

XAML-2 tiếp tục giải nén hai thành phần con được nén ZIP và mã hóa Base64: XAML-2-1 và XAML-2-2.

Thành phần XAML-2-1 bao gồm 796 dòng mã XAML. Mục đích duy nhất của nó là vô hiệu hóa hoàn toàn cơ chế quét bộ nhớ Antimalware Scan Interface (AMSI). Để vượt qua các bộ lọc chữ ký tĩnh, toàn bộ các chuỗi nhạy cảm (tên API, GUID, chuỗi hex) trong XAML-2-1 đều bị băm nhỏ thành các ký tự đơn lẻ hoặc các đoạn cực ngắn (1-2 ký tự) và được ghép lại trong thời gian chạy.

Quy trình bypass AMSI diễn ra như sau:

  1. Kiểm tra kiến trúc: Xác nhận tiến trình đang chạy ở chế độ 64-bit (IntPtr.Size == 8). Nếu không phải, quá trình sẽ dừng lại.
  2. Khởi tạo COM AMSI: Ghép chuỗi để lấy CLSID {fdb00e52-a214-4aa1-8fba-4357bb0072ec} và tạo một thể hiện của đối tượng AMSI COM.
  3. Patch phương thức mồi (Console.Clear):
    • Mã độc tạo một delegate trỏ tới phương thức hệ thống hợp lệ System.Console.Clear() và lấy con trỏ hàm gốc trong bộ nhớ.
    • Ghi đè 10 byte đầu tiên của Console.Clear() bằng chuỗi shellcode
  4. Hoán đổi con trỏ trong VTable (VTable Pointer Swap):
    • Lấy con trỏ gốc IUnknown của đối tượng COM thông qua Marshal.GetIUnknownForObject().
    • Đọc địa chỉ bảng phương thức ảo (VTable) và cộng thêm offset 0x18, nơi chứa con trỏ trỏ tới phương thức CAmsiAntimalware::Scan.
    • Sử dụng VirtualProtect() mở quyền ghi (PAGE_EXECUTE_READWRITE), thay thế con trỏ Scan() bằng địa chỉ của phương thức Console.Clear() đã được patch, sau đó khôi phục lại thuộc tính bảo vệ bộ nhớ ban đầu.

Kỹ thuật này đạt đến trình độ né tránh EDR thượng thừa. Kẻ tấn công không hề can thiệp hay sửa đổi bất kỳ byte nào trên các trang bộ nhớ của thư viện amsi.dll. Mọi cơ chế kiểm tra tính toàn vẹn mã (Code Integrity / Memory Scanning của Defender hay EDR) nhắm vào amsi.dll đều báo trạng thái nguyên bản. Mọi lệnh quét AMSI tiếp theo sẽ được chuyển hướng thẳng tới Console.Clear() và luôn trả về kết quả AMSI_RESULT_CLEAN (0).

Giai đoạn 2: XAML-2-2 & .NET 1 Loader — Phân tích cấu hình C2 JSON-1

Song song với việc vô hiệu hóa AMSI, thành phần XAML-2-2 giải nén tệp thực thi .NET đầu tiên (.NET 1 Loader) cùng tệp cấu hình dạng JSON (JSON-1), sau đó gọi hàm khởi tạo Assembly.CreateInstance() và truyền dữ liệu vào phương thức m.C().

Cấu hình JSON-1 được chia thành hai nhánh độc lập:

1. Nhánh báo cáo C2 (JSON-1-c)

Chứa các tham số phục vụ việc thông báo trạng thái lây nhiễm ban đầu về máy chủ điều khiển:

  • sc: Cờ boolean (đặt là false để tạm hoãn gửi báo cáo nếu chưa đủ điều kiện).
  • c: Địa chỉ C2 server tiếp nhận báo cáo thực thi của hàm m.C().
  • tp: Thumbprint chứng chỉ SSL đáng tin cậy.
  • e: Khóa AES dùng để mã hóa kết quả thực thi trả về.

2. Nhánh cấu hình payload kế tiếp (JSON-1-p)

Đây là khối dữ liệu trung tâm điều phối các giai đoạn tiếp theo của mã độc:

Bóc tách các trường tham số cốt lõi:

  • oib: Chứa toàn bộ mã nhị phân PE dạng Base64 của backdoor chính (.NET 2 Plugin).
  • oub: Đoạn mã XAML ngắn gọi hàm Environment.Exit(0) dùng cho cơ chế tự hủy.
  • ibk: Khóa AES dùng để giải mã trường ibi.
  • ibi: Tập hợp các mẫu template XAML đã được nén và mã hóa dùng để lắp ráp thành XAML-3.
  • cu: Danh sách URL của máy chủ C2 (https://openaigpt4v[.]com/model_v4/).
  • tp: Thumbprint SSL đặt dấu * (chấp nhận mọi chứng chỉ TLS/SSL, vô hiệu hóa việc xác thực chứng thực).
  • mis & mas: Thời gian chờ ngẫu nhiên ban đầu từ 1.200 đến 2.400 giây (20 đến 40 phút).
  • mib & mab: Khoảng thời gian gửi tín hiệu beacon định kỳ từ 79.200 đến 100.800 giây (22 đến 28 tiếng).
  • wi: Giới hạn thời gian sống tối đa của tiến trình là 100.801 giây (~28 tiếng).

Giai đoạn 3: Bẻ gãy cây tiến trình qua RPC Remote COM Injection & Tắt ETW Telemetry

Trước khi chuyển giao quyền kiểm soát sang backdoor chính, .NET 1 Loader thực hiện một bước ngoặt về phòng thủ hành vi: Bẻ gãy cây tiến trình (Process Tree Disassociation).

Hầu hết các giải pháp EDR thế hệ mới đều dựa trên mô hình quan hệ cha-con (Parent-Child Process Relationship) để phát hiện bất thường: Nếu PatchMyPC-ScriptRunner.exe sinh ra kết nối mạng ra ngoài hoặc kích hoạt các tiến trình nhạy cảm, EDR sẽ gắn cờ cảnh báo ngay lập tức. Để đối phó, mã độc thực hiện:

1. Làm mù .NET ETW Telemetry: Khởi tạo đối tượng COM WScript.Shell (CLSID: 41904400-BE18-11D3-A28B-00104BD35090), can thiệp vào biến môi trường của tiến trình hiện tại và thiết lập:

COMPlus_ETWEnabled = 0

Giá trị này ngăn chặn .NET CLR đăng ký Event Tracing for Windows (ETW) provider, vô hiệu hóa hoàn toàn luồng giám sát hành vi nạp module và biên dịch JIT của các bộ cảm biến bảo mật.

2. Tiêm mã qua Remote COM RPC: Sử dụng giao thức RPC để tạo một đối tượng COM từ xa với CLSID {ab8902b4-09ca-4bb6-b78d-a8f59079a8d5}. Lỗ hổng giải tuần tự hóa nhị phân kết hợp TypeConfuseDelegate tiếp tục được kích hoạt trên đối tượng COM này.

Kết quả là payload XAML-3 được nạp và kích hoạt bên trong tiến trình hệ thống hợp lệ dllhost.exe hoàn toàn độc lập. Quá trình lây nhiễm chính thức "rũ bỏ" tiến trình cha PatchMyPC-ScriptRunner.exe.

Giai đoạn 4: XAML-3 & .NET 2 Plugin — Thực thi trong Isolated AppDomain và Anti-Analysis

Khi được nạp vào không gian nhớ của dllhost.exe, XAML-3 thực hiện giải mã hai template con: __P1__ (tiếp tục vô hiệu hóa AMSI trong tiến trình dllhost.exe mới) và XAML-P2. Template XAML-P2 giải nén trường oib để nạp tệp PE .NET 2 Plugin và gọi hàm thực thi m.C().

Trong hàm m.C(), một tiểu trình (thread) độc lập được khởi tạo để duy trì quyền kiểm soát với hàng loạt cơ chế đối kháng phân tích:

1. Khóa tiến trình bằng CoLockObjectExternal

Tiến trình dllhost.exe được kích hoạt qua COM RPC thông thường sẽ tự động giải phóng và kết thúc nếu không còn yêu cầu gọi hàm từ client. Để ngăn hệ điều hành đóng tiến trình, mã độc truy xuất interface IUnknown của một managed object và gọi API CoLockObjectExternal(pUnk, TRUE, FALSE) trong ole32.dll. Hành động này khóa đối tượng trong bộ nhớ, giữ cho dllhost.exe tồn tại vĩnh viễn.

2. Thu thập dấu vân tay hệ thống & Khởi tạo định danh

Mã độc truy vấn Registry để trích xuất thông tin phiên bản hệ thống:

  • HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\full -> Lấy giá trị Version.
  • HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion -> Lấy giá trị BuildLab (ví dụ: 17763.rs5_release.180914-1434).
  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate -> Đọc giá trị SusClientId. Sau đó kết hợp với chuỗi byte \x14\x43\x9B\x64 để tính toán ra mã định danh máy trạm si (41bd7f37-c3f6-4a9e-b2f3-5363e9a2c095).

3. Kỹ thuật né tránh Sandbox bằng Jitter Delay & Watchdog

  • Jitter Delay: Trước khi thực hiện bất kỳ kết nối mạng nào về C2, mã độc rơi vào trạng thái ngủ ngẫu nhiên từ 20 đến 40 phút (is="1200-2400"). Hầu hết các sandbox thương mại chỉ theo dõi hành vi trong khoảng 3-10 phút, do đó cơ chế này khiến mã độc được kết luận là vô hại.
  • Watchdog Timer (~28 giờ): Mã độc thiết lập một bộ đếm thời gian tối đa là 100.801 giây (~28 tiếng) từ khóa wi. Khi hết giờ, hàm callback sẽ giải mã trường u trong cấu hình (vốn là đoạn XAML gọi Environment.Exit(0)) để tự hủy tiến trình, không để lại tiến trình bất thường chạy quá lâu trong hệ thống.

4. Kỹ thuật thực thi tải trọng trong AppDomain cô lập (Isolated AppDomain)

Khi nhận lệnh chứa payload XAML mới từ máy chủ điều khiển, .NET 2 Plugin không thực thi trực tiếp trong AppDomain mặc định mà áp dụng kỹ thuật cách ly tuyệt đối:

  • Tạo một AppDomain mới với tên là một chuỗi GUID ngẫu nhiên.
  • Sao chép dữ liệu cấu hình và proxy sang AppDomain mới.
  • Sử dụng kỹ thuật Reflection can thiệp vào mảng nội bộ _invocationList của lớp MulticastDelegate (CrossAppDomainDelegate).
  • Dùng TypeConfuseDelegate thay thế hàm TimeZoneInfo.ClearCachedData() bằng XamlReader.Parse().
  • Gọi AppDomain.DoCallBack() để kích hoạt XamlReader.Parse() thực thi đoạn mã XAML vừa tải về bên trong AppDomain cô lập.
  • Sau khi thực thi xong, mã độc thu hồi kết quả và gọi AppDomain.Unload().

Ưu điểm kỹ thuật: Toàn bộ dấu vết bộ nhớ, đối tượng runtime và mã độc tải thêm sẽ bị CLR giải phóng sạch sẽ khi AppDomain bị hủy, khiến các công cụ chụp dump bộ nhớ (memory forensics) không thể tìm thấy bằng chứng trong AppDomain chính.

Giai đoạn 5: Hạ tầng C2, Kỹ thuật Proxy Discovery & Giao thức Encrypt-then-MAC

Cơ chế dò quét Proxy 3 tầng (Proxy Discovery)

Để đảm bảo khả năng duy trì liên lạc từ các phân vùng mạng cô lập của cơ quan chính phủ, .NET 2 Plugin tích hợp 3 cơ chế dò tìm cấu hình proxy liên hoàn:

  1. Tầng 1 (Hệ thống): Gọi Win32 API WinHttpGetDefaultProxyConfiguration() trong winhttp.dll và trích xuất cấu hình máy chủ proxy bằng biểu thức chính quy: (?:([a-zA-Z]+)=)?(.*).
  2. Tầng 2 (Người dùng hiện hành): Nếu tầng 1 thất bại, mã độc tìm kiếm tiến trình explorer.exe đang hoạt động, thực hiện giả mạo token người dùng (Impersonate()) và gọi API .NET WebProxy.GetDefaultProxy().
  3. Tầng 3 (Dự phòng): Sử dụng thuộc tính mặc định của hệ thống WebProxy.DefaultWebProxy.

Giao thức mã hóa mạng Encrypt-then-MAC

Kênh liên lạc giữa NetamLoader và máy chủ C2 (https://openaigpt4v[.]com/model_v4/) sử dụng kiến trúc mật mã đối xứng cấp độ cao:

  • Khóa chủ (Master Key): Cấu hình trong trường ec: 9fT04e03tAiZAPogcDWt0w== (AES-128).
  • Dẫn xuất khóa con (Key Derivation): Sử dụng thuật toán HMAC-SHA256 kết hợp 4 giá trị seed đơn byte (0, 1, 2, 3) để tạo ra 4 khóa riêng biệt cho phía client và server
Seed Khóa sinh ra phía Client (Malware) Khóa tương ứng phía Server (C2)
0 Khóa giải mã dữ liệu (Decryption Key) Khóa mã hóa dữ liệu (Encryption Key)
1 Khóa xác thực giải mã (Decryption Auth Key) Khóa xác thực mã hóa (Encryption Auth Key)
2 Khóa mã hóa dữ liệu (Encryption Key) Khóa giải mã dữ liệu (Decryption Key)
3 Khóa xác thực mã hóa (Encryption Auth Key) Khóa xác thực giải mã (Decryption Auth Key)

Quá trình đóng gói dữ liệu tuân thủ nghiêm ngặt tiêu chuẩn Encrypt-then-MAC:

  1. Plaintext được mã hóa bằng thuật toán AES-128-CBC với một vector IV ngẫu nhiên 16 byte.
  2. Tính toán mã xác thực thông điệp HMAC-SHA256 trên chuỗi ghép IV (16 bytes) + Ciphertext.
  3. Cấu trúc gói tin hoàn chỉnh: [ IV: 16 bytes ] | [ Ciphertext ] | [ HMAC: 32 bytes ].
  4. Toàn bộ mảng byte được mã hóa Base64 và URL-encode để truyền tải qua tham số b trong yêu cầu HTTPS GET/POST:

Kỹ Thuật Xóa Dấu Vết

Để duy trì khả năng ẩn mình lâu dài trong mạng nội bộ chính phủ, NetamLoader tích hợp quy trình xóa dấu vết điều tra số (Anti-Forensics) ở mức độ cực kỳ tỉ mỉ:

  1. Xóa tệp cài đặt ban đầu: Ngay sau khi nạp xong Stage 2, mã độc lập tức xóa bỏ 3 tệp mồi giải nén từ CAB trong thư mục Download\Install\:

    • PatchMyPC-ScriptRunner.exe.config
    • fabric.config
    • Resources.resx
  2. Xóa nhật ký thực thi .NET (CLR UsageLogs): Xóa tệp log lưu lại lịch sử nạp assembly của CLR: %LOCALAPPDATA%\Microsoft\CLR_v4.0\UsageLogs\PatchMyPC-ScriptRunner.exe.log

  3. Xóa bộ nhớ đệm thực thi của hệ điều hành (Prefetch Cache): Xóa toàn bộ các tệp Prefetch liên quan tới tệp thực thi mồi: %WINDIR%\Prefetch\PATCHMYPC-SCRIPTRUNNER.EXE-*.pf

  4. Thanh lọc nhật ký hệ thống chuyên biệt CmitUpdateAgent: Mã độc duyệt các tệp nhật ký theo mẫu %WINDIR%\Logs\CmitUpdateAgent\20????\20??????, đọc toàn bộ nội dung, loại bỏ tất cả các dòng chứa chuỗi GetExtendedUpdateInfoHandler và ghi đè nội dung sạch trở lại tệp. Thao tác này nhằm xóa sạch dấu vết cho thấy cơ chế cập nhật của bản Windows tùy biến đã bị can thiệp.

  5. Cơ chế ghi log ngoại lệ qua Registry: Thay vì ghi lỗi ra tệp hoặc console, mã độc tạo các khóa con trong Registry dưới dạng bitmask theo cấu trúc:

    HKLM\SOFTWARE\Classes\appid\{specific_GUID}
    

    Giá trị {specific_GUID} được sinh ra bằng thuật toán băm từ chính URL của C2 server. Mã độc sử dụng 9 GUID đại diện cho các trạng thái ngoại lệ (từ bit 0 đến bit 7 và 1 khóa chỉ định ngoại lệ xảy ra). Trước khi chạy, mã độc đệ quy xóa sạch các khóa lỗi cũ để tái lập trạng thái điều tra sạch.

IOCs

File Hash

  • F2458ED133F8D0CA19E22C10F577E98E
  • E1DC6F1ED193594F2284BE22AE08DFA4
  • AB81564BCB8CA7E710C66832DE747556
  • CFB8B281BDF5D9390E64B10C312FB2C1
  • 67E3617F8709D34F806F8E02BADBA8A5
  • 514AC0D73B8A1B73488EF5E2E55A75C3
  • 514117D536E347560D049CFE0C609632
  • 9000820D8153C24CD60D53001D3A97B6
  • B3C4A635179680EDAFB5D006CF0CFFC6
  • 4F28622C5E60C01319BF48CF742FE1A5
  • C86D53392A87DD3F3E62D62C9B92A9BD

File Path

  • C:\Windows\SoftwareDistribution\Download\Install\PatchMyPC-ScriptRunner.exe.config
  • C:\Windows\SoftwareDistribution\Download\Install\fabric.config
  • C:\Windows\SoftwareDistribution\Download\Install\Resources.resx

Domain

  • openaigpt4v[.]com

MITRE ATT&CK Mapping

Tactic Technique ID Technique Name Ngữ cảnh sử dụng trong chiến dịch NetamLoader
Initial Access T1195.002 Supply Chain Compromise: Compromise Software Supply Chain Giả mạo gói cập nhật Windows Update CAB và tiện ích quản trị bản vá Patch My PC
Execution T1059.005 Command and Scripting Interpreter: Visual Basic / XAML Thực thi các đoạn mã XAML đa tầng (XAML-1, XAML-2, XAML-3) để kích hoạt logic độc hại
Execution T1559.001 Inter-Process Communication: Component Object Model Khởi tạo đối tượng COM từ xa qua RPC để chuyển giao payload sang tiến trình dllhost.exe
Persistence / Privilege Escalation T1574.014 Hijack Execution Flow: AppDomainManager Lạm dụng thuộc tính appDomainManagerType trong .config để CLR nạp assembly độc hại
Defense Evasion T1562.001 Impair Defenses: Disable or Modify Tools Vô hiệu hóa AMSI bằng cách hoán đổi VTable pointer sang Console.Clear đã patch
Defense Evasion T1562.002 Impair Defenses: Disable Windows Event Logging Thiết lập COMPlus_ETWEnabled = 0 để làm mù bộ ghi vết .NET CLR ETW provider
Defense Evasion T1027.003 Obfuscated/Encrypted: Steganography / Environmental Keying Khóa khóa AES giải mã XAML-2 theo chuỗi băm SHA-256 của dòng lệnh thực thi
Defense Evasion T1070.004 Indicator Removal: File Deletion Xóa các tệp cấu hình .config, fabric.config, Resources.resx, Prefetch và log CLR
Defense Evasion T1070.002 Indicator Removal: Clear Windows Event Logs Lọc bỏ chuỗi GetExtendedUpdateInfoHandler trong log cập nhật CmitUpdateAgent
Defense Evasion T1497.003 Virtualization/Sandbox Evasion: Time Based Evasion Chờ ngẫu nhiên 20-40 phút (Jitter delay) trước khi gửi kết nối C2 đầu tiên
Defense Evasion T1055 Process Injection Tiêm và thực thi mã động trong AppDomain cô lập thông qua CrossAppDomainDelegate
Defense Evasion T1036.005 Masquerading: Match Legitimate Name or Location Sử dụng tên miền C2 openaigpt4v[.]com ngụy trang dịch vụ trí tuệ nhân tạo OpenAI
Discovery T1082 System Information Discovery Trích xuất thông tin .NET Version, BuildLab và SusClientId từ Windows Registry
Discovery T1016 System Network Configuration Discovery Dò quét cấu hình hệ thống qua 3 tầng: WinHttpGetDefaultProxyConfiguration, Impersonation và WebProxy
Command and Control T1071.001 Application Layer Protocol: Web Protocols Giao tiếp C2 thông qua giao thức mã hóa HTTPS GET/POST
Command and Control T1573.001 Encrypted Channel: Symmetric Cryptography Mã hóa dữ liệu mạng bằng chuẩn AES-128-CBC kết hợp HMAC-SHA256 (Encrypt-then-MAC)

Nhận Định Chuyên Gia FPT IS SOC

Qua phân tích chiến dịch NetamLoader, đội ngũ FPT IS SOC rút ra 3 nhận định cốt lõi:

  • Tác chiến cấp độ Nation-State không cần Zero-day: NetamLoader chứng minh kẻ tấn công không cần khai thác lỗ hổng kernel phức tạp để vượt qua EDR. Bằng cách kết hợp chuỗi Living-off-the-Land trên .NET/XAML, kỹ thuật hoán đổi con trỏ VTable (không can thiệp trang nhớ của amsi.dll), tách cây tiến trình qua RPC sang dllhost.exe và mã hóa Encrypt-then-MAC với khóa sinh động theo dòng lệnh (Environmental Keying), tác nhân đe dọa đã đạt đến độ tàng hình gần như tuyệt đối mà chỉ dựa trên các tính năng hợp lệ của hệ điều hành.
  • Nghịch lý an ninh của các hệ điều hành chuyên biệt: Xu hướng tùy biến bản build hệ điều hành và cơ chế cập nhật riêng (như CmitUpdateAgent) nhằm bảo đảm chủ quyền công nghệ lại vô tình mở ra bề mặt tấn công chuỗi cung ứng mới. Khi mã độc ẩn mình trực tiếp vào luồng cập nhật phần mềm nội bộ, tâm lý "tin cậy mặc định" của đội ngũ vận hành đã biến quy trình update thành lối vào lý tưởng cho gián điệp mạng.
  • Cảnh báo thực chiến cho hạ tầng trọng yếu tại Việt Nam: Các cơ quan, tổ chức tài chính tại Việt Nam đang chuẩn hóa bản cài máy trạm (SOE image) và phần mềm dùng chung cần đặc biệt lưu tâm. Giám sát Windows Event Log truyền thống hoàn toàn bị "làm mù" khi mã độc tắt ETW (COMPlus_ETWEnabled = 0) và mượn danh dllhost.exe. Các SOC nội địa cần chủ động chuyển dịch sang giám sát sâu ở tầng bộ nhớ và áp dụng chính sách Application Control (WDAC) để vô hiệu hóa triệt để vector lạm dụng .config và AppDomainManager.

Khuyến Nghị Phòng Thủ

Khuyến nghị Khẩn cấp (Immediate: 0 - 24 giờ)

  1. Rà quét IOC trên toàn bộ máy trạm và máy chủ:

    • Cập nhật ngay lập tức danh sách mã băm (MD5/SHA256) của các thành phần NetamLoader vào hệ thống EDR/SIEM.
    • Thiết lập cảnh báo khẩn cấp đối với bất kỳ kết nối mạng nào hướng tới tên miền openaigpt4v[.]com hoặc địa chỉ IP 104.18.14[.]219.
  2. Truy vấn săn lùng các tệp cấu hình .config bất thường trong thư mục Windows Update: Quản trị viên có thể sử dụng lệnh PowerShell sau để rà soát toàn bộ các tệp .config xuất hiện trong thư mục SoftwareDistribution:

    Get-ChildItem -Path "C:\Windows\SoftwareDistribution\Download" -Filter "*.config" -Recurse -ErrorAction SilentlyContinue |

    Select-Object FullName, Length, LastWriteTime |

    Format-Table -AutoSize

    => Nếu phát hiện tệp cấu hình chứa thẻ appDomainManagerType hoặc appDomainManagerAssembly, cần lập tức cách ly máy trạm để điều tra số.

  3. Kiểm tra khóa Registry DllSurrogate bất thường: Truy vấn sự xuất hiện của khóa surrogate liên quan đến mã độc: reg query "HKLM\SOFTWARE\Classes\appid\{ff259bcd-2f0a-44de-b34a-0092fec1d8a2}" /s

Khuyến nghị Ngắn hạn (Short-term: 1 - 7 ngày)

  1. Thiết lập Threat Hunting Rule phát hiện lạm dụng AppDomainManager: Cấu hình SIEM/EDR cảnh báo khi các tiến trình thực thi .NET khởi chạy cùng tệp cấu hình nạp assembly nằm ngoài các thư mục hệ thống chuẩn (System32, SysWOW64, Program Files).
  2. Giám sát hành vi bất thường của tiến trình dllhost.exe:
    • dllhost.exe thông thường không tạo kết nối mạng trực tiếp ra Internet. Cần thiết lập luật cảnh báo nghiêm ngặt trên tường lửa máy trạm và EDR đối với bất kỳ tiến trình dllhost.exe nào phát sinh kết nối mạng ra các dải IP công cộng, đặc biệt là các kết nối HTTPS có thời gian sống kéo dài hàng chục tiếng.
    • Giám sát hành vi nạp module .NET (clr.dll, mscoreei.dll) bất thường bên trong không gian nhớ của dllhost.exe.
  3. Phát hiện hành vi can thiệp vào biến môi trường ETW: Thiết lập giám sát trên EDR phát hiện các thao tác gán giá trị COMPlus_ETWEnabled = 0 hoặc can thiệp vào registry key liên quan tới ETW của .NET CLR.

Khuyến nghị Dài hạn (Long-term: Chiến lược kiến trúc bền vững)

  1. Áp dụng chính sách kiểm soát ứng dụng nghiêm ngặt (Application Control / WDAC): Triển khai Windows Defender Application Control (WDAC) hoặc AppLocker ở chế độ Enforce Mode. WDAC có khả năng chặn đứng hoàn toàn kỹ thuật AppDomainManager Injection bằng cách vô hiệu hóa việc nạp các assembly không được phê duyệt hoặc kiểm soát chặt chẽ việc nạp tệp cấu hình ứng dụng .config.
  2. Bảo vệ toàn vẹn chuỗi cung ứng cập nhật phần mềm nội bộ:
    • Kiểm soát và ký số bắt buộc (Code Signing với chứng chỉ nội bộ an toàn) cho toàn bộ các gói phần mềm, kịch bản cập nhật phân phối cho máy trạm cơ quan nhà nước.
    • Tách biệt hoàn toàn máy chủ quản trị cập nhật (WSUS, Patch Management) vào phân vùng mạng quản trị riêng biệt, áp dụng xác thực đa yếu tố (MFA) và kiểm toán định kỳ tính toàn vẹn của các gói lưu trữ CAB/MSI trước khi đẩy xuống người dùng cuối.
  3. Tăng cường khả năng giải mã và phân tích lưu lượng TLS: Triển khai giải pháp TLS/SSL Inspection tại cổng mạng Internet (Next-Gen Firewall / Secure Web Gateway) để phân tích nội dung gói tin HTTPS, ngăn chặn việc mã độc ngụy trang lưu lượng C2 dưới vỏ bọc các dịch vụ AI hoặc CDN công cộng.

Tài Liệu Tham Khảo

NetamLoader Targets Asian Government Windows Build: Kaspersky - TechNadu

APT Hackers Use NetamLoader Malware to Target Windows 10 Systems in Asian Governments

Unknown APT uses NetamLoader to attack a Win10 OS customized for governments in Asia | Securelist

No comments yet. Be the first to comment.

More from this blog