Determinismo desde dentro de los programas
Aunque todas las operaciones deterministas en datos conocidos producen resultados deterministas, el diseño de la memoria no debe considerarse como determinista para nadie más que para los desarrolladores de kernel. Aunque el diseño es determinista en el sentido matemático 1 , la naturaleza cambiante y diversificada de la industria del software hace que la visión de una aplicación de las estructuras del sistema sea efectivamente estocástica.
Funciones de seguridad portátiles
Ni el código portátil ni el confiable pueden basarse en suposiciones sobre la memoria fuera de los modelos de programación estandarizados provistos. Los encabezados de memoria estática, asignados dinámicamente o asignados pueden cambiar, y el compilador puede cambiar en sincronización para que un programa que cumpla con los estándares se ejecute sin problemas, pero que explote el conocimiento especial del sistema operativo pueda romperse y crear más riesgos de seguridad de los que pretende eliminar. .
Un programa no puede depender de la consistencia de las estructuras del kernel a lo largo del tiempo. Las arquitecturas de la CPU, sus conjuntos de instrucciones, los modelos de ejecución, el manejo de la pila y la mecánica de Malloc y Free pueden cambiar en cualquier momento. Esta es la razón para POSIX y otros estándares. Solo las fachadas proporcionadas a través de las llamadas de sistemas estandarizados pueden (generalmente) ser confiables para exhibir un comportamiento predecible.
Evitar las explotaciones de variables de entorno
Uno puede, si lo desea, recorrer las variables de entorno, copiar los valores necesarios y luego escribir ceros en el rango exacto que ocupa cada uno. Pero esa no es la mejor estrategia.
Práctica de fuente y sistema generalmente útil
La fruta de baja pendiente que ha sido utilizada por muchos equipos de seguridad es bloquear la ejecución de todo el software ejecutable de todos los usuarios, excepto las combinaciones de software de usuario que tienen sentido. Aquellos que están permitidos se analizan para detectar posibles agujeros de seguridad y se aplican los parches apropiados para minimizarlos.
La protección adecuada específica de la explotación contra el desbordamiento y el desbordamiento del búfer es una validación cuidadosa del índice del búfer en lenguajes como C o el uso adecuado de objetos diseñados para evitar estas manipulaciones de modelos de memoria explotables.
Métodos de inyección de entropía
La aleatorización del diseño del espacio de direcciones (ASLR) es una característica del sistema operativo que proporciona resistencia adicional al ataque. Usted no agrega ASLR a su programa. Cada sistema operativo que proporciona el modelo tiene un mecanismo en el que se pueden ejecutar programas específicos sin proporcionar una sugerencia a través de la inspección del proceso desde donde se cargan en la CPU los bytes de instrucciones ejecutables.
El ejecutable independiente de la posición (PIE) es un mecanismo que admite la aleatorización al garantizar que todas las direcciones en el ejecutable sean relativas o se comporten (en grupos de instrucciones) como si lo fueran.
Necesitará ver cómo se puede agregar la entropía al posicionamiento del modelo de memoria en su sistema operativo de destino en particular. Puede haber restricciones asociadas en su código, compilación o marcas de enlace para usar, y la ejecución del contenedor que realiza la aleatorización necesaria. Puede haber un impacto en la velocidad y los recursos, por lo que es posible que desee identificar sus niveles de riesgo ejecutables y ser selectivo.
¿Cómo funcionan? La introducción de la entropía en la determinación de la ubicación de la memoria hace que sea difícil para los atacantes adivinar dónde residen las instrucciones de la CPU en la memoria, por lo que la fuente de salto y el destino deseado son más difíciles de determinar en tiempo real desde otra porción de tiempo en un escenario de multitarea.
Estrategias de capas para la seguridad acumulativa
Recuerda que estos son guardias, no garantías de seguridad. Pocas estrategias rentables son tan efectivas como la combinación tradicional de administración de sistemas de clase mundial, acceso cuidadoso a la memoria dentro de los programas y excelente saneamiento de los datos entrantes. Las adiciones más recientes a esta lista son agregar capas a estas estrategias efectivas para aumentar la resistencia del sistema al ataque.
[1] El diseño de la memoria es determinista a menos que el sistema operativo capture la entropía real del movimiento del mouse, la entrada de audio o algún otro transductor y luego se emplee para posicionar la memoria de forma aleatoria (en oposición a pseudo-aleatoria). p>