Impedire l’iniezione dell’assemblaggio esterno tramite PublicKeyToken

Sto usando il seguente codice:

AppDomain.CurrentDomain.AssemblyLoad += (sender, args) => { var token = args.LoadedAssembly.GetName().GetPublicKeyToken(); if (!IsValidToken(token)) { Process.GetCurrentProcess().Kill(); } }; 

Dove IsValidToken() confronta il token di chiave pubblica dell’assieme caricato su un elenco di token di chiave pubblica autorizzati codificati nella mia applicazione come matrici di byte.

Questa è una buona misura di sicurezza per prevenire attacchi di iniezione di codice? Inoltre, è necessario in considerazione del fatto che in seguito offuscherò la mia applicazione utilizzando NetReactor? Sto cercando di impedire qualsiasi “ficcanaso” nella mia applicazione, non solo dallo strumento Snoop, ma anche da qualsiasi fonte esterna indesiderata.

Solo a prima vista, dirò “no, questo non sarà abbastanza”.

Motivi:

  • CreateRemoteThread attacchi CreateRemoteThread sono chiamate dirette Win32, senza tracce di codice gestito che farebbero scattare un rivelatore come questo

  • Penso che sarebbe ansible creare un altro AppDomain nella DLL iniettata, ignorando così completamente questo controllo. Quindi è ansible eseguire codice da AppDomain , potenzialmente (dovrei pensarlo attraverso) richiamando l’ AppDomain “principale” tramite AppDomain.DoCallback

  • Process.Kill è un modo orribile per rilasciare la tua applicazione, anche se è un modo non intercettabile di farlo – cioè, chiunque sia attaccato non sarebbe in grado di impedirlo (usa Win32 TerminateProcess sotto il cofano)

Dovrei sbarazzarmi della mia imbracatura “Injecterator” per testare queste affermazioni, anche se posso ricordare dove diavolo ho messo quel codice …

Indipendentemente da qualcuno di questi, vorrete assolutamente hide l’inferno di questo assembly, specialmente se intendete archiviare dei bit sensibili all’interno (in effetti, direi di non memorizzare QUALSIASI informazione sensibile all’interno di un assembly se potete aiutarlo) – il tuo metodo di prevenzione NON fermerà assolutamente nessun disassemblatore come Reflector, ILSpy, dotPeek, ecc.

Sarebbe anche più sicuro se si generassero i tasti completi in fase di runtime (forse da più chiavi parziali). Questo funziona aggirando staticamente il tuo binario per le chiavi.