Las protecciones de Carnary se basan en que el compilador agregue un código antes y después de cada cuerpo de la función, y posiblemente el recurso de las variables locales de la función, por lo que esto no es posible para el elemento 1.
En cuanto al elemento 2, lo único que viene a la mente es ejecutar el ejecutable en Valgrind para su análisis. No querrás hacer eso en producción, ya que es lento. Además, algunas incorporaciones de GCC se comportan mal bajo Valgrind (por ejemplo, la incorporada strlen
puede leer hasta 3 bytes (en i386) más allá del final de un búfer asignado), por lo que emitirá falsos positivos.
Diría que su único es recompilar la aplicación con el SSP habilitado (también, GCC envía libssp que contiene funciones para hacer el elemento 2). Muchas otras bibliotecas de C ya contienen código de soporte de SSP (en realidad no es mucho), por lo que no usar el libc de GNU no es un problema.
Algunos compiladores de C también contienen comprobaciones de límites, comprobaciones de desbordamiento de búfer, comprobaciones de desbordamiento de pila, etc. en varios estados de usabilidad.
También deberías ver tu implementación malloc
. Algunas implementaciones, sobre todo omalloc de OpenBSD, ofrecen reservar "páginas de guarda" antes y después de las asignaciones de tamaño de página, y mover asignaciones más pequeñas al principio o al final de una página, para capturar accesos más allá del búfer.