Glibc tiene algunas capacidades inherentes en la detección de sobrepasos, y se pueden activar con la variable de entorno MALLOC_CHECK_
. Consulte mcheck y mallopt para más detalles.
Al probarlo en un sistema Ubuntu 14.04 de 64 bits, parece que al asignar muchos bloques de memoria, malloc()
redondea el tamaño solicitado al siguiente múltiplo de 8, y usa 8 bytes adicionales. Por ejemplo, si asignó 1000000 bloques de 50 bytes, el proceso realmente solicita 64000000 bytes del kernel, no 50000000. Esto deja espacio para un "canario separador" de 8 bytes entre cualquiera de los dos bloques asignados.
Estas características parecen estar destinadas a detectar errores de implementación, no a la explotación maliciosa. No está claro si serían realmente buenos para detectar realmente los desbordamientos de búfer, y hacerlo con la suficiente antelación; de hecho, por definición, las verificaciones de coherencia de la pila de ese tipo solo se pueden aplicar cuando se invocan las rutinas de asignación de pila. Esto significa que si tuvo un desbordamiento de búfer, puede recibir algún aviso solo cuando se libere el bloque relevante, o el siguiente en la RAM: esto sucede después del desbordamiento, posiblemente mucho después, por lo tanto, demasiado tarde. Esto contrasta con los canarios basados en la pila, que se verifican antes devolviendo (es decir, después del desbordamiento, pero antes de usar la ranura de dirección de retorno que puede haber sido obstruida).
Lo que tales controles son más o menos buenos es detectar problemas de doble libertad. No pueden atrapar los casos de uso después de que hayan sido liberados y, como se explicó anteriormente, cuando detectan un desbordamiento, probablemente sea demasiado tarde.