Ho ragione di pensare che se io in codice firmare un exe che fa riferimento a un paio di DLL (non forti di nome) che un utente malintenzionato potrebbe sostituire il mio DLL e distribuire l'applicazione in un modo che appare come se è firmato da me, ma sta eseguendo il loro codice?
Sì se il resto delle DLL sono solo firmato e non un nome sicuro che può essere sostituito senza .NET sollevare un'eccezione. È possibile, all'interno dell'exe, verificare che le DLL siano firmate dalla stessa chiave dell'exe. Nessuno di questi approcci impedisce a qualcuno di sostituire le DLL o l'EXE.
Supponendo che sia vero, sembra che non si vuole veramente firmare un'applicazione .NET senza una forte-nominare il tutto, altrimenti si sta dando alle persone la possibilità di eseguire codice con il pretesto di un'app che hai scritto?
generale suppongo che è la 'best practice', ma ancora una volta non hanno impedito nulla. Una volta che un utente ha i diritti per modificare i file sul sistema locale, non c'è molto che puoi fare per impedirgli di svolgere attività dannose.
Esistono diverse tecnologie di offuscamento che creano progetti .NET completi in un unico exe, questo potrebbe rendere l'approccio "più sicuro" ma ancora in grado di manometterlo.
La vera domanda è cosa stai cercando di impedire loro di fare? Voglio dire, perché qualcuno dovrebbe essere interessato a sostituire la tua DLL? Cosa speravano di ottenere, qual è il loro obiettivo? Se stai cercando di impedire a qualcuno di leggere informazioni sensibili dal processo in cui ti trovi per una lunga e dura strada di delusione. Supponete che una parte malintenzionata abbia accesso completo al vostro codice sorgente e ogni informazione utilizzata dal vostro processo, perché lo fanno. Supponiamo che possano sostituire tutto o parte del codice a volontà, perché possono farlo.
Updated reindirizzamento
Così vincolante funziona solo con assembly con nome con la stessa chiave, e quindi non vi protegga da DLL di essere cambiato?
corretta, con l'eccezione ha osservato che l'iniezione di codice può ancora essere fatto in molti modi.
... e tornando alla domanda originale, fa la firma del codice senza una forte denominazione po minare il punto di firma del codice?
Non proprio. La firma del codice (non denominazione forte) ha due scopi distinti:
- Autenticazione. Verifica chi è l'autore del software.
- Integrità. Verifica che il software non sia stato manomesso dal momento della firma.
Spesso questo è solo autenticato e convalidato durante l'installazione. Questo è il motivo per cui firmiamo il nostro setup.exe, per garantire che il cliente abbia ricevuto da noi il programma di installazione non modificato. Viene richiesto con "Ti fidi di XXXX Company" e concedi quindi l'autorizzazione al programma di installazione autenticato/firmato. Una volta installato, tuttavia, vi è un piccolo uso incorporato della firma del codice da parte del sistema operativo (eccetto per i driver e alcuni altri casi oscuri).
Strong Naming sull'altro aveva uno scopo completamente diverso per la sua esistenza. È interamente focalizzato sull '"integrità" dell'applicazione. Non esiste alcun certificato, nessuna autorità di firma (CA) per verificarlo, nessuna informazione visualizzata dall'utente da confermare e nulla che il sistema operativo possa verificare sull'eseguibile che verrà eseguito.
Il framework .NET utilizza nomi sicuri per molte cose, tutti loro ho vagamente categorizzare come l'integrità delle applicazioni:
- Il contenuto del dll/exe ha un hash firmato in modo che non può essere manomesso.
- Ogni riferimento deve essere un nome sicuro e verificato quando si carica la dipendenza.
- Gli assembly possono essere registrati nel GAC e le politiche del publisher possono essere utilizzate.
- Le immagini native possono essere inventate per produrre un'immagine IL dell'assemblaggio.
Sono sicuro che ci sono altre cose che mi mancano qui, ma questi sono gli usi primari di cui sono a conoscenza.
Le migliori pratiche per la firma e Forte di denominazione
- Utilizzare un installatore firmato
- utilizzare un codice-firmato eseguibile
- Utilizzare una con nome eseguibile
- nome sicuro tutte le dipendenze e riferimenti ad essi
- Generalmente le dipendenze per la firma del codice non sono richieste *
- consideri GAC registrazione assemblee al momento dell'installazione
* Nota: La firma del codice può essere utile in alcuni casi per una DLL, per esempio oggetti COM classificati come 'sicuri' e incorporati in un browser dovrebbe essere firmato e con nome sicuro come se fosse un eseguibile. La firma del codice può essere utile anche per verificare esternamente le dipendenze senza caricare l'assembly o riflettere gli attributi.
Non ho un esempio che sto cercando di proteggere, sto solo cercando di comprendere appieno codice/SN :-) Suggerisci che SN può essere bypassato con i collegamenti di reindirizzamento ... Non è una specie di sconfitta il punto di SN interamente? –
Si è corretto, il reindirizzamento vincolante non può modificare la chiave di firma. Mi limito a controllare i fatti dopo che ho postato, ma mi sono distratto. –
Il reindirizzamento vincolante funzionerà solo con gli assembly con nome sicuro con la stessa chiave e pertanto * si * protegge dalle DLL che vengono modificate? (e tornando alla domanda originale, la firma del codice senza il nome con caratteri forti indebolisce il punto di firma del codice?) –