mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/mobile-pentesting/android-app-pentesting/android-applic
This commit is contained in:
parent
fd0a75820f
commit
7fb719110c
@ -4,10 +4,10 @@
|
|||||||
|
|
||||||
## Android Security Model
|
## Android Security Model
|
||||||
|
|
||||||
**二つのレイヤーがあります:**
|
**二つの層があります:**
|
||||||
|
|
||||||
- **OS**は、インストールされたアプリケーションを互いに隔離します。
|
- **OS**は、インストールされたアプリケーションを互いに隔離します。
|
||||||
- **アプリケーション自体**は、開発者が**特定の機能を公開**し、アプリケーションの機能を設定することを可能にします。
|
- **アプリケーション自体**は、開発者が**特定の機能を公開**し、アプリケーションの機能を構成することを可能にします。
|
||||||
|
|
||||||
### UID Separation
|
### UID Separation
|
||||||
|
|
||||||
@ -15,8 +15,8 @@
|
|||||||
|
|
||||||
### UID Sharing
|
### UID Sharing
|
||||||
|
|
||||||
**二つのアプリケーションは同じUIDを使用するように設定できます**。これは情報を共有するのに便利ですが、一方が侵害されると両方のアプリケーションのデータが侵害されることになります。これがこの動作が**推奨されない理由です**。\
|
**二つのアプリケーションは同じUIDを使用するように構成できます**。これは情報を共有するのに便利ですが、一方が侵害されると両方のアプリケーションのデータが侵害されることになります。これがこの動作が**推奨されない理由です**。\
|
||||||
**同じUIDを共有するには、アプリケーションはマニフェストで同じ`android:sharedUserId`値を定義する必要があります。**
|
**同じUIDを共有するには、アプリケーションはマニフェスト内で同じ`android:sharedUserId`値を定義する必要があります。**
|
||||||
|
|
||||||
### Sandboxing
|
### Sandboxing
|
||||||
|
|
||||||
@ -25,10 +25,10 @@ Android 5.0(L)以降は**SELinux**が強制されます。基本的に、SELinux
|
|||||||
|
|
||||||
### Permissions
|
### Permissions
|
||||||
|
|
||||||
アプリをインストールするときに**アプリが権限を要求する**場合、アプリは**AndroidManifest.xml**ファイル内の**`uses-permission`**要素に設定された権限を要求しています。**uses-permission**要素は、**name**属性内で要求された権限の名前を示します。また、**maxSdkVersion**属性があり、指定されたバージョンよりも高いバージョンでは権限の要求を停止します。\
|
アプリをインストールするときに**権限を要求される**場合、アプリは**AndroidManifest.xml**ファイル内の**`uses-permission`**要素で構成された権限を要求しています。**uses-permission**要素は、**name**属性内で要求された権限の名前を示します。また、**maxSdkVersion**属性もあり、指定されたバージョンよりも高いバージョンでは権限を要求しなくなります。\
|
||||||
Androidアプリケーションは最初にすべての権限を要求する必要はなく、**動的に権限を要求することもできます**が、すべての権限は**マニフェストに宣言されている必要があります**。
|
Androidアプリケーションは最初にすべての権限を要求する必要はなく、**動的に権限を要求することもできますが、すべての権限は**マニフェスト内で**宣言されなければなりません**。
|
||||||
|
|
||||||
アプリが機能を公開する際には、**特定の権限を持つアプリのみがアクセスできるように制限することができます**。\
|
アプリが機能を公開する際には、**特定の権限を持つアプリのみにアクセスを制限することができます**。\
|
||||||
権限要素には三つの属性があります:
|
権限要素には三つの属性があります:
|
||||||
|
|
||||||
- 権限の**name**
|
- 権限の**name**
|
||||||
@ -45,24 +45,24 @@ Androidアプリケーションは最初にすべての権限を要求する必
|
|||||||
|
|
||||||
- **AOSP**(Android OpenSource Project)**ROM**に付属しているもの
|
- **AOSP**(Android OpenSource Project)**ROM**に付属しているもの
|
||||||
- デバイスの**製造元**によって追加されたもの
|
- デバイスの**製造元**によって追加されたもの
|
||||||
- **携帯電話プロバイダー**によって追加されたもの(彼らから購入した場合)
|
- 携帯電話の**プロバイダー**によって追加されたもの(彼らから購入した場合)
|
||||||
|
|
||||||
## Rooting
|
## Rooting
|
||||||
|
|
||||||
物理的なAndroidデバイスにルートアクセスを取得するには、一般的に**1つまたは2つの脆弱性を**利用する必要があります。これらは**デバイス**と**バージョン**に特有のものであることが多いです。\
|
物理的なAndroidデバイスにルートアクセスを取得するには、一般的に**1つまたは2つの脆弱性を**利用する必要があります。これらは通常、**デバイス**および**バージョン**に特有です。\
|
||||||
エクスプロイトが成功すると、通常、Linuxの`su`バイナリがユーザーのPATH環境変数に指定された場所(例:`/system/xbin`)にコピーされます。
|
エクスプロイトが成功すると、通常、Linuxの`su`バイナリがユーザーのPATH環境変数で指定された場所(例:`/system/xbin`)にコピーされます。
|
||||||
|
|
||||||
`su`バイナリが設定されると、別のAndroidアプリが`su`バイナリとインターフェースし、**ルートアクセスのリクエストを処理します**。これには**Superuser**や**SuperSU**(Google Playストアで入手可能)が含まれます。
|
`su`バイナリが設定されると、別のAndroidアプリが`su`バイナリとインターフェースし、**ルートアクセスのリクエストを処理**します。これには**Superuser**や**SuperSU**(Google Playストアで入手可能)が含まれます。
|
||||||
|
|
||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
> ルート化プロセスは非常に危険であり、デバイスに深刻な損傷を与える可能性があることに注意してください。
|
> ルート化プロセスは非常に危険であり、デバイスに深刻な損傷を与える可能性があることに注意してください。
|
||||||
|
|
||||||
### ROMs
|
### ROMs
|
||||||
|
|
||||||
**カスタムファームウェアをインストールすることでOSを置き換えることが可能です**。これにより、古いデバイスの有用性を拡張したり、ソフトウェア制限を回避したり、最新のAndroidコードにアクセスしたりすることができます。\
|
**カスタムファームウェアをインストールしてOSを置き換えることが可能です**。これにより、古いデバイスの有用性を拡張したり、ソフトウェア制限を回避したり、最新のAndroidコードにアクセスしたりできます。\
|
||||||
**OmniROM**や**LineageOS**は使用するのに人気のあるファームウェアの二つです。
|
**OmniROM**や**LineageOS**は使用するのに人気のあるファームウェアの二つです。
|
||||||
|
|
||||||
**カスタムファームウェアをインストールするためにデバイスをルート化する必要はないことに注意してください**。**一部の製造元は**、文書化され、安全な方法でブートローダーのロック解除を許可しています。
|
**カスタムファームウェアをインストールするためにデバイスをルート化する必要はないこともあります**。**一部の製造元は**、文書化され、安全な方法でブートローダーのロック解除を許可しています。
|
||||||
|
|
||||||
### Implications
|
### Implications
|
||||||
|
|
||||||
@ -77,9 +77,9 @@ Androidアプリケーションは最初にすべての権限を要求する必
|
|||||||
- resources.arsc:バイナリXMLのようなプリコンパイルされたリソースを含みます。
|
- resources.arsc:バイナリXMLのようなプリコンパイルされたリソースを含みます。
|
||||||
- res/xml/files_paths.xml
|
- res/xml/files_paths.xml
|
||||||
- META-INF/
|
- META-INF/
|
||||||
- ここに証明書が存在します!
|
- ここに証明書があります!
|
||||||
- **classes.dex**
|
- **classes.dex**
|
||||||
- Dalvikバイトコードを含み、アプリケーションがデフォルトで実行するコンパイルされたJava(またはKotlin)コードを表します。
|
- アプリケーションがデフォルトで実行するコンパイルされたJava(またはKotlin)コードを表すDalvikバイトコードを含みます。
|
||||||
- lib/
|
- lib/
|
||||||
- CPUアーキテクチャごとにサブディレクトリに分けられたネイティブライブラリを格納します。
|
- CPUアーキテクチャごとにサブディレクトリに分けられたネイティブライブラリを格納します。
|
||||||
- `armeabi`:ARMベースのプロセッサ用のコード
|
- `armeabi`:ARMベースのプロセッサ用のコード
|
||||||
@ -99,7 +99,7 @@ Android開発では、**JavaまたはKotlin**がアプリ作成に使用され
|
|||||||
|
|
||||||
## Intents
|
## Intents
|
||||||
|
|
||||||
インテントは、Androidアプリがそのコンポーネント間または他のアプリと通信するための主要な手段です。これらのメッセージオブジェクトは、アプリ間またはコンポーネント間でデータを運ぶこともでき、HTTP通信でのGET/POSTリクエストのように機能します。
|
インテントは、Androidアプリがそのコンポーネント間または他のアプリと通信するための主要な手段です。これらのメッセージオブジェクトは、アプリ間やコンポーネント間でデータを運ぶこともでき、HTTP通信でのGET/POSTリクエストのように機能します。
|
||||||
|
|
||||||
したがって、インテントは基本的に**コンポーネント間で渡されるメッセージ**です。インテントは**特定のコンポーネントやアプリに向けられる**ことも、**特定の受取人なしで送信される**こともできます。\
|
したがって、インテントは基本的に**コンポーネント間で渡されるメッセージ**です。インテントは**特定のコンポーネントやアプリに向けられる**ことも、**特定の受取人なしで送信される**こともできます。\
|
||||||
簡単に言えば、インテントは次のように使用できます:
|
簡単に言えば、インテントは次のように使用できます:
|
||||||
@ -118,9 +118,9 @@ Android開発では、**JavaまたはKotlin**がアプリ作成に使用され
|
|||||||
|
|
||||||
インテントフィルターは、カテゴリ、アクション、およびデータフィルターで構成され、追加のメタデータを含めることができます。この設定により、コンポーネントは宣言された基準に一致する特定のインテントを処理できます。
|
インテントフィルターは、カテゴリ、アクション、およびデータフィルターで構成され、追加のメタデータを含めることができます。この設定により、コンポーネントは宣言された基準に一致する特定のインテントを処理できます。
|
||||||
|
|
||||||
Androidコンポーネント(アクティビティ/サービス/コンテンツプロバイダー/ブロードキャストレシーバー)の重要な側面は、その可視性または**公開状態**です。コンポーネントは、**`exported`**が**`true`**の値である場合、またはマニフェストにインテントフィルターが宣言されている場合、公開と見なされ、他のアプリと相互作用できます。ただし、開発者はこれらのコンポーネントを明示的にプライベートに保ち、他のアプリと意図せず相互作用しないようにする方法があります。これは、マニフェスト定義で**`exported`**属性を**`false`**に設定することで実現されます。
|
Androidコンポーネント(アクティビティ/サービス/コンテンツプロバイダー/ブロードキャストレシーバー)の重要な側面は、その可視性または**公開状態**です。コンポーネントは、**`exported`**が**`true`**の値で設定されている場合、またはマニフェスト内でインテントフィルターが宣言されている場合、公開と見なされ、他のアプリと相互作用できます。ただし、開発者はこれらのコンポーネントを明示的にプライベートに保ち、他のアプリと意図せず相互作用しないようにする方法があります。これは、マニフェスト定義内で**`exported`**属性を**`false`**に設定することで実現されます。
|
||||||
|
|
||||||
さらに、開発者は特定の権限を要求することで、これらのコンポーネントへのアクセスをさらに保護するオプションがあります。**`permission`**属性を設定することで、指定された権限を持つアプリのみがコンポーネントにアクセスできるようにし、誰がそれと相互作用できるかに対する追加のセキュリティと制御のレイヤーを追加します。
|
さらに、開発者は特定の権限を要求することで、これらのコンポーネントへのアクセスをさらに保護するオプションがあります。**`permission`**属性を設定することで、指定された権限を持つアプリのみがコンポーネントにアクセスできるようにし、誰がそれと相互作用できるかに対する追加のセキュリティと制御の層を追加します。
|
||||||
```java
|
```java
|
||||||
<activity android:name=".MyActivity" android:exported="false">
|
<activity android:name=".MyActivity" android:exported="false">
|
||||||
<!-- Intent filters go here -->
|
<!-- Intent filters go here -->
|
||||||
@ -132,9 +132,9 @@ Androidコンポーネント(アクティビティ/サービス/コンテン
|
|||||||
```java
|
```java
|
||||||
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
|
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
|
||||||
```
|
```
|
||||||
**Action**として以前に宣言されたインテントは**ACTION_SEND**であり、**Extra**はmailto **Uri**です(Extraはインテントが期待している追加情報です)。
|
この**Action**は、以前に宣言されたインテントの**ACTION_SEND**であり、**Extra**はmailto **Uri**です(Extraはインテントが期待している追加情報です)。
|
||||||
|
|
||||||
このインテントは、以下の例のようにマニフェスト内で宣言する必要があります:
|
このインテントは、以下の例のようにマニフェスト内で宣言する必要があります:
|
||||||
```xml
|
```xml
|
||||||
<activity android:name="ShareActivity">
|
<activity android:name="ShareActivity">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
@ -145,7 +145,7 @@ Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
|
|||||||
```
|
```
|
||||||
インテントフィルターは、メッセージを受信するために**アクション**、**データ**、および**カテゴリ**が一致する必要があります。
|
インテントフィルターは、メッセージを受信するために**アクション**、**データ**、および**カテゴリ**が一致する必要があります。
|
||||||
|
|
||||||
「インテント解決」プロセスは、どのアプリが各メッセージを受信すべきかを決定します。このプロセスは、**優先度属性**を考慮し、これは**インテントフィルター宣言**で設定できます。**優先度が高い方が選択されます**。この優先度は-1000から1000の間で設定でき、アプリケーションは`SYSTEM_HIGH_PRIORITY`値を使用できます。**競合**が発生した場合、「チョイザー」ウィンドウが表示され、**ユーザーが決定できます**。
|
「インテント解決」プロセスは、どのアプリが各メッセージを受信するべきかを決定します。このプロセスは、**優先度属性**を考慮し、これは**インテントフィルター宣言**で設定できます。**優先度が高い方が選択されます**。この優先度は-1000から1000の間で設定でき、アプリケーションは`SYSTEM_HIGH_PRIORITY`値を使用できます。**競合**が発生した場合、「チョイザー」ウィンドウが表示され、**ユーザーが決定できます**。
|
||||||
|
|
||||||
### 明示的インテント
|
### 明示的インテント
|
||||||
|
|
||||||
@ -161,11 +161,11 @@ context.startService(intent);
|
|||||||
```
|
```
|
||||||
### Pending Intents
|
### Pending Intents
|
||||||
|
|
||||||
これにより、他のアプリケーションが**あなたのアプリケーションの代理でアクションを実行する**ことができます。Pending Intentを構築する際には、**インテントと実行するアクションを指定する必要があります**。もし**宣言されたインテントが明示的でない場合**(どのインテントが呼び出せるかを宣言していない場合)、**悪意のあるアプリケーションが被害者アプリの代理で宣言されたアクションを実行する可能性があります**。さらに、**アクションが指定されていない場合**、悪意のあるアプリは**被害者の代理で任意のアクションを実行できる**ことになります。
|
これにより、他のアプリケーションが**あなたのアプリケーションの代理でアクションを実行する**ことができます。Pending Intentを構築する際には、**インテントと実行するアクションを指定する必要があります**。もし**宣言されたインテントが明示的でない場合**(どのインテントが呼び出せるかを宣言していない場合)、**悪意のあるアプリケーションが被害者アプリの代理で宣言されたアクションを実行する可能性があります**。さらに、**アクションが指定されていない場合**、悪意のあるアプリは**被害者の代理で任意のアクションを実行できる**ようになります。
|
||||||
|
|
||||||
### Broadcast Intents
|
### Broadcast Intents
|
||||||
|
|
||||||
前のインテントとは異なり、1つのアプリだけが受信するのではなく、ブロードキャストインテントは**複数のアプリで受信可能です**。ただし、APIバージョン14以降は、**メッセージを受信するアプリを指定することが可能です**。Intent.setPackageを使用します。
|
前述のインテントとは異なり、ブロードキャストインテントは**複数のアプリで受信される可能性があります**。ただし、APIバージョン14以降は、Intent.setPackageを使用して**メッセージを受信すべきアプリを指定することが可能です**。
|
||||||
|
|
||||||
また、ブロードキャストを送信する際に**権限を指定することも可能です**。受信アプリはその権限を持っている必要があります。
|
また、ブロードキャストを送信する際に**権限を指定することも可能です**。受信アプリはその権限を持っている必要があります。
|
||||||
|
|
||||||
@ -186,7 +186,7 @@ context.startService(intent);
|
|||||||
|
|
||||||
Androidアプリケーションでは、**ディープリンク**を使用してURLを介して直接アクション(インテント)を開始します。これは、アクティビティ内で特定の**URLスキーム**を宣言することによって行われます。Androidデバイスがこのスキームを持つURLに**アクセスしようとすると**、アプリケーション内の指定されたアクティビティが起動します。
|
Androidアプリケーションでは、**ディープリンク**を使用してURLを介して直接アクション(インテント)を開始します。これは、アクティビティ内で特定の**URLスキーム**を宣言することによって行われます。Androidデバイスがこのスキームを持つURLに**アクセスしようとすると**、アプリケーション内の指定されたアクティビティが起動します。
|
||||||
|
|
||||||
スキームは**`AndroidManifest.xml`**ファイル内で宣言する必要があります:
|
スキームは**`AndroidManifest.xml`**ファイルに宣言する必要があります:
|
||||||
```xml
|
```xml
|
||||||
[...]
|
[...]
|
||||||
<activity android:name=".MyActivity">
|
<activity android:name=".MyActivity">
|
||||||
@ -198,7 +198,7 @@ Androidアプリケーションでは、**ディープリンク**を使用して
|
|||||||
</intent-filter>
|
</intent-filter>
|
||||||
[...]
|
[...]
|
||||||
```
|
```
|
||||||
前の例のスキームは `examplescheme://` です(**`category BROWSABLE`** にも注意してください)
|
前の例のスキームは `examplescheme://` です(**`category BROWSABLE`** も注意してください)
|
||||||
|
|
||||||
次に、データフィールドで **host** と **path** を指定できます:
|
次に、データフィールドで **host** と **path** を指定できます:
|
||||||
```xml
|
```xml
|
||||||
@ -217,13 +217,13 @@ HTMLページを使用せずに[ディープリンクを呼び出す方法](#exp
|
|||||||
|
|
||||||
## AIDL - Androidインターフェース定義言語
|
## AIDL - Androidインターフェース定義言語
|
||||||
|
|
||||||
**Androidインターフェース定義言語(AIDL)**は、Androidアプリケーションにおける**プロセス間通信**(IPC)を通じてクライアントとサービス間の通信を促進するために設計されています。他のプロセスのメモリに直接アクセスすることはAndroidでは許可されていないため、AIDLはオブジェクトをオペレーティングシステムが理解できる形式にマーシャリングすることで、異なるプロセス間の通信を容易にします。
|
**Androidインターフェース定義言語(AIDL)**は、Androidアプリケーションにおける**プロセス間通信**(IPC)を通じてクライアントとサービス間の通信を促進するために設計されています。別のプロセスのメモリに直接アクセスすることはAndroidでは許可されていないため、AIDLはオブジェクトをオペレーティングシステムが理解できる形式にマーシャリングすることで、異なるプロセス間の通信を容易にします。
|
||||||
|
|
||||||
### 主要概念
|
### 主要概念
|
||||||
|
|
||||||
- **バウンドサービス**: これらのサービスはIPCのためにAIDLを利用し、アクティビティやコンポーネントがサービスにバインドし、リクエストを行い、レスポンスを受け取ることを可能にします。サービスのクラス内の`onBind`メソッドは、相互作用を開始するために重要であり、脆弱性を探すためのセキュリティレビューにおいて重要な領域です。
|
- **バウンドサービス**: これらのサービスはIPCのためにAIDLを利用し、アクティビティやコンポーネントがサービスにバインドし、リクエストを行い、レスポンスを受け取ることを可能にします。サービスのクラス内の`onBind`メソッドは、相互作用を開始するために重要であり、脆弱性を探すためのセキュリティレビューにおいて重要な領域です。
|
||||||
|
|
||||||
- **メッセンジャー**: バウンドサービスとして機能するメッセンジャーは、`onBind`メソッドを通じてデータを処理することに重点を置いたIPCを促進します。このメソッドを注意深く検査し、安全でないデータ処理や機密関数の実行がないか確認することが重要です。
|
- **メッセンジャー**: バウンドサービスとして機能するメッセンジャーは、`onBind`メソッドを通じてデータを処理することに重点を置いてIPCを促進します。このメソッドを注意深く検査し、安全でないデータ処理や機密関数の実行がないか確認することが重要です。
|
||||||
|
|
||||||
- **バインダー**: AIDLの抽象化によりバインダーの直接使用はあまり一般的ではありませんが、バインダーは異なるプロセスのメモリ空間間でデータ転送を促進するカーネルレベルのドライバーとして機能することを理解することは有益です。さらなる理解のために、リソースは[https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8)で利用可能です。
|
- **バインダー**: AIDLの抽象化によりバインダーの直接使用はあまり一般的ではありませんが、バインダーは異なるプロセスのメモリ空間間でデータ転送を促進するカーネルレベルのドライバーとして機能することを理解することは有益です。さらなる理解のために、リソースは[https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8)で利用可能です。
|
||||||
|
|
||||||
@ -252,9 +252,9 @@ Androidアプリでは、**アクティビティ**は画面のようなもので
|
|||||||
```
|
```
|
||||||
しかし、別のアプリからアクティビティにアクセスすることが常にセキュリティリスクであるわけではありません。懸念は、機密データが不適切に共有される場合に生じ、情報漏洩につながる可能性があります。
|
しかし、別のアプリからアクティビティにアクセスすることが常にセキュリティリスクであるわけではありません。懸念は、機密データが不適切に共有される場合に生じ、情報漏洩につながる可能性があります。
|
||||||
|
|
||||||
アクティビティのライフサイクルは**onCreateメソッド**から始まり、UIを設定し、ユーザーとのインタラクションのためにアクティビティを準備します。
|
アクティビティのライフサイクルは**onCreateメソッドから始まり**、UIを設定し、ユーザーとのインタラクションのためにアクティビティを準備します。
|
||||||
|
|
||||||
### アプリケーションクラス
|
### アプリケーションサブクラス
|
||||||
|
|
||||||
Android開発では、アプリは[Application](https://developer.android.com/reference/android/app/Application)クラスの**サブクラス**を作成するオプションがありますが、必須ではありません。このようなサブクラスが定義されると、それはアプリ内で最初にインスタンス化されるクラスになります。**`attachBaseContext`**メソッドがこのサブクラスで実装されている場合、**`onCreate`**メソッドの前に実行されます。このセットアップにより、アプリケーションの残りの部分が開始される前に早期初期化が可能になります。
|
Android開発では、アプリは[Application](https://developer.android.com/reference/android/app/Application)クラスの**サブクラス**を作成するオプションがありますが、必須ではありません。このようなサブクラスが定義されると、それはアプリ内で最初にインスタンス化されるクラスになります。**`attachBaseContext`**メソッドがこのサブクラスで実装されている場合、**`onCreate`**メソッドの前に実行されます。このセットアップにより、アプリケーションの残りの部分が開始される前に早期初期化が可能になります。
|
||||||
```java
|
```java
|
||||||
@ -278,27 +278,27 @@ super.onCreate();
|
|||||||
|
|
||||||
サービスは多用途であり、さまざまな方法で開始できますが、**Intents** がアプリケーションのエントリーポイントとしてサービスを起動する主な方法です。`startService` メソッドを使用してサービスが開始されると、その `onStart` メソッドが動作を開始し、`stopService` メソッドが明示的に呼び出されるまで実行を続けます。あるいは、サービスの役割がアクティブなクライアント接続に依存している場合、`bindService` メソッドを使用してクライアントをサービスにバインドし、データの受け渡しのために `onBind` メソッドが呼び出されます。
|
サービスは多用途であり、さまざまな方法で開始できますが、**Intents** がアプリケーションのエントリーポイントとしてサービスを起動する主な方法です。`startService` メソッドを使用してサービスが開始されると、その `onStart` メソッドが動作を開始し、`stopService` メソッドが明示的に呼び出されるまで実行を続けます。あるいは、サービスの役割がアクティブなクライアント接続に依存している場合、`bindService` メソッドを使用してクライアントをサービスにバインドし、データの受け渡しのために `onBind` メソッドが呼び出されます。
|
||||||
|
|
||||||
サービスの興味深い応用には、バックグラウンドでの音楽再生や、ユーザーがアプリと対話することを妨げることなくネットワークデータを取得することが含まれます。さらに、サービスは**エクスポート**を通じて同じデバイス上の他のプロセスにアクセス可能にすることができます。これはデフォルトの動作ではなく、Android Manifestファイルで明示的な設定が必要です:
|
サービスの興味深い応用には、バックグラウンドでの音楽再生やネットワークデータの取得が含まれ、ユーザーがアプリと対話することを妨げません。さらに、サービスは**エクスポート**を通じて同じデバイス上の他のプロセスにアクセス可能にすることができます。これはデフォルトの動作ではなく、Android Manifestファイルで明示的な設定が必要です:
|
||||||
```xml
|
```xml
|
||||||
<service android:name=".ExampleExportedService" android:exported="true"/>
|
<service android:name=".ExampleExportedService" android:exported="true"/>
|
||||||
```
|
```
|
||||||
### Broadcast Receivers
|
### Broadcast Receivers
|
||||||
|
|
||||||
**Broadcast receivers** は、メッセージングシステムにおけるリスナーとして機能し、複数のアプリケーションがシステムからの同じメッセージに応答できるようにします。アプリは **Manifest** を通じて、または **`registerReceiver`** API を介してアプリのコード内で **2つの主要な方法** で **レシーバーを登録** できます。Manifest では、ブロードキャストは権限でフィルタリングされ、動的に登録されたレシーバーは登録時に権限を指定することもできます。
|
**Broadcast receivers** は、メッセージングシステムにおけるリスナーとして機能し、複数のアプリケーションがシステムからの同じメッセージに応答できるようにします。アプリは **Manifest** を通じて、または **`registerReceiver`** API を介してアプリのコード内で **2つの主要な方法** で **レシーバーを登録** できます。Manifest では、ブロードキャストは権限でフィルタリングされますが、動的に登録されたレシーバーは登録時に権限を指定することもできます。
|
||||||
|
|
||||||
**Intent フィルター** は、両方の登録方法で重要であり、どのブロードキャストがレシーバーをトリガーするかを決定します。一致するブロードキャストが送信されると、レシーバーの **`onReceive`** メソッドが呼び出され、アプリが低バッテリーアラートに応じて動作を調整するなど、適切に反応できるようになります。
|
**Intent フィルター** は、両方の登録方法で重要であり、どのブロードキャストがレシーバーをトリガーするかを決定します。一致するブロードキャストが送信されると、レシーバーの **`onReceive`** メソッドが呼び出され、アプリが低バッテリーアラートに応じて動作を調整するなど、適切に反応できるようになります。
|
||||||
|
|
||||||
ブロードキャストは **非同期** であり、順序なしにすべてのレシーバーに到達することも、**同期** であり、レシーバーが設定された優先順位に基づいてブロードキャストを受け取ることもできます。ただし、任意のアプリが自分自身を優先させてブロードキャストを傍受できる可能性があるため、潜在的なセキュリティリスクに注意することが重要です。
|
ブロードキャストは **非同期** であり、順序なしにすべてのレシーバーに到達することも、**同期** であり、レシーバーが設定された優先順位に基づいてブロードキャストを受け取ることもできます。ただし、どのアプリでも自分を優先させてブロードキャストを傍受できる可能性があるため、潜在的なセキュリティリスクに注意することが重要です。
|
||||||
|
|
||||||
レシーバーの機能を理解するには、そのクラス内の **`onReceive`** メソッドを探してください。このメソッドのコードは受信した Intent を操作でき、特に **Ordered Broadcasts** では、データの検証が必要であることを強調しています。Ordered Broadcasts は Intent を変更または削除することができます。
|
レシーバーの機能を理解するには、そのクラス内の **`onReceive`** メソッドを探します。このメソッドのコードは受信した Intent を操作できるため、特に **Ordered Broadcasts** では、レシーバーによるデータ検証の必要性が強調されます。Ordered Broadcasts は Intent を変更または削除することができます。
|
||||||
|
|
||||||
### Content Provider
|
### Content Provider
|
||||||
|
|
||||||
**Content Providers** は、アプリ間で **構造化データを共有する** ために不可欠であり、データセキュリティを確保するために **権限** を実装する重要性を強調しています。これにより、アプリはデータベース、ファイルシステム、またはウェブなど、さまざまなソースからデータにアクセスできます。**`readPermission`** や **`writePermission`** などの特定の権限は、アクセスを制御するために重要です。さらに、一時的なアクセスは、アプリのマニフェスト内の **`grantUriPermission`** 設定を通じて付与でき、`path`、`pathPrefix`、および `pathPattern` などの属性を利用して詳細なアクセス制御を行います。
|
**Content Providers** は、アプリ間で **構造化データを共有する** ために不可欠であり、データセキュリティを確保するために **権限** を実装する重要性を強調します。これにより、アプリはデータベース、ファイルシステム、またはウェブなど、さまざまなソースからデータにアクセスできます。特定の権限、例えば **`readPermission`** と **`writePermission`** は、アクセスを制御するために重要です。さらに、一時的なアクセスは、アプリのマニフェスト内の **`grantUriPermission`** 設定を通じて付与でき、`path`、`pathPrefix`、および `pathPattern` などの属性を利用して詳細なアクセス制御を行います。
|
||||||
|
|
||||||
入力検証は、SQL インジェクションなどの脆弱性を防ぐために重要です。Content Providers は、データ操作とアプリケーション間の共有を促進する基本的な操作をサポートします: `insert()`、`update()`、`delete()`、および `query()`。
|
入力検証は、SQL インジェクションなどの脆弱性を防ぐために重要です。Content Providers は、データ操作とアプリケーション間の共有を促進する基本的な操作をサポートします: `insert()`、`update()`、`delete()`、および `query()`。
|
||||||
|
|
||||||
**FileProvider** は、ファイルを安全に共有することに特化した Content Provider です。これは、フォルダーへのアクセスを制御するための特定の属性を持ってアプリのマニフェストで定義され、`android:exported` および `android:resource` がフォルダー構成を指します。機密データが誤って公開されないように、ディレクトリを共有する際には注意が必要です。
|
**FileProvider** は、ファイルを安全に共有することに特化した Content Provider です。これは、フォルダーへのアクセスを制御するための特定の属性を持ってアプリのマニフェストで定義され、`android:exported` と `android:resource` がフォルダーの構成を指します。機密データを誤って公開しないように、ディレクトリを共有する際には注意が必要です。
|
||||||
|
|
||||||
FileProvider の例のマニフェスト宣言:
|
FileProvider の例のマニフェスト宣言:
|
||||||
```xml
|
```xml
|
||||||
@ -325,10 +325,10 @@ android:resource="@xml/filepaths" />
|
|||||||
|
|
||||||
WebViewsはAndroidアプリ内の**ミニウェブブラウザ**のようなもので、ウェブまたはローカルファイルからコンテンツを取得します。通常のブラウザと同様のリスクに直面しますが、特定の**設定**を通じて**リスクを軽減する**方法があります。
|
WebViewsはAndroidアプリ内の**ミニウェブブラウザ**のようなもので、ウェブまたはローカルファイルからコンテンツを取得します。通常のブラウザと同様のリスクに直面しますが、特定の**設定**を通じて**リスクを軽減する**方法があります。
|
||||||
|
|
||||||
Androidは主に2種類のWebViewを提供しています:
|
Androidは主に2つのWebViewタイプを提供します:
|
||||||
|
|
||||||
- **WebViewClient**は基本的なHTMLには適していますが、JavaScriptのアラート機能をサポートしていないため、XSS攻撃のテストに影響を与えます。
|
- **WebViewClient**は基本的なHTMLには適していますが、JavaScriptのアラート機能をサポートしていないため、XSS攻撃のテストに影響を与えます。
|
||||||
- **WebChromeClient**はフルChromeブラウザの体験に近い動作をします。
|
- **WebChromeClient**はフルChromeブラウザの体験に近いです。
|
||||||
|
|
||||||
重要な点は、WebViewブラウザはデバイスのメインブラウザと**クッキーを共有しない**ことです。
|
重要な点は、WebViewブラウザはデバイスのメインブラウザと**クッキーを共有しない**ことです。
|
||||||
|
|
||||||
@ -336,7 +336,7 @@ Androidは主に2種類のWebViewを提供しています:
|
|||||||
|
|
||||||
JavaScriptの「ブリッジ」はJavaオブジェクトがJavaScriptと相互作用することを可能にし、Android 4.2以降はセキュリティのためにメソッドに`@JavascriptInterface`を付ける必要があります。
|
JavaScriptの「ブリッジ」はJavaオブジェクトがJavaScriptと相互作用することを可能にし、Android 4.2以降はセキュリティのためにメソッドに`@JavascriptInterface`を付ける必要があります。
|
||||||
|
|
||||||
コンテンツアクセスを許可すること(`setAllowContentAccess(true)`)はWebViewがContent Providersにアクセスできるようにしますが、コンテンツURLが安全であることを確認しない限りリスクとなる可能性があります。
|
コンテンツアクセスを許可すること(`setAllowContentAccess(true)`)はWebViewsがContent Providersにアクセスできるようにしますが、コンテンツURLが安全であることを確認しない限りリスクとなる可能性があります。
|
||||||
|
|
||||||
ファイルアクセスを制御するために:
|
ファイルアクセスを制御するために:
|
||||||
|
|
||||||
@ -346,11 +346,15 @@ JavaScriptの「ブリッジ」はJavaオブジェクトがJavaScriptと相互
|
|||||||
|
|
||||||
### **アプリケーションのデジタル署名**
|
### **アプリケーションのデジタル署名**
|
||||||
|
|
||||||
- **デジタル署名**はAndroidアプリに必須で、インストール前に**真正に作成された**ことを保証します。このプロセスはアプリの識別のために証明書を使用し、インストール時にデバイスのパッケージマネージャーによって検証される必要があります。アプリは**自己署名または外部CAによって認証**され、無許可のアクセスから保護され、デバイスへの配信中にアプリが改ざんされないことを保証します。
|
- **デジタル署名**はAndroidアプリに必須で、インストール前に**真正に作成された**ことを保証します。このプロセスはアプリの識別のために証明書を使用し、インストール時にデバイスのパッケージマネージャーによって検証される必要があります。アプリは**自己署名または外部CAによって認証**され、不正アクセスから保護され、デバイスへの配信中にアプリが改ざんされないことを保証します。
|
||||||
|
|
||||||
### **セキュリティ強化のためのアプリ検証**
|
### **セキュリティ強化のためのアプリ検証**
|
||||||
|
|
||||||
- **Android 4.2**以降、**Verify Apps**という機能により、ユーザーはインストール前にアプリの安全性を確認できます。この**検証プロセス**は、潜在的に有害なアプリに対してユーザーに警告を発したり、特に悪意のあるアプリのインストールを防いだり
|
- **Android 4.2**以降、**Verify Apps**という機能により、ユーザーはインストール前にアプリの安全性を確認できます。この**検証プロセス**は、潜在的に有害なアプリに対してユーザーに警告を発したり、特に悪意のあるアプリのインストールを防いだりすることができ、ユーザーのセキュリティを強化します。
|
||||||
|
|
||||||
|
### **モバイルデバイス管理 (MDM)**
|
||||||
|
|
||||||
|
- **MDMソリューション**は**デバイス管理API**を通じてモバイルデバイスの**監視とセキュリティ**を提供します。これにより、モバイルデバイスを効果的に管理し、保護するためにAndroidアプリのインストールが必要です。主な機能には**パスワードポリシーの強制**、**ストレージ暗号化の義務付け**、および**リモートデータ消去の許可**が含まれ、モバイルデバイスに対する包括的な制御とセキュリティを確保します。
|
||||||
```java
|
```java
|
||||||
// Example of enforcing a password policy with MDM
|
// Example of enforcing a password policy with MDM
|
||||||
DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
|
DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
|
||||||
@ -361,4 +365,100 @@ if (dpm.isAdminActive(adminComponent)) {
|
|||||||
dpm.setPasswordMinimumLength(adminComponent, 8);
|
dpm.setPasswordMinimumLength(adminComponent, 8);
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
## AIDL / Binderサービスの列挙と悪用
|
||||||
|
|
||||||
|
Android *Binder* IPCは多くの**システムおよびベンダー提供のサービス**を公開します。これらのサービスは、適切な権限チェックなしにエクスポートされると**攻撃面**となります(AIDLレイヤー自体は*アクセス制御*を行いません)。
|
||||||
|
|
||||||
|
### 1. 実行中のサービスを発見する
|
||||||
|
```bash
|
||||||
|
# from an adb shell (USB or wireless)
|
||||||
|
service list # simple one-liner
|
||||||
|
am list services # identical output, ActivityManager wrapper
|
||||||
|
```
|
||||||
|
I'm sorry, but I need the specific content you would like me to translate in order to assist you. Please provide the text you want translated.
|
||||||
|
```
|
||||||
|
145 mtkconnmetrics: [com.mediatek.net.connectivity.IMtkIpConnectivityMetrics]
|
||||||
|
146 wifi : [android.net.wifi.IWifiManager]
|
||||||
|
```
|
||||||
|
* **インデックス**(最初の列)はランタイムで割り当てられます – 再起動を跨いでそれに依存しないでください。
|
||||||
|
* **バインダー名**(例: `mtkconnmetrics`)は `service call` に渡されるものです。
|
||||||
|
* 括弧内の値は、スタブが生成された完全修飾 **AIDL インターフェース** です。
|
||||||
|
|
||||||
|
### 2. インターフェースディスクリプタを取得する(PING)
|
||||||
|
すべてのバインダースタブは自動的に **トランザクションコード `0x5f4e5446`** (`1598968902` 十進法、ASCII "_NTF")を実装します。
|
||||||
|
```bash
|
||||||
|
# "ping" the service
|
||||||
|
service call mtkconnmetrics 1 # 1 == decimal 1598968902 mod 2^32
|
||||||
|
```
|
||||||
|
有効な応答は、`Parcel` 内に UTF-16 文字列としてエンコードされたインターフェース名を返します。
|
||||||
|
|
||||||
|
### 3. トランザクションの呼び出し
|
||||||
|
構文: `service call <name> <code> [type value ...]`
|
||||||
|
|
||||||
|
一般的な引数指定子:
|
||||||
|
* `i32 <int>` – 符号付き 32 ビット値
|
||||||
|
* `i64 <long>` – 符号付き 64 ビット値
|
||||||
|
* `s16 <string>` – UTF-16 文字列 (Android 13+ は `utf16` を使用)
|
||||||
|
|
||||||
|
例 – MediaTek ハンドセットで uid **1** でネットワーク監視を開始:
|
||||||
|
```bash
|
||||||
|
service call mtkconnmetrics 8 i32 1
|
||||||
|
```
|
||||||
|
### 4. 不明なメソッドのブルートフォース
|
||||||
|
ヘッダーファイルが利用できない場合、**コードを反復処理**してエラーが次のように変わるまで続けることができます:
|
||||||
|
```
|
||||||
|
Result: Parcel(00000000 00000000) # "Not a data message"
|
||||||
|
```
|
||||||
|
通常の `Parcel` 応答または `SecurityException`。
|
||||||
|
```bash
|
||||||
|
for i in $(seq 1 50); do
|
||||||
|
printf "[+] %2d -> " $i
|
||||||
|
service call mtkconnmetrics $i 2>/dev/null | head -1
|
||||||
|
done
|
||||||
|
```
|
||||||
|
サービスが**proguard**でコンパイルされている場合、マッピングは推測する必要があります – 次のステップを参照してください。
|
||||||
|
|
||||||
|
### 5. onTransact()を介したコード↔メソッドのマッピング
|
||||||
|
インターフェースを実装しているjar/odexをデコンパイルします(AOSPスタブの場合は`/system/framework`を確認; OEMはしばしば`/system_ext`または`/vendor`を使用します)。
|
||||||
|
`Stub.onTransact()`を検索します – それには巨大な`switch(transactionCode)`が含まれています:
|
||||||
|
```java
|
||||||
|
case TRANSACTION_updateCtaAppStatus: // 5
|
||||||
|
data.enforceInterface(DESCRIPTOR);
|
||||||
|
int appId = data.readInt();
|
||||||
|
boolean ok = data.readInt() != 0;
|
||||||
|
updateCtaAppStatus(appId, ok);
|
||||||
|
reply.writeNoException();
|
||||||
|
return true;
|
||||||
|
```
|
||||||
|
今やプロトタイプと**パラメータタイプ**は明確です。
|
||||||
|
|
||||||
|
### 6. 欠落している権限チェックの特定
|
||||||
|
実装(しばしば内部の`Impl`クラス)は認可を担当しています:
|
||||||
|
```java
|
||||||
|
private void updateCtaAppStatus(int uid, boolean status) {
|
||||||
|
if (!isPermissionAllowed()) {
|
||||||
|
throw new SecurityException("uid " + uid + " rejected");
|
||||||
|
}
|
||||||
|
/* privileged code */
|
||||||
|
}
|
||||||
|
```
|
||||||
|
そのようなロジックや特権UIDのホワイトリスト(例:`uid == 1000 /*system*/`)がないことは**脆弱性の指標**です。
|
||||||
|
|
||||||
|
ケーススタディ – *MediaTek* `startMonitorProcessWithUid()`(トランザクション**8**)は、許可ゲートなしでNetlinkメッセージを**完全に**実行し、特権のないアプリがカーネルのNetfilterモジュールと相互作用し、システムログをスパムすることを可能にします。
|
||||||
|
|
||||||
|
### 7. 評価の自動化
|
||||||
|
Binderの偵察を加速するツール/スクリプト:
|
||||||
|
* [binderfs](https://android.googlesource.com/platform/frameworks/native/+/master/cmds/binderfs/) – サービスごとのノードを持つ`/dev/binderfs`を公開
|
||||||
|
* [`binder-scanner.py`](https://github.com/adenflare/binder-scanner) – バインダーテーブルを歩き、ACLを印刷
|
||||||
|
* Fridaショートカット: `Java.perform(()=>console.log(android.os.ServiceManager.listServices().toArray()))`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 参考文献
|
||||||
|
|
||||||
|
- [Android Services 101 – Pentest Partners](https://www.pentestpartners.com/security-blog/android-services-101/)
|
||||||
|
- [Android Developer Docs – AIDL](https://developer.android.com/guide/components/aidl)
|
||||||
|
- [Android Developer Docs – IBinder](https://developer.android.com/reference/android/os/IBinder)
|
||||||
|
- [Understanding Binder, Talk @ Google](https://www.youtube.com/watch?v=O-UHvFjxwZ8)
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user