Como soy nuevo en la investigación de vulnerabilidades en aplicaciones nativas (a diferencia de las aplicaciones web), tengo dificultades para comprender un bloqueo en el navegador de Debian, Epiphany (versión 2.30.6), y para determinar si es explotable.
Descubrí que el siguiente código HTML + CSS provoca un bloqueo en Epiphany, cuando ocurre un redireccionamiento a otra página:
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
::-webkit-scrollbar-thumb {
height:0;
}
::-webkit-scrollbar {
overflow:visible;
}
</style>
<meta http-equiv="Refresh" content="1; http://www.example.com/" />
</head>
<body></body>
</html>
Hasta ahora, he estado tratando de aprender sobre él y determinar su explotabilidad utilizando GDB y Valgrind .
GDB, la mayoría de las veces, informa un error de segmentación o en una dirección que cambia cada vez que lo ejecuto. También lo he visto reportar SIGILL en lugar de SIGSEGV, pero es raro. Depurando más, descubrí que esto está siendo causado por una instrucción CALL [edx + 0x228] . El valor del registro edx en el momento en que esta instrucción se ejecuta cambia ligeramente en cada ejecución, pero, según el mapa de memoria, siempre está dentro del montón.
Valgrind informa una Lectura no válida de tamaño 4 , [...] 3 bytes después de un bloque de tamaño 61 libre , justo antes de un Salto a la dirección no válida indicada en la siguiente línea y, finalmente, la falla de segmentación.
Para mí, parece un error de uso después de libre. Me gustaría que alguien confirme que tengo razón.
Suponiendo que esto es, de hecho, un uso después de libre, sé que el error podría ser explotable. Sin embargo, nunca logré sobrescribir la memoria en la dirección que resulta de la expresión edx + 0x228 y, por lo tanto, no puedo controlar el puntero de instrucción.
Creo que la razón de esto es porque el objeto se está liberando justo después de que se inicie el redireccionamiento de la página, por lo que no puedo sobrescribir el espacio en la memoria que estaba ocupando con Javascript que se ejecuta cuando se carga la página. He intentado agregar un spray de pila a window.onunload , sin embargo, agregar este método (con cualquier tipo de código en el interior) en realidad evita que ocurra el bloqueo.
Básicamente, mis preguntas son:
- ¿Es realmente un error de uso después de liberarse?
- Si es así, ¿cómo puedo determinar cuándo se está liberando el objeto y, por lo tanto, intentar averiguar si es posible sobrescribir su ubicación en la memoria después de que se libere?
Cualquier sugerencia sobre determinar si la ejecución del código es posible con este error, y cómo sucedería, también es bienvenida.
Gracias.