¿Existe therea mcu / cpu con una pila aislada (a través de hardware o compilador)?

1

Está la arquitectura de Harvard, que aisló los buses de datos y códigos. ¿Hay una arquitectura que también aisló el bus de pila en hardware? ¿O al menos algún compilador que implementa una doble pila: una para direcciones y registros de retorno y otra para variables locales?

    
pregunta hulkingtickets

3 respuestas

4

Si bien la mayoría de los procesadores tienen hardware diseñado para facilitar la implementación y el uso de una pila de estilo C típica, normalmente la pila se define con el compilador utilizando el código compilador incorporado.

Podría implementar su propio compilador que crea y utiliza un estilo de pila diferente. En su caso, estaría buscando implementar dos pilas separadas, una con variables de entrada, local y de retorno, y otra con ubicaciones de llamada / retorno. Puede implementar ambas pilas en una sección de la memoria que no se puede ejecutar, ni hacer referencia a los punteros en el resto del código, por lo que no puede modificarse, excepto por las llamadas a funciones definidas por el compilador y las devoluciones. Al ubicar las variables locales aparte de la pila de llamada / retorno, evitará algunos tipos de ataques de desbordamiento de búfer.

La Sección 10 de Conceptos básicos del diseño del compilador (Gratis, PDF, 1.6MB) explica las llamadas a funciones y la pila de llamadas. Si revisa esa sección, encontrará que el diseño de la pila que incluye tanto las llamadas como las variables locales es muy conveniente por varios motivos. Dividirlas podría aumentar la seguridad, pero estás desacelerando el procesador y el programa al tratar con dos pilas.

A excepción de los procesadores pequeños de propósito especial, como el microcontrolador PIC, no hay arquitecturas comunes que implementen el concepto que está preguntando. Sin embargo, hay un gran número de procesadores de investigación con varios métodos para prevenir ataques de desbordamiento de búfer , algunos de los cuales incluyen conceptos similares a los tuyos.

Sin embargo, incluso en esos procesadores, el trabajo del compilador es lidiar con la pila. La arquitectura del procesador simplemente proporciona herramientas adicionales para facilitar la protección del software contra ataques.

En su lugar, podría utilizar un lenguaje y un compilador diseñados de forma que no sean posibles los ataques de desbordamiento de búfer. Hoy en día, muchos lenguajes de alto nivel realizan la verificación de los límites de la matriz en cada acceso a la matriz, evitando ataques de desbordamiento de búfer. Esto es, en gran medida, un problema resuelto para muchos idiomas y sus compiladores.

    
respondido por el Adam Davis
3

Algunos procesadores PIC tienen una pila de hardware, que consta de 8 registros fijos y podría considerarse "aislada" del bus de datos.

Editar: al parecer, todos ellos ( enlace ).

Sin embargo, ahora ha agregado algo más a su pregunta: el propósito de prevenir los desbordamientos de búfer. Esto tiene diferentes implicaciones. Por lo general, los desbordamientos de búfer se basan en (1) la inserción del código para ejecutarse en un búfer en la memoria de datos y (2) la sobrescritura de la dirección de retorno para que ese código se ejecute. (1) puede ser derrotado por bits de "no ejecución" presentes en algunos MMU (esto ha estado disponible en Intel durante mucho tiempo pero solo recientemente recibió soporte del sistema operativo).

En algunas plataformas, los ataques se pueden crear completamente cambiando la pila sin agregar ningún código, usando "programación orientada a retorno" . Tener una pila distinta evita que esto se haga, pero no evita otras formas de corrupción de datos al exceder un búfer y sobrescribir otra memoria de datos. Es posible que puedas lograr un aprovechamiento útil si cambias un poco, incluso si el flujo de control no cambia.

    
respondido por el pjc50
2
  • "¿Hay una arquitectura que también aisló el bus de pila en el hardware?"
    Nunca he dirigido una arquitectura que tenga un bus de pila . Sin embargo, es bastante común tener punteros de pila separados (y pilas) para diferentes propósitos, por ejemplo. una pila de supervisor y una pila de usuario.
    Un ejemplo (antiguo): MC68020 Manual del usuario (pdf)

  • "... o al menos algún compilador que implementa una pila dual":
    Existe el concepto de no usar la pila para las variables locales en absoluto, sino asignar variables locales en áreas de memoria superpuestas. Por supuesto, esto solo es posible si la jerarquía de llamadas es estática (es decir, sin recursión y dependencia en el tiempo de ejecución de la jerarquía de llamadas). Ejemplo: C51 Keil C-Compiler .

respondido por el Curd

Lea otras preguntas en las etiquetas