macOS TCC Bypasses
기능별
쓰기 우회
이것은 우회가 아니라 TCC가 작동하는 방식입니다: 쓰기를 보호하지 않습니다. 터미널이 사용자의 데스크톱을 읽을 수 없더라도 여전히 쓸 수 있습니다:
**확장 속성 com.apple.macl
**은 새 파일에 추가되어 생성자 앱이 해당 파일을 읽을 수 있도록 합니다.
TCC ClickJacking
사용자가 알아채지 못하고 TCC 프롬프트를 수락하도록 창을 TCC 프롬프트 위에 놓을 수 있습니다. TCC-ClickJacking에서 PoC를 찾을 수 있습니다.
임의의 이름으로 TCC 요청
공격자는 **Info.plist
**에 임의의 이름(예: Finder, Google Chrome...)을 가진 앱을 생성하고 일부 TCC 보호 위치에 액세스를 요청하도록 만들 수 있습니다. 사용자는 정품 애플리케이션이 이 액세스를 요청하는 것으로 생각할 것입니다.
게다가, 정품 앱을 도크에서 제거하고 가짜 앱을 넣어놓을 수 있으므로 사용자가 가짜 앱을 클릭하면(동일한 아이콘을 사용할 수 있음) 정품 앱을 호출하여 TCC 권한을 요청하고 악성 코드를 실행시킬 수 있어 사용자는 정품 앱이 액세스를 요청한 것으로 믿게 됩니다.
자세한 정보 및 PoC:
pagemacOS Privilege EscalationSSH 우회
기본적으로 SSH를 통한 액세스는 "전체 디스크 액세스"를 가졌습니다. 이를 비활성화하려면 목록에는 있지만 비활성화된 상태여야 합니다(목록에서 제거하면 해당 권한이 제거되지 않습니다):
여기에서 일부 악성 코드가 이 보호를 우회한 예시를 찾을 수 있습니다:
지금은 SSH를 활성화하려면 전체 디스크 액세스가 필요합니다
확장자 처리 - CVE-2022-26767
파일에는 특정 애플리케이션이 읽을 수 있는 권한을 부여하기 위해 com.apple.macl
속성이 부여됩니다. 이 속성은 파일을 앱 위로 드래그&드롭하거나 사용자가 파일을 더블 클릭하여 기본 애플리케이션으로 열 때 설정됩니다.
따라서 사용자는 모든 확장자를 처리할 악성 앱을 등록하고 런치 서비스를 호출하여 모든 파일을 열 수 있도록 만들 수 있습니다(따라서 악성 파일이 읽을 수 있도록 권한이 부여됩니다).
iCloud
com.apple.private.icloud-account-access
권한을 통해 com.apple.iCloudHelper
XPC 서비스와 통신할 수 있으며 이를 통해 iCloud 토큰을 제공할 수 있습니다.
iMovie 및 Garageband에는 이 권한과 다른 권한이 부여되어 있습니다.
해당 권한으로부터 iCloud 토큰을 얻는 exploit에 대한 자세한 정보는 다음 토크를 확인하십시오: #OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula
kTCCServiceAppleEvents / 자동화
kTCCServiceAppleEvents
권한이 있는 앱은 다른 앱을 제어할 수 있습니다. 이는 다른 앱에 부여된 권한을 남용할 수 있음을 의미합니다.
Apple 스크립트에 대한 자세한 정보는 다음을 확인하십시오:
pagemacOS Apple Scripts예를 들어, 앱이 iTerm
에 대한 자동화 권한을 가지고 있다면, 이 예시에서 **Terminal
**이 iTerm에 대한 액세스 권한을 가지고 있습니다:
iTerm을 통해
FDA가 없는 Terminal이 FDA를 가진 iTerm을 호출하고 사용하여 작업을 수행할 수 있습니다:
Finder를 통해
또는 앱이 Finder를 통해 액세스하는 경우, 다음과 같은 스크립트가 있을 수 있습니다:
앱 동작에 따른
CVE-2020–9934 - TCC
tccd 데몬은 HOME
env 변수를 사용하여 다음 위치에서 TCC 사용자 데이터베이스에 액세스합니다: $HOME/Library/Application Support/com.apple.TCC/TCC.db
이 스택 오버플로우 게시물에 따르면, TCC 데몬은 현재 사용자 도메인 내에서 launchd
를 통해 실행되므로 전달되는 모든 환경 변수를 제어할 수 있습니다.
따라서 공격자는 $HOME
환경 변수를 **launchctl
**에서 제어된 디렉토리를 가리키도록 설정하고, TCC 데몬을 재시작한 다음 TCC 데이터베이스를 직접 수정하여 최종 사용자에게 알림 없이 모든 TCC 권한을 부여할 수 있습니다.
PoC:
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 - 음악 및 TV
**음악
**에는 흥미로운 기능이 있습니다: 실행 중일 때 **~/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 - CVE-2023-32422
**SQLITE_SQLLOG_DIR="경로/폴더"
**를 설정하면 모든 열린 db가 해당 경로로 복사됩니다. 이 CVE에서는 이 제어가 남용되어 TCC 데이터베이스를 가진 프로세스에 의해 열릴 SQLite 데이터베이스에 쓰기되고, **SQLITE_SQLLOG_DIR
**을 파일 이름에 심볼릭 링크로 남용하여 해당 데이터베이스가 열릴 때 사용자 TCC.db가 열린 것으로 덮어씌워집니다.
자세한 정보는 여기의 설명서 및 여기의 강연에서 확인할 수 있습니다.
SQLITE_AUTO_TRACE
환경 변수 **SQLITE_AUTO_TRACE
**가 설정되면 라이브러리 **libsqlite3.dylib
**가 모든 SQL 쿼리를 기록하기 시작합니다. 많은 애플리케이션이 이 라이브러리를 사용했기 때문에 모든 SQLite 쿼리를 기록할 수 있었습니다.
여러 Apple 애플리케이션은 TCC로 보호된 정보에 액세스하기 위해 이 라이브러리를 사용했습니다.
MTL_DUMP_PIPELINES_TO_JSON_FILE - CVE-2023-32407
이 환경 변수는 Metal
프레임워크에서 사용됩니다. 이는 주로 Music
과 같은 여러 프로그램에 의존하며 FDA를 가지고 있습니다.
다음을 설정합니다: MTL_DUMP_PIPELINES_TO_JSON_FILE="경로/이름"
. 경로
가 유효한 디렉토리인 경우, 버그가 트리거되고 fs_usage
를 사용하여 프로그램에서 무슨 일이 일어나고 있는지 볼 수 있습니다:
open()
이 호출되어경로/.dat.nosyncXXXX.XXXXXX
(X는 랜덤)라는 파일이 열립니다.하나 이상의
write()
가 파일에 내용을 씁니다 (이를 제어할 수 없습니다).경로/.dat.nosyncXXXX.XXXXXX
가rename()
을 통해경로/이름
으로 이름이 바뀝니다.
이것은 임시 파일 쓰기이며, **보안이 되지 않은 rename(old, new)
**로 이어집니다.
이것은 이전과 새 경로를 별도로 해석해야 하기 때문에 안전하지 않습니다. 이는 시간이 걸리고 Race Condition에 취약할 수 있습니다. 자세한 정보는 xnu
함수 renameat_internal()
을 확인하십시오.
따라서, 특권 프로세스가 제어하는 폴더에서 이름을 바꾸는 경우, RCE를 성공시키고 특권 앱이 만든 파일을 열어 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
의open()
을 감지합니다 (X는 랜덤).여기서 우리는 또한 이 파일을 쓰기 위해
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 원격 데스크톱
루트로이드이면이 서비스를 활성화할 수 있으며 ARD 에이전트는 전체 디스크 액세스를 갖게 되어 사용자가 새 TCC 사용자 데이터베이스를 복사하도록 남용할 수 있습니다.
NFSHomeDirectory에 의해
TCC는 사용자의 홈 폴더에있는 데이터베이스를 사용하여 사용자의 $HOME/Library/Application Support/com.apple.TCC/TCC.db에서 사용자에게 특정 리소스에 대한 액세스를 제어합니다.
따라서 사용자가 $HOME
환경 변수를 다른 폴더를 가리키도록 재시작하면 사용자는 /Library/Application Support/com.apple.TCC/TCC.db에 새 TCC 데이터베이스를 생성하고 TCC에게 어떤 앱에 대한 TCC 권한을 부여할지 속일 수 있습니다.
Apple은 NFSHomeDirectory
속성 내에 저장된 설정을 사용하여 $HOME
값을 결정합니다. 따라서 이 값을 수정할 권한이있는 애플리케이션을 침해하면 (kTCCServiceSystemPolicySysAdminFiles
), TCC 우회를 위해이 옵션을 무기화할 수 있습니다.
CVE-2021-30970 - Powerdir
첫 번째 POC는 dsexport 및 dsimport를 사용하여 사용자의 HOME 폴더를 수정합니다.
대상 앱에 대한 csreq 블롭을 가져옵니다.
필요한 액세스 및 csreq 블롭이 포함 된 가짜 TCC.db 파일을 심어놓습니다.
dsexport를 사용하여 사용자의 디렉토리 서비스 항목을 내보냅니다.
사용자의 홈 디렉토리를 변경하기 위해 디렉토리 서비스 항목을 수정합니다.
dsimport를 사용하여 수정된 디렉토리 서비스 항목을 가져옵니다.
사용자의 _tccd_를 중지하고 프로세스를 다시 시작합니다.
두 번째 POC는 **/usr/libexec/configd
**를 사용하여 com.apple.private.tcc.allow
가 kTCCServiceSystemPolicySysAdminFiles
값을 가지고 있었습니다.
**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-validation
과 com.apple.private.tcc.manager
를 가졌습니다. 첫 번째는 코드 인젝션을 허용하고 두 번째는 TCC를 관리할 수 있는 권한을 부여했습니다.
이 바이너리는 /Library/Audio/Plug-Ins/HAL
폴더에서 서드 파티 플러그인을 로드할 수 있었기 때문에, 다음 PoC를 사용하여 플러그인을 로드하고 TCC 권한을 남용할 수 있었습니다:
더 많은 정보는 원본 보고서를 확인하십시오.
장치 추상화 레이어 (DAL) 플러그인
**kTCCServiceCamera
**를 사용하는 앱(Core Media I/O를 통해 카메라 스트림을 열기 위한 시스템 앱)은 /Library/CoreMediaIO/Plug-Ins/DAL
에 위치한 이 플러그인들을 프로세스 내에서 로드합니다(SIP 제한 없음).
일반 생성자가 포함된 라이브러리를 거기에 저장하는 것만으로도 코드 주입이 가능합니다.
이에 취약한 여러 Apple 앱들이 있었습니다.
Firefox
Firefox 앱은 com.apple.security.cs.disable-library-validation
및 com.apple.security.cs.allow-dyld-environment-variables
엔터티먼트를 가지고 있었습니다:
CVE-2020-10006
바이너리 /system/Library/Filesystems/acfs.fs/Contents/bin/xsanctl
에는 com.apple.private.tcc.allow
및 com.apple.security.get-task-allow
허용 권한이 있었으며, 이를 통해 프로세스 내부에 코드를 삽입하고 TCC 권한을 사용할 수 있었습니다.
CVE-2023-26818 - 텔레그램
텔레그램은 com.apple.security.cs.allow-dyld-environment-variables
및 com.apple.security.cs.disable-library-validation
허용 권한이 있었기 때문에 카메라로 녹화하는 등의 권한에 액세스할 수 있었습니다. 해당 페이로드를 여기서 찾을 수 있습니다.
환경 변수를 사용하여 라이브러리를 로드하는 방법에 주목하십시오. 사용자 정의 plist를 만들어 이 라이브러리를 삽입하고 **launchctl
**를 사용하여 실행했습니다:
열린 호출을 통해
**open
**을 sandboxed 상태에서도 호출하는 것이 가능합니다.
터미널 스크립트
기술 인원이 사용하는 컴퓨터에서는 터미널에 **전체 디스크 액세스 (FDA)**를 부여하는 것이 꽤 일반적입니다. 그리고 .terminal
스크립트를 호출하는 것이 가능합니다.
.terminal
스크립트는 다음과 같은 명령을 CommandString
키에서 실행하는 이러한 plist 파일입니다:
어플리케이션은 /tmp와 같은 위치에 터미널 스크립트를 작성하고 다음과 같이 실행할 수 있습니다:
마운트를 통해
CVE-2020-9771 - mount_apfs TCC 우회 및 권한 상승
어떤 사용자 (심지어 권한이 없는 사용자도)는 타임 머신 스냅샷을 생성하고 마운트하여 해당 스냅샷의 모든 파일에 액세스할 수 있습니다.
사용된 응용 프로그램(예: Terminal
)이 전체 디스크 액세스(FDA) 액세스(kTCCServiceSystemPolicyAllfiles
)를 가져야 하며, 이 권한은 관리자에 의해 부여되어야 합니다.
보다 자세한 설명은 원본 보고서에서 찾을 수 있습니다.
CVE-2021-1784 및 CVE-2021-30808 - TCC 파일을 덮어쓰기
TCC DB 파일이 보호되어 있더라도 새로운 TCC.db 파일을 덮어쓸 수 있었습니다:
원본 설명서에서 전체 악용을 확인하세요(https://theevilbit.github.io/posts/cve-2021-30808/).
asr
도구 **/usr/sbin/asr
**는 전체 디스크를 복사하고 TCC 보호를 우회하여 다른 위치에 장착할 수 있었습니다.
위치 서비스
**/var/db/locationd/clients.plist
**에는 위치 서비스에 액세스할 수 있는 클라이언트를 나타내는 세 번째 TCC 데이터베이스가 있습니다.
폴더 /var/db/locationd/
는 DMG 장착을 방지하지 않았기 때문에 우리 자신의 plist를 장착할 수 있었습니다.
시작 프로그램에 의해
pagemacOS Auto Startgrep에 의해
여러 경우에 파일에는 이메일, 전화번호, 메시지 등과 같은 민감한 정보가 비보호된 위치에 저장될 수 있습니다 (이는 Apple의 취약점으로 간주됩니다).
합성 클릭
이 방법은 더 이상 작동하지 않지만, 과거에는 작동했습니다:
CoreGraphics 이벤트를 사용한 다른 방법:
참고
Last updated