¿Tiene sentido tener DFI y CFI?
No.
¿DFI implica CFI?
Sí, porque secuestrar el flujo de control significa modificar los datos de control y DFI garantiza la integridad de los datos, ya sea que se utilicen para el control o no.
¿Puedo seguir utilizando exploits que alteran el gráfico de flujo de control (CFG) si solo tengo DFI?
No, será detectado.
DFI aplica una política sobre el flujo de datos observado en el tiempo de ejecución. Asegura que un programa debe seguir un gráfico de flujo de datos generado a través de un análisis estático en tiempo de compilación. Un pase de instrumentación en el programa agrega controles antes de cada instrucción de lectura para garantizar que no lean datos dañados.
El análisis estático utiliza un que alcanza el análisis de definición . Es un análisis de flujo de datos que nos da para cada instrucción de lectura que lee una variable, un conjunto de instrucciones que podrían haber definido esta variable por última vez.
Para cada instrucción de lectura, se realiza el análisis, y a cada instrucción de escritura que define una variable se le asigna un identificador único.
Luego, un paso de instrumentación agrega comprobaciones antes de cada instrucción de escritura para actualizar una tabla que asigna una dirección a la que se está escribiendo y que el último identificador ha escrito un valor en esa dirección.
Además, la instrumentación agrega controles antes de cada instrucción de lectura. Obtiene el identificador asignado con la dirección desde la que está leyendo el valor, y garantiza que el identificador esté en el conjunto de definiciones de alcance encontradas gracias al análisis estático.
Por ejemplo, si un atacante logra corromper la dirección de retorno en la pila, la instrucción de escritura utilizada para corromperla actualiza la tabla con su identificador. Por lo tanto, la instrumentación justo antes de la instrucción ret
notará la corrupción, porque el último identificador utilizado para modificar la dirección de retorno no está en el conjunto de identificadores permitidos.
Es por eso que DFI previene tanto los ataques de datos sin control como los ataques de datos de control. También explica por qué no tiene sentido usar ambos, porque sería redundante.