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. 앱 실행 시 검증 흐름

시스템 또는 커널에서 다음을 확인:

  1. 서명이 존재하는지 (LC_CODE_SIGNATURE 확인)
  2. CodeDirectory의 해시가 CMS 서명에 포함된 인증서로 검증되는지
  3. 실행 중인 Mach-O 바이너리의 섹션들이 CodeDirectory에 정의된 해시와 일치하는지
  4. 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

+ Recent posts