[Does] compiling your own binary for an application (with specific compilation flags) instead of using the "mainstream binary" make it more difficult for an attacker to leverage buffer overflows?
Dipende dal sistema operativo, dalla lingua in cui è scritta l'applicazione e dal compilatore.
In primo luogo, il linguaggio di programmazione deve essere un linguaggio compilato: C, C ++, C #, Java, Objective-C, Delphi, ecc. I linguaggi interpretati (JavaScript, PHP, Ruby, ecc.) vengono eseguiti dal sorgente (non compilato) , quindi per modificare il comportamento della memoria è necessario modificare le impostazioni dell'interprete o la fonte. Ovviamente, nessuna compilazione, nessuna protezione.
Secondo il linguaggio di programmazione deve consentire la gestione manuale della memoria. Java e C # utilizzano la gestione automatica della memoria, evitando la vulnerabilità di base dell'overflow del buffer. C e C ++ consentono la gestione manuale della memoria dinamica. Se il linguaggio di programmazione ha gestito la memoria, la compilazione non sarà di aiuto.
In terzo luogo, il compilatore o le librerie utilizzate nell'applicazione devono supportare un controllo o un controllo esteso della gestione della memoria dinamica. I compilatori Microsoft C ++, Intel C ++, GNU C ++, LLVM Clang C ++ supportano tutti -fstack-protector, IBM XL C ++ supporta -qstackprotect. Alcune librerie come LibSafe di Avaya Labs hanno anche meccanismi per proteggere lo stack. Se il compilatore non supporta la protezione dello stack e non sono disponibili librerie di protezione dello stack, la compilazione non sarà di aiuto.
In quarto luogo, il sistema operativo potrebbe fornire una certa protezione. Alcuni sistemi operativi già proteggono lo stack da bit eseguibili, impilano i puntatori di base e salvano gli indirizzi di ritorno nei registri. Se il sistema operativo sta già proteggendo lo stack, la compilazione non sarà di aiuto.
Is it way less efficient than Address space layout randomization ?
La randomizzazione dello spazio degli indirizzi è una tecnica che impedisce a un utente malintenzionato di utilizzare un indirizzo ben noto per chiamare una funzione di sistema. Ad esempio, se setuid () è sempre all'indirizzo 0xDEADBEEF, l'utente malintenzionato può tentare di sovrascrivere un indirizzo di ritorno con 0xDEADBEEF ed eseguire setuid. La randomizzazione non impedisce il buffer overflow, ma impedisce solo l'uso di valori di indirizzo statici.
Is this point rendered moot by new memory management strategies in OS kernels?
Non necessariamente. Dipende dal sistema operativo. Alcuni sistemi operativi sono più focalizzati sulle prestazioni rispetto alla sicurezza. Questi sistemi operativi possono effettivamente introdurre più vulnerabilità con trucchi di gestione della memoria.