Reverse Malware on Android
1. Introduction
Android là hệ điều hành dành cho các thiết bị di động phát triển bởi Google trên nền tảng Linux. Android được xây dựng mở cho phép người dùng tự tạo ứng dụng dựa trên các thư viện sẵn có.
Các ứng dụng có thể upload lên Android Market để chia sẻ với người dùng khác theo hình thức miễn phí hoặc thu phí.
Thị trường ứng dụng Android phát triển nhanh chóng kéo theo hàng loạt mối nguy hại có thể xảy ra đổi với các thiết bị sử dụng android và điển hình là Malware.
Malware trên android là những đoạn mã độc được nhúng vào các ứng dụng bình thường, có khả năng xâm nhập ăn cắp thông tin của người dùng hoặc tự động thực thi các tác vụ không mong muốn.
Malware trên Android đầu tiên phải kể đến DroidDream, sau đó là một loại các malware nguy hiểm khác như Zitmo, HippoSMS … và gần đây là biến thể DroidDreamLight.
Theo thống kê Malware DroidDream phát hiện vào tháng 3/2011 đã tấn công vào 400.000 thiết bị, biến thể DroidDreamLight được phát hiện gần đây cũng đã tấn công vào trên 120.000 thiết bị.
Bài nghiên cứu tập trung phân tích malware Droid Dream trên android và giới thiệu các kỹ thuật cơ bản sử dụng :
- Decompile apps Android.
- Edit.
- Compile and Sign App
2. Android Architecture
Đầu tiên chúng ta cùng nhìn lại tổng quan kiến trúc Android.
Kiến trúc Android bao gồm 4 phần :
Figure 1: Kiến trúc tổng quan hệ thống Android
· Linux Kernel :
Cung cấp các trình điều khiển các thiết bị phần cứng(driver), quản lý tiến trình, quản lý tài nguyên, cơ chế an ninh,...
· Libraries và Android Runtime :
- Libraries : Là các thư viện được viết bằng ngôn ngữ C/C++ sẽ được các developer phát triển ứng dụng android thông qua tầng Android Framework. VD : SQLite – quản lý database của ứng dụng.
- Android Runtime :
o gồm một tập hợp các thư viện Java Core.
o Máy ảo Dalvik thực thi các file định dạng .dex (Dalvik Excutable) .
· Application Framework :
Google xây dựng cho các developer để phát triển các ứng dụng của họ trên Android chỉ bằng cách gọi các API . VD :
- View UI - để xây dựng layout của ứng dụng bao gồm: list view, text field, button, dialog, form…
- Notification Manager - cho phép tất cả các ứng dụng hiển thị thông báo của mình trên hệ điều hành.
- Resource Manager - cung cấp cách thức truy cập đến non-code resources như các asset, graphic, image, music, video …
- Activity Manager - quản lý vòng đời của các ứng dụng.
- ….
· Applications :
Là các ứng dụng mà lập trình viên phát triển.
Mô hình an ninh trong Android được thiết kế sao cho không ứng dụng nào có thể gây ảnh hưởng xấu tới ứng dụng khác cũng như hệ thống. Sandbox và cơ chế phân quyền là cơ sở của mô hình an ninh trong android.
Theo đó mỗi ứng dụng được cấp ID và chạy trong một tiến trình riêng của máy ảo Dalvik.
Figure 2: Mô hình thực thi của ứng dụng trên Android
Cơ chế an ninh như vậy khiến cho việc virus hoạt động trong hệ thống android khá khó khăn.
Chính vì vậy hướng phát triển trên android chủ yếu là malware và spyware.
3. Reverse Malware on Android
Figure 3: Repackaging ứng dụng và mô hình tấn công
Mô hình trên mô tả quá trình kẻ tấn công chèn malware vào ứng dụng bình thường với mục đích tấn công người sử dụng. Vậy làm điều đó như thế nào???
Như đã giới thiệu ở trên, ứng dụng Android được biên dịch ra dạng mã máy (file .dex) để chạy trên máy ảo dalvik. Năm 2009, các nhà nghiên cứ đã tìm ra cách dịch ngược Dalvik Bytecode sang dạng mã java bytecode.
Sử dụng tool Dex2Jar được viết bởi 1 sinh viên Trung Quốc, có thể chuyển từ dalvik bytecode sang java bytecode sau đó sử dụng một số chương trình Java Decompiler là có thể đọc được mã java của ứng dụng :
Figure 4: Sử dụng JD-gui và Dex2Jar decompile chương trình Twitter 2.1.1
Tuy nhiên phương pháp này có vấn đề khi decompile chương trình phức tạp và khó khăn trong việc compile lại chương trình.
Giải pháp được đưa ra đó là dịch ngược mã dalvik bytecode sang một dạng mã dễ đọc hơn và từ đó chỉnh sửa và biên dịch lại. Tool smali và baksmali được phát triển để thực hiện việc này.
Các công cụ cần thiết để reverse một ứng dụng android :
- APKTOOL : Là công cụ sử dụng smali/baksmali để phân tích ứng dụng android. Có khả năng decompile sau đó compile lại ứng dụng.
- Sign tool : tool dùng để ký một ứng dụng android.
- Android SDK và AVD Manager : dùng để giả lập máy ảo android để cài đặt ứng dụng
- Công cụ lập trình android : VD eclipse.
Ứng dụng được chọn để khai thác là Twitter 2.1.1, bản mới nhất được tải trên Android Market.
Đầu tiên sử dụng apktool để decompile file Twitter211.apk
Figure 5: Decompile chương trình sử dung apktool
Kết quả thu được là folder Twitter221 chứa toàn bộ mã nguồn của chương trình.
Figure 6: Danh sách file mã nguồn của chương trình
Với mã nguồn này, ta tiến hành đọc và tìm cách sửa phù hợp. Ở đây mình tiến hành sửa trong file LoginActivity.java với mục đích chèn 1 package có chức năng hiện thị một message box khi người dùng đăng nhập vào twitter :
Figure 7: Chèn mã thực thi vào trong ứng dụng.
Trong đoạn mã chèn thêm, Lp/str/Str_i trỏ đến một package srt_i.java được viết ra với mục đích hiện thị một message box và được copy trực tiếp vào trong folder /smali của chương trình nguồn.
Tác dụng của đoạn code chèn thêm vào là khởi tạo một new-instance trỏ đến package str_i sau đó gọi thực thi package này.
Sau khi sửa code ta tiến hành biên dịch và ký lại chương trình.
Figure 8: Re-Compile and Re-Sign application
Và kết quả thu được :
Figure 9: Chương trình sau khi bị chèn thêm mã độc
4. Malware DroidDream analysis
Dựa trên những kỹ thuật giới thiệu ở trên, trong mục này ta sẽ phân tích malware Droid Dream. Một malware rất cơ bản trên android từ trước đến nay.
Chương trình được chọn để phân tích là bowlingtime.apk.
Đầu tiên để nhận biết chương trình có malware hay không chúng ta thử xem qua những quyền mà chương trình này yêu cầu.
Đọc file xml ta dễ dàng nhận thấy một số quyền bất thường mà một game yêu cầu như : INTERNET, READ_PHONE_STATE, ACCESS_WIFI_STATE.
Figure 10: Bowlingtime.xml
Sử dụng Dex2jar và JD-Gui để phân tích mã java cũng như hoạt động của chương trình này.
Figure 11: Hàm main trong chương trình
Có thể nhận thấy khi khởi tạo chương trình tạo mới một Intent thuộc Setting class và khởi chạy trước chương trình chính => malware được chèn trong class Setting này.
Tiếp tục tìm hiểu có thể tóm tắt hoạt động của malware này như sau :
Bước 1 : Gửi request chứa thông tin của thiết bị bao gồm IMEI, IMSI, … tới server. Đặt giá trị của biến “pref_config_setting” nếu nhận dc respone từ server và không tiến hành gửi request nữa.
Các request,respone và url đều được mã hóa bởi hàm crypt() :
Bước 2 : Kiểm tra có tồn tại file profile trong /system/bin/ hay không. Nếu không sẽ tiến hành cài đặt file DownloadProvidersManager.apk chứa trong sqlite.db vào /system/app/ .
Do cần quyền root để cài đặt, ở đây sử dụng 2 cách để nâng quyền root.
Sử dụng exploid payload và rageagainstthecage payload (2 payload có thể tìm thấy trong folder assets của chương trình) :
exploid payload : khai thác lỗ hổng trong xử lý UDEV event của android’s init.
rageagainstthecage payload : khai thác lỗ hổng của adbd.
___ exploid payload (CVE-2009-1185):
Yêu cầu :
+ Android < 2.1
+ Udev < 1.4.1
Mô tả :
Khai thác lỗi trong udev (trong android init / ueventd) để gửi một fake message (NETLINK_KOBJECT_UEVENTD) để thực thi code dưới quyền root.
Chi tiết :
Udev là thành phần cung cấp chức năng quản lý các thiết bị, cho phép thiết bị có thể “hotplug” và yêu cầu truy cập dưới quyền root (ví dụ USB device).
Hoạt động của udev dựa trên thông điệp điều khiển từ nhân Linux Kernel. Tuy nhiên khi thực thi, udev không kiểm tra nguồn gốc của thông điệp điều khiển. Do đó một ứng dụng giả mạo cũng có thể gửi một thông điệp đến udev và có hành động được thực hiện ( trong trường hợp của android là thực thi dưới quyền root).
Kỹ thuật được sử dụng là gửi một thông điệp NETLINK_KOBJECT_UEVENT (CVE-2009-1185) để chạy một bản sao mã thực thi khi sự kiện “hotplug” được kích hoạt.
___ rageagainstthecage payload :
Yêu cầu :
Android
Android là hệ điều hành dành cho các thiết bị di động phát triển bởi Google trên nền tảng Linux. Android được xây dựng mở cho phép người dùng tự tạo ứng dụng dựa trên các thư viện sẵn có.
Các ứng dụng có thể upload lên Android Market để chia sẻ với người dùng khác theo hình thức miễn phí hoặc thu phí.
Thị trường ứng dụng Android phát triển nhanh chóng kéo theo hàng loạt mối nguy hại có thể xảy ra đổi với các thiết bị sử dụng android và điển hình là Malware.
Malware trên Android đầu tiên phải kể đến DroidDream, sau đó là một loại các malware nguy hiểm khác như Zitmo, HippoSMS … và gần đây là biến thể DroidDreamLight.
Theo thống kê Malware DroidDream phát hiện vào tháng 3/2011 đã tấn công vào 400.000 thiết bị, biến thể DroidDreamLight được phát hiện gần đây cũng đã tấn công vào trên 120.000 thiết bị.
Bài nghiên cứu tập trung phân tích malware Droid Dream trên android và giới thiệu các kỹ thuật cơ bản sử dụng :
- Decompile apps Android.
- Edit.
- Compile and Sign App
2. Android Architecture
Đầu tiên chúng ta cùng nhìn lại tổng quan kiến trúc Android.
Kiến trúc Android bao gồm 4 phần :
Figure 1: Kiến trúc tổng quan hệ thống Android
· Linux Kernel :
Cung cấp các trình điều khiển các thiết bị phần cứng(driver), quản lý tiến trình, quản lý tài nguyên, cơ chế an ninh,...
· Libraries và Android Runtime :
- Libraries : Là các thư viện được viết bằng ngôn ngữ C/C++ sẽ được các developer phát triển ứng dụng android thông qua tầng Android Framework. VD : SQLite – quản lý database của ứng dụng.
- Android Runtime :
o gồm một tập hợp các thư viện Java Core.
o Máy ảo Dalvik thực thi các file định dạng .dex (Dalvik Excutable) .
· Application Framework :
Google xây dựng cho các developer để phát triển các ứng dụng của họ trên Android chỉ bằng cách gọi các API . VD :
- View UI - để xây dựng layout của ứng dụng bao gồm: list view, text field, button, dialog, form…
- Notification Manager - cho phép tất cả các ứng dụng hiển thị thông báo của mình trên hệ điều hành.
- Resource Manager - cung cấp cách thức truy cập đến non-code resources như các asset, graphic, image, music, video …
- Activity Manager - quản lý vòng đời của các ứng dụng.
- ….
· Applications :
Là các ứng dụng mà lập trình viên phát triển.
Mô hình an ninh trong Android được thiết kế sao cho không ứng dụng nào có thể gây ảnh hưởng xấu tới ứng dụng khác cũng như hệ thống. Sandbox và cơ chế phân quyền là cơ sở của mô hình an ninh trong android.
Theo đó mỗi ứng dụng được cấp ID và chạy trong một tiến trình riêng của máy ảo Dalvik.
Figure 2: Mô hình thực thi của ứng dụng trên Android
Cơ chế an ninh như vậy khiến cho việc virus hoạt động trong hệ thống android khá khó khăn.
Chính vì vậy hướng phát triển trên android chủ yếu là malware và spyware.
3. Reverse Malware on Android
Figure 3: Repackaging ứng dụng và mô hình tấn công
Mô hình trên mô tả quá trình kẻ tấn công chèn malware vào ứng dụng bình thường với mục đích tấn công người sử dụng. Vậy làm điều đó như thế nào???
Như đã giới thiệu ở trên, ứng dụng Android được biên dịch ra dạng mã máy (file .dex) để chạy trên máy ảo dalvik. Năm 2009, các nhà nghiên cứ đã tìm ra cách dịch ngược Dalvik Bytecode sang dạng mã java bytecode.
Sử dụng tool Dex2Jar được viết bởi 1 sinh viên Trung Quốc, có thể chuyển từ dalvik bytecode sang java bytecode sau đó sử dụng một số chương trình Java Decompiler là có thể đọc được mã java của ứng dụng :
Figure 4: Sử dụng JD-gui và Dex2Jar decompile chương trình Twitter 2.1.1
Giải pháp được đưa ra đó là dịch ngược mã dalvik bytecode sang một dạng mã dễ đọc hơn và từ đó chỉnh sửa và biên dịch lại. Tool smali và baksmali được phát triển để thực hiện việc này.
Các công cụ cần thiết để reverse một ứng dụng android :
- APKTOOL : Là công cụ sử dụng smali/baksmali để phân tích ứng dụng android. Có khả năng decompile sau đó compile lại ứng dụng.
- Sign tool : tool dùng để ký một ứng dụng android.
- Android SDK và AVD Manager : dùng để giả lập máy ảo android để cài đặt ứng dụng
- Công cụ lập trình android : VD eclipse.
Ứng dụng được chọn để khai thác là Twitter 2.1.1, bản mới nhất được tải trên Android Market.
Đầu tiên sử dụng apktool để decompile file Twitter211.apk
Figure 5: Decompile chương trình sử dung apktool
Figure 6: Danh sách file mã nguồn của chương trình
Figure 7: Chèn mã thực thi vào trong ứng dụng.
Tác dụng của đoạn code chèn thêm vào là khởi tạo một new-instance trỏ đến package str_i sau đó gọi thực thi package này.
Sau khi sửa code ta tiến hành biên dịch và ký lại chương trình.
Figure 8: Re-Compile and Re-Sign application
Figure 9: Chương trình sau khi bị chèn thêm mã độc
4. Malware DroidDream analysis
Dựa trên những kỹ thuật giới thiệu ở trên, trong mục này ta sẽ phân tích malware Droid Dream. Một malware rất cơ bản trên android từ trước đến nay.
Chương trình được chọn để phân tích là bowlingtime.apk.
Đầu tiên để nhận biết chương trình có malware hay không chúng ta thử xem qua những quyền mà chương trình này yêu cầu.
Đọc file xml ta dễ dàng nhận thấy một số quyền bất thường mà một game yêu cầu như : INTERNET, READ_PHONE_STATE, ACCESS_WIFI_STATE.
Figure 10: Bowlingtime.xml
Sử dụng Dex2jar và JD-Gui để phân tích mã java cũng như hoạt động của chương trình này.
Figure 11: Hàm main trong chương trình
Tiếp tục tìm hiểu có thể tóm tắt hoạt động của malware này như sau :
Bước 1 : Gửi request chứa thông tin của thiết bị bao gồm IMEI, IMSI, … tới server. Đặt giá trị của biến “pref_config_setting” nếu nhận dc respone từ server và không tiến hành gửi request nữa.
Các request,respone và url đều được mã hóa bởi hàm crypt() :
Bước 2 : Kiểm tra có tồn tại file profile trong /system/bin/ hay không. Nếu không sẽ tiến hành cài đặt file DownloadProvidersManager.apk chứa trong sqlite.db vào /system/app/ .
Do cần quyền root để cài đặt, ở đây sử dụng 2 cách để nâng quyền root.
Sử dụng exploid payload và rageagainstthecage payload (2 payload có thể tìm thấy trong folder assets của chương trình) :
exploid payload : khai thác lỗ hổng trong xử lý UDEV event của android’s init.
rageagainstthecage payload : khai thác lỗ hổng của adbd.
___ exploid payload (CVE-2009-1185):
Yêu cầu :
+ Android < 2.1
+ Udev < 1.4.1
Mô tả :
Khai thác lỗi trong udev (trong android init / ueventd) để gửi một fake message (NETLINK_KOBJECT_UEVENTD) để thực thi code dưới quyền root.
Chi tiết :
Udev là thành phần cung cấp chức năng quản lý các thiết bị, cho phép thiết bị có thể “hotplug” và yêu cầu truy cập dưới quyền root (ví dụ USB device).
Hoạt động của udev dựa trên thông điệp điều khiển từ nhân Linux Kernel. Tuy nhiên khi thực thi, udev không kiểm tra nguồn gốc của thông điệp điều khiển. Do đó một ứng dụng giả mạo cũng có thể gửi một thông điệp đến udev và có hành động được thực hiện ( trong trường hợp của android là thực thi dưới quyền root).
Kỹ thuật được sử dụng là gửi một thông điệp NETLINK_KOBJECT_UEVENT (CVE-2009-1185) để chạy một bản sao mã thực thi khi sự kiện “hotplug” được kích hoạt.
___ rageagainstthecage payload :
Yêu cầu :
Android
Chỉnh sửa lần cuối bởi người điều hành: