Non sempre possimo utilizzare l'ultima novità anzi.. i compotenti COM, Win32 DLL sono ancora molto diffusi, pensiamo solo al se si tratta di continuare a migliore prodotti di livello enterprise, in questi casi non sempre si può ripartire da zero.
Quali sono i problemi di sicurezza in questi casi?
- la CAS in questo caso non ci aiuta, il codice unmanaged ad essa sfugge
- nel codice che andiamo ad utilizzare effettivamente può esserci scritto di tutto e tanto per fare un esempio possiamo anche incorrere nel buffer overruns (detto anche buffer overflow)
- sono unsigned, quindi facilmente rimpiazzabili con cose non proprio buone e giuste
Le regole principali da seguire in questi casi sono:
- validare l'input e l'output che viene passato o ottenuto da una libreria unmanaged
- verificare che il "chiamato" sia integro, ad esempio calcolando l'hash e verificandolo col precedente ad ogni chiamata
- nel caso di DLL specificar il path assoluto e non relativo utilizzando DLLImport Attibute, che tra le altre cose si occupa di:
•LoadLibrary (carica la dll in memoria) – Free (scarica la dll)
•GetProcAddress (ottiene un puntatore alla funzione richiesta)
•Marshalling (mapping e passaggio parametri)
Però se utilizziamo il path assoluto dobbiamo ricordarci che ci potrebbero essere problemi relativamente l'hash con nuovi update del compotente
Quindi invece di:
using System.Runtime.InteropServices;
[DllImport("user32.dll")]
Abbiamo:
using System.Runtime.InteropServices;
[DllImport(@"C:\windods\system32\user32.dll");
E su tutto ricordasi.. per far funzionare la nostra applicazione l'utilizzatore non deve necessariamante avere i privilegi dell'amministratore... ovvero ricordarsi della regola dei privilegi minimi !