App Sandbox란?
앱이 손상된 경우 손상을 방지하기 위해 macOS 앱의 시스템 리소스 및 사용자 데이터에 대한 액세스를 제한합니다.
앱 샌드박스는 권한을 통해 요청된 리소스에 대한 앱의 액세스를 제한하여 시스템 리소스와 사용자 데이터를 보호합니다.
샌드박스는 앱이 시스템의 다른 부분과 격리된 환경에서 실행되도록 하는 보안 기술입니다. 샌드박스는 앱이 시스템 리소스에 제한된 액세스 권한을 갖도록 하여 앱의 보안성을 높이고 악의적인 활동을 방지합니다.
Important❗️
Mac App Store를 통해 macOS 앱을 배포하려면 App Sandbox 기능을 활성화해야 합니다.
Topics
Essentials
앱이 손상된 경우 시스템 및 사용자 데이터의 손상을 억제하기 위해 앱이 액세스 제어 기술을 사용할 수 있는지 여부를 나타내는 부울 값입니다.
키: com.apple.security.app-sandbox
파일, 네트워크 연결, 하드웨어 기능에 대한 앱의 액세스를 제한하여 악의적인 공격으로부터 사용자 데이터와 운영 체제 리소스를 보호하세요.
- 상세 내용파일, 네트워크 연결, 하드웨어 기능에 대한 앱의 액세스를 제한하여 악의적인 공격으로부터 사용자 데이터와 운영 체제 리소스를 보호하세요.앱을 개발하는 동안 보안 코딩 방식을 채택했더라도 여전히 사용자의 보안과 개인 정보 보호를 위협하는 취약점이 있을 수 있습니다. App Store에 앱을 배포하기 위한 요구 사항인 앱 샌드박스는 공격자가 앱을 통해 플랫폼 기능을 남용할 수 있는 범위를 제한합니다.메모App Sandbox와 호환되지 않는 기능 검토페이지제한되는 활동은 다음과 같습니다.
- 인증 서비스 API 사용.
- 보조 앱에서 접근성 API를 사용합니다.
- Apple 이벤트를 임의의 앱으로 보내기.
- 분산 알림의 사전을 다른 작업으로 보냅니다 .userInfo
- 커널 확장을 로드하는 중입니다.
- 열기 및 저장 대화 상자에서 사용자 입력을 시뮬레이션합니다.
- 다른 앱의 기본 설정에 액세스하거나 수정합니다.
- 네트워크 설정 구성.
- 실행 중인 다른 앱을 종료합니다.
- 활동 모니터를 엽니다.
- 보기 > 열을 선택하고 모니터링할 수 있는 열 목록 중에서 Sandbox를 선택합니다.
- 앱을 실행하세요.
- Activity Monitor의 프로세스 목록에서 앱을 찾고 아래 그림과 같이 샌드박스 열의 값이 예인지 확인하세요.
- 앱 샌드박스 위반 발견 및 진단
- 샌드박스 앱에 명령줄 도구 포함
- 앱이 손상된 경우 시스템 및 사용자 데이터의 손상을 억제하기 위해 앱이 액세스 제어 기술을 사용할 수 있는지 여부를 나타내는 부울 값입니다.
- 골자페이지 링크에서
- [Key] com.apple.security.app-sandbox [Value] [Bool] true
- % codesign -dvvv --entitlements - <path to your app>
- 활동 모니터에서 앱을 확인하려면:
- 앱이 App Sandbox를 사용하는지 확인페이지 링크에서
- 포함된 도구에 대한 앱 샌드박스 구성페이지 링크에서
- 운영 체제는 샌드박스 앱을 시작할 때 앱이 무제한 읽기 및 쓰기 액세스 권한을 갖는 컨테이너 디렉터리를 생성합니다. 샌드박스 앱은 사용자의 홈 폴더에 무제한으로 액세스할 수 없습니다. 이 메서드를 사용하면 샌드박스 앱에 대한 앱 컨테이너 내의 위치를 반환하므로 사용자 문서, 스크립트 및 지원 파일에 대한 공통 디렉터리를 찾을 수 있습니다.FileManagerurl(for:in:appropriateFor:create:)
- 앱이 샌드박스에서 실행될 때 운영 체제에서 특정 활동을 금지합니다. 앱이 이러한 기능을 수행하는지 확인하고 이를 제거하거나 동일한 기능을 제공하는 대체 방법을 찾으세요.
- Xcode에서 앱 샌드박스 기능을 활성화하는 방법에 대한 자세한 내용은 macOS 앱 샌드박스 구성을 참조하세요 .
- Xcode에서 새로운 macOS 앱을 생성하면 앱 샌드박스 권한과 기본 기능 세트가 제공됩니다. 기존 앱이 있는 경우 App Sandbox를 채택하여 사람들에게 추가 보안을 제공할 수 있습니다.
- 개요페이지
- App Sandbox로 사용자 데이터 보호
샌드박스가 적용된 앱의 Xcode 프로젝트에 명령줄 도구를 추가하면 결과 앱이 도우미 도구로 실행할 수 있습니다.
- 상세 내용샌드박스가 적용된 앱의 Xcode 프로젝트에 명령줄 도구를 추가하면 결과 앱이 도우미 도구로 실행할 수 있습니다.Mac용 앱을 구축할 때 도우미 도구 역할을 하는 명령줄 도구를 앱에 포함할 수 있습니다. 이것이 도움이 될 수 있는 예는 다음과 같습니다.
- 일부 코드를 별도의 프로세스에서 실행하려고 합니다. 대부분의 경우 XPC 서비스가 더 나은 선택이지만 명령줄 도구를 포함하는 것이 더 쉬운 경우도 있습니다.
- 외부 빌드 시스템(예: )을 사용하여 명령줄 도구를 빌드한 make다음 앱에서 실행하려고 합니다.
다음을 확인하세요.% codesign -d -vvv --entitlements :- AppWithTool.app … Identifier=com.example.apple-samplecode.AppWithTool Format=app bundle with Mach-O universal (x86_64 arm64) CodeDirectory v=20500 size=822 flags=0x10000(runtime) hashes=14+7 location=embedded … Authority=Apple Distribution: … … TeamIdentifier=SKMME9E2Y8 … <dict> <key>com.apple.security.app-sandbox</key> <true/> <key>com.apple.security.files.user-selected.read-only</key> <true/> </dict> </plist> % codesign -d -vvv --entitlements :- AppWithTool.app/Contents/MacOS/ToolX … Identifier=com.example.apple-samplecode.AppWithTool.ToolX Format=Mach-O universal (x86_64 arm64) CodeDirectory v=20500 size=796 flags=0x10000(runtime) hashes=13+7 location=embedded … Authority=Apple Distribution: … … TeamIdentifier=SKMME9E2Y8 … <dict> <key>com.apple.security.app-sandbox</key> <true/> <key>com.apple.security.inherit</key> <true/> </dict> </plist>
- 필드 Identifier는 코드 서명 식별자입니다.
- 이 Format필드에는 실행 파일이 범용임을 표시합니다.
- runtime필드 의 플래그는 강화 된 런타임이 활성화되었음을 나타냅니다.CodeDirectory
- 필드 Authority에는 코드가 App Store 제출에서 기대할 수 있는 Apple 배포 서명 ID로 서명되었음을 표시합니다.
- 필드 는 팀 ID입니다.TeamIdentifier
- 앱의 자격에는 이 앱에 적합한 기타 자격이 포함됩니다.com.apple.security.app-sandbox
- 도구의 권한에는 및 만 포함됩니다 .com.apple.security.app-sandboxcom.apple.security.inherit
여기서 C는 Clang으로 빌드됨을 의미합니다 .% mkdir ToolC % cd ToolC
해당 소스 파일을 clang각 아키텍처에 대해 한 번씩 두 번 빌드한 다음 lipo함께 빌드합니다.이 -mmacosx-version-min옵션은 AppWithTool 앱과 일치하도록 배포 대상을 설정합니다. Intel 아키텍처의 경우 위에서 설명한 대로 macOS 10.15입니다. Apple 실리콘 아키텍처의 경우 이는 Apple 실리콘을 지원하는 최초의 macOS 릴리스인 macOS 11.0입니다.% cat main.c #include <stdio.h> int main(int argc, char ** argv) { printf("Hello Cruel World!\\n"); return 0; }
아래와 같이 도구에 서명합니다.이는 다음과 같이 분류됩니다.% /usr/libexec/PlistBuddy -c "Add :com.apple.security.app-sandbox bool true" "ToolC.entitlements" File Doesn't Exist, Will Create: ToolC.entitlements % /usr/libexec/PlistBuddy -c "Add :com.apple.security.inherit bool true" ToolC.entitlements % cat ToolC.entitlements … <dict> <key>com.apple.security.app-sandbox</key> <true/> <key>com.apple.security.inherit</key> <true/> </dict> </plist>
- 인수 s -는 임시 서명(Xcode 용어로 로컬에서 실행하기 위한 서명)을 적용합니다. 여기서 코드 서명을 설정하는 것이 중요합니다. Xcode는 도구를 최종 앱에 포함할 때 도구에 다시 서명할 때 사용하는 패턴을 설정합니다. 서명 ID만 중요하지 않습니다. Xcode는 임베딩 프로세스 중에 제품의 서명 ID로 해당 ID를 재정의하므로 임시 서명을 사용하지 않아도 됩니다.
- 이 옵션은 코드 서명 식별자를 설정합니다.i com.example.apple-samplecode.AppWithTool.ToolC
- 이 o runtime옵션은 강화된 런타임을 활성화합니다. 다시 말하지만 이는 App Store 배포에는 필요하지 않지만 새 코드에는 모범 사례입니다.
- 옵션 은 서명의 자격을 제공합니다.-entitlements ToolC.entitlements
- 이 f옵션은 기존 서명을 재정의합니다. clang이는 꼭 필요한 것은 아니지만 아키텍처에 적용되는 기존 임시 서명에 대한 혼동을 방지합니다 arm64. Apple 실리콘에서는 모든 코드에 서명이 필요하므로 clangApple 실리콘용으로 빌드할 때 자동으로 임시 서명을 적용합니다.
- "필요한 경우 항목 복사"를 활성화합니다.
- "폴더 참조 만들기" 대신 "그룹 만들기"를 선택하세요.
- "대상에 추가" 목록에서 모든 상자를 선택 취소합니다.
- 앱에 패키지 종속성 추가
- 또한보십시오페이지 링크에서
- 다시 빌드하고 유효성을 검사하세요.페이지 링크에서
- % codesign -s - -i com.example.apple-samplecode.AppWithTool.ToolC -o runtime --entitlements ToolC.entitlements -f ToolC
- 도구에 대한 자격 파일을 만듭니다.
- % clang -o ToolC-x86_64 -mmacosx-version-min=10.15 -arch x86_64 main.c % clang -o ToolC-arm64 -mmacosx-version-min=11.0 -arch arm64 main.c % lipo ToolC-x86_64 ToolC-arm64 -create -output ToolC
- 다음과 같은 디렉터리에 소스 파일을 만듭니다.
- 새 디렉터리를 만들고 그 디렉터리로 변경합니다.
- 앱과 Xcode 기반 도우미 도구가 올바르게 작동하면 이제 외부 빌드 시스템을 사용하여 빌드된 도구에 대한 프로세스를 반복할 차례입니다. 다음 예에서는 명령줄에서 더미 도우미 도구를 만든 다음 AppWithTool 앱에 도구를 포함합니다. 실제 프로젝트에서는 명령줄 도구의 외부 빌드 시스템(예: make)을 사용하여 포함하려는 도구를 빌드합니다.
- 도구에 다른 권한을 추가하면 문제가 발생할 수 있습니다. 앱이 도구를 실행할 때 코드 서명 오류로 인해 도구가 즉시 충돌하는 경우 도구가 다음 두 가지 자격으로 서명되었는지 확인하세요. 및 .com.apple.security.app-sandboxcom.apple.security.inherit
- 다음 명령을 실행하여 Xcode가 모든 것을 올바르게 구성했는지 확인하십시오.
- 메모
- App Store Connect를 선택하고 다음을 클릭한 후 내보내기를 선택하고 다음을 클릭합니다.
- 메모
- 프로젝트가 설정되었으면 이제 모든 것이 올바르게 빌드되는지 테스트할 차례입니다. 시작하려면 도구 대상을 빌드한 다음 앱 대상을 빌드하고 전자의 결과를 후자에 포함시키는 제품 > 아카이브를 선택하십시오.
- 빌드 단계에 대한 자세한 내용은 빌드 단계란 무엇입니까?를 참조하세요.
- 새로운 파일 복사 빌드 단계를 추가합니다. 빌드 단계 이름을 두 번 클릭하고 다음으로 변경합니다 Embed Helper Tools(정확한 이름은 중요하지 않지만 설명이 포함된 이름을 선택하는 것이 가장 좋습니다). 대상 팝업을 실행 파일로 설정합니다. 그러면 Placing Content in a Bundle 에서 권장하는 위치 중 하나인 앱 디렉터리에 도우미 도구가 배치됩니다 .Contents/MacOS
- 도우미 도구 포함페이지 링크에서
- ToolX 구성표를 선택하고 제품 > 빌드를 선택하여 도구가 올바르게 빌드되는지 확인하세요.
- 기타 코드 서명 플래그( ) 빌드 설정을 로 설정하면 도구의 코드 서명 식별자가 해당 번들 ID와 일치하는지 확인됩니다.OTHER_CODE_SIGN_FLAGS$(inherited) -i $(PRODUCT_BUNDLE_IDENTIFIER)
- 중요한
- 빌드 설정 탭에서 설치 건너뛰기( ) 빌드 설정을 활성화합니다. 이 설정이 없으면 Xcode는 앱에 포함된 도구 외에 Xcode 아카이브에 도구의 독립 실행형 복사본을 저장합니다. 해당 도구 사본은 해당 아카이브를 배포하려고 할 때 문제를 일으킵니다.SKIP_INSTALL
- 번들 식별자 필드를 입력합니다. 앱의 번들 ID는 이므로 로 설정하세요 . 이 값은 도우미 도구의 코드 서명 식별자가 됩니다. 아래의 기타 코드 서명 플래그 빌드 설정에 대한 설명을 참조하세요.com.example.apple-samplecode.AppWithToolcom.example.apple-samplecode.AppWithTool.ToolX
- 도구 대상 편집기의 일반 탭에서 배포 대상 필드를 지웁니다. 그러면 프로젝트에서 배포 대상(macOS 10.15)을 상속하도록 도구 대상이 구성됩니다.
- 도우미 도구 대상 만들기페이지 링크에서
- 제품 > 아카이브를 선택하면 앱이 Xcode 아카이브로 빌드되고 Xcode 구성 도우미에 해당 아카이브가 표시됩니다. 여기서 목표는 지금까지 모든 것이 제대로 작동하는지 확인하는 것입니다.
- 앱 타겟 편집기의 서명 및 기능 탭에서 "서명 자동 관리"가 선택되어 있는지 확인한 다음 적절한 팀을 선택하세요. 서명 인증서 팝업이 개발로 전환되어야 합니다. 이는 정확히 일상적인 개발에 필요한 것입니다.
- 프로젝트 편집기에서 배포 대상을 10.15로 설정합니다. 나중에 이 배포 대상을 상속하도록 도구 대상을 구성하면 모든 것을 동기화하는 데 도움이 됩니다.
- 앱 프로젝트 만들기페이지
- 메모
- 개요페이지
- 샌드박스 앱에 명령줄 도구 포함
샌드박스 위반으로 인해 macOS 앱이 제대로 작동하지 않는 경우를 확인하고 샌드박스 관련 문제를 수정하세요.
Network
com.apple.security.network.server
앱이 들어오는 네트워크 연결을 수신할 수 있는지 여부를 나타내는 부울 값입니다.
com.apple.security.network.client
앱이 나가는 네트워크 연결을 열 수 있는지 여부를 나타내는 부울 값입니다.
Hardware
앱이 내장 및 외부 카메라와 상호 작용하고 동영상과 정지 이미지를 캡처할 수 있는지 여부를 나타내는 부울 값입니다.
키: com.apple.security.device.camera
com.apple.security.device.microphone
앱이 마이크를 사용할 수 있는지 여부를 나타내는 부울 값입니다.
com.apple.security.device.usb
앱이 USB 장치와 상호 작용할 수 있는지 여부를 나타내는 부울 값입니다.
com.apple.security.print
앱이 문서를 인쇄할 수 있는지 여부를 나타내는 부울 값입니다.
com.apple.security.device.bluetooth
앱이 블루투스 기기와 상호작용할 수 있는지 여부를 나타내는 부울 값입니다.
App Data
앱이 사용자 주소록의 연락처에 대한 읽기-쓰기 액세스 권한을 가질 수 있는지 여부를 나타내는 부울 값입니다.
키: com.apple.security.personal-information.addressbook
앱이 위치 서비스의 위치 정보에 액세스할 수 있는지 여부를 나타내는 부울 값입니다.
키: com.apple.security.personal-information.location
앱이 사용자의 캘린더에 대한 읽기/쓰기 액세스 권한을 가질 수 있는지 여부를 나타내는 부울 값입니다.
키: com.apple.security.personal-information.calendars
File Access
보안 보호를 유지하면서 문서와 지원 파일을 읽고 쓰세요.
앱 파일을 App Sandbox 컨테이너로 마이그레이션
문서 및 지원 파일에 대한 앱의 액세스를 단순화합니다.
com.apple.security.files.user-selected.read-only
사용자가 열기 또는 저장 대화 상자를 사용하여 선택한 파일에 대해 앱이 읽기 전용 액세스 권한을 가질 수 있는지 여부를 나타내는 부울 값입니다.
com.apple.security.files.user-selected.read-write
사용자가 열기 또는 저장 대화 상자를 사용하여 선택한 파일에 대해 앱이 읽기-쓰기 액세스 권한을 가질 수 있는지 여부를 나타내는 부울 값입니다.
com.apple.security.files.downloads.read-only
앱이 다운로드 폴더에 대한 읽기 전용 액세스 권한을 가질 수 있는지 여부를 나타내는 부울 값입니다.
com.apple.security.files.downloads.read-write
앱이 다운로드 폴더에 대한 읽기-쓰기 액세스 권한을 가질 수 있는지 여부를 나타내는 부울 값입니다.
com.apple.security.assets.pictures.read-only
앱이 그림 폴더에 대한 읽기 전용 액세스 권한을 가질 수 있는지 여부를 나타내는 부울 값입니다.
com.apple.security.assets.pictures.read-write
앱이 사진 폴더에 대한 읽기-쓰기 액세스 권한을 가질 수 있는지 여부를 나타내는 부울 값입니다.
com.apple.security.assets.music.read-only
앱이 음악 폴더에 대한 읽기 전용 액세스 권한을 가질 수 있는지 여부를 나타내는 부울 값입니다.
com.apple.security.assets.music.read-write
앱이 음악 폴더에 대한 읽기/쓰기 액세스 권한을 가질 수 있는지 여부를 나타내는 부울 값입니다.
com.apple.security.assets.movies.read-only
앱이 영화 폴더에 대한 읽기 전용 액세스 권한을 가질 수 있는지 여부를 나타내는 부울 값입니다.
com.apple.security.assets.movies.read-write
앱이 영화 폴더에 대한 읽기/쓰기 액세스 권한을 가질 수 있는지 여부를 나타내는 부울 값입니다.
앱이 모든 파일에 액세스할 수 있는지 여부를 나타내는 부울 값입니다. (더 이상 사용되지 않음)
~~키: com.apple.security.files.all~~
property list key NSAppDataUsageDescription
앱이 다른 앱의 샌드박스 컨테이너에 있는 파일에 액세스해야 하는 이유를 사용자에게 알려주는 메시지입니다.
이름: 개인 정보 - 기타 애플리케이션 데이터 사용 설명
See Also
Secure code
시스템에서 실행되는 서명된 코드를 검사하고 검증합니다.
공증을 위해 macOS 소프트웨어를 Apple에 제출하여 사용자에게 macOS 소프트웨어에 대한 신뢰도를 더욱 높여주세요.
arm64e 아키텍처에 대해 앱을 테스트하여 향상된 보안 기능과 원활하게 작동하는지 확인하세요.
macOS 앱에 대한 보안 보호 및 리소스 액세스를 관리합니다.
드라이버, 커널 확장 및 기타 하위 수준 코드를 테스트하기 위해 개발 중에만 시스템 보호를 일시적으로 비활성화하십시오.
앱이 현재 OS 릴리스에서 실행되도록 레거시 앱 코드 서명을 업데이트하세요.
코드 서명 충돌을 일으키지 않고 Mac 소프트웨어 업데이트를 구현합니다.
프로비저닝 프로필을 통해 Apple 플랫폼에서 타사 코드를 실행할 수 있는 방법을 알아보세요
reference
'TIL (Today I Learned)' 카테고리의 다른 글
[SwiftUI] SwiftUI의 View란? (0) | 2024.01.30 |
---|---|
ObservableObject , @ObservedObject, @StateObject (0) | 2024.01.21 |
[iOS] NearbyInteraction란? (2) | 2024.01.13 |
[SwiftUI] SwiftUI 기본 컴포넌트 정리 (0) | 2023.03.24 |
[iOS] 인강 및 문서 추천 (0) | 2023.02.01 |