¿Se detecta un desbordamiento de pila por hardware o software?


26

¿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?


Yo diría que el hardware, a través de fallas MMU en la mayoría de las CPU. x86 en modo de 32 bits tenía segmentación además de paginación, y el "Segmento de pila" está asociado, como los segmentos de Código, Datos, Ext ... con una dirección base y un tamaño. Cualquier acceso fuera de ese rango desencadenaría una falla.
TEMLIB

Respuestas:


25

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.

+---------------+---------------+---------------+---------------+
| stack                         | unmapped      | other stuff   |
|    ----> direction of growth  |               |               |
+---------------+---------------+---------------+---------------+
^               ^               ^               ^               ^  page boundaries

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.


44
No llamaría al acceso a la matriz fuera de los límites un desbordamiento de la pila, incluso si la matriz está en la pila. Es solo un caso especial de desbordamiento de búfer.
CodesInChaos

Si no se asigna a los elementos de la pila primaria a los que se hace referencia en relación con un puntero sin pila / marco o un desplazamiento no constante, se evitarían los desbordamientos de la pila tradicional. El uso de una pila de dirección de retorno separada (o una pila de derrame de RA / registro como Itanium) reduciría al menos en gran medida las oportunidades de programación orientada a la devolución.
Paul A. Clayton

El acceso fuera de límites se denomina más correctamente un desbordamiento , no un desbordamiento.
Ben Voigt

3
@ awesomebing1 no todas las plataformas detectan desbordamientos de pila. Podría terminar sobrescribiendo lo que esté después de la pila (similar a cualquier otro desbordamiento de búfer).
user253751

1
@CodesInChaos, a veces los desbordamientos del búfer en los búferes asignados a la pila se denominan "desbordamientos de la pila" (para abreviar). De acuerdo, esa terminología puede ser un poco confusa sin contexto.
DW
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.