W jaki sposób macOS identyfikuje status podpisania aplikacji pobranej z Internetu?

8

Pobrałem aplikację z Internetu za pomocą Safari. Po uruchomieniu macOS informuje, że aplikacja pochodzi od niezidentyfikowanego programisty.

W jaki sposób macOS jest w stanie określić te informacje? Gdzie są przechowywane metadane podpisywania aplikacji?

Novellizator
źródło
Jeśli rozumiem twoje pytanie, otrzymujesz ten alert, ponieważ aplikacja pobrana w Safari nie została podpisana przez programistę znanego Apple. Czy pytasz, gdzie znajduje się program xyz na twoim komputerze?
Jake3231,

Odpowiedzi:

13

Informacje są przechowywane w ramach rozszerzonych atrybutów, a dodatkowe informacje mogą być osadzone w aplikacji.

Rozszerzone atrybuty

Informacje o kwarantannie są przechowywane jako atrybut rozszerzony . Użyj tego xattrnarzędzia, aby wyświetlić atrybuty powiązane z plikiem lub aplikacją.

Atrybut powodujący tę wiadomość to com.apple.quarantine.

Zobacz Jak usunąć „atrybuty rozszerzone” z pliku w Mac OS X? i aplikacji nie można otworzyć, ponieważ pochodzi od niezidentyfikowanego programisty, aby uzyskać więcej informacji.

Strażnik i podpisy kodów

Rozszerzony atrybut jest używany przez Gatekeeper na macOS i jest omówiony w Jak ustawić (przywrócić) atrybut com.apple.quarantine?

Opcjonalny podpis cyfrowy osadzony w aplikacji służy do określania dewelopera aplikacji. Jeśli podpis nie zostanie znaleziony, macOS przedstawia aplikację jako niezidentyfikowanego programistę.

Graham Miln
źródło
5
To nie jest całkiem poprawne. Dane kwarantanny służą do śledzenia źródła pobranego pliku, ale podpis znajduje się gdzie indziej.
duskwuff -inactive-
1
@duskwuff jest poprawny. Kwarantanna powoduje wyskakujące okienko „XXX został pobrany z Internetu, czy na pewno chcesz go otworzyć?”
Barmar
1
Nie wszystkie pliki i aplikacje są podpisane kodem. Wiele aplikacji nie ma, więc w takich przypadkach nie ma podpisu wbudowanego. Tak będzie w przypadku wiadomości „niezidentyfikowanego programisty”.
Graham Miln,
7

W rzeczywistości komunikat „Niezidentyfikowany programista ...” jest wynikiem połączenia obu zadań: sprawdzenia atrybutu com.apple.quarantine i zasobów do podpisywania kodu (w * / Contents / _CodeSignature / CodeResources), podczas gdy rzeczywisty status podpisywania to określone wyłącznie przez * / CodeResources .

Rozszerzony atrybut można uzyskać, wprowadzając:

$ xattr -p com.apple.quarantine /Applications/*.app

Informacje o podpisywaniu kodu można uzyskać, wprowadzając:

$ codesign -dvvv /Applications/*.app

Przykład:

$ codesign -dvvvv /Applications/Google\ Chrome.app/
Executable=/Applications/Google Chrome.app/Contents/MacOS/Google Chrome
Identifier=com.google.Chrome
Format=app bundle with Mach-O thin (x86_64)
CodeDirectory v=20200 size=273 flags=0x800(restrict) hashes=3+3 location=embedded
OSPlatform=36
OSSDKVersion=658432
OSVersionMin=657664
Hash type=sha256 size=32
CandidateCDHash sha1=bc8e3dffe7d9d5242e09ea80a220ed365d46fdf2
CandidateCDHash sha256=d7ae6211906bb17d593ce9c215d190a81f37e658
Hash choices=sha1,sha256
Page size=4096
CDHash=d7ae6211906bb17d593ce9c215d190a81f37e658
Signature size=8949
Authority=Developer ID Application: Google, Inc. (EQHXZ8M8AV)
Authority=Developer ID Certification Authority
Authority=Apple Root CA
Timestamp=20. Mar 2018 at 07:23:20
Info.plist entries=36
TeamIdentifier=EQHXZ8M8AV
Sealed Resources version=2 rules=7 files=203
Internal requirements count=1 size=240

Najważniejszą częścią jest łańcuch certyfikatów (i łańcuch zaufania):

Authority=Developer ID Application: Google, Inc. (EQHXZ8M8AV)
Authority=Developer ID Certification Authority
Authority=Apple Root CA

Tutaj widoczne są trzy różne organy:

  1. Certyfikat główny: Apple Root CA
  2. Pośredni certyfikat programisty Apple: Urząd certyfikacji ID dewelopera
  3. Certyfikat programisty: Google, Inc. (EQHXZ8M8AV)

Oznacza to, że aplikacja jest podpisana certyfikatem programisty, opublikowanym i podpisanym przez pośredni urząd programisty Apple, który sam jest opublikowany i podpisany przez główny urząd certyfikacji Apple.

Ten łańcuch kwalifikuje Google (a dokładniej: zespół / jednostkę Google, Inc. (EQHXZ8M8AV)) jako programistę zidentyfikowanego przez Apple.

Możesz także podpisywać aplikacje samodzielnie lub z certyfikatem podpisywania kodu od innego organu pośredniczącego / głównego, ale to nie obejdzie Gatekeeper.

Teraz możliwe są cztery permutacje przy założeniu, że Gatekeeper jest włączony (ale nie rozważa samodzielnego podpisywania / podpisywania obcych):

  • Brak atrybutu com.apple.quarantine / brak certyfikatu Apple Developer (przykład: zainstalowano beczkę piwa Apache CouchDB )
  • Brak atrybutu com.apple.quarantine / certyfikatu Apple Developer (przykład: beczka piwa zainstalowana Google Chrome )
  • Atrybut com.apple.quarantine / brak certyfikatu Apple Developer (przykład: zainstalowany Apache CouchDB, pobierając plik zip ze strony internetowej i kopiując rozpakowaną aplikację do / Applications / )
  • Atrybut com.apple.quarantine / certyfikat Apple Developer (przykład: Google Chrome jest zainstalowany, pobierając dmg ze strony internetowej i kopiując aplikację do / Applications / )

W pierwszych dwóch przypadkach aplikacja zostanie po prostu uruchomiona. W trzecim przypadku otrzymasz wiadomość Unindentified Developer . Możesz rozwiązać ten problem, usuwając atrybut rozszerzony xattr -d com.apple.quarantine *(= przypadek 1). W czwartym przypadku pojawi się komunikat „* został pobrany z Internetu, czy na pewno chcesz go otworzyć?”

klanomath
źródło
5

W jaki sposób macOS jest w stanie określić te informacje? Gdzie są przechowywane metadane podpisywania aplikacji?

Podpis jest przechowywany w samym pliku binarnym aplikacji, z pewnymi dodatkowymi danymi w pakiecie aplikacji (w pliku Contents/_CodeSignature/CodeResources).

Możesz uzyskać pewne informacje na temat podpisu za pomocą narzędzia wiersza polecenia codesign- na przykład:

# codesign -dv /Applications/Preview.app
Executable=/Applications/Preview.app/Contents/MacOS/Preview
Identifier=com.apple.Preview
Format=app bundle with Mach-O thin (x86_64)
CodeDirectory v=20100 size=21314 flags=0x0(none) hashes=659+5 location=embedded
Platform identifier=4
Signature size=4485
Info.plist entries=35
TeamIdentifier=not set
Sealed Resources version=2 rules=13 files=2077
Internal requirements count=1 size=68
Duskwuff -inactive-
źródło