Evitar el exceso de búfer cuando el rendimiento no es una preocupación

3

Las tecnologías contra la explotación (DEP, ASLR, protector de pila, etc.) no proporcionan una protección completa. Una razón para esto es el rendimiento; estas tecnologías están diseñadas para funcionar con una sobrecarga de bajo rendimiento.

Para un sistema que tiene altas necesidades de seguridad, pero bajas necesidades de rendimiento, ¿existen técnicas que puedan proporcionar una protección más confiable contra el exceso de búfer (y otras fallas de corrupción de memoria)? Como regla general, una desaceleración de 10x no sería un problema, aunque una desaceleración de 100x probablemente sería inaceptable.

Me interesan las técnicas teóricas y los sistemas prácticos.

Editar: Para ser claro, estoy hablando de un sistema que necesita ejecutar una base de código existente en un idioma que no sea seguro para la memoria. Así que Java, .Net, etc. no ayudarán.

    
pregunta paj28 17.11.2015 - 15:54
fuente

3 respuestas

2

Intérpretes de idiomas como los mencionados aquí debe ser capaz de detectar accesos de memoria fuera de los límites con alta confiabilidad. A cambio de esta mayor confiabilidad, los intérpretes ejecutarán su aplicación más lentamente (no tengo estadísticas pero vi números que dicen 5x) y probablemente introducirán incompatibilidades con el código compilado. Estas incompatibilidades pueden deberse a errores del intérprete o simplemente a la holgura en las especificaciones del idioma. Debe verificar la configuración en el compilador que usa, ya que pueden tener opciones para habilitar comprobaciones de memoria adicionales a un costo de rendimiento.

    
respondido por el Neil Smithline 17.11.2015 - 21:02
fuente
0

Si el sistema operativo lo admite, usar páginas de guarda entre los segmentos de la memoria del programa puede ayudar. Si se produce un desbordamiento de búfer y va demasiado lejos, se accederá a la página de protección causando un fallo de segmentación para ese proceso.

El compilador gcc también implementa protección de aplastamiento de pila colocando 'canarios' o variables de protección con valores conocidos. Si cambian el proceso se anula.

Ambas soluciones tienen un impacto insignificante en el rendimiento.

En el ámbito académico parece haber dos ideologías en competencia para evitar la redirección de ejecución:

  1. Reescritura binaria (Modificación de tiempo de compilación del binario)
  2. Mitigar los desbordamientos de búfer en el tiempo de ejecución (BinArmor: enlace )

La mitigación del tiempo de ejecución tiene las repercusiones de rendimiento más significativas.

    
respondido por el Whome 17.11.2015 - 17:50
fuente
0

Clang AddressSanitizer puede hacer esto. De la documentación:

  

AddressSanitizer es un detector rápido de errores de memoria. Consiste en un módulo de instrumentación del compilador y una biblioteca en tiempo de ejecución. La herramienta puede detectar los siguientes tipos de errores:

     
  • Accesos fuera de los límites al montón, pila y globales
  •   
  • Uso después de libre
  •   
  • Uso después de la devolución (hasta cierto punto)
  •   
  • Doble libre, inválido gratis
  •   
  • Fugas de memoria (experimental)
  •   

La desaceleración típica introducida por AddressSanitizer es 2x.

    
respondido por el paj28 18.11.2015 - 08:32
fuente

Lea otras preguntas en las etiquetas