
Preuve de concept d'exploit pour CVE-2023-1999 ciblant la bibliothèque de codec WebP sur Android 10 (r33). Démontre une vulnérabilité de heap buffer overflow dans la bibliothèque libwebp, permettant l'exécution de code à distance via une image WebP spécialement conçue.
/ \\/ \/ _ \/ _ )/ _ \
\ / __/ _ \ __/
\__\__/\____/\_____/__/ ____ ___
/ _/ / \ \ / _ \/ _/
/ \_/ / / \ \ __/ \__
\____/____/\_____/_____/____/v1.0.2
Codec WebP : bibliothèque pour encoder et décoder des images au format WebP. Ce paquet contient la bibliothèque qui peut être utilisée dans d'autres programmes pour ajouter le support WebP, ainsi que les outils en ligne de commande 'cwebp' et 'dwebp'.
Voir http://developers.google.com/speed/webp
L'arborescence source la plus récente est disponible à l'adresse https://chromium.googlesource.com/webm/libwebp
Elle est distribuée sous la même licence que le projet WebM. Voir http://www.webmproject.org/license/software/ ou le fichier "COPYING" pour plus de détails. Une concession supplémentaire de droits de propriété intellectuelle se trouve dans le fichier PATENTS.
En exécutant :
nmake /f Makefile.vc CFG=release-static RTLIBCFG=static OBJDIR=output
le répertoire output\release-static(x64|x86)\bin contiendra les outils cwebp.exe et dwebp.exe. Le répertoire output\release-static(x64|x86)\lib contiendra la bibliothèque statique libwebp. L'architecture cible (x86/x64) est détectée par Makefile.vc depuis le compilateur Visual Studio (cl.exe) disponible dans le chemin système.
Sur les plateformes avec les outils GNU installés (gcc et make), exécuter
make -f makefile.unix
construira les binaires examples/cwebp et examples/dwebp, ainsi que la bibliothèque statique src/libwebp.a. Aucune installation système n'est fournie, car il s'agit d'une alternative simple au système d'installation complet basé sur les outils autoconf (voir ci-dessous). Veuillez vous référer à makefile.unix pour plus de détails et de personnalisations.
Prérequis : Un compilateur (par ex. gcc), make, autoconf, automake, libtool. Sur un système de type Debian, ce qui suit devrait installer tout ce dont vous avez besoin pour une construction minimale : $ sudo apt-get install gcc make autoconf automake libtool
Lors de la construction à partir des sources git, vous devrez exécuter autogen.sh pour générer le script configure.
./configure make make install
devrait être tout ce dont vous avez besoin pour obtenir les fichiers suivants
/usr/local/include/webp/decode.h /usr/local/include/webp/encode.h /usr/local/include/webp/types.h /usr/local/lib/libwebp.* /usr/local/bin/cwebp /usr/local/bin/dwebp
installés.
Remarque : Une bibliothèque de décodage uniquement, libwebpdecoder, est disponible en utilisant le drapeau '--enable-libwebpdecoder'. La bibliothèque d'encodage est construite séparément et peut être installée indépendamment en utilisant une modification mineure dans les fichiers configure Makefile.am correspondants (voir les commentaires ici). Voir './configure --help' pour plus d'options.
Les versions stables disponibles de la chaîne d'outils MIPS Linux peuvent être trouvées à : https://community.imgtec.com/developers/mips/tools/codescape-mips-sdk/available-releases/
export PATH=$PATH:/path/to/toolchain/bin
HOST=mips-mti-linux-gnu
MIPS_CFLAGS="-O3 -mips32r5 -mabi=32 -mtune=p5600 -mmsa -mfp64
-msched-weight -mload-store-pairs -fPIE"
MIPS_LDFLAGS="-mips32r5 -mabi=32 -mmsa -mfp64 -pie"
HOST=mips-img-linux-gnu
MIPS_CFLAGS="-O3 -mips64r6 -mabi=64 -mtune=i6400 -mmsa -mfp64
-msched-weight -mload-store-pairs -fPIE"
MIPS_LDFLAGS="-mips64r6 -mabi=64 -mmsa -mfp64 -pie"
./configure --host=${HOST} --build=config.guess
CC="${HOST}-gcc -EL"
CFLAGS="$MIPS_CFLAGS"
LDFLAGS="$MIPS_LDFLAGS"
make
make install
Avec CMake, vous pouvez compiler libwebp, cwebp, dwebp, gif2web, img2webp, webpinfo et les liaisons JS.
Prérequis : Un compilateur (par ex. gcc avec autotools) et CMake. Sur un système de type Debian, ce qui suit devrait installer tout ce dont vous avez besoin pour une construction minimale : $ sudo apt-get install build-essential cmake
Lors de la construction à partir des sources git, vous devrez exécuter cmake pour générer les makefiles.
mkdir build && cd build && cmake ../ make make install
Si vous souhaitez également l'un des exécutables, vous devrez les activer via CMake, par exemple :
cmake -DWEBP_BUILD_CWEBP=ON -DWEBP_BUILD_DWEBP=ON ../
ou via votre interface préférée (comme ccmake ou cmake-qt-gui).
Utilisez l'option -DWEBP_UNICODE=ON pour le support Unicode sous Windows (avec chcp 65001).
Enfin, une fois installé, vous pouvez également utiliser WebP dans votre projet CMake en faisant :
find_package(WebP)
ce qui définira les variables CMake WebP_INCLUDE_DIRS et WebP_LIBRARIES.
Le support pour Gradle est minimal : il vous aide seulement à compiler libwebp, cwebp et dwebp et webpmux_example.
Prérequis : Un compilateur (par ex. gcc avec autotools) et gradle. Sur un système de type Debian, ce qui suit devrait installer tout ce dont vous avez besoin pour une construction minimale : $ sudo apt-get install build-essential gradle
Lors de la construction à partir des sources git, vous devrez exécuter le wrapper Gradle avec la cible appropriée, par exemple :
./gradlew buildAllExecutables
Pour générer des liaisons linguistiques à partir de swig/libwebp.swig, au moins swig-1.3 (http://www.swig.org) est requis.
Actuellement, les fonctions suivantes sont mappées : Decode : WebPGetDecoderVersion WebPGetInfo WebPDecodeRGBA WebPDecodeARGB WebPDecodeBGRA WebPDecodeBGR WebPDecodeRGB
Encode : WebPGetEncoderVersion WebPEncodeRGBA WebPEncodeBGRA WebPEncodeRGB WebPEncodeBGR WebPEncodeLosslessRGBA WebPEncodeLosslessBGRA WebPEncodeLosslessRGB WebPEncodeLosslessBGR
Voir swig/README pour des instructions de construction plus détaillées.
Liaisons Java :
Pour construire le code wrapper JNI généré par swig, au moins JDK-1.5 (ou équivalent) est nécessaire pour le support des énumérations. La sortie est destinée à être un objet partagé / DLL qui peut être chargé via System.loadLibrary("webp_jni").
Liaisons Python :
Pour construire le code d'extension Python généré par swig, au moins Python 2.6 est requis. Python < 2.6 pourrait être construit avec quelques modifications mineures de libwebp.swig ou du code généré, mais n'a pas été testé.
Le répertoire examples/ contient des outils pour encoder (cwebp) et décoder (dwebp) des images.
L'utilisation la plus simple devrait ressembler à : cwebp input.png -q 80 -o output.webp ce qui convertira le fichier d'entrée en un fichier WebP en utilisant un facteur de qualité de 80 sur une échelle de 0 à 100 (0 étant la qualité la plus basse, 100 la meilleure. La valeur par défaut est 75). Vous voudrez peut-être aussi essayer le drapeau -lossless, qui comprimera la source (en format RGBA) sans aucune perte. Le paramètre de qualité -q contrôlera dans ce cas la quantité de temps de traitement consacré à essayer de rendre le fichier de sortie aussi petit que possible.
Une liste plus longue d'options est disponible en utilisant le drapeau de ligne de commande -longhelp :
cwebp -longhelp Usage : cwebp [-preset <...>] [options] in_file [-o out_file]
Si la taille d'entrée (-s) pour une image n'est pas spécifiée, il est supposé qu'il s'agit d'un fichier PNG, JPEG, TIFF ou WebP.