Apilar canarios, para proteger los punteros de función en objetos de montón

4

Me pregunto si alguien ha propuesto, evaluado o implementado previamente la siguiente medida para reforzar los sistemas contra sobrecargas de búfer basadas en el montón: básicamente, apilar canarios, pero aplicados antes de punteros de función en objetos almacenados en el montón en lugar de antes de regresar Direcciones almacenadas en la pila.

Considera una estructura como

struct whatever {
    int blah;
    char buf[256];
    void (*fp)(); // a function pointer
}

Observe que si hay una saturación que escribe más allá del final del campo buf , será posible sobrescribir el campo de puntero de función fp .

Un compilador podría defenderse plausiblemente de esto introduciendo un canario, un valor aleatorio secreto, almacenado entre el búfer y el puntero de función. Básicamente, el compilador transformaría el diseño de la estructura a

struct whatever {
    int blah;
    char buf[256];
    unsigned int canary; // inserted by compiler; not exposed to source code
    void (*fp)(); // a function pointer
}

Por ejemplo, el compilador podría organizar escribir el campo canary con un valor secreto global cada vez que el programa escriba en fp , y podría verificar que el valor de canary permanezca sin cambios cada vez que el programa lea de fp .

Esto es básicamente el análogo de los canarios de pila, pero ahora nos centramos en proteger los punteros de función en el montón en lugar de direcciones de retorno en la pila. Parece una idea natural.

¿Alguien ha propuesto esto antes? ¿Alguien ha hecho un prototipo o evaluado el costo de rendimiento de hacer algo como esto? ¿Existen barreras no obvias para la implementación (más allá del hecho de que requiere cambios para los compiladores, al igual que lo hacen los canarios de pila)?

Investigación que he hecho: soy consciente de la idea de insertar páginas de guarda entre objetos en el montón, pero eso es diferente (protege contra los desbordamientos del montón que van más allá de los límites de un solo objeto, mientras que estoy hablando sobre algo que proteger contra los desbordamientos de pila que permanecen dentro de la región de un solo objeto de pila). Estoy familiarizado con Cruiser y ContraPolice , que coloca canarios entre objetos en el montón, pero que también se enfoca en desbordamientos de objetos cruzados en lugar de desbordamientos dentro de objetos. También estoy familiarizado con el uso de pila de archivos o el cifrado de puntero para proteger los metadatos de malloc, pero, una vez más, no protege contra los desbordamientos dentro de los objetos y está diseñado para proteger los metadatos de malloc en lugar de los punteros de función.

    
pregunta D.W. 05.06.2014 - 01:57
fuente

2 respuestas

2

Los canarios dentro de un objeto se ejecutan en un problema práctico: cambia el diseño en memoria de estos objetos. Este diseño debe ser consistente cuando se pasa, por ejemplo, entre el programa y las bibliotecas. Si pasó un puntero del tipo struct whatever * desde un programa compilado con esta instrumentación, a una biblioteca compilada sin esta instrumentación (pero con la misma declaración de struct whatever ) , entonces las cosas se romperían, porque algunos de los campos estarían en un desplazamiento diferente. Como resultado, el uso de canarios internos para cualquier otra cosa que no sea la investigación teórica rompería la compatibilidad con casi todos los códigos y bibliotecas existentes.

    
respondido por el Mark 05.06.2014 - 07:28
fuente
1

Un enfoque similar es el cifrado de puntero de función, similar al utilizado para proteger los metadatos de malloc. Esto se propone en

El análisis del libro es favorable. También hay un documento más antiguo sobre esta técnica (y otro ). Sin embargo, por lo que sé, esta técnica no es un uso activo. No tengo la menor idea de por qué no; Quizás se trate de problemas de rendimiento y compatibilidad; o quizás la NSA haya silenciado a las personas que lo propusieron.

    
respondido por el paj28 05.06.2014 - 07:40
fuente

Lea otras preguntas en las etiquetas