# 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.

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

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

Để 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

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


| 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` |