No importa en qué kernel compile un exploit.
Las fallas se debieron a que el kernel proporcionaba protecciones contra los métodos de explotación que utilizaste. Estas protecciones se realizan en tiempo de ejecución. El kernel no inserta de alguna manera el código para paralizar los exploits compilados debajo de él. La solución sería ejecutar el exploit en un kernel con estas características de seguridad eliminadas o inhabilitadas, no compilar en dicho kernel. No es necesario que tenga ASLR en ejecución (ni que sea compatible con su núcleo) para compilar un ejecutable independiente de la posición, por ejemplo.
El kernel en ejecución no cambia la salida del compilador de una manera que pueda romper un exploit. Lo único que importa es que lo está compilando con las mismas características (, al menos compatibles) del compilador, las bibliotecas (si están vinculadas estáticamente) y las optimizaciones. Si este es el caso, se puede compilar en cualquier lugar. Incluso podría compilar un exploit para una aplicación de Linux en Windows u OpenBSD, y viceversa.
Algunas cosas que debería tener en cuenta con respecto al entorno de su cadena de herramientas:
- La compilación en un sistema con
-march=native
puede resultar en un ejecutable que no funciona correctamente o que no funciona en otro sistema. Evite las optimizaciones específicas del hardware.
- El uso de características de, digamos, GCC 7.2.0 puede causar roturas si se compila en una máquina que solo tiene 6.4.0. Lo mismo se aplica a las regresiones que pueden romper una vulnerabilidad en un compilador más nuevo.
- Si su destino tiene archivos de encabezado que son incompatibles con un exploit operativo por cualquier motivo, deberá incluir los archivos de encabezado correctos o compilarlos en un sistema que los tenga.
- Los sistemas de compilación de algunas bibliotecas comprueban la versión del kernel en ejecución, y usan esto para decidir qué características incluir. Tenga en cuenta esto si también está compilando bibliotecas en este sistema.