¿El uso de pilas separadas para direcciones de retorno y argumentos de funciones es una medida de seguridad viable?

10

Hasta donde sé, muchas de las vulnerabilidades dependen de la sobrescritura de la dirección de retorno de la función que intentan explotar. Lo hacen por exceso de búfer. Pero, ¿qué pasa si el compilador configuró dos pilas separadas una de la otra en el espacio de direcciones y usó una de ellas (tal vez la del sistema, como esp / rsp -daire una en sistemas x86 *) para direcciones de retorno y la otra para pasar argumentos de función? En este caso, cualquier exceso de búfer sobrescribirá algunos locales, tal vez incluyendo los de las funciones del llamante, pero aún así dejará intactas las direcciones de retorno.

Además, la pila para direcciones de retorno podría usarse para almacenar todos los punteros de función y entidades similares que permiten saltar / llamar indirectamente, para que también estén protegidos.

¿Esta opción ya ha sido considerada? ¿Es viable? En caso afirmativo, ¿por qué no se ha implementado (o se ha implementado)?

    
pregunta Ruslan 07.08.2015 - 21:52
fuente

2 respuestas

4

El problema con la mayoría de los sistemas operativos es que siguen una "convención de llamada" específica. Esta convención requiere poner parámetros de función en la pila, ya que es un derivado de la convención de llamada de estilo C. Usted debe usar esta convención para la compatibilidad de ABI (Interfaz Binaria de la Aplicación) con ese SO. Por lo tanto, sin el soporte del sistema operativo, solo podría usar esta función para las llamadas realizadas dentro de su aplicación.

Esto complicaría bastante a los compiladores y probablemente requeriría una buena cantidad de trabajo. En resumen, podría proteger sus propios programas si tuviera un compilador compatible con esta convención de llamadas, pero aún estaría a merced del sistema operativo cada vez que tuviera que hacer cosas como leer / escribir un archivo, etc. en una DLL, por ejemplo, no se puede arreglar cambiando la convención de llamadas.

En segundo lugar, hasta hace poco, con el advenimiento de la virtualización, realmente no era posible configurar un área separada como esta, porque la segmentación era costosa, y la virtualización de la memoria aún más. Hoy en día, esto prácticamente no sería un problema, pero como tenemos que lidiar con software histórico (por ejemplo, cosas escritas hace diez años que aún requieren los métodos de llamada convencionales), el sistema operativo se vería obligado a soportar ambos modelos por un período indefinido. de tiempo.

Si se escribiera un sistema operativo nuevo sin problemas de compatibilidad, ciertamente podría hacerlo, pero probablemente no sucederá, porque hay métodos más viables. El sistema operativo Singularity de Microsoft es completamente inmune a los desbordamientos de búfer (según ellos), porque el sistema operativo valida estáticamente que cada programa no puede portarse mal. Curiosamente, este sistema operativo no utiliza la "protección de memoria" que utilizan Windows, Linux, Mac OS, etc. Los programas se validan para el comportamiento correcto antes que se ejecutan, no como se ejecutan . Por supuesto, si un virus fuera capaz de este sistema, tendría un control ilimitado del sistema debido a la falta de protección a nivel de hardware.

En resumen, incluso sin una investigación seria sobre el tema, es claramente posible que este enfoque funcione, pero fuera de FOSS (software libre y de código abierto), no sería posible Este enfoque para trabajar desde un punto de vista financiero. Linux podría reescribirse desde el kernel hasta admitir el nuevo modelo, se desplegó un compilador para él, y luego todo el software podría volver a compilarse sin demasiado esfuerzo (nota: "demasiado" es relativo a, decir, Microsoft).

Microsoft, Apple, etc. no tienen este beneficio, porque el código ya está compilado por millones de desarrolladores diferentes, por lo que cualquier cosa que no se pueda actualizar se volvería obsoleta instantáneamente, o tendrían que escribir emuladores para apoyar el software antiguo. Básicamente, hasta que alguien presente un sistema operativo que tenga esta característica incorporada, con compiladores compatibles (como mínimo C y C ++, además de probablemente Cocoa y Win32 C ++), y ganen suficiente soporte para convertirse en un En contra de Linux, Microsoft y Mac OS, sería bastante difícil justificar el cambio a un nuevo modelo. Linux sería el más fácil de mover, aunque todo el software tendría que compilarse hasta que los RPM y otros tipos de paquetes sean compatibles con el nuevo modelo de llamada.

Finalmente, DEP (Prevención de ejecución de datos) soluciona el problema en la mayoría de los casos, lo que dificulta la ejecución de código que no debería. Esto también reduce la necesidad de cambiar a un nuevo modelo, aunque, como lo demuestra Singularity, el hardware podría ser mucho más rápido si no fuera forzado constantemente a protegerse contra los errores de los programadores y las vulnerabilidades que presentan.

    
respondido por el phyrfox 07.08.2015 - 22:30
fuente
2

Sí, esto se ha implementado antes. En esta publicación de blog, Erin Ptacek menciona brevemente cómo AVR tiene diferentes programas y memorias de datos y cómo esto se hace. La explotación más difícil.

  

Una arquitectura de Harvard tiene dos memorias distintas; hay memoria de programa (imem, típicamente flash) y memoria de datos (dmem, típicamente SRAM). Viven en dos espacios de direcciones diferentes. La CPU lee las instrucciones de imem, pero las instrucciones leen y escriben dmem.   Esto es bueno porque hace que los exploits sean más difíciles de escribir. No puedes simplemente cargar código en un búfer y de alguna manera apuntar la PC hacia él; ese búfer está en dmem, no imem. Verás lo que quiero decir en unas pocas semanas.

Aunque esto ayudaría a evitar que un atacante explote un desbordamiento de búfer, no evita totalmente que un desbordamiento de búfer sea explotable. La sobrescritura de variables locales puede hacer mucho para ganar control sobre un proceso. Phyrfox también hizo muy buenos puntos sobre por qué esto no estaría a la altura de las expectativas de los sistemas operativos modernos.

    
respondido por el Justin Moore 07.08.2015 - 22:39
fuente

Lea otras preguntas en las etiquetas