# Android Pentest #2 – Tổng quan Permissions và AndroidManifest.xml ## AndroidManifest.xml File `AndroidManifest.xml` khai báo cho hệ điều hành biết ứng dụng có những gì, cần quyền gì và tương tác với bên ngoài ra sao. ![image](https://hackmd.io/_uploads/HyJA5GkUZe.png) Cấu trúc tổng thể của file ```xml= <manifest> <uses-sdk /> <uses-permission /> <application> <activity /> <service /> <receiver /> <provider /> </application> </manifest> ``` ### <manifest> – root node ```xml= <manifest package="com.apphacking.privacy" android:versionCode="1" android:versionName="1.0"> ``` `Unique Identifier` (`Package Name`): Tên gói duy nhất của ứng dụng (ví dụ: `com.apphacking.privacy`). Đây là ID để hệ thống phân biệt các app với nhau. ### <uses-sdk> – API level ```xml= <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="30" /> ``` Nếu `targetSdkVersion >= 31` exported bắt buộc phải khai báo. App target thấp thường dính: exported mặc địnhbehavior cũ, dễ khai thác hơn. ### <uses-permission> ```xml= <uses-permission android:name="android.permission.READ_SMS"/> ``` Đây là danh sách các quyền mà ứng dụng yêu cầu hệ thống cấp phép (như đọc danh bạ, truy cập internet, định vị). ### <application> Là container của toàn bộ component. Trái tim của file Manifest. - Activities (Giao diện người dùng): - Khai báo qua thẻ `<activity>`. - Là các màn hình mà người dùng tương tác trực tiếp. - Pentest Tip: Tìm `Activity` có `<intent-filter>` chứa `action.MAIN` và `category.LAUNCHER` đây là điểm khởi đầu (Entry point) của app. ```xml= <activity android:name=".LoginActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity> ``` - Services (Tác vụ chạy nền): - Khai báo qua thẻ `<service>`. - Thực hiện các công việc lâu dài như tải file, phát nhạc mà không có UI. - Nếu không có UI Update, nó thường tương tác qua Broadcast. ```xml= <service android:name=".SyncService" android:exported="false" /> ``` - Broadcast Receivers (Bộ thu tín hiệu): - Khai báo qua thẻ `<receiver>`. - Lắng nghe các thông báo từ hệ thống hoặc app khác (như báo pin yếu, máy khởi động xong). ```xml= <receiver android:name=".BootReceiver" android:exported="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver> ``` - Content Providers (Quản lý dữ liệu): - Khai báo qua thẻ `<provider>`. - Quản lý việc chia sẻ database hoặc tệp tin giữa các ứng dụng. - Cần chú ý các thuộc tính như `android:authorities`, `android:exported="true"` và các quyền đọc/ghi file. ```xml= <provider android:name=".DBContentProvider" android:authorities="com.apphacking.privacy" android:exported="true" /> ``` ## Permissions ### Permissions - Android Sandboxing ![image](https://hackmd.io/_uploads/Sk8CbXk8We.png) Android sử dụng nhân Linux nên bản chất của Sandboxing là một app tương đương với một user. - Định danh duy nhất: Mỗi ứng dụng khi cài đặt sẽ được cấp một mã UID (User ID) riêng biệt, ví dụ như `uid:10113`. - Cô lập tài nguyên: Vì mỗi app là một "người dùng" Linux khác nhau, nên mặc định App A không thể truy cập vào tiến trình hay thư mục dữ liệu `/data/data/` của App B. - Bảo mật tệp tin: Data directory riêng `/data/data/<package>`. ### Permissions - App ![image](https://hackmd.io/_uploads/B1KNQm1UWl.png) Để một ứng dụng có thể "thoát" khỏi Sandbox của mình và truy cập tài nguyên hệ thống, nó phải khai báo các thẻ trong file AndroidManifest.xml: - `<uses-permission>`: Đây là các quyền mà ứng dụng yêu cầu từ hệ thống (ví dụ: `READ_CONTACTS`, `INTERNET`, `READ_EXTERNAL_STORAGE`). - Lưu trữ: Khi ứng dụng được cài đặt, các quyền này được hệ thống ghi lại trong file cấu hình `/data/system/packages.xml` để quản lý tập trung. #### Custom Permissions ![image](https://hackmd.io/_uploads/H1n48QkIZg.png) Một app có thể dùng thẻ `<permission>` để tạo ra một quyền mới (ví dụ: `READ_KEYS`) kèm theo một `protectionLevel`. Thực thi: Nếu App 2 muốn đọc "Key" của App 1, nó bắt buộc phải có dòng `<uses-permission android:name="...READ_KEYS" />` trong Manifest của mình. => Nếu App 1 định nghĩa quyền nhưng đặt `protectionLevel="normal"`, App 2 (maybe malware) có thể dễ dàng lấy được quyền này mà không cần sự đồng ý của người dùng. #### Protection Level ![image](https://hackmd.io/_uploads/H1OmD7y8We.png) ![image](https://hackmd.io/_uploads/r1i6D7JUZe.png) | Level | Đặc điểm | Pentest note | Ví dụ permission hay gặp | | --------------------- | ------------------------------------------ | ----------------------- | ------------------------ | | **normal** | Quyền rủi ro thấp, hệ thống tự động cấp | Thường ít nguy hiểm | `INTERNET`, `VIBRATE`, `ACCESS_NETWORK_STATE` | | **dangerous** | User phải allow (runtime permission) | Hay dính logic bug | `READ_CONTACTS`, `ACCESS_FINE_LOCATION`, `CAMERA`, `READ_EXTERNAL_STORAGE` | | **signature** | Chỉ app cùng certificate mới dùng được | Gần như an toàn | `READ_LOGS`, custom permission của app | | **signatureOrSystem** | Chỉ app hệ thống / app ký cert hệ thống | Không cho app thường | `WRITE_SECURE_SETTINGS`, `MODIFY_PHONE_STATE` |