Giới thiệu dự án

Sự bùng nổ của hệ điều hành Android trên hơn 3 tỷ thiết bị di động toàn cầu đã biến nền tảng này thành mục tiêu hàng đầu của các cuộc tấn công mạng và mã độc tinh vi. Theo thống kê từ các tổ chức an ninh mạng quốc tế, hàng chục nghìn biến thể mã độc mới xuất hiện mỗi ngày với khả năng lẩn tránh phân tích tĩnh (Static Analysis) thông qua kỹ thuật làm rối mã nguồn (obfuscation), nén mã (packing), mã hóa payload và nạp động (dynamic class loading). Trong khi đó, phương pháp phân tích động (Dynamic Analysis) truyền thống bằng cách đặt chốt chặn (hooking) lại làm suy giảm hiệu năng hệ thống, tốn tài nguyên và dễ dàng bị vô hiệu hóa bởi các cơ chế chống gỡ lỗi (anti-debugging).

Vấn đề cốt lõi đặt ra là: Làm thế nào để trích xuất đầy đủ chứng cứ số và phát hiện mã độc một cách chính xác mà không làm biến dạng trạng thái thực thi của ứng dụng? Đồ án tốt nghiệp "Xây dựng bộ dữ liệu pháp chứng từ bộ nhớ ứng dụng Android cho các mô hình phát hiện mã độc" (tên tiếng Anh: Recovery and reconstruction of Android in-memory forensics artifacts for malware detection models) của nhóm tác giả Lê Kim Tuấn và Nguyễn Ngọc Diễm Quỳnh, dưới sự hướng dẫn của TS. Nguyễn Tấn Cầm tại Trường Đại học Công nghệ Thông tin - ĐHQG-HCM, đã giải quyết trực tiếp thách thức này thông qua giải pháp Android Object Allocation Graph (AOAG).

+-----------------------------------------------------------------------------------+
|                            QUY TRÌNH TỔNG QUAN AOAG                               |
+-----------------------------------------------------------------------------------+
|  [Tiến trình Android]                                                             |
+-----------------------------------------------------------------------------------+

Mục tiêu dự án cụ thể:

  1. Khôi phục cấu trúc bộ nhớ Runtime: Định vị và tái tạo cấu trúc dữ liệu của Android Runtime (ART) trên Android 8.0+ từ tập tin trích xuất bộ nhớ tiến trình (/proc/<pid>/mem/proc/<pid>/maps).
  2. Giải mã đối tượng vùng nhớ Heap: Trích xuất toàn bộ các thực thể đối tượng (Primitives, Arrays, Strings, Complex Objects) được cấp phát thông qua bộ quản lý vùng nhớ RegionSpace và cơ chế RegionTLAB của thuật toán gom rác Concurrent Copying (CC).
  3. Mô hình hóa đồ thị cấp phát đối tượng (OAG): Ứng dụng kỹ thuật phân tích con trỏ ngữ cảnh Heap (Heap-context Points-to Analysis) để thiết lập đồ thị có hướng mô tả quan hệ tham chiếu giữa các đối tượng.
  4. Phân loại mã độc bằng Trí tuệ nhân tạo: Trích xuất các thuộc tính cấu trúc mạng (Network Topology Metrics) và ứng dụng Mạng nơ-ron đồ thị (Graph Neural Networks - GNN) để tự động phân loại ứng dụng lành tính và ứng dụng độc hại.

Phạm vi và giới hạn nghiên cứu:

  • Phạm vi: Nghiên cứu tập trung vào không gian bộ nhớ người dùng (Userland Memory Forensics) của các tiến trình thực thi trên môi trường máy ảo Android Runtime (ART) phiên bản Android 8.0 (Oreo) đến Android 10.
  • Giới hạn: Tập dữ liệu thử nghiệm bao gồm 153 bản ghi bộ nhớ tiến trình (97 đồ thị ứng dụng lành tính và 56 đồ thị ứng dụng độc hại) được trích xuất trong môi trường thử nghiệm kiểm soát.

Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Phương pháp phân tích Cơ chế hoạt động Ưu điểm Nhược điểm & Rào cản kỹ thuật
Phân tích tĩnh (Static Analysis) Dịch ngược APK, phân tích mã Smali, Manifest và chuỗi nhị phân. Tốc độ nhanh, độ phủ mã nguồn cao, chi phí tính toán thấp. Hoàn toàn bất lực trước kỹ thuật mã hóa DEX, Reflection động, Native code (JNI) và Obfuscation.
Phân tích động truyền thống (Dynamic Hooking) Can thiệp vào runtime bằng Frida, Xposed hoặc sửa đổi AOSP ROM. Bắt được hành vi thực thi thời gian thực, vượt qua mã hóa tĩnh. Chi phí tài nguyên cao, làm chậm ứng dụng; dễ bị mã độc phát hiện cơ chế Hooking/Sandbox để tự hủy.
Pháp chứng bộ nhớ AOAG (Đề xuất) Dump trực tiếp bộ nhớ RAM của tiến trình qua /proc và dựng đồ thị tham chiếu đối tượng. Bất biến với các kỹ thuật che giấu mã, không sửa đổi runtime, lưu giữ toàn bộ dữ liệu nhạy cảm trong Heap. Đòi hỏi giải mã cấu trúc dữ liệu cấp thấp phức tạp của ART và quản lý đồ thị quy mô lớn.

Yêu cầu hệ thống (Mô hình MoSCoW)

  • Must-have: Khôi phục thành công địa chỉ gốc của đối tượng art::Runtime từ thư viện libart.so; giải mã chính xác các đối tượng trong RegionSpace; xây dựng cấu trúc đồ thị OAG chuẩn hóa.
  • Should-have: Thuật toán phân tích ngữ nghĩa (Semantic Analysis) với chức năng tìm kiếm chuỗi/lớp đối tượng và xác định đường đi không chung cạnh (Edge-disjoint paths).
  • Could-have: Tích hợp pipeline tự động từ khâu trích xuất RAM bằng Memfetch đến phân loại mã độc bằng GNN.
  • Won't-have (giai đoạn này): Phân tích bộ nhớ kernel và hỗ trợ các kiến trúc Dalvik VM đời cũ (Android 4.x trở xuống).

Thiết kế kiến trúc hệ thống

Kiến trúc AOAG được chia làm 4 khối thành phần chính:

|                          KIẾN TRÚC HỆ THỐNG AOAG                            |
|  1. Acquisition Layer (Thu thập)                                            |
|  2. Runtime Structure Recovery - RDS (Khôi phục cấu trúc)                   |
|  3. Object Recovery & Reconstruction - ORR & OAGen (Giải mã & Dựng đồ thị)   |
|  4. Malware Classification Layer (Phát hiện mã độc)                         |

Công nghệ sử dụng

  • Môi trường hệ thống: Linux Kernel 4.x / Android AOSP 8.0 - 10.0.
  • Ngôn ngữ lập trình: Python 3.8+, C/C++ (sử dụng Header files chuẩn của ART).
  • Thư viện đồ thị & Học máy: NetworkX 2.8+, PyTorch 1.12.0, PyTorch Geometric (PyG) 2.0+, Scikit-learn 1.1+.
  • Công cụ phân tích nhị phân: GNU Binary Utilities (nm, objdump), GDB.

Implementation và kết quả

Quy trình giải mã bộ nhớ và thuật toán cốt lõi

Quy trình khôi phục bắt đầu bằng việc phân tích tĩnh thư viện thực thi libart.so để tìm ký hiệu _ZN3art7Runtime9instance_E. Địa chỉ này lưu giữ con trỏ tới đối tượng Runtime đơn thể (singleton) trong không gian tiến trình.

// Trích xuất cấu trúc đối tượng Runtime trong Android 8.0 (ART)
struct Runtime {
    void* callee_save_methods_[6];         // offset 0x0
    void* pre_allocated_OutOfMemoryError_; // offset 0x20
    void* pre_allocated_NoClassDefFoundError_; // offset 0x24
    void* resolution_method_;             // offset 0x28
    gc::Heap* heap_;                       // offset 0xF4 (244)
    void* jit_arena_pool_;                 // offset 0xF8 (248)
    void* arena_pool_;                     // offset 0xFC (252)
    ThreadList* thread_list_;              // offset 0x114 (276)
};

Khi đã có heap_, hệ thống truy cập vào cấu trúc RegionSpace (offset 0xA8). Mỗi Region được cấp phát có kích thước cố định (thường là 256 KB). Thuật toán quét và giải mã vùng nhớ Heap (HeapDump) duyệt qua toàn bộ các vùng Non-free Regions theo cơ chế sau:

Thuật toán 1: HeapDump Algorithm
----------------------------------------------------------------------
Input : Địa chỉ bắt đầu vùng nhớ (regionBegin), đỉnh vùng nhớ (regionTop)
Output: Danh sách đối tượng sống và hợp lệ trong Region

1  pos = regionBegin
2  while pos < regionTop do
3      if clazz -> ResolveClass(pos) != nullptr then
4          obj = GetObject(pos, clazz)
5          size = GetSize(obj)
6          pos = pos + size + kAlignment
7      else
8          pos = pos + kAlignment
9      end
10 end

Sau khi phát hiện đối tượng, mô-đun decodeObject sẽ giải mã nội dung dựa trên 4 phân loại dữ liệu chính:

Thuật toán 2: Giải mã đối tượng (ObjectDecode Algorithm)
----------------------------------------------------------------------
Input : Đối tượng obj, lớp clazz
Output: Thuộc tính và dữ liệu đã giải mã

1  if clazz == Primitive then
2      len = obj -> getType() -> getComponentSize()
3  else if clazz == String then
4      len = obj -> len
5  else if clazz == Array then
6      type = obj -> getType()
7      len = obj -> getComponentSize(type)
8  else
9      clazzName = obj -> getName()
10     fields[] = obj -> getFields()
11     len = fields -> getLength()
12 end
13 data = read(obj, len)

Dựa trên kết quả giải mã, thuật toán OAGen thiết lập đồ thị $G = (V, E)$. Mỗi nút $v \in V$ mang bộ ba thuộc tính $(\text{ID}, \text{Label}, \text{Data})$ biểu thị địa chỉ bộ nhớ, tên lớp Java và dữ liệu thực tế. Mối quan hệ tham chiếu giữa các trường dữ liệu được bổ sung đệ quy:

# Thuật toán đệ quy xây dựng cạnh đồ thị OAG
def recurse_object(G, node, heap_begin):
    decoded = decode_object(node, heap_begin)
    if decoded.type == "String":
        node.label = "java.lang.String"
        node.data = decoded.value
    elif decoded.type in ["PrimitiveArray", "ObjectArray"]:
        node.label = decoded.type_name
        references = get_all_references(decoded)
        for ref_addr in references:
            if not G.has_node(ref_addr):
                G.add_node(ref_addr)
            G.add_edge(node.id, ref_addr)
        node.data = decoded.raw_bytes
    elif decoded.type == "ComplexObject":
        node.label = decoded.class_name
        fields = get_object_fields(decoded)
        for field in fields:
            if field.is_reference and field.target_address != 0:
                if not G.has_node(field.target_address):
                    G.add_node(field.target_address)
                G.add_edge(node.id, field.target_address)
        node.data = decoded.field_values

Thuật toán 3: Xác định ngữ cảnh (Context Identification)
----------------------------------------------------------------------
Input : Nút đối tượng mục tiêu (target), Đồ thị G
Output: Đồ thị con ngữ cảnh H chứa các nút tiền nhiệm

1  nodePred = [target]
2  for n in nodePred do
3      for pred in G.iterpred(n) do
4          nodePred.append(pred)
5      end
6  end
7  H = G.subgraph(nodePred)
8  return H

Kết quả thực nghiệm và đánh giá số liệu

Hệ thống đã thực hiện trích xuất và dựng đồ thị thành công trên tập mẫu kiểm thử gồm các ứng dụng phổ biến (WhatsApp, Chrome, Facebook...) và các mẫu mã độc từ ngân hàng dữ liệu mã độc Android.

+-----------------------------------------------------------------------------------+
|               HIỆU QUẢ KHÔI PHỤC ĐỐI TƯỢNG VÙNG HEAP (TOP APPS)                   |
+-----------------------------------------------------------------------------------+
| Ứng dụng lành tính      | Tổng đối tượng Heap | Khôi phục thành công | Tỉ lệ (%)  |
| WhatsApp Messenger      | 142,580             | 138,302              | 97.00%     |
| Google Chrome           | 210,430             | 201,171              | 95.60%     |
| Android Messaging       | 89,210              | 86,980               | 97.50%     |
+-----------------------------------------------------------------------------------+
| Mẫu mã độc (Malware)    | Tổng đối tượng Heap | Khôi phục thành công | Tỉ lệ (%)  |
| Trojan-Banker.AndroidOS | 64,120              | 61,106               | 95.30%     |
| Ransomware.AndroidOS    | 45,890              | 44,054               | 96.00%     |
| Spyware.AndroidOS       | 78,340              | 74,814               | 95.50%     |
+-----------------------------------------------------------------------------------+

Phân tích đặc trưng đồ thị (Graph Metrics Analysis)

Phân tích thống kê đơn biến và đa biến trên 153 đồ thị cho thấy sự phân hóa rõ rệt về mặt hình thái học mạng giữa ứng dụng lành tính và mã độc:

  • Bậc trung bình (Average Degree): Ứng dụng lành tính có cấu trúc liên kết phân tầng sâu (Average Degree $\approx 3.2 - 4.8$), trong khi mã độc thường tạo nhiều đối tượng ngầm cô lập hoặc tập trung đột biến vào các module mã hóa/kết nối mạng botnet.
  • Hệ số phân cụm (Clustering Coefficient) & Đường kính mạng (Network Diameter): Đồ thị mã độc có xu hướng hình thành các thành phần liên kết mạnh (Strongly Connected Components - SCC) nhỏ lẻ, rời rạc và tỷ lệ nút cô lập (isolated_ratio) cao hơn 28.4% so với ứng dụng thông thường.
+-----------------------------------------------------------------------------+
|           ĐÁNH GIÁ HIỆU NĂNG PHÂN LOẠI MÃ ĐỘC CỦA CÁC MÔ HÌNH               |
+-----------------------------------------------------------------------------+
| Mô hình phân loại           | Accuracy (%) | Precision (%) | Recall/F1 (%)  |
| Random Forest (ML Baseline) | 88.20%       | 87.50%        | 87.80%         |
| Support Vector Machine (SVM)| 84.60%       | 83.10%        | 83.80%         |
| Multi-Layer Perceptron (MLP)| 86.90%       | 85.70%        | 86.20%         |
| GCN (Graph Convolutional)   | 93.40%       | 92.80%        | 93.10%         |
| GraphSAGE (Deep Graph Learn)| 95.80%       | 95.20%        | 95.50%         |
| GIN (Graph Isomorphism Net) | 94.70%       | 94.10%        | 94.40%         |
+-----------------------------------------------------------------------------+

Mô hình GraphSAGE đạt hiệu quả cao nhất với độ chính xác 95.80%, khẳng định rằng các liên kết ngữ nghĩa giữa các đối tượng trong bộ nhớ RAM chứa đựng dấu hiệu nhận diện mã độc có tính phân biệt vượt trội so với các đặc trưng trích xuất tĩnh.


Đổi mới và đóng góp

  1. Tiên phong giải mã cấu trúc RegionSpace của ART CC GC: Đây là công trình nghiên cứu ứng dụng đầu tiên tại Việt Nam giải mã thành công cơ chế quản lý bộ nhớ dựa trên vùng (Region-based Memory Management) và bảng cấp phát luồng cục bộ RegionTLAB của bộ thu gom rác Concurrent Copying trên Android 8.0 trở lên.
  2. Kỹ thuật trích xuất ngữ cảnh Points-to không phụ thuộc Logic mã nguồn: Khác với các phương pháp tái tạo giao diện truyền thống đòi hỏi phải học trước logic chương trình, giải pháp OAGen trong đồ án hoạt động hoàn toàn độc lập, cho phép truy vết mọi chuỗi tham chiếu và ngữ cảnh đối tượng từ bất kỳ file dump RAM nào.
  3. Chuyển đổi pháp chứng số thành biểu diễn đồ thị học máy: Đồ án đã cầu nối thành công giữa hai lĩnh vực: Pháp chứng bộ nhớ (Memory Forensics)Học sâu trên đồ thị (Graph Deep Learning), mở ra hướng tiếp cận hoàn toàn mới trong việc giám sát và phát hiện phần mềm độc hại.

Ứng dụng thực tế và triển khai

Tình huống ứng dụng thực tế (Use Cases)

  • Trung tâm điều hành an ninh mạng (SOC / DFIR): Hỗ trợ các chuyên viên điều tra số khôi phục chứng cứ bay hơi (Volatile Evidence) trong RAM như tin nhắn trò chuyện chưa lưu, URL kết nối ngầm C&C Server, khóa giải mã mã độc tống tiền (Ransomware keys).
  • Hệ thống tự động phân loại mã độc di động: Tích hợp pipeline trích xuất OAG vào quy trình Sandbox động để tăng cường lớp phòng thủ phân tích bộ nhớ.
|                         QUY TRÌNH TRIỂN KHAI SOC / DFIR                     |
|  [Thiết bị Android nghi nhiễm]                                              |
|  [File Raw Process Memory Dump]                                             |
|  [Cấu trúc Đối tượng Heap & Chuỗi ký tự nhạy cảm]                           |
|  [Mạng liên kết đối tượng OAG (Graph ML/GNN)]                               |
|  [Báo cáo Pháp chứng: Nhãn Mã Độc + Chuỗi chứng cứ C&C/Key (JSON & Dot)]    |

Yêu cầu triển khai và độ phức tạp

  • Hạ tầng máy chủ trích xuất & phân tích: Máy chủ Ubuntu 20.04 LTS, CPU 8 Cores, RAM tối thiểu 16 GB, GPU NVIDIA (hỗ trợ CUDA cho huấn luyện GNN).
  • Độ phức tạp thuật toán: Quá trình quét HeapDump và dựng OAG có độ phức tạp thời gian tuyến tính $O(N + E)$, trong đó $N$ là số đối tượng và $E$ là số liên kết tham chiếu trong Heap, đảm bảo thời gian xử lý trung bình dưới 45 giây cho mỗi tiến trình 200 MB RAM.

Hạn chế và hướng phát triển

Hạn chế kỹ thuật

  • Sự phụ thuộc vào cấu trúc nhị phân của libart.so: Khi nâng cấp phiên bản Android lớn (như Android 12, 13, 14), offset các trường trong đối tượng RuntimeRegionSpace có thể thay đổi, đòi hỏi phải cập nhật bảng ánh xạ offset.
  • Thời điểm trích xuất bộ nhớ (Snaphot Timing): Dữ liệu khôi phục phụ thuộc vào trạng thái tại thời điểm dump RAM; nếu bộ thu gom rác (GC) đã thực hiện thu hồi vùng nhớ trước khi dump, một số đối tượng ngắn hạn có thể bị giải phóng.

Hướng phát triển tương lai

  • Tự động hóa quá trình phân tích Header C++ để sinh mã Parser động cho mọi phiên bản Android Runtime mới nhất.
  • Kết hợp mô hình Temporal Graph Neural Networks để phân tích chuỗi biến đổi của đồ thị Heap theo thời gian thực (Live Memory Streaming Forensics).

Đối tượng hưởng lợi

  • Sinh viên & Học viên ngành An toàn thông tin: Nguồn tài liệu chuyên sâu về cấu trúc tầng thấp của Android Runtime, kỹ thuật dịch ngược và phương pháp nghiên cứu ứng dụng thực tế.
  • Kỹ sư bảo mật & Chuyên gia điều tra số (DFIR): Bộ công cụ và phương pháp luận mạnh mẽ để trích xuất bằng chứng số từ bộ nhớ RAM trong các vụ án tội phạm công nghệ cao.
  • Doanh nghiệp & Đơn vị phát triển giải pháp EDR di động: Cơ sở khoa học để thiết kế module phát hiện mã độc không dùng chữ ký (Signature-less) dựa trên hình thái học bộ nhớ.
  • Nhà nghiên cứu học thuật: Cung cấp tập dữ liệu đồ thị chuẩn hóa (OAG Dataset) phục vụ cho các nghiên cứu tiếp theo về mạng nơ-ron đồ thị trong an ninh thông tin.

Câu hỏi thường gặp

1. Yêu cầu kỹ thuật tối thiểu để triển khai trích xuất bộ nhớ bằng Memfetch và DroidScraper là gì?

Hệ thống cần quyền truy cập root trên thiết bị Android mục tiêu (hoặc chạy trên môi trường Android Virtual Device - AVD) để đọc trực tiếp file ảo /proc/<pid>/mem/proc/<pid>/maps. Máy trạm phân tích cần cài đặt Python 3.8+, thư viện NetworkX và bộ công cụ Android NDK để biên dịch các module phân tích C++.

2. Giới hạn mở rộng khi kích thước đồ thị OAG lên đến hàng trăm nghìn đỉnh là gì?

Khi số lượng đối tượng trong Heap vượt quá 500,000 nút, việc tìm kiếm toàn cục có thể gặp hiện tượng nghẽn bộ nhớ. Giải pháp được áp dụng là thuật toán cắt tỉa đệ quy với tham số giới hạn độ sâu (Depth Cut-off Limit = 30) trong mô-đun Context Identification, giúp cô lập chính xác đồ thị con chứa chứng cứ mà không làm quá tải tài nguyên.

3. Giải pháp này có tích hợp được vào hệ thống SIEM/SOAR hiện có của doanh nghiệp không?

Hoàn toàn có thể. Kết quả phân tích của AOAG có thể xuất ra dưới dạng chuẩn JSON hoặc file đồ thị .dot. Các hệ sinh thái giám sát an ninh (như Splunk, Elastic Security) có thể ingest trực tiếp các chỉ số đe dọa (IoC) và độ tin cậy của mô hình GNN thông qua RESTful API.

4. Chi phí duy trì và bảo trì hệ thống định kỳ như thế nào?

Chi phí bảo trì chủ yếu tập trung vào việc cập nhật bảng ánh xạ cấu trúc struct của libart.so khi Android phát hành bản cập nhật AOSP mới và tái huấn luyện (re-train) mô hình GNN theo định kỳ hàng quý với các mẫu mã độc mới xuất hiện.

5. Tại sao phương pháp tiếp cận qua đồ thị OAG lại vượt trội hơn phân tích chuỗi nhị phân (YARA rules trên RAM)?

YARA rules trên RAM dễ bị vượt qua nếu mã độc sử dụng kỹ thuật mã hóa chuỗi trong bộ nhớ và chỉ giải mã từng phần nhỏ khi thực thi. Ngược lại, OAG nắm bắt bản chất cấu trúc liên kết và cách thức ứng dụng tổ chức dữ liệu trong Heap – một đặc trưng hành vi cấu trúc mà mã độc rất khó che giấu mà không làm hỏng logic thực thi của chính nó.


Kết luận

Khóa luận tốt nghiệp của nhóm tác giả Lê Kim Tuấn và Nguyễn Ngọc Diễm Quỳnh đã giải quyết xuất sắc bài toán phát hiện mã độc Android thế hệ mới thông qua việc khai thác triệt để không gian pháp chứng bộ nhớ người dùng. Bằng việc kết hợp nhuần nhuyễn giữa kỹ thuật dịch ngược tầng thấp trên Android Runtime (ART), giải mã cấu trúc RegionSpace, xây dựng đồ thị cấp phát đối tượng OAGen và ứng dụng các mô hình học sâu đồ thị (GraphSAGE đạt độ chính xác 95.80%), công trình không chỉ có giá trị học thuật xuất sắc mà còn mang tính ứng dụng thực tiễn cao trong ngành an toàn thông tin.

Đây là nguồn tham khảo mẫu mực cho các kỹ sư bảo mật và nhà nghiên cứu quan tâm đến lĩnh vực Mobile Memory ForensicsAI in Cybersecurity.