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


8

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

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


Se capisco la tua domanda, ricevi questo avviso perché un'applicazione scaricata in Safari non è stata firmata da uno sviluppatore noto ad Apple. Stai chiedendo dove si trova il programma xyz sul tuo computer?
Jake3231

Risposte:


13

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

Attributi estesi

Queste informazioni di quarantena vengono archiviate come attributo esteso . Utilizzare lo xattrstrumento 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.

Gatekeeper e firme di codice

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

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


5
Questo non è del tutto corretto. I dati di quarantena vengono utilizzati per tenere traccia dell'origine di un file scaricato, ma la firma è altrove.
duskwuff -inattivo-

1
@duskwuff è corretto. La quarantena provoca il popup "XXX è stato scaricato da Internet, sei sicuro di volerlo aprire?"
Barmar

1
Non tutti i file e le applicazioni sono firmati con codice. Molte applicazioni non lo sono, quindi in quei casi non esiste una firma incorporata. Questo sarà il caso dei messaggi "sviluppatore non identificato".
Graham Miln,

7

In effetti il ​​messaggio "Sviluppatore non identificato ..." è il risultato di una combinazione di entrambe le attività: controllo dell'attributo com.apple.quarantine e delle risorse di firma del codice (in * / Contents / _CodeSignature / CodeResources) mentre lo stato di firma effettivo è determinato esclusivamente da * / CodeResources .

È possibile ottenere l'attributo esteso inserendo:

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

È possibile accedere alle informazioni sulla firma del codice 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 radice: CA radice Apple
  2. Certificato di sviluppatore Apple intermedio: Autorità di certificazione ID sviluppatore
  3. Certificato dello sviluppatore: Google, Inc. (EQHXZ8M8AV)

Ciò significa che l'app è firmata con un certificato dello sviluppatore, pubblicato e firmato dall'autorità di sviluppo intermedia di Apple, che a sua volta è pubblicata e firmata dalla CA principale di Apple.

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

Puoi anche firmare in codice le app da solo o con un certificato di firma del codice di un'altra autorità intermedia / root, ma questo non supererà Gatekeeper.

Ora sono possibili quattro permutazioni supponendo che Gatekeeper sia abilitato (ma senza considerare l'auto-firma / la firma aliena):

  • Nessun attributo com.apple.quarantine / nessun certificato Apple Developer (Esempio: brew cask installato Apache CouchDB )
  • Nessun attributo com.apple.quarantine / un certificato per sviluppatori Apple (esempio: brew cask installato Google Chrome )
  • Un attributo com.apple.quarantine / nessun certificato Apple Developer (Esempio: Apache CouchDB installato scaricando lo 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 all'interno in / Applicazioni / )

Nei primi due casi l'app si avvierà semplicemente. Nel terzo caso riceverai il messaggio Sviluppatore non identificato . È possibile risolvere questo problema rimuovendo l'attributo esteso xattr -d com.apple.quarantine *(= caso 1). Nel quarto caso otterrai "* è stato scaricato da Internet, sei sicuro di volerlo aprire?"


5

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

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

È possibile ottenere alcune informazioni sulla firma utilizzando l'utilità della riga di comando, codesignad 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.