Considerazioni sulla sicurezza degli assembly
Quando si compila un assembly, è possibile specificare un set di autorizzazioni necessarie per consentirne l'esecuzione. Se sussistano o meno le autorizzazioni per l'utilizzo di un assembly lo si evince dalle evidenze.
Le evidenze vengono utilizzate in due modi diversi:
L'evidenza di input viene unita all'evidenza acquisita durante il caricamento per creare un set di evidenze finale utilizzato per la risoluzione dei criteri. I metodi in cui viene usata tale semantica sono Assembly.Load, Assembly.LoadFrom e Activator.CreateInstance.
L'evidenza di input viene utilizzata non modificata come set di evidenze finale per la risoluzione dei criteri. I metodi in cui viene usata tale semantica sono Assembly.Load(byte[]) e AppDomain.DefineDynamicAssembly().
Autorizzazioni facoltative possono essere concesse dai criteri di sicurezza impostati per il computer che eseguirà l'assembly. Se si desidera che il proprio codice gestisca tutte le possibili eccezioni di sicurezza, si può procedere in uno dei modi seguenti:
Inserire una richiesta per tutte le autorizzazioni di cui il codice deve disporre e gestire gli errori che si verificheranno in fase di caricamento nel caso in cui le autorizzazioni non venissero riconosciute.
Non prevedere una richiesta per le autorizzazioni eventualmente necessarie, ma limitarsi a predisporre la gestione delle eccezioni di sicurezza che si verificheranno in mancanza di tali autorizzazioni.
Nota
Quello della sicurezza è un tema complesso in cui è possibile scegliere tra molte possibili opzioni. Per altre informazioni, vedere Concetti principali sulla sicurezza.
In fase di caricamento, l'evidenza dell'assembly viene utilizzata come input per i criteri di sicurezza. I criteri di sicurezza vengono stabiliti dall'azienda e dall'amministratore dei computer, così come dalle impostazioni adottate dallo stesso utente, e determinano l'insieme di autorizzazioni concesse a tutto il codice gestito che viene eseguito sul computer. È possibile stabilire criteri di sicurezza basati sull'autore dell'assembly (se questo ha una firma generata da uno strumento firma digitale), sul sito Web e la zona (concetto di Internet Explorer) da cui è stato effettuato il download dell'assembly o sul nome sicuro dell'assembly. L'amministratore di un computer può ad esempio stabilire criteri di sicurezza che consentono a tutto il codice scaricato da un sito Web e firmato da una determinata azienda di software di accedere al database presente su un computer, ma non di scrivere sul disco rigido.
Assembly con nome sicuro e strumenti di firma
Avviso
Non usare i nomi sicuri per la sicurezza, poiché forniscono solo un'identità univoca.
È possibile firmare un assembly in due modi diversi ma complementari: con un nome sicuro o tramite SignTool.exe (strumento per la firma). La firma di un assembly con un nome sicuro comporta l'aggiunta della crittografia con chiave pubblica al file che contiene il manifesto dell'assembly. La firma con nome sicuro garantisce l'univocità del nome, ne impedisce l'utilizzo fraudolento e fornisce un'identità al chiamante quando un riferimento viene risolto.
I nomi sicuri non garantiscono alcun livello di attendibilità. A ciò provvede infatti SignTool.exe (strumento per la firma). I due strumenti firma digitale impongono all'autore di provare la propria identità a un'autorità terza per ottenere un certificato. Il certificato viene poi incorporato nel file e può essere utilizzato da un amministratore per decidere se considerare attendibile l'autenticità del codice.
È possibile associare a un assembly il solo nome sicuro, la sola firma digitale creata tramite SignTool.exe (strumento per la firma) o entrambi. Con i due strumenti firma digitale è possibile firmare un solo file alla volta. Nel caso di assembly su più file, si firmerà solo il file che contiene il manifesto dell'assembly. Il nome sicuro viene memorizzato nel file che contiene il manifesto dell'assembly, mentre la firma creata tramite SignTool.exe (strumento per la firma) viene memorizzata in un'area riservata del file eseguibile portabile (PE, Portable Executable) che contiene il manifesto dell'assembly. La firma di un assembly realizzata tramite SignTool.exe (strumento per la firma) può essere adottata (con o senza un nome sicuro) quando si ha già una gerarchia attendibile basata su firme generate tramite SignTool.exe (strumento per la firma) o quando i propri criteri si avvalgono solo della chiave e non controllano la catena di attendibilità.
Nota
Quando a un assembly si assegna sia un nome sicuro che una firma digitale, il nome sicuro deve essere assegnato per primo.
Common Language Runtime esegue anche una verifica hash. Il manifesto dell'assembly contiene infatti un elenco di tutti i file che compongono l'assembly, comprensivo dell'hash generato per ciascun file al momento della compilazione del manifesto. Quando si carica un file, viene calcolato il codice hash del relativo contenuto e viene eseguito un confronto con il valore hash archiviato nel manifesto. Se i due hash non corrispondono, l'assembly non viene caricato.
I nomi sicuri e le firme create attraverso SignTool.exe (strumento per la firma) garantiscono l'integrità tramite firme digitali e certificati. Tutte le tecnologie menzionate, ovvero verifica hash, denominazioni sicure e firme create mediante SignTool.exe (strumento per la firma), contribuiscono a garantire che l'assembly non sia stato alterato in alcun modo.