임시 코드 서명의 제한 사항은 무엇입니까? ID를 전혀 사용하지 않으며 정확히 하나의 코드

를 사용하여 코드 또는 앱에 “ad-hoc”을 서명 할 수 있습니다 codesign. 매뉴얼 페이지는 애드혹 코드 서명에 대해 다음을 알려줍니다.

신원이 단일 문자 “-“(대시)이면 임시 서명이 수행됩니다. 임시 서명은 ID를 전혀 사용하지 않으며 정확히 하나의 코드 인스턴스를 식별합니다. 임시 서명 된 코드 사용에는 상당한 제한이 적용됩니다. 사용하기 전에 설명서를 참조하십시오.

(나에 의해 추가 된 empasis)

더 알고 싶었고 해당 문서를 찾으려고했지만 세부 사항을 찾을 수 없었습니다. “macOS Code Signing In Depth”라는 기술 노트를 찾았 지만 임시 서명은 전혀 언급하지 않았습니다.

이러한 “중요한 제한”은 무엇이며 어디에 기록되어 있습니까?



답변

이 문맥에서 기본적으로 임시 서명은 바이너리가 암호화 증명없이 서명된다는 것을 의미합니다.

본질적으로 바이너리는 일반적으로 CodeDirectory의 해시가 서명 ID로 서명 된 메시지 인 CMS (암호화 메시지)를 추가하여 서명됩니다. 이는 외부인이 해당 ID의 개인 키를 보유한 사람이 실제로 코드에 서명했는지 확인할 수 있음을 의미합니다.

프로그램을 실행할 때 macOS 시스템은 이러한 서명이 유효한지, 서명 ID를 신뢰하는지 확인하고 서명 된 경우 프로그램을 실행합니다. 이것이 GateKeeper 기능의 기본입니다.

임시 서명 된 바이너리는 CMS가 없기 때문에 크게 다릅니다. 그 대신, 유효성에 대한 암호 증명없이 검증 할 인증서 / ID 경로없이 CodeDirectory의 SHA-1 해시 값을 보유합니다.

CodeDirectory는 응용 프로그램이 만들어진 다양한 코드 조각에 대한 해시 값을 사용하여 특정 정적 코드 인스턴스를 설명하는 개체입니다. 암호화 서명을 확인하여 CodeDirectory가 변경되지 않도록하고 응용 프로그램의 다양한 코드 비트가 디렉토리에 저장된 해시 값과 일치하는지 확인하여 코드가 변경되지 않았 음을 확인할 수 있습니다.

암호 증명이 없으면이 “비 암호화”검사를 일반적인 방식으로 수행 할 수 없습니다.

대신 임시 서명 된 바이너리는 SHA-1 해시 값을 커널 내부의 정적 신뢰 캐시에 저장된 “알려진 양호한”해시 값 목록과 비교하여 확인됩니다.

본질적으로 이것은 사용자가 직접 서명 한 응용 프로그램에 적용되는 “중요한 제한 사항”이 어떤 종류의 확인도 통과하지 못한다는 것을 의미합니다. 기본적으로 서명되지 않은 이진과 동일합니다.

그러나 Apple 인 경우 일반적인 방식으로 공동 설계되지 않고 커널에서 명시 적으로 신뢰하는 응용 프로그램을 만들 수 있습니다. 예를 들어, Apple은 전체 서명 신원 확인이 작동하지 않거나 실행되지 않는 (또는 사용할 수없는) 시스템 시작 초기 단계에서 실행될 때 응용 프로그램이 변경되지 않도록하려면 임시 서명을 사용할 수 있습니다. 이러한 응용 프로그램은 인증서 리포지토리가 호스로 연결되어 있는지 여부에 관계없이 항상 정적 신뢰 캐시로 확인할 수 있습니다.

실제로 임시 서명 된 바이너리를 생성하는 것은 Apple 개발자에게 실질적인 가치 일뿐입니다.

Apple 개발자 섹션에서 임시 서명에 대한 사소한 문서를 찾을 수 있습니다. 예를 들면 다음과 같습니다.

https://developer.apple.com/documentation/security/seccodesignatureflags/kseccodesignatureadhoc

그러나 codesign 유틸리티 자체의 소스 코드와 libsecurity의 소스 코드에서 문서 스 니펫을 찾을 수도 있습니다.