# Kiến trúc Android và công cụ pentest Android ## Kiến trúc hệ điều hành Android ### 1. **Giới thiệu** - Android là một hệ điều hành mã nguồn mở dựa trên nhân Linux, được thiết kế cho thiết bị di động nhưng đã mở rộng sang nhiều loại thiết bị khác như TV, xe hơi và IoT. Hệ thống này được xây dựng theo kiến trúc nhiều lớp, mỗi lớp đảm nhiệm một vai trò riêng và kết hợp với nhau để cung cấp môi trường chạy ứng dụng ổn định và bảo mật. ### 2. **Kiến trúc** ![image](https://hackmd.io/_uploads/H1tZhn_dee.png) - Từ dưới lên, `Linux Kernel` là lớp quản lý phần cứng và cung cấp driver cho camera, Wi-Fi, audio hay display. - `Hardware Abstraction Layer` đóng vai trò là cầu nối giữa phần cứng và phần mềm, cho phép hđh giao tiếp với cảm biến (sensor), blutooth hay camera mà không phụ thuộc vào chi tiết từng thiết bị. - `Libraries` và `Android Run Time` cung cấp thư viện lõi và môi trường thực thi ứng dụng Android. Các thư viện này hỗ trợ từ quản lý giao diện, kết nối mạng, xử lý đa phương tiện cho đến cơ sở dữ liệu. - `Application Framework` cung cấp API để các anh dev build app. Nó bao gồm quản lý Activity, Content Providers, gói ứng dụng, thông báo và nhiều dịch vụ khác. - `Application Layer` là nơi các ứng dụng hệ thống như trình duyệt, camera, lịch và ứng dụng người dùng hoạt động, khai thác tài nguyên từ lớp dưới để cung cấp tính năng cho người dùng cuối. ### 3. **Hệ thống file trong Android** Phần này mình có tham khảo của tryhackme nhưng do room này có phí nên các bạn có thể xem [video](https://www.youtube.com/watch?v=RqHzvi767eA&t=260s) này. ![image](https://hackmd.io/_uploads/SkPzW6ddeg.png) ![image](https://hackmd.io/_uploads/rJzX-6O_eg.png) Android sử dụng cấu trúc hệ thống file dựa trên Linux, được tổ chức thành nhiều thư mục chính, mỗi thư mục có chức năng riêng và quyền truy cập khác nhau. Việc hiểu rõ cách sắp xếp này giúp pentester xác định nhanh nơi lưu trữ dữ liệu nhạy cảm và tiềm ẩn nguy cơ lộ lọt thông tin. - `/system/` : Chứa các tệp hệ điều hành Android, thư viện hệ thống, và framework Java (.jar). Ở chế độ người dùng, thư mục này chỉ đọc (read-only), nhưng nếu bị root hoặc flash ROM tùy chỉnh, kẻ tấn công có thể chỉnh sửa để cài mã độc. - `/data/` : là nơi phân vùng dữ liệu người dùng. - `/data/app/` : chứa các file apk đã cài đặt. - `/data/data/` : dữ liệu riêng của từng ứng dụng (SharePreferences, DB, file). - `/data/misc/` : thông tin cấu hình hệ thống (Wi-Fi configs). - `/data/media/` : vùng lưu trữ mã hóa (encrypted storaged). - `/data/system/` : tài khoản, mật khẩu, setting hệ thống. 👉 Đây là mục tiêu số 1 khi pentest hoặc forensic vì chứa nhiều dữ liệu nhạy cảm. - `/scard/` hoặc `/storage/emulator/0` : Bộ nhớ ngoài hoặc lưu trữ dùng chung, chứa ảnh, video, file tải xuống. Ứng dụng nào có quyền đọc ghi bộ nhớ ngoài đều có thể truy cập khu vực này → rủi ro rò rỉ dữ liệu. - `/vendor/` : Chứa các thư viện và tệp nhị phân đặc thù của nhà sản xuất thiết bị. - `/dev/`, `/proc/` và `/sys/` : Các giao diện kernel và thiết bị giống Linux. - `/tmp/`, `/mnt/` và `/media/` : Dùng cho file tạm hoặc mount thiết bị ngoài. Nếu không bảo vệ tốt, đây có thể là nơi chèn file độc hại. ### 4. **Quy trình biên dịch và thực thi ứng dụng Android** ![image](https://hackmd.io/_uploads/SJlxw6ddxl.png) ##### Dalvik VM - `.java files` → được Java Compiler biên dịch thành .class files (bytecode Java). - `DEX Compiler` chuyển đổi `.class` thành `.dex file` (Dalvik Executable), tối ưu cho thiết bị android. - `dexopt` tối ưu thành `.odex` (Optimized DEX) khi cài đặt. - Khi chạy, Dalvik VM biên dịch Just-In-Time (JIT) => biên dịch từng phần khi mã cần. ##### ART Runtime - Quy trình đầu tương tự: `.java` → `.class` → `.dex`. - `dex2oat` biên dịch `Ahead-Of-Time (AOT)` thành `native code (.oat)` ngay khi cài đặt. - Khi chạy, ứng dụng thực thi trực tiếp từ mã máy, không cần JIT liên tục. 👉 Khi reverse engineering APK cần biết app chạy trên `Dalvik` hay `ART` để chọn công cụ phù hợp (apktool, jadx, oat2dex…). 👉 `ART` biên dịch trước thành `.oat`, nên đôi khi cần `de-odex` hoặc `oat2dex` để khôi phục `.dex` ban đầu. ### 5. **Cấu trúc file APK** ![image](https://hackmd.io/_uploads/SJed26_ueg.png) Một file APK (Android Package) thực chất là một file ZIP chứa toàn bộ tài nguyên và mã cần thiết để ứng dụng chạy. - `AndroidManifest.xml` (Manifest) - Khai báo thông tin ứng dụng: tên gói, quyền yêu cầu (permissions), các component (Activity, Service, Broadcast Receiver, Content Provider), version, intent filters… - Đây là file pentester thường phân tích đầu tiên để xác định bề mặt tấn công. - `META-INF/` (Signatures) - Chứa chữ ký số và thông tin chứng thực của ứng dụng. - Pentester có thể kiểm tra tính hợp lệ hoặc phát hiện khi chữ ký bị giả mạo. - `resources.arsc` (Compiled Resources) - File nhị phân chứa các tài nguyên đã biên dịch như string, layout, theme… - Có thể trích xuất để tìm text, URL, API key… - `lib/` (Natives Libraries) - Chứa thư viện viết bằng C/C++ (.so files) cho từng kiến trúc CPU (armeabi, arm64-v8a, x86…). - Kiểm tra để tìm lỗ hổng memory corruption, buffer overflow (IDA, Ghidra,...). - `class.dex` (Dalvik Bytecode) - Chứa bytecode của ứng dụng, có thể decompile để phân tích logic, tìm hardcoded credentials hoặc lỗi bảo mật. - `res/` (Resources) - Chứa tài nguyên chưa biên dịch như ảnh, layout XML. - Có thể tiết lộ thông tin ẩn nếu dev để file debug. ## Android's security model ### 1. **Giới thiệu** - Android Security Model là cơ chế bảo vệ được Android triển khai trên toàn hệ thống để ngăn chặn, giảm thiểu tấn công (sandbox, permission, app signing, SELinux, verified boot…). ### 2. **Application sandboxing** Sandboxing là cơ chế bảo mật cốt lõi của Android, đảm bảo mỗi ứng dụng chạy trong một môi trường tách biệt, hạn chế tối đa việc truy cập trái phép dữ liệu hoặc tài nguyên của ứng dụng khác. ![image](https://hackmd.io/_uploads/ryNSQAduel.png) - `UID` (User ID) và `GID` (Group ID) - Khi cài đặt, mỗi ứng dụng Android được gán một `UID` duy nhất trong hệ thống Linux. - Ứng dụng chỉ có quyền truy cập vào tài nguyên thuộc `UID` của mình, bao gồm thư mục dữ liệu riêng trong `/data/data/<package_name>/`. - `GID` được sử dụng để quản lý nhóm quyền mà app có thể tham gia (ví dụ: quyền truy cập mạng). - `Isolation of the user` : Mỗi ứng dụng được cách ly khỏi ứng dụng khác ở cấp độ hệ điều hành. ![image](https://hackmd.io/_uploads/H19BmROOxx.png) - Ví dụ cụ thể với WhatsApp (UID: 10078) và BrainDom (UID: 10085). - Mỗi app chạy trong `ART VM` riêng và chỉ có thể truy cập dữ liệu của chính mình. - `/data/data/com.whatsapp/` và `/data/data/com.android.braindom/` nằm trong các sandbox tách biệt. Điều này có nghĩa là WhatsApp không thể đọc dữ liệu của BrainDom và ngược lại, trừ khi cấp quyền qua cơ chế IPC (Inter-Process Communication) hoặc Content Provider. - Việc phá vỡ sandbox (ví dụ qua lỗ hổng hệ thống hoặc root) sẽ cho phép kẻ tấn công truy cập dữ liệu của app khác. ### 3. **Permissions** Hệ điều hành Android áp dụng cơ chế `permission-based access control` để kiểm soát cách ứng dụng truy cập tài nguyên và dịch vụ của hệ thống. Mỗi quyền (permission) xác định một hành động hoặc loại dữ liệu cụ thể mà ứng dụng có thể sử dụng. ![image](https://hackmd.io/_uploads/BJ_G8Cd_xg.png) - Ứng dụng chỉ có thể truy cập file của chính nó và các tài nguyên “world-accessible”. - Truy cập phần cứng (camera, GPS), kết nối mạng, dữ liệu hoặc dịch vụ hệ điều hành cần quyền cụ thể. - Các quyền được khai báo trong `AndroidManifest.xml`. - Ứng dụng có thể chia sẻ cùng một UID nếu được ký bằng cùng một certificate và dùng thuộc tính `sharedUserId`. ![image](https://hackmd.io/_uploads/rJHT8C_Oxl.png) - Kiểm tra xem chức năng cần xây dựng có thể thực hiện mà không cần permission hay không. - Nếu có thể → triển khai trực tiếp. - Nếu không, khai báo permission trong AndroidManifest.xml. - Xác định xem permission đó có phải là runtime permission không (nhóm dangerous). - Nếu có → yêu cầu người dùng cấp quyền khi app đang chạy. - Nếu không → quyền được cấp khi cài đặt. ### 4. **SE Linux** Từ Android 4.3, Google tích hợp `Security-Enhanced Linux` (SELinux) vào hệ điều hành để áp dụng mô hình `Mandatory Access Control` (MAC), gọi là `SEAndroid`. ![image](https://hackmd.io/_uploads/SJv8FR_Ogg.png) - `MAC` (Mandatory Access Control) - Kiểm soát truy cập dựa trên chính sách bảo mật bắt buộc, không thể bị bỏ qua bởi user hoặc ứng dụng. - Mọi hành động truy cập tài nguyên (file, process, network) đều bị kiểm tra so với policy trước khi cho phép. - Hai chế độ của SELinux: - `Permissive mode`: Ghi log các vi phạm nhưng không chặn hành động. Dùng cho debug và phát triển. - `Enforcing mode`: Vừa ghi log vừa chặn các hành động vi phạm policy. - `SEAndroid` tách các tiến trình hệ thống và dịch vụ vào domain riêng biệt, giảm thiểu khả năng một tiến trình bị compromise có thể tấn công sang tiến trình khác. 👉 Nếu ở Permissive, có thể khai thác các lỗ hổng privilege escalation dễ hơn. ## Công cụ pentest android ![image](https://hackmd.io/_uploads/ryZXoA__el.png) Các bạn có thể đọc qua bài [Cách setup lab Android-InsecureBankv2](/21Td7ILVQHyIgRtV9DtyPA) nhé. ![image](https://hackmd.io/_uploads/B1jVy1tOgl.png) ### Static analysis #### 1. **apktool** ![image](https://hackmd.io/_uploads/r1p3gJKdxl.png) - `apktool` là công cụ dòng lệnh hỗ trợ dịch ngược (decompile) ứng dụng Android (.apk) thành smali code và tài nguyên gốc (XML, hình ảnh, layout), cho phép phân tích và chỉnh sửa. Sau khi sửa đổi, `apktool` có thể biên dịch lại (recompile) thành APK mới. - Decompile:<pre>```apktool d app.apk```</pre> - Recompile:<pre>```apktool b app.apk```</pre> ![image](https://hackmd.io/_uploads/BkP6Zktdel.png) #### 2. **MobSF** ![image](https://hackmd.io/_uploads/HkH-M1FOll.png) - Tải ở đây nhá: [Mobsf](https://github.com/MobSF/Mobile-Security-Framework-MobSF) - `MobSF` là một framework mã nguồn mở hỗ trợ phân tích bảo mật ứng dụng di động (Android, iOS, Windows) theo cả hai hướng: - Phân tích tĩnh (Static Analysis): Tự động giải nén APK/IPA, dịch ngược code, quét AndroidManifest.xml, permissions, API nhạy cảm, hardcoded secrets, cấu hình bảo mật… - Phân tích động (Dynamic Analysis): Chạy ứng dụng trong môi trường sandbox để giám sát hành vi, lưu lượng mạng, file system và các truy cập nhạy cảm. #### 3. **jadx** ![image](https://hackmd.io/_uploads/HyjrmyY_lx.png) JADX là một công cụ dịch ngược (decompiler) mã nguồn mở dùng để chuyển đổi DEX bytecode (hoặc APK) của ứng dụng Android về mã Java dễ đọc. - Tải [jadx](https://github.com/skylot/jadx?tab=readme-ov-file) -Chức năng chính: - Hỗ trợ giải nén APK, DEX, JAR, AAR. - Dịch ngược DEX sang Java source code. - Giao diện GUI trực quan hoặc dùng CLI cho tự động hóa. - Tìm kiếm chuỗi, class, method nhanh chóng. - Hỗ trợ xuất toàn bộ mã nguồn ra thư mục để phân tích sâu. > Đó là một số tool mình hay dùng bạn có thể tham khảo thêm tại [đây nhé](https://github.com/tanprathan/MobileApp-Pentest-Cheatsheet). ### Dynamic analysis #### 1. **Frida** - Các bạn có thể đọc [Frida for Android Pentesting — A Beginner’s Guide](https://hackmd.io/@PinkArmor/fridaforbeginner) ở đây nhé. #### 2. **Burp Suite** --- <p align="center"><strong>🔥 Happy Hacking! 🔥</strong></p> --- <p align="center"><strong>From 37 with love!!! 💚</strong></p>