---
# System prepended metadata

title: 'Android Pentest #2 – Tổng quan Permissions và AndroidManifest.xml'

---

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