Memoria

Buffer overflow explicado

Sin duda muchos de vosotros habréis oído hablar de una vulnerabilidad basada en un buffer overflow pero no os ha llegado a quedar claro que significa exactamente esto.

En general, cuando aparecen dichas noticias suelen ir asociadas al término "ejecución de código arbitrario" que es, en realidad, el verdadero problema. Vamos a ver un poco más a fondo lo que significa una vulnerabilidad de buffer overflow y lo que implica.

En primer lugar, la palabra overflow procede del inglés y quiere decir desbordamiento (de hecho existe el término desbordamiento de buffer en español, pero como tantas otras cosas, es mucho más habitual escuchar el término inglés). ¿Que significa esto? Pues ni más ni menos que lo que indica su nombre, que tenemos un buffer cuya capacidad se ha visto desbordada.

En la mayoría de los lenguajes de programación un buffer hace referencia a un puntero a memoria reservada que tiene un determinado tamaño, si intentamos meter datos de más tamaño del del buffer, este se desborda.

Podríamos pensar que cuando esto pasa se produce una excepción y listo (y en algunos lenguajes esto es exactamente lo que pasa) sin embargo en la mayoría de los lenguajes no ocurre, con resultados generalmente desastrosos.

Safeguards en Delphi.

Introducción

Los safeguards son el nombre que recibe un ingenioso mecanismo que nos permite, en cierto sentido, olvidarnos de los problemas asociados a liberar memoria en Delphi y que simulan de alguna forma el funcionamiento de un recolector de basura. En C++, para aquellos que han trabajado alguna vez con él, este mecanismo se conoce como Smart Pointers.

El truco

El truco para "olvidarnos" de liberar los objetos cuando terminamos con ellos consiste en el uso de interfaces. En delphi los interfaces incorporan un mecanismo de conteo referencial automático. Esto significa que cuando no se van a usar más (por ejemplo cuando salen de ámbito o cuando se "sobreescriben" y no quedan referencias al objeto que implementa dicho interface) se destruyen automáticamente.

Utilizando esto podemos utilizar el mecanismo de Safeguards para encapsular cualquier objeto dentro de un interface de forma que cuando dicho interface se destruya (porque cualquiera de los motivos expuestos antes) nuestro objeto se libere automáticamente sin que tengamos que preocuparnos nosotros de ello.

Multihilo. Espacios de memoria, código reentrante y código threadsafe.

Introducción

Este artículo sirve de introducción al concepto de espacio de memoria de un proceso para su aplicación al concepto de multihilo de forma que solo da una introducción a los distintos segmentos de memoria y a aspectos como la visibilidad para centrarse en el porque y el cuando de la sincronización en el acceso a datos.

En la mayoría de los sistemas operativos (y para lo que nos ocupa en Windows y en Linux) todo proceso tiene varios segmentos en memoria, en concreto son el segmento de código, el segmento de datos, el segmento de pila y el segmento de heap.