- CVE-2025-31250은 macOS의 TCC 권한 동의 팝업을 신뢰하기 어렵게 만든 취약점으로, 화면에 보이는 앱과 실제 권한을 받는 앱을 다르게 만들 수 있었음
- 문제는
tccd의TCCAccessRequestIndirect처리에 있었고,target_path는 팝업에 표시될 앱 이름에,target_identifier는 실제 권한을 받을 앱 식별자에 쓰였음 - 기존 우회처럼 가짜 앱·Dock 바로가기·사용자 클릭 유도가 필요하지 않았고, 사용자가 스푸핑된 팝업에서 Allow를 누르면 공격이 성립할 수 있었음
- Apple은 macOS Sequoia 15.5에서 패치했지만, 같은 날 나온 Ventura 13.7.6과 Sonoma 14.7.6은 패치하지 않으며 이전 버전 패치 계획도 없다고 확인함
- 공격자는 FaceTime, Voice Memos, System Settings 같은 앱이 열리는 순간을 노려 권한 팝업 스푸핑을 시도할 수 있어, 사용자가 실제 권한 부여 대상을 오인할 위험이 있음
CVE-2025-31250의 핵심 동작
- CVE-2025-31250은 macOS TCC 권한 팝업에서 표시되는 앱과 실제 권한을 받는 앱을 다르게 만들 수 있었던 취약점임
- 패치 전에는 다음과 같은 구성이 가능했음
- Application A가 macOS에 권한 동의 팝업 표시를 요청함
- 팝업은 Application B에서 온 것처럼 보임
- 사용자의 동의 결과는 Application C에 적용됨
- 세 앱은 서로 달라도 됐고, 정상적인 사용에서는 보통 같은 앱일 가능성이 높음
- 핵심 문제는 팝업에 표시되는 앱과 실제 권한 수신 앱이 달라도 검증이 충분하지 않았다는 점임
패치 적용 범위와 정정 사항
- 초기 설명과 달리 패치는 macOS Sequoia 15.5에만 적용됨
- 같은 날 릴리스된 macOS Ventura 13.7.6과 macOS Sonoma 14.7.6은 패치되지 않았음
- Sonoma 14.7.6 가상 머신에서 PoC를 컴파일해 실행했을 때 취약점이 여전히 동작함
- Apple Product Security는 보고 상태를 “We’ve addressed the issue in all planned releases.”로 바꿨고, 이후 Ventura와 Sonoma에는 이 취약점 패치 계획이 없다고 확인함
- 결과적으로 Ventura와 Sonoma는 이 취약점에 취약한 상태로 남아 있음
TCC와 Apple Events가 만나는 지점
- TCC는 Apple 운영체제의 핵심 권한 시스템이며, 내부적으로
tccd데몬과 privateTCC프레임워크를 통해 동작함 - 개발자는 private API를 직접 호출하지 않지만, public API가 필요한 시점에 내부적으로 TCC 기능을 호출함
tccd는 Apple의 XPC API를 사용해 메시지를 받음- 패치 전에는 XPC 메시지를
tccd로 보낼 수 있는 앱이 조작된 메시지를 보내, 권한 팝업 표시 앱과 실제 권한 수신 앱을 분리할 수 있었음
Apple Events와 TCC 데이터 모델
- Apple Events는 macOS의 프로세스 간 통신 방식이며, 현재는 주로 자동화 용도로 쓰임
- Apple Events 자동화는 Apple의 Open Scripting Architecture를 통해 스크립트화할 수 있음
- 대표 언어는 AppleScript
- JavaScript도 사용할 수 있음
- macOS Mojave 10.14부터 앱이 Apple Events를 보내려면 TCC를 통한 사용자 동의가 필요함
- TCC의 사용자 동의 결과는 사용자 홈 폴더 아래
Application Support/com.apple.TCC/TCC.dbSQLite 데이터베이스에 저장됨 - 일반적인 TCC 행에는 요청 앱, 요청 서비스, 사용자 동의 결과가 들어감
- Apple Events는 수신 앱마다 권한을 제한해야 하므로
indirect object컬럼을 사용함- 이 컬럼에는 Apple Events를 받을 앱의 식별자가 들어감
- Apple Events 외에 FileProviderDomain 서비스도 이 컬럼을 사용함
취약한 XPC 메시지 구조
- 문제는
TCCAccessRequestIndirect함수의 로직 버그에 있었음 - 이 함수는
TCC.db의indirect object컬럼을 써야 하는 접근 요청을 처리함 - PoC의 핵심은
target_prompt가2일 때 두 필드를 분리해 넣는 방식임target_path: GUI 권한 팝업에 표시할 앱 이름을 얻는 데 사용됨target_identifier: 실제로 데이터베이스에 기록되어 권한을 받는 앱의 번들 ID로 사용됨
TCCAccessRequestIndirect는 indirect object용 함수인데도, 빈 문자열을 indirect object로 넣어 해당 컬럼을 쓰지 않는 여러 TCC 서비스에도 사용할 수 있었음- 이 버그는 다른 접근 요청 함수에는 존재하지 않았음
악용 조건과 제한
- 취약점 악용은 사용자가 권한 팝업에서 Allow를 눌러야 성공함
- 사용할 수 있는 TCC 서비스는 제한적이었지만, Microphone과 Camera 같은 주요 서비스가 포함됨
- 특정 디렉터리 접근 권한 팝업도 스푸핑할 수 있었지만, 파일 주변의 추가 보안 계층 때문에 유용성은 낮았음
- 악성 앱이 권한을 자기 자신이 아니라 다른 앱에 적용하게 만드는 것도 가능했음
- 공격자가 다른 앱을 제어할 수 있지만 그 앱에 TCC 권한이 필요한 경우에 활용할 수 있는 경로임
팝업 타이밍을 이용한 속임수
- 무작위로 권한 팝업이 뜨면 사용자가 의심하고 Don’t Allow를 누를 가능성이 있음
- macOS 앱은 실행 중인 애플리케이션 목록과 현재 최상위 앱을 확인할 수 있음
- 실행 중인 앱 확인: NSWorkspace runningApplications
- 최상위 앱 확인: NSWorkspace frontmostApplication
- 악성 앱은 특정 앱이 실행되거나 최상위 앱이 되는 시점까지 기다린 뒤, 그 앱 이름으로 스푸핑된 권한 팝업을 띄울 수 있음
- 예를 들어 FaceTime 실행 시 Camera 권한 팝업을, Voice Memos 실행 시 Microphone 권한 팝업을 스푸핑할 수 있음
- 사용자는 앱을 열거나 전환한 직후 나타난 팝업을 해당 앱의 정상 권한 요청으로 오인할 수 있음
기존 TCC 우회 경로와의 연결
- 이전에는
tccd가 사용자 홈 폴더를HOME환경 변수로 판단해, 가짜 홈 폴더와 가짜TCC.db를 심는 방식의 TCC 우회가 가능했음 - 이 문제는 2020년 7월 중순 업데이트에서 패치됐고, 이후
tccd는 운영체제의 사용자 정보 디렉터리에서 홈 폴더를 조회함 - 이후에도 사용자 홈 폴더 변경을 악용한 우회 사례가 있었음
- Wojciech Reguła는 macOS의 GUI 사용자 정보 디렉터리 편집기 플러그인 시스템을 악용한 CVE-2020-27937을 공개함
- Microsoft Threat Intelligence 팀은 import/export 명령을 이용한 powerdir 우회를 공개함
- 사용자 홈 폴더를 바꾸려면 일반적으로 두 가지가 필요함
- root 권한
- 특정 TCC 서비스에 대한 사용자 동의
- CVE-2025-31250은 root 권한 요구사항을 우회하지 못하지만, 필요한 TCC 동의를 스푸핑된 팝업으로 유도할 수 있음
- 악성 앱이 사용자를 속여 동의를 얻고 root 권한 상승까지 확보하면, 사용자 정보 디렉터리를 바꾸고 가짜
TCC.db를 심는 경로가 가능함 REG.db는 유효한TCC.db를 추적하지만, TCC에는 앱이REG.db에 항목을 추가할 수 있는 함수가 있어 심어둔TCC.db경로를 추가할 수 있음
사용자에게 보이는 권한 관리의 한계
- TCC는 System Settings의 Privacy & Security 패널 뒤에서 동작하는 시스템임
- Apple Events 관련 동의 결과는 Automation 섹션에 표시됨
- Privacy & Security 패널에서는 사용자가 부여한 동의를 확인하고, 많은 경우 특정 동의를 철회할 수 있음
- 그러나 공격자가 사용자를 속여 Apple Events 권한을 허용하게 만든 경우, 해당 동의 결과가 System Settings에 나타나지 않았음
- 사용자는
tccutilCLI 도구로 동의를 철회할 수 있지만, 이 도구는 문서화가 제한적이고 대부분의 사용자가 알기 어려움- Apple 문서로는 오래된 Technical Q&A와 IT training page가 있음
Endpoint Security와 탐지 가능성
- Apple의 Endpoint Security 프레임워크는 최근 TCC 데이터베이스 수정 감시를 지원하기 시작함
- Objective-See의 글은 이 변경을 다룬 자료임: Endpoint Security TCC database monitoring
- 이 기능이 기대대로 동작하면, 프레임워크를 쓰는 앱은 사용자에게 실제로 어느 앱에 권한을 부여했는지 사후 알림을 줄 수 있음
- 다만 이 탐지 가능성은 Apple이 Endpoint Security 이벤트를 추가한 시점과 취약점 패치 사이의 짧은 기간에만 직접적인 의미가 있었음
Apple의 수정 방식
- macOS Sequoia 15.5의
tccd바이너리 분석 결과, 최종 패치는 초기 추정보다 더 복잡했음 - 패치 후에는 같은 방식으로 TCC 팝업을 스푸핑할 수 없음
- indirect object에 빈 문자열을 넣어 다른 TCC 서비스에
TCCAccessRequestIndirect를 사용하는 동작도 제한된 것으로 보임 - 취약한 형태의 메시지는 이제
tccd에서 조용히 버려지고 아무 동작도 하지 않는 것으로 관찰됨 - 간단한 검증에서는 좋은 패치로 보였지만, 전체 동작을 완전히 이해하려면 추가 분석이 필요함
보고와 패치까지의 흐름
- 이 취약점은 Apple에 보고된 두 번째 버그였고, Apple이 패치한 보고 건 중 패치까지 가장 오래 걸린 사례였음
- 보고 과정에는 초기 제보, Apple Product Security의 추가 설명 요청, 잠재적 전체 TCC 우회 경로 공유, PoC 테스트 업데이트, 재현 상태 확인, 여러 차례의 진행 상황 문의가 포함됨
- 제안된 단순 패치는 두 필드가 같은 앱을 가리키는지 검증하는 방식이었음
- Apple은 조사 중이라는 답변을 여러 차례 보냈고, 이후 크레딧 표기 이름을 요청한 뒤 패치를 릴리스함
- 취약점 이름은 “TCC, Who?”로 붙여짐