728x90
Apple의 코드사인(Code Signing) 메커니즘은 macOS, iOS 등 Apple 플랫폼에서 실행 파일(앱, 프레임워크, dylib 등)의 무결성, 인증, 신뢰성을 보장하기 위한 보안 기술입니다.
Apple 코드사인 메커니즘 개요
1. 목적
- 코드가 수정되지 않았음 (무결성 확인)
- 코드의 출처가 신뢰할 수 있음 (인증)
- 시스템이 해당 코드를 허용해도 되는지 판단 (신뢰성 검증)
코드사인의 구성요소
Apple의 코드서명은 Mach-O 파일 내부와 함께 .app 번들 외부에도 정보가 포함됩니다.
1. Code Signature (서명 블록)
Mach-O 파일 끝에 추가되는 구조체이며, 아래 정보 포함:
- CodeDirectory: 해시 테이블 및 서명 메타데이터
- CMS Signature: 실제 서명 (X.509 인증서 기반 CMS 구조)
- Entitlements: 앱 권한 (예: 앱이 카메라 접근 가능한지 등)
- Requirements: 실행 정책 요구사항 (예: Team ID 매칭)
2. X.509 인증서 체인
- 인증서에는 Apple Developer ID 또는 Apple 공인 서명자가 포함되어야 함.
- 이 인증서는 codesign 명령어로 서명할 때 같이 포함됨.
3. Mach-O 내 서명 데이터 위치
- __LINKEDIT 세그먼트의 마지막에 서명 정보가 추가됨.
- otool로 보면:
- LC_CODE_SIGNATURE dataoff = <offset> datasize = <size>
코드사인의 동작 원리
1. 앱/라이브러리 서명
개발자는 다음 명령어로 Mach-O 파일을 서명합니다:
codesign -s "Developer ID Application: Your Name (TEAMID)" binary_or_app
이 과정에서:
- 바이너리의 각 섹션을 해시 → CodeDirectory 생성
- CodeDirectory에 대해 CMS 서명 수행
- 전체 서명 구조를 Mach-O 파일의 끝에 삽입
2. 앱 실행 시 검증 흐름
시스템 또는 커널에서 다음을 확인:
- 서명이 존재하는지 (LC_CODE_SIGNATURE 확인)
- CodeDirectory의 해시가 CMS 서명에 포함된 인증서로 검증되는지
- 실행 중인 Mach-O 바이너리의 섹션들이 CodeDirectory에 정의된 해시와 일치하는지
- Entitlements, Requirements 등 정책 조건 충족 여부 확인
3. System Integrity Protection (SIP), Gatekeeper와 연계
- macOS의 Gatekeeper는 App Store 외부에서 실행되는 앱의 서명을 강제 확인
- SIP는 시스템 영역의 바이너리 수정 자체를 방지
코드 무결성 검증 방식
- Mach-O의 특정 영역만 서명에 포함됩니다:
- 일반적으로 __TEXT, __DATA 등의 실제 코드/데이터 영역
- 서명 자체가 들어간 __LINKEDIT는 제외됨
- 따라서 서명 이후 __TEXT가 바뀌면 무조건 서명 검증 실패
애플 코드사인이 깨지는 조건
원인 | 설명 |
바이너리 섹션 수정 | __TEXT, __DATA 등 서명된 코드 변경 |
데이터 추가 | Mach-O 파일 끝에 HMAC 등 추가 |
서명된 리소스 변경 | Info.plist, entitlements 등 수정 |
인증서 문제 | 만료/철회된 개발자 인증서 |
번들 구조 변경 | .app 내부 파일 추가/삭제/이동 |
dylib 로딩 오류 | dylib 위치, 서명, 무결성 문제 |
728x90
'Programming > IOS, macOS, Android' 카테고리의 다른 글
apple IOS macOS의 Mach-O 파일 구조 개념 (0) | 2025.04.24 |
---|