¿Es la tarea del software (sistema operativo) detectar desbordamientos de pila o se detecta un desbordamiento de pila en el hardware, causando una excepción en la CPU?
computer-architecture
stacks
gilianzz
fuente
fuente
Respuestas:
Puede ser software o hardware, o ambos, o ninguno.
Hay dos tipos de desbordamientos: desbordamiento al aumentar la pila (al ingresar a una función) y desbordamiento al acceder a una matriz en la pila. Los desbordamientos al aumentar la pila se pueden detectar haciendo una verificación de límites en la entrada de la función, para verificar que hay suficiente espacio (y señalar un error o aumentar la pila si no la hay). Los desbordamientos al acceder a una matriz en la pila son solo un problema en los idiomas de bajo nivel que no verifican los límites de la matriz; La solución es verificar los límites de la matriz.
Estos enfoques de software tienen la ventaja de que funcionan de manera totalmente confiable: puede estar seguro de que se detectará cualquier desbordamiento de pila. Su inconveniente es que aumentan el tamaño del código y el tiempo de ejecución. El hardware puede ayudar al proporcionar un método para detectar la mayoría de los desbordamientos sin costo, siempre que no ocurra un desbordamiento. En una arquitectura con una MMU ¹, el entorno de tiempo de ejecución puede organizar el mapeo de la pila en un límite de página, con la siguiente página sin asignar.
De esa forma, si el software intenta acceder a datos más allá del límite de la página (ya sea porque el puntero de la pila se ha movido más allá del límite o porque el acceso a la matriz está fuera de los límites y más allá del límite), causará un error al acceder a un área no asignada . Esto solo sucede si el desbordamiento es lo suficientemente pequeño: si la cantidad de desbordamiento es demasiado grande, el programa puede terminar accediendo a otras cosas en el otro lado del espacio en el espacio de direcciones.
Las desventajas del enfoque de hardware son que no es totalmente confiable ya que es posible que no se detecte un desbordamiento por una gran cantidad, y que no detecta desbordamientos de matriz que permanecen dentro del espacio direccionable.
Para detectar desbordamientos de matriz, otra técnica de software es un canario : coloque un valor especial en la parte superior de la pila o entre cuadros, y verifique que el valor del canario no haya cambiado en el retorno de la función. Esta también es una técnica imperfecta ya que el desbordamiento podría evitar el canario por completo o podría no detectarse porque el valor del canario se ha restaurado para el momento en que se verifica. Sin embargo, es útil para hacer más difícil explotar algunas vulnerabilidades de seguridad.
La forma más segura y económica de evitar desbordamientos de pila es calcular la cantidad de pila que necesitará el programa antes de comenzar a ejecutarlo, mediante análisis estático. Sin embargo, esto no siempre es práctico: la cantidad de pila que necesita un programa es indecidible en general y depende de los datos que manipula el programa.
Same El mismo principio también se puede aplicar con solo una MPU, o sin protección de memoria si hay un solo hilo cuya pila está en el borde de las asignaciones físicas existentes.
fuente