macOS Gatekeeper / Quarantine / XProtect
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Fpentest.eu%2FRENDER_WebSec_10fps_21sec_9MB_29042024.gif&width=768&dpr=4&quality=100&sign=bc0743d1&sv=1)
Gatekeeper
Gatekeeper는 Mac 운영 체제를 위해 개발된 보안 기능으로, 사용자가 신뢰할 수 있는 소프트웨어만 시스템에서 실행하도록 보장합니다. 이는 사용자가 App Store 외부의 소스에서 다운로드하고 열려고 시도하는 소프트웨어(앱, 플러그인 또는 설치 패키지 등)를 검증함으로써 작동합니다.
Gatekeeper의 핵심 메커니즘은 검증 프로세스에 있습니다. 다운로드한 소프트웨어가 인정된 개발자에 의해 서명되었는지 확인하여 소프트웨어의 진위를 보장합니다. 또한, 소프트웨어가 Apple에 의해 노타리제이션되었는지 확인하여 알려진 악성 콘텐츠가 없고 노타리제이션 이후에 변조되지 않았음을 확인합니다.
또한, Gatekeeper는 사용자가 다운로드한 소프트웨어를 처음 열 때 승인을 요청하여 사용자 제어 및 보안을 강화합니다. 이 보호 장치는 사용자가 무심코 해로운 실행 코드를 실행하는 것을 방지하는 데 도움을 줍니다.
Application Signatures
애플리케이션 서명, 즉 코드 서명은 Apple의 보안 인프라의 중요한 구성 요소입니다. 이는 소프트웨어 저자(개발자)의 신원을 검증하고 코드가 마지막으로 서명된 이후에 변조되지 않았음을 보장하는 데 사용됩니다.
작동 방식은 다음과 같습니다:
애플리케이션 서명: 개발자가 애플리케이션을 배포할 준비가 되면, 개인 키를 사용하여 애플리케이션에 서명합니다. 이 개인 키는 개발자가 Apple Developer Program에 등록할 때 Apple이 발급하는 인증서와 연결되어 있습니다. 서명 프로세스는 앱의 모든 부분에 대한 암호화 해시를 생성하고 이 해시를 개발자의 개인 키로 암호화하는 과정을 포함합니다.
애플리케이션 배포: 서명된 애플리케이션은 개발자의 인증서와 함께 사용자에게 배포되며, 이 인증서에는 해당 공개 키가 포함되어 있습니다.
애플리케이션 검증: 사용자가 애플리케이션을 다운로드하고 실행하려고 시도할 때, Mac 운영 체제는 개발자의 인증서에서 공개 키를 사용하여 해시를 복호화합니다. 그런 다음 현재 애플리케이션 상태를 기반으로 해시를 재계산하고 이를 복호화된 해시와 비교합니다. 일치하면 애플리케이션이 개발자가 서명한 이후로 수정되지 않았음을 의미하며, 시스템은 애플리케이션 실행을 허용합니다.
애플리케이션 서명은 Apple의 Gatekeeper 기술의 필수적인 부분입니다. 사용자가 인터넷에서 다운로드한 애플리케이션을 열려고 시도할 때, Gatekeeper는 애플리케이션 서명을 검증합니다. Apple이 알려진 개발자에게 발급한 인증서로 서명되었고 코드가 변조되지 않았다면, Gatekeeper는 애플리케이션 실행을 허용합니다. 그렇지 않으면 애플리케이션을 차단하고 사용자에게 경고합니다.
macOS Catalina부터는 Gatekeeper가 애플리케이션이 Apple에 의해 노타리제이션되었는지도 확인하여 추가 보안 계층을 추가합니다. 노타리제이션 프로세스는 애플리케이션에서 알려진 보안 문제와 악성 코드를 검사하며, 이러한 검사가 통과하면 Apple은 Gatekeeper가 검증할 수 있는 티켓을 애플리케이션에 추가합니다.
Check Signatures
일부 악성 샘플을 확인할 때는 항상 서명을 확인해야 하며, 서명한 개발자가 이미 악성 코드와 관련이 있을 수 있습니다.
Notarization
Apple의 노타리제이션 프로세스는 사용자를 잠재적으로 해로운 소프트웨어로부터 보호하기 위한 추가적인 안전장치 역할을 합니다. 이는 개발자가 자신의 애플리케이션을 Apple의 노타리 서비스에 제출하여 검토를 받는 과정을 포함합니다. 이 서비스는 App Review와 혼동해서는 안 됩니다. 이 서비스는 자동화된 시스템으로, 제출된 소프트웨어에 악성 콘텐츠와 코드 서명과 관련된 잠재적인 문제를 검사합니다.
소프트웨어가 우려 사항 없이 이 검사를 통과하면, 노타리 서비스는 노타리제이션 티켓을 생성합니다. 개발자는 이 티켓을 자신의 소프트웨어에 첨부해야 하며, 이를 '스테이플링'이라고 합니다. 또한, 노타리제이션 티켓은 온라인에 게시되어 Gatekeeper, Apple의 보안 기술이 이를 접근할 수 있습니다.
사용자가 소프트웨어를 처음 설치하거나 실행할 때, 노타리제이션 티켓의 존재 - 실행 파일에 스테이플링되었거나 온라인에서 발견된 경우 - Gatekeeper에 소프트웨어가 Apple에 의해 노타리제이션되었음을 알립니다. 결과적으로, Gatekeeper는 초기 실행 대화 상자에 설명 메시지를 표시하여 소프트웨어가 Apple에 의해 악성 콘텐츠 검사를 받았음을 나타냅니다. 이 과정은 사용자가 자신의 시스템에 설치하거나 실행하는 소프트웨어의 보안에 대한 신뢰를 높입니다.
Enumerating GateKeeper
GateKeeper는 신뢰할 수 없는 앱의 실행을 방지하는 여러 보안 구성 요소이자 구성 요소 중 하나입니다.
GateKeeper의 상태를 확인하는 것은 가능합니다:
GateKeeper 서명 검사는 격리 속성이 있는 파일에 대해서만 수행되며, 모든 파일에 대해 수행되지 않습니다.
GateKeeper는 설정 및 서명에 따라 이진 파일이 실행될 수 있는지 확인합니다:
이 구성을 유지하는 데이터베이스는 **/var/db/SystemPolicy
**에 위치합니다. 루트로 이 데이터베이스를 확인할 수 있습니다:
Note how the first rule ended in "App Store" and the second one in "Developer ID" and that in the previous imaged it was enabled to execute apps from the App Store and identified developers. If you modify that setting to App Store, the "Notarized Developer ID" rules will disappear.
There are also thousands of rules of type GKE:
이 해시는 /var/db/SystemPolicyConfiguration/gke.bundle/Contents/Resources/gke.auth
, /var/db/gke.bundle/Contents/Resources/gk.db
및 **/var/db/gkopaque.bundle/Contents/Resources/gkopaque.db
**에서 가져온 것입니다.
또는 이전 정보를 다음과 같이 나열할 수 있습니다:
The options --master-disable
and --global-disable
of spctl
will completely disable these signature checks:
옵션 --master-disable
및 **--global-disable
**는 **spctl
**의 서명 검사를 완전히 비활성화합니다:
완전히 활성화되면 새로운 옵션이 나타납니다:
앱이 GateKeeper에 의해 허용될지 확인할 수 있습니다:
GateKeeper에 특정 앱의 실행을 허용하는 새로운 규칙을 추가하는 것이 가능합니다:
Quarantine Files
응용 프로그램이나 파일을 다운로드할 때, 웹 브라우저나 이메일 클라이언트와 같은 특정 macOS 응용 프로그램은 다운로드된 파일에 일반적으로 "격리 플래그"로 알려진 확장 파일 속성을 첨부합니다. 이 속성은 파일이 신뢰할 수 없는 출처(인터넷)에서 왔음을 표시하는 보안 조치로 작용하며, 잠재적인 위험을 내포할 수 있습니다. 그러나 모든 응용 프로그램이 이 속성을 첨부하는 것은 아니며, 예를 들어 일반적인 BitTorrent 클라이언트 소프트웨어는 보통 이 과정을 우회합니다.
격리 플래그의 존재는 사용자가 파일을 실행하려고 할 때 macOS의 Gatekeeper 보안 기능에 신호를 보냅니다.
격리 플래그가 존재하지 않는 경우(일부 BitTorrent 클라이언트를 통해 다운로드된 파일과 같이), Gatekeeper의 검사가 수행되지 않을 수 있습니다. 따라서 사용자는 덜 안전하거나 알려지지 않은 출처에서 다운로드한 파일을 열 때 주의해야 합니다.
코드 서명의 유효성을 확인하는 것은 코드와 모든 번들 리소스의 암호화된 해시를 생성하는 자원 집약적인 과정입니다. 또한, 인증서 유효성을 확인하는 것은 발급 후 취소되었는지 확인하기 위해 Apple의 서버에 온라인 확인을 수행하는 것을 포함합니다. 이러한 이유로, 앱이 실행될 때마다 전체 코드 서명 및 인증 확인을 실행하는 것은 비현실적입니다.
따라서 이러한 검사는 격리 속성이 있는 앱을 실행할 때만 수행됩니다.
이 속성은 파일을 생성/다운로드하는 응용 프로그램에 의해 설정되어야 합니다.
그러나 샌드박스된 파일은 생성하는 모든 파일에 이 속성이 설정됩니다. 비샌드박스 앱은 스스로 설정할 수 있거나, 시스템이 생성된 파일에 com.apple.quarantine
확장 속성을 설정하도록 Info.plist에서 LSFileQuarantineEnabled 키를 지정할 수 있습니다.
또한, **qtn_proc_apply_to_self
**를 호출하는 프로세스에 의해 생성된 모든 파일은 격리됩니다. 또는 API **qtn_file_apply_to_path
**는 지정된 파일 경로에 격리 속성을 추가합니다.
상태를 확인하고 활성화/비활성화(루트 필요)하는 것이 가능합니다:
You can also find if a file has the quarantine extended attribute with:
확인하십시오 값 확장된 속성 및 다음과 같이 격리 속성을 작성한 앱을 찾으십시오:
실제로 프로세스는 "생성한 파일에 격리 플래그를 설정할 수 있습니다" (생성한 파일에 USER_APPROVED 플래그를 적용하려고 했지만 적용되지 않았습니다):
Last updated