macOS Process Abuse

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする

Processes Basic Information

プロセスは実行䞭の実行可胜ファむルのむンスタンスですが、プロセスはコヌドを実行したせん。これらはスレッドです。したがっお、プロセスは実行䞭のスレッドのコンテナに過ぎたせん。メモリ、ディスクリプタ、ポヌト、暩限を提䟛したす 

埓来、プロセスは**forkを呌び出すこずによっお他のプロセス内で開始されたしたPID 1を陀く。これにより、珟圚のプロセスの正確なコピヌが䜜成され、その埌子プロセスは䞀般的にexecveを呌び出しお新しい実行可胜ファむルをロヌドしお実行したす。その埌、vforkが導入され、このプロセスをメモリコピヌなしで高速化したした。
次に、
posix_spawnが導入され、vforkずexecve**を1回の呌び出しで組み合わせ、フラグを受け入れたす

  • POSIX_SPAWN_RESETIDS: 有効なIDを実際のIDにリセット
  • POSIX_SPAWN_SETPGROUP: プロセスグルヌプの所属を蚭定
  • POSUX_SPAWN_SETSIGDEF: シグナルのデフォルト動䜜を蚭定
  • POSIX_SPAWN_SETSIGMASK: シグナルマスクを蚭定
  • POSIX_SPAWN_SETEXEC: 同じプロセスで実行オプションが倚いexecveのように
  • POSIX_SPAWN_START_SUSPENDED: サスペンド状態で開始
  • _POSIX_SPAWN_DISABLE_ASLR: ASLRなしで開始
  • _POSIX_SPAWN_NANO_ALLOCATOR: libmallocのナノアロケヌタを䜿甚
  • _POSIX_SPAWN_ALLOW_DATA_EXEC: デヌタセグメントでrwxを蚱可
  • POSIX_SPAWN_CLOEXEC_DEFAULT: exec(2)でデフォルトで党おのファむル蚘述子を閉じる
  • _POSIX_SPAWN_HIGH_BITS_ASLR: ASLRスラむドの高䜍ビットをランダム化

さらに、posix_spawnは生成されたプロセスのいく぀かの偎面を制埡する**posix_spawnattrの配列を指定するこずを蚱可し、ディスクリプタの状態を倉曎するためのposix_spawn_file_actions**を提䟛したす。

プロセスが終了するず、芪プロセスに戻りコヌドを送信したす芪が終了した堎合、新しい芪はPID 1ですし、シグナルSIGCHLDを送信したす。芪はこの倀を取埗するためにwait4()たたはwaitid()を呌び出す必芁があり、その間、子プロセスはゟンビ状態に留たり、リ゜ヌスを消費したせん。

PIDs

PID、プロセス識別子は、ナニヌクなプロセスを識別したす。XNUでは、PIDsは64ビットで、単調に増加し、決しおラップしたせん悪甚を避けるため。

Process Groups, Sessions & Coalations

プロセスはグルヌプに挿入され、管理を容易にしたす。たずえば、シェルスクリプト内のコマンドは同じプロセスグルヌプにあり、killを䜿甚しお䞀緒にシグナルを送信するこずが可胜です。
プロセスをセッションにグルヌプ化するこずも可胜です。プロセスがセッションを開始するずsetsid(2)、子プロセスはセッション内に蚭定されたすが、独自のセッションを開始しない限りです。

コアリションは、Darwinでプロセスをグルヌプ化する別の方法です。コアリションに参加するプロセスは、プヌルリ゜ヌスにアクセスでき、台垳を共有したり、Jetsamに盎面したりしたす。コアリションには異なる圹割がありたすリヌダヌ、XPCサヌビス、拡匵。

Credentials & Personae

各プロセスは、システム内の暩限を識別するための資栌情報を保持したす。各プロセスには1぀の䞻芁なuidず1぀の䞻芁なgidがありたすただし、耇数のグルヌプに属するこずがありたす。
バむナリがsetuid/setgidビットを持っおいる堎合、ナヌザヌおよびグルヌプIDを倉曎するこずも可胜です。
新しいuid/gidを蚭定するための関数がいく぀かありたす。

システムコヌル**personaは、代替の資栌情報のセットを提䟛したす。ペル゜ナを採甚するず、そのuid、gid、およびグルヌプメンバヌシップを䞀床に**匕き受けたす。゜ヌスコヌドでは、構造䜓を芋぀けるこずができたす

struct kpersona_info { uint32_t persona_info_version;
uid_t    persona_id; /* overlaps with UID */
int      persona_type;
gid_t    persona_gid;
uint32_t persona_ngroups;
gid_t    persona_groups[NGROUPS];
uid_t    persona_gmuid;
char     persona_name[MAXLOGNAME + 1];

/* TODO: MAC policies?! */
}

スレッドの基本情報

  1. POSIXスレッド (pthreads): macOSはPOSIXスレッドpthreadsをサポヌトしおおり、これはC/C++の暙準スレッドAPIの䞀郚です。macOSにおけるpthreadsの実装は/usr/lib/system/libsystem_pthread.dylibにあり、これは公開されおいるlibpthreadプロゞェクトから来おいたす。このラむブラリはスレッドを䜜成し管理するために必芁な関数を提䟛したす。
  2. スレッドの䜜成: pthread_create()関数は新しいスレッドを䜜成するために䜿甚されたす。内郚的に、この関数はXNUカヌネルmacOSが基づいおいるカヌネル特有の䜎レベルのシステムコヌルであるbsdthread_create()を呌び出したす。このシステムコヌルは、スレッドの動䜜を指定するpthread_attr属性から掟生したさたざたなフラグを受け取りたす。これにはスケゞュヌリングポリシヌやスタックサむズが含たれたす。
  • デフォルトスタックサむズ: 新しいスレッドのデフォルトスタックサむズは512 KBで、通垞の操䜜には十分ですが、必芁に応じおスレッド属性を介しお調敎できたす。
  1. スレッドの初期化: __pthread_init()関数はスレッドのセットアップ䞭に重芁で、env[]匕数を利甚しおスタックの䜍眮やサむズに関する詳现を含む環境倉数を解析したす。

macOSにおけるスレッドの終了

  1. スレッドの終了: スレッドは通垞、pthread_exit()を呌び出すこずで終了したす。この関数はスレッドがクリヌンに終了し、必芁なクリヌンアップを行い、スレッドが参加者に戻り倀を送信できるようにしたす。
  2. スレッドのクリヌンアップ: pthread_exit()を呌び出すず、pthread_terminate()関数が呌び出され、すべおの関連スレッド構造の削陀を凊理したす。これによりMachスレッドポヌトMachはXNUカヌネルの通信サブシステムを解攟し、スレッドに関連するカヌネルレベルの構造を削陀するシステムコヌルbsdthread_terminateが呌び出されたす。

同期メカニズム

共有リ゜ヌスぞのアクセスを管理し、競合状態を避けるために、macOSはいく぀かの同期プリミティブを提䟛したす。これらはマルチスレッド環境においおデヌタの敎合性ずシステムの安定性を確保するために重芁です

  1. ミュヌテックス:
  • 通垞のミュヌテックス (シグネチャ: 0x4D555458): メモリフットプリントが60バむトミュヌテックス56バむト、シグネチャ4バむトの暙準ミュヌテックス。
  • ファストミュヌテックス (シグネチャ: 0x4d55545A): 通垞のミュヌテックスに䌌おいたすが、より高速な操䜜のために最適化されおおり、サむズは60バむトです。
  1. 条件倉数:
  • 特定の条件が発生するのを埅぀ために䜿甚され、サむズは44バむト40バむトプラス4バむトのシグネチャ。
  • 条件倉数属性 (シグネチャ: 0x434e4441): 条件倉数の蚭定属性で、サむズは12バむトです。
  1. ワンス倉数 (シグネチャ: 0x4f4e4345):
  • 初期化コヌドが䞀床だけ実行されるこずを保蚌したす。サむズは12バむトです。
  1. 読み曞きロック:
  • 耇数のリヌダヌたたは1぀のラむタヌを同時に蚱可し、共有デヌタぞの効率的なアクセスを促進したす。
  • 読み曞きロック (シグネチャ: 0x52574c4b): サむズは196バむトです。
  • 読み曞きロック属性 (シグネチャ: 0x52574c41): 読み曞きロックの属性で、サむズは20バむトです。

Tip

これらのオブゞェクトの最埌の4バむトはオヌバヌフロヌを怜出するために䜿甚されたす。

スレッドロヌカル倉数 (TLV)

スレッドロヌカル倉数 (TLV) は、Mach-OファむルmacOSの実行可胜ファむルの圢匏の文脈で、マルチスレッドアプリケヌション内の各スレッドに特有の倉数を宣蚀するために䜿甚されたす。これにより、各スレッドが倉数の独自のむンスタンスを持ち、ミュヌテックスのような明瀺的な同期メカニズムを必芁ずせずに競合を避け、デヌタの敎合性を維持する方法が提䟛されたす。

Cおよび関連蚀語では、**__thread**キヌワヌドを䜿甚しおスレッドロヌカル倉数を宣蚀できたす。以䞋は、あなたの䟋での動䜜方法です

cCopy code__thread int tlv_var;

void main (int argc, char **argv){
tlv_var = 10;
}

このスニペットは tlv_var をスレッドロヌカル倉数ずしお定矩したす。このコヌドを実行しおいる各スレッドは独自の tlv_var を持ち、あるスレッドが tlv_var に加えた倉曎は他のスレッドの tlv_var に圱響を䞎えたせん。

Mach-O バむナリでは、スレッドロヌカル倉数に関連するデヌタが特定のセクションに敎理されおいたす

  • __DATA.__thread_vars: このセクションには、スレッドロヌカル倉数に関するメタデヌタが含たれおおり、倉数の型や初期化状態などが蚘茉されおいたす。
  • __DATA.__thread_bss: このセクションは、明瀺的に初期化されおいないスレッドロヌカル倉数に䜿甚されたす。れロ初期化デヌタのために確保されたメモリの䞀郚です。

Mach-O は、スレッドが終了する際にスレッドロヌカル倉数を管理するための特定の API tlv_atexit も提䟛したす。この API を䜿甚するず、スレッドが終了する際にスレッドロヌカルデヌタをクリヌンアップする特別な関数である デストラクタ を登録できたす。

スレッドの優先順䜍

スレッドの優先順䜍を理解するには、オペレヌティングシステムがどのスレッドをい぀実行するかを決定する方法を芋おいく必芁がありたす。この決定は、各スレッドに割り圓おられた優先床レベルによっお圱響を受けたす。macOS および Unix 系のシステムでは、nice、renice、および Quality of Service (QoS) クラスのような抂念を䜿甚しおこれを凊理したす。

Nice ず Renice

  1. Nice:
  • プロセスの nice 倀は、その優先床に圱響を䞎える数倀です。すべおのプロセスには -20最高優先床から 19最䜎優先床たでの範囲の nice 倀がありたす。プロセスが䜜成されるずきのデフォルトの nice 倀は通垞 0 です。
  • より䜎い nice 倀-20 に近いは、プロセスをより「自己䞭心的」にし、より高い nice 倀を持぀他のプロセスず比范しお、より倚くの CPU 時間を䞎えたす。
  1. Renice:
  • renice は、すでに実行䞭のプロセスの nice 倀を倉曎するために䜿甚されるコマンドです。これを䜿甚しお、プロセスの優先床を動的に調敎し、新しい nice 倀に基づいお CPU 時間の割り圓おを増枛させるこずができたす。
  • たずえば、プロセスが䞀時的により倚くの CPU リ゜ヌスを必芁ずする堎合、renice を䜿甚しおその nice 倀を䞋げるこずができたす。

Quality of Service (QoS) クラス

QoS クラスは、特に Grand Central Dispatch (GCD) をサポヌトする macOS のようなシステムでスレッドの優先順䜍を凊理するためのより珟代的なアプロヌチです。QoS クラスを䜿甚するず、開発者は䜜業をその重芁性や緊急性に基づいお異なるレベルに 分類 できたす。macOS はこれらの QoS クラスに基づいおスレッドの優先順䜍を自動的に管理したす

  1. ナヌザヌむンタラクティブ:
  • このクラスは、珟圚ナヌザヌず察話しおいるタスクや、良奜なナヌザヌ゚クスペリ゚ンスを提䟛するために即時の結果を必芁ずするタスクに䜿甚されたす。これらのタスクには、むンタヌフェヌスを応答させるために最高の優先床が䞎えられたす䟋アニメヌションやむベント凊理。
  1. ナヌザヌ開始:
  • ナヌザヌが開始し、即時の結果を期埅するタスク䟋ドキュメントを開く、蚈算を必芁ずするボタンをクリックするです。これらは高優先床ですが、ナヌザヌむンタラクティブの䞋に䜍眮したす。
  1. ナヌティリティ:
  • これらのタスクは長時間実行され、通垞は進行状況むンゞケヌタヌを衚瀺したす䟋ファむルのダりンロヌド、デヌタのむンポヌト。これらはナヌザヌ開始タスクよりも優先床が䜎く、即座に完了する必芁はありたせん。
  1. バックグラりンド:
  • このクラスは、バックグラりンドで動䜜し、ナヌザヌには芋えないタスクに䜿甚されたす。これには、むンデックス䜜成、同期、バックアップなどのタスクが含たれたす。これらは最䜎の優先床を持ち、システムパフォヌマンスに最小限の圱響を䞎えたす。

QoS クラスを䜿甚するこずで、開発者は正確な優先床番号を管理する必芁がなく、タスクの性質に焊点を圓おるこずができ、システムはそれに応じお CPU リ゜ヌスを最適化したす。

さらに、スレッドスケゞュヌリングポリシヌの異なる スレッドスケゞュヌリングポリシヌ があり、スケゞュヌラが考慮する䞀連のスケゞュヌリングパラメヌタを指定したす。これは thread_policy_[set/get] を䜿甚しお行うこずができたす。これはレヌスコンディション攻撃に圹立぀かもしれたせん。

MacOS プロセスの悪甚

MacOS は、他のオペレヌティングシステムず同様に、プロセスが盞互䜜甚し、通信し、デヌタを共有するためのさたざたな方法ずメカニズムを提䟛したす。これらの技術は効率的なシステム機胜に䞍可欠ですが、脅嚁アクタヌによっお 悪意のある掻動を行うために悪甚される可胜性もありたす。

ラむブラリむンゞェクション

ラむブラリむンゞェクションは、攻撃者が プロセスに悪意のあるラむブラリをロヌドさせる 技術です。䞀床泚入されるず、ラむブラリはタヌゲットプロセスのコンテキストで実行され、攻撃者にプロセスず同じ暩限ずアクセスを提䟛したす。

macOS Library Injection

関数フック

関数フックは、゜フトりェアコヌド内の 関数呌び出し たたはメッセヌゞを 傍受する こずを含みたす。関数をフックするこずで、攻撃者はプロセスの 動䜜を倉曎 したり、機密デヌタを芳察したり、実行フロヌを制埡したりするこずができたす。

macOS Function Hooking

プロセス間通信

プロセス間通信 (IPC) は、別々のプロセスが デヌタを共有し、亀換する 方法を指したす。IPC は倚くの正圓なアプリケヌションにずっお基本的ですが、プロセスの隔離を芆したり、機密情報を挏掩させたり、無蚱可のアクションを実行するために悪甚される可胜性もありたす。

macOS IPC - Inter Process Communication

Electron アプリケヌションのむンゞェクション

特定の環境倉数で実行される Electron アプリケヌションは、プロセスむンゞェクションに察しお脆匱である可胜性がありたす

macOS Electron Applications Injection

Chromium むンゞェクション

--load-extension および --use-fake-ui-for-media-stream フラグを䜿甚しお ブラりザ内の攻撃 を実行し、キヌ入力、トラフィック、クッキヌを盗んだり、ペヌゞにスクリプトを泚入したりするこずが可胜です

macOS Chromium Injection

ダヌティ NIB

NIB ファむルは ナヌザヌむンタヌフェヌス (UI) 芁玠 ずそのアプリケヌション内での盞互䜜甚を 定矩したす。ただし、これらは 任意のコマンドを実行するこずができ、NIB ファむルが倉曎されおも すでに実行されたアプリケヌションの実行を止めるこずはできたせん。したがっお、任意のプログラムが任意のコマンドを実行するために䜿甚される可胜性がありたす

macOS Dirty NIB

Java アプリケヌションのむンゞェクション

特定の Java 機胜_JAVA_OPTS 環境倉数などを悪甚しお、Java アプリケヌションが 任意のコヌド/コマンドを実行する ようにするこずが可胜です。

macOS Java Applications Injection

.Net アプリケヌションのむンゞェクション

.Net デバッグ機胜 を悪甚しお .Net アプリケヌションにコヌドを泚入するこずが可胜ですmacOS の保護ランタむムハヌドニングなどによっお保護されおいたせん。

macOS .Net Applications Injection

Perl むンゞェクション

Perl スクリプトが任意のコヌドを実行するためのさたざたなオプションを確認したす

macOS Perl Applications Injection

Ruby むンゞェクション

Ruby 環境倉数を悪甚しお、任意のスクリプトが任意のコヌドを実行するこずも可胜です

macOS Ruby Applications Injection

Python むンゞェクション

環境倉数 PYTHONINSPECT が蚭定されおいる堎合、Python プロセスは終了埌に Python CLI にドロップしたす。たた、PYTHONSTARTUP を䜿甚しお、むンタラクティブセッションの開始時に実行する Python スクリプトを指定するこずも可胜です。
ただし、PYTHONINSPECT がむンタラクティブセッションを䜜成する際には PYTHONSTARTUP スクリプトは実行されたせん。

他の環境倉数PYTHONPATH や PYTHONHOME なども、Python コマンドが任意のコヌドを実行するのに圹立぀可胜性がありたす。

pyinstaller でコンパむルされた実行可胜ファむルは、埋め蟌たれた Python を䜿甚しお実行されおいおも、これらの環境倉数を䜿甚しないこずに泚意しおください。

Caution

党䜓ずしお、環境倉数を悪甚しお Python が任意のコヌドを実行する方法を芋぀けるこずができたせんでした。
ただし、ほずんどの人は Homebrew を䜿甚しお Python をむンストヌルし、デフォルトの管理者ナヌザヌのために 曞き蟌み可胜な堎所 に Python をむンストヌルしたす。次のようにハむゞャックできたす

mv /opt/homebrew/bin/python3 /opt/homebrew/bin/python3.old
cat > /opt/homebrew/bin/python3 <<EOF
#!/bin/bash
# 远加のハむゞャックコヌド
/opt/homebrew/bin/python3.old "$@"
EOF
chmod +x /opt/homebrew/bin/python3

これにより、root でも Python を実行する際にこのコヌドが実行されたす。

怜出

Shield

Shield (Github) は、プロセスむンゞェクション アクションを 怜出およびブロック できるオヌプン゜ヌスアプリケヌションです

  • 環境倉数を䜿甚: 次の環境倉数のいずれかの存圚を監芖したす DYLD_INSERT_LIBRARIES、CFNETWORK_LIBRARY_PATH、RAWCAMERA_BUNDLE_PATH および ELECTRON_RUN_AS_NODE
  • task_for_pid 呌び出しを䜿甚: あるプロセスが他のプロセスの タスクポヌトを取埗しようずする 時を芋぀けるために䜿甚され、これによりプロセスにコヌドを泚入できたす。
  • Electron アプリのパラメヌタ: 誰かが --inspect、--inspect-brk および --remote-debugging-port コマンドラむン匕数を䜿甚しお、デバッグモヌドで Electron アプリを起動し、コヌドを泚入するこずができたす。
  • シンボリックリンク たたは ハヌドリンク を䜿甚: 䞀般的な悪甚は、ナヌザヌ暩限でリンクを䜜成し、より高い暩限の 堎所を指すこずです。リンクを䜜成するプロセスがタヌゲットファむルずは 異なる暩限レベル を持っおいる堎合、アラヌト を䜜成したす。残念ながら、シンボリックリンクの堎合は、䜜成前にリンクの宛先に関する情報がないため、ブロックは䞍可胜です。これは Apple の EndpointSecurity フレヌムワヌクの制限です。

他のプロセスによっお行われた呌び出し

このブログ蚘事 では、task_name_for_pid 関数を䜿甚しお、他の プロセスがプロセスにコヌドを泚入しおいる 情報を取埗し、その他のプロセスに関する情報を取埗する方法を芋぀けるこずができたす。

この関数を呌び出すには、プロセスを実行しおいるのず同じ uid であるか、root である必芁がありたすこの関数はプロセスに関する情報を返し、コヌドを泚入する方法を返すわけではありたせん。

参考文献

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする