[¿Hace] que compilar su propio binario para una aplicación (con indicadores de compilación específicos) en lugar de usar el "binario principal" hace que sea más difícil para un atacante aprovechar los desbordamientos de búfer?
Depende del sistema operativo, el idioma en el que está escrita la aplicación y el compilador.
Primero, el lenguaje de programación debe ser un lenguaje compilado: C, C ++, C #, Java, Objective-C, Delphi, etc. Los lenguajes interpretados (JavaScript, PHP, Ruby, etc.) se ejecutan desde la fuente (no compilados) Para modificar el comportamiento de la memoria, debe cambiar la configuración del intérprete o la fuente. Obviamente, no hay compilación, no hay protección.
Segundo, el lenguaje de programación debe permitir la gestión manual de la memoria. Java y C # utilizan la administración automática de memoria, lo que evita la vulnerabilidad básica de desbordamiento de búfer. C y C ++ permiten la gestión manual de memoria dinámica. Si el lenguaje de programación tiene memoria administrada, la compilación no ayudará.
En tercer lugar, el compilador o las bibliotecas utilizadas en la aplicación deben admitir cierto control o supervisión de la gestión dinámica de la memoria extendida. Los compiladores Microsoft C ++, Intel C ++, GNU C ++, LLVM Clang C ++ son compatibles con -fstack-protector, IBM XL C ++ admite -qstackprotect. Algunas bibliotecas como LibSafe de Avaya Labs, también tienen mecanismos para proteger la pila. Si el compilador no admite la protección de la pila y no hay bibliotecas de protección de la pila disponibles, la compilación no ayudará.
Cuarto, el sistema operativo puede proporcionar cierta protección. Algunos sistemas operativos ya protegen la pila con bits exeables, punteros de base de pila y guardando direcciones de retorno en los registros. Si el sistema operativo ya está protegiendo la pila, la compilación no ayudará.
¿Es mucho menos eficiente que la distribución aleatoria del espacio de direcciones?
La asignación aleatoria de espacio de direcciones es una técnica que evita que un atacante utilice una dirección conocida para llamar a una función del sistema. Por ejemplo, si setuid () está siempre en la dirección 0xDEADBEEF, el atacante puede intentar sobrescribir una dirección de retorno con 0xDEADBEEF y ejecutar setuid. La aleatorización no evita los desbordamientos del búfer, solo evita el uso de valores de dirección estática.
¿Este punto se vuelve discutible por las nuevas estrategias de administración de memoria en los núcleos del sistema operativo?
No necesariamente. Depende del sistema operativo. Algunos sistemas operativos están más centrados en el rendimiento que en la seguridad. Esos sistemas operativos pueden introducir más vulnerabilidades con los trucos de administración de memoria.