macOS TCC Bypasses
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
これはバイパスではなく、TCCの動作方法です:書き込みから保護されていません。ターミナルがユーザーのデスクトップを読み取るアクセス権を持っていなくても、そこに書き込むことができます:
The extended attribute com.apple.macl
は新しい ファイル に追加され、作成者のアプリ がそれを読み取るアクセスを得るためのものです。
TCCプロンプトの上にウィンドウを置く ことで、ユーザーが それを受け入れる ようにすることが可能です。PoCは TCC-ClickJacking** で見つけることができます。**
攻撃者は 任意の名前 (例: Finder, Google Chrome...) のアプリを Info.plist
に作成し、TCCで保護された場所へのアクセスを要求させることができます。ユーザーは、正当なアプリケーションがこのアクセスを要求していると思うでしょう。
さらに、正当なアプリをDockから削除し、偽のアプリをその上に置く ことが可能です。ユーザーが偽のアプリ(同じアイコンを使用できる)をクリックすると、正当なアプリを呼び出し、TCCの権限を要求し、マルウェアを実行させることができ、ユーザーは正当なアプリがアクセスを要求したと信じることになります。
詳細情報とPoCは以下にあります:
macOS Privilege Escalationデフォルトでは、SSH経由のアクセスは「フルディスクアクセス」を持っていました。これを無効にするには、リストに載せておく必要がありますが、無効にすること(リストから削除すること)はその権限を取り除くことにはなりません:
ここでは、いくつかの マルウェアがこの保護を回避できた例 を見つけることができます:
現在、SSHを有効にするには フルディスクアクセス が必要です。
属性 com.apple.macl
はファイルに与えられ、特定のアプリケーションにそれを読む権限を与えます。 この属性は、ドラッグ&ドロップ でファイルをアプリに移動したとき、またはユーザーが ダブルクリック して デフォルトアプリケーション で開くときに設定されます。
したがって、ユーザーは 悪意のあるアプリを登録 してすべての拡張子を処理させ、Launch Servicesを呼び出して 任意のファイルを開く ことができます(そのため、悪意のあるファイルはそれを読むアクセスを得ることになります)。
権限 com.apple.private.icloud-account-access
により、com.apple.iCloudHelper
XPCサービスと通信することが可能で、iCloudトークン を提供します。
iMovie と Garageband はこの権限を持っており、他のアプリも許可されていました。
この権限から iCloudトークンを取得する ためのエクスプロイトに関する詳細情報は、トークをチェックしてください: #OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula
kTCCServiceAppleEvents
権限を持つアプリは、他のアプリを制御する ことができます。これは、他のアプリに付与された権限を 悪用する ことができることを意味します。
Apple Scriptsに関する詳細情報は以下を確認してください:
macOS Apple Scripts例えば、アプリが iTerm
に対して Automation権限 を持っている場合、この例では Terminal
がiTermにアクセスしています:
FDAを持たないTerminalは、iTermを呼び出し、それを使用してアクションを実行できます:
または、アプリがFinderにアクセスできる場合、次のようなスクリプトを使用できます:
ユーザーランドの tccd デーモン は HOME
env 変数を使用して、TCC ユーザーデータベースにアクセスします: $HOME/Library/Application Support/com.apple.TCC/TCC.db
この Stack Exchange の投稿 によると、TCC デーモンは現在のユーザーのドメイン内で launchd
を介して実行されているため、渡されるすべての環境変数を制御することが可能です。
したがって、攻撃者は $HOME
環境 変数を launchctl
で 制御された ディレクトリ を指すように設定し、TCC デーモンを 再起動 し、その後 TCC データベースを直接変更して、エンドユーザーにプロンプトを表示することなく すべての TCC 権限を取得することができます。
PoC:
ノートはTCC保護された場所にアクセスできましたが、ノートが作成されると、これは保護されていない場所に作成されます。したがって、ノートに保護されたファイルをノートにコピーするように依頼し(つまり、保護されていない場所に)、そのファイルにアクセスすることができます:
バイナリ/usr/libexec/lsd
は、ライブラリlibsecurity_translocate
を使用しており、権限com.apple.private.nullfs_allow
を持っていたため、nullfsマウントを作成でき、**kTCCServiceSystemPolicyAllFiles
**を使用してすべてのファイルにアクセスできる権限com.apple.private.tcc.allow
を持っていました。
「Library」にクアランティン属性を追加し、com.apple.security.translocation
XPCサービスを呼び出すことが可能で、その後、Libraryは**$TMPDIR/AppTranslocation/d/d/Library
にマッピングされ、Library内のすべてのドキュメントにアクセス**できるようになりました。
Music
には興味深い機能があります:実行中に、~/Music/Music/Media.localized/Automatically Add to Music.localized
にドロップされたファイルをユーザーの「メディアライブラリ」にインポートします。さらに、次のような呼び出しを行います:rename(a, b);
ここで、a
とb
は:
a = "~/Music/Music/Media.localized/Automatically Add to Music.localized/myfile.mp3"
b = "~/Music/Music/Media.localized/Automatically Add to Music.localized/Not Added.localized/2023-09-25 11.06.28/myfile.mp3
この**rename(a, b);
の動作はレースコンディションに対して脆弱であり、Automatically Add to Music.localized
フォルダ内に偽のTCC.dbファイルを置き、新しいフォルダ(b)が作成されるときにファイルをコピーし、削除し、~/Library/Application Support/com.apple.TCC
**にポイントすることが可能です。
SQLITE_SQLLOG_DIR="path/folder"
は基本的に開いている任意のデータベースがそのパスにコピーされることを意味します。このCVEでは、この制御が悪用され、SQLiteデータベース内に書き込まれ、そのデータベースがFDAのTCCデータベースで開かれるプロセスによって開かれることになり、SQLITE_SQLLOG_DIR
をファイル名のシンボリックリンクで悪用し、そのデータベースが開かれると、ユーザーのTCC.dbが上書きされます。
詳細情報 こちらの解説 および こちらのトーク。
環境変数**SQLITE_AUTO_TRACE
が設定されている場合、ライブラリlibsqlite3.dylib
はすべてのSQLクエリをログ**し始めます。多くのアプリケーションがこのライブラリを使用していたため、すべてのSQLiteクエリをログに記録することが可能でした。
いくつかのAppleアプリケーションは、このライブラリを使用してTCC保護情報にアクセスしていました。
このenv変数はMetal
フレームワークによって使用され、これはさまざまなプログラムの依存関係であり、特にMusic
がFDAを持っています。
次のように設定します: MTL_DUMP_PIPELINES_TO_JSON_FILE="path/name"
。path
が有効なディレクトリであれば、バグがトリガーされ、fs_usage
を使用してプログラム内で何が起こっているかを見ることができます:
path/.dat.nosyncXXXX.XXXXXX
(Xはランダム)という名前のファイルがopen()
されます。
1つ以上のwrite()
がファイルに内容を書き込みます(これを制御することはできません)。
path/.dat.nosyncXXXX.XXXXXX
がpath/name
にrenamed()
されます。
これは一時ファイルの書き込みであり、その後に**rename(old, new)
が安全ではありません。**
安全でない理由は、古いパスと新しいパスを別々に解決する必要があるため、これには時間がかかる可能性があり、レースコンディションに対して脆弱です。詳細については、xnu
関数renameat_internal()
を確認できます。
基本的に、特権プロセスがあなたが制御するフォルダから名前を変更している場合、RCEを獲得し、異なるファイルにアクセスさせることができるか、またはこのCVEのように、特権アプリが作成したファイルを開いてFDを保存することができます。
名前変更があなたが制御するフォルダにアクセスする場合、ソースファイルを変更したり、FDを持っている間に、宛先ファイル(またはフォルダ)をシンボリックリンクを指すように変更することで、いつでも書き込むことができます。
これがCVEでの攻撃でした: たとえば、ユーザーのTCC.db
を上書きするために、次のことができます:
/Users/hacker/ourlink
を作成して/Users/hacker/Library/Application Support/com.apple.TCC/
を指すようにします。
ディレクトリ/Users/hacker/tmp/
を作成します。
MTL_DUMP_PIPELINES_TO_JSON_FILE=/Users/hacker/tmp/TCC.db
を設定します。
このenv変数でMusic
を実行してバグをトリガーします。
/Users/hacker/tmp/.dat.nosyncXXXX.XXXXXX
のopen()
をキャッチします(Xはランダム)。
ここで、このファイルをライティング用にopen()
し、ファイルディスクリプタを保持します。
/Users/hacker/tmp
を/Users/hacker/ourlink
とループ内で原子的に切り替えます。
レースウィンドウが非常に狭いため、成功の可能性を最大化するためにこれを行いますが、レースに負けることのデメリットはほとんどありません。
少し待ちます。
運が良かったかテストします。
そうでなければ、最初から再実行します。
詳細はhttps://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.htmlで確認できます。
今、env変数MTL_DUMP_PIPELINES_TO_JSON_FILE
を使用しようとすると、アプリが起動しません。
rootとしてこのサービスを有効にすると、ARDエージェントはフルディスクアクセスを持ち、これをユーザーが悪用して新しいTCCユーザーデータベースをコピーさせることができます。
TCCは、ユーザーのHOMEフォルダ内のデータベースを使用して、$HOME/Library/Application Support/com.apple.TCC/TCC.dbでユーザー固有のリソースへのアクセスを制御します。 したがって、ユーザーが$HOME env変数を異なるフォルダを指すように再起動できれば、ユーザーは**/Library/Application Support/com.apple.TCC/TCC.db**に新しいTCCデータベースを作成し、TCCを騙して任意のTCC権限を任意のアプリに付与させることができます。
Appleは、NFSHomeDirectory
属性内のユーザープロファイルに保存された設定を$HOME
の値として使用しているため、この値を変更する権限を持つアプリケーションを侵害すると、TCCバイパスを使用してこのオプションを武器化できます。
最初のPOCは、dsexportとdsimportを使用して、ユーザーのHOMEフォルダを変更します。
対象アプリの_csreq_バイナリを取得します。
必要なアクセス権と_csreq_バイナリを持つ偽の_TCC.db_ファイルを植え付けます。
dsexportを使用してユーザーのディレクトリサービスエントリをエクスポートします。
ユーザーのホームディレクトリを変更するためにディレクトリサービスエントリを修正します。
dsimportを使用して修正されたディレクトリサービスエントリをインポートします。
ユーザーの_tccd_を停止し、プロセスを再起動します。
2番目のPOCは、/usr/libexec/configd
を使用し、com.apple.private.tcc.allow
にkTCCServiceSystemPolicySysAdminFiles
の値がありました。
-t
オプションでconfigd
を実行することが可能で、攻撃者はカスタムバンドルをロードすることを指定できました。したがって、エクスプロイトは、ユーザーのホームディレクトリを変更するための**dsexport
およびdsimport
メソッドをconfigd
コードインジェクション**に置き換えます。
詳細は元の報告を確認してください。
プロセス内にコードを注入し、そのTCC権限を悪用するためのさまざまな技術があります:
macOS Process Abuseさらに、TCCをバイパスするために見つかった最も一般的なプロセスインジェクションは**プラグイン(ライブラリの読み込み)**です。 プラグインは通常、ライブラリやplistの形で追加のコードであり、メインアプリケーションによって読み込まれ、そのコンテキストで実行されます。したがって、メインアプリケーションがTCC制限ファイルへのアクセス権を持っている場合(付与された権限または権利によって)、カスタムコードもそれを持ちます。
アプリケーション/System/Library/CoreServices/Applications/Directory Utility.app
は、権限**kTCCServiceSystemPolicySysAdminFiles
を持ち、.daplug
**拡張子のプラグインを読み込み、ハードンされたランタイムを持っていませんでした。
このCVEを武器化するために、NFSHomeDirectory
が変更され(以前の権限を悪用して)、ユーザーの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権限を悪用することが可能でした:
For more info check the original report.
Core Media I/O を介してカメラストリームを開くシステムアプリケーション(kTCCServiceCamera
を持つアプリ)は、/Library/CoreMediaIO/Plug-Ins/DAL
にある これらのプラグインをプロセス内で読み込みます(SIP 制限なし)。
そこに一般的な コンストラクタ を持つライブラリを保存するだけで コードを注入 することができます。
いくつかの Apple アプリケーションがこれに対して脆弱でした。
Firefox アプリケーションは com.apple.security.cs.disable-library-validation
と com.apple.security.cs.allow-dyld-environment-variables
の権限を持っていました:
Fore more info about how to easily exploit this check the original report.
バイナリ /system/Library/Filesystems/acfs.fs/Contents/bin/xsanctl
は com.apple.private.tcc.allow
と com.apple.security.get-task-allow
の権限を持っており、プロセス内にコードを注入し、TCCの権限を使用することができました。
Telegram は com.apple.security.cs.allow-dyld-environment-variables
と com.apple.security.cs.disable-library-validation
の権限を持っていたため、カメラでの録画などの 権限にアクセスするために悪用する ことが可能でした。ペイロードは writeupで見つけることができます。
環境変数を使用してライブラリをロードする方法に注意してください。カスタムplist が作成され、このライブラリを注入するために launchctl
が使用されました:
**open
**をサンドボックス化された状態でも呼び出すことが可能です。
技術者が使用するコンピュータでは、ターミナルに**フルディスクアクセス (FDA)を与えることが一般的です。そして、それを使用して.terminal
**スクリプトを呼び出すことが可能です。
**.terminal
スクリプトは、CommandString
**キーに実行するコマンドを含むplistファイルです:
アプリケーションは、/tmp のような場所にターミナルスクリプトを書き込み、次のようなコマンドで起動することができます:
任意のユーザー(特権のないユーザーも含む)は、タイムマシンのスナップショットを作成してマウントし、そのスナップショットのすべてのファイルにアクセスできます。
必要な唯一の特権は、使用されるアプリケーション(Terminal
など)がフルディスクアクセス(FDA)アクセス(kTCCServiceSystemPolicyAllfiles
)を持つことであり、これは管理者によって付与される必要があります。
より詳細な説明は元のレポートで見つけることができます。
TCC DBファイルが保護されていても、新しいTCC.dbファイルをディレクトリの上にマウントすることが可能でした:
Check the full exploit in the original writeup.
ツール /usr/sbin/asr
は、TCC保護を回避してディスク全体をコピーし、別の場所にマウントすることを可能にしました。
/var/db/locationd/clients.plist
に第三のTCCデータベースがあり、位置情報サービスにアクセスすることを許可されたクライアントを示します。
フォルダ /var/db/locationd/
はDMGマウントから保護されていなかったため、自分のplistをマウントすることが可能でした。
いくつかの場面で、ファイルはメール、電話番号、メッセージなどの機密情報を保護されていない場所に保存します(これはAppleにとって脆弱性と見なされます)。
これはもう機能しませんが、過去には機能していました:
別の方法としてCoreGraphicsイベントを使用します:
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)