Quando si collega a OpenSSL (o altre librerie crittografiche) sarebbe più sicuro usare una libreria condivisa e avere la randomizzazione del layout di spazio degli indirizzi, o usare una libreria statica e non avere ASLR?
Quando si collega a OpenSSL (o altre librerie crittografiche) sarebbe più sicuro usare una libreria condivisa e avere la randomizzazione del layout di spazio degli indirizzi, o usare una libreria statica e non avere ASLR?
ASLR e cose del genere sono modi per provare a far fronte alle conseguenze di un overflow del buffer: sono un gioco di ricerca e nascondigli in modo che gli aggressori trovino più difficile trasformare un buffer overflow nell'esecuzione di codice in modalità remota. Per sicurezza adeguata, è meglio farlo in modo che i buffer overflow non si verifichino in primo luogo.
... e per questo, il collegamento dinamico è migliore. Il motivo è il seguente: sarebbe eccessivamente ottimistico credere che ogni dato pezzo di codice scritto in C non abbia alcun buffer overflow (specialmente OpenSSL, che ha una storia piuttosto lunga su quell'argomento). Quindi, il meglio che puoi fare è essere in grado di prontamente correggere i buchi di sicurezza noti sostituendo la parte difettosa. Se si utilizza il collegamento dinamico, questo è semplice: basta sostituire la DLL e farla. Se la DLL è fornita dal sistema operativo (il caso normale nei sistemi Linux), ciò avverrà naturalmente quando si applicano gli aggiornamenti di sicurezza dal fornitore del sistema operativo. Tuttavia, se si utilizza il collegamento statico, le patch non entreranno nell'applicazione finché non ricompilare (o ricollegare almeno) quella specifica applicazione con OpenSSL con patch.
In pratica, il collegamento statico significa che le correzioni di sicurezza nella libreria richiederanno più tempo per essere applicate all'applicazione o, molto spesso, non verranno applicate affatto. Questo non va bene. Pertanto, utilizza il collegamento dinamico .
Sono in ritardo per la festa, ma volevo solo dare alcune opinioni nel caso in cui passasse qualcun altro. La risposta accettata è accurata in quanto il collegamento statico rende più difficile effettuare un aggiornamento sul posto. Ad esempio, se stai usando OpenSSL con la tua app, puoi semplicemente distribuire il nuovo libcrypto.dll (supponendo che sia retrocompatibile con la tua app) sulla vecchia DLL, e starai bene.
Tuttavia, per quanto riguarda gli exploit e altre cose sgradevoli, direi che il collegamento statico è un po 'più sicuro. Fondamentalmente, non ci sono DLL esterne alla tua applicazione che possono essere scambiate con una versione contaminata della stessa DLL o anche uno shim (proxy DLL e simili ...)
Inoltre, questo non è un argomento contro nessuno, ma se la tua libreria esterna ha un exploit né statico né dinamico sarà più sicuro poiché viene sfruttato in fase di esecuzione quando è già collegato alla tua applicazione.
Sono d'accordo con i loro consigli su come semplificare la corrispondenza con le attuali versioni di OpenSSL e per la maggior parte suggerirei collegamenti dinamici, ma tu conosci meglio la tua applicazione, e dal momento che la domanda originale chiedeva quale è più sicuro (se installato su una scatola, Presumo), dovresti anche pensare alla manomissione.