In che modo macOS identifica lo stato della firma di un'app scaricata da Internet?

8

Ho scaricato un'applicazione da Internet utilizzando Safari. Al momento dell'esecuzione, macOS notifica che l'app proviene da uno sviluppatore non identificato.

In che modo macOS è in grado di determinare queste informazioni? Dove sono archiviati i metadati per un'app?

    
posta Novellizator 04.04.2018 - 14:37
fonte

3 risposte

13

Le informazioni sono memorizzate all'interno di attributi estesi, con informazioni aggiuntive potenzialmente incorporate in un'applicazione.

Attributi estesi

Questa informazione di quarantena è memorizzata come attributo esteso . Utilizza lo strumento xattr per visualizzare gli attributi associati a un file o un'applicazione.

L'attributo che causa questo messaggio è com.apple.quarantine .

Vedi Come rimuovo gli "attributi estesi" su un file in Mac OS X? e L'app non può essere aperta perché proviene da uno sviluppatore non identificato per maggiori dettagli.

Firma gatekeeper e codice

L'attributo esteso viene utilizzato da Gatekeeper su macOS ed è discusso in Come impostare (ripristinare) il attributo com.apple.quarantine?

Una firma digitale facoltativa incorporata in un'applicazione viene utilizzata per determinare lo sviluppatore dell'applicazione. Se una firma non viene trovata, macOS presenta l'applicazione come proveniente da uno sviluppatore non identificato.

    
risposta data 04.04.2018 - 14:49
fonte
7

Infatti il messaggio "Sviluppatore non identificato ..." è il risultato di una combinazione di entrambe le attività: verifica l'attributo com.apple.quarantine e le risorse per la firma del codice (in * / Contents / _CodeSignature / CodeResources) mentre lo stato effettivo della firma è determinato esclusivamente da * / CodeResources .

Puoi ottenere l'attributo esteso inserendo:

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

Le informazioni sulla firma del codice sono accessibili inserendo:

$ codesign -dvvv /Applications/*.app

Esempio:

$ 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

La parte più importante è la catena di certificati (e la catena di fiducia):

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

Qui sono visibili tre diverse autorità:

  1. Certificato root: Apple Root CA
  2. Certificato intermedio per sviluppatori Apple: Autorità di certificazione ID dello sviluppatore
  3. Certificato dello sviluppatore: Google, Inc. (EQHXZ8M8AV)

Ciò significa che l'app è firmata con un certificato per sviluppatori, pubblicato e firmato dall'autorità di sviluppo intermedio di Apple, che a sua volta è pubblicato e firmato dalla CA Root di Apple.

Questa catena qualifica Google (o più esattamente: il team / unità Google, Inc. (EQHXZ8M8AV)) come uno sviluppatore identificato da Apple.

Puoi anche codificare le app da te o con un certificato di codesign da un'altra autorità intermedia / root, ma ciò non supererà Gatekeeper.

Ora sono possibili quattro permutazioni assumendo che Gatekeeper sia abilitato (ma non considerando l'autofirmazione / la firma di alieni):

  • Nessun attributo com.apple.quarantine / nessun certificato Apple Developer (Esempio: brew cask installato Apache CouchDB )
  • Nessun attributo com.apple.quarantine / certificato Apple Developer (Esempio: brew cask installato Google Chrome )
  • Un attributo com.apple.quarantine / nessun certificato Apple Developer (Esempio: Apache CouchDB installato scaricando il file zip dal sito web e copiando l'app decompressa in / Applicazioni / )
  • Un attributo com.apple.quarantine / un certificato per sviluppatori Apple (Esempio: Google Chrome installato scaricando il dmg dal sito web e copiando l'app in / Applicazioni / )

Nei primi due casi l'app verrà semplicemente lanciata. Nel terzo caso riceverai il messaggio Unindentified Developer . Puoi risolvere questo rimuovendo l'attributo esteso xattr -d com.apple.quarantine * (= caso 1). Nel quarto caso otterrai "* scaricato da Internet, sei sicuro di volerlo aprire?"

    
risposta data 04.04.2018 - 23:47
fonte
5

How is macOS able to determine this information? Where is the signing metadata for an app stored?

La firma è memorizzata all'interno del binario dell'applicazione stesso, con alcuni dati aggiuntivi nel pacchetto dell'applicazione (nel file Contents/_CodeSignature/CodeResources ).

Puoi ottenere alcune informazioni sulla firma usando l'utilità della riga di comando codesign - per esempio:

# 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
    
risposta data 04.04.2018 - 20:51
fonte

Leggi altre domande sui tag