Contexte de sécurité
Les décodeurs d’images sont omniprésents, du noyau du système aux processus de navigateur sandboxés. Leur exposition à des flux d’entrée non fiables les rend vulnérables aux bugs de sécurité liés à la mémoire. La faille CVE-2023-4863, exploitée activement et répertoriée par le CISA, a affecté des milliards d’appareils utilisant libwebp dans Chrome, Firefox, Signal, Microsoft Teams, etc. Selon l’équipe Chromium, près de 70 % des bugs de sécurité critiques proviennent de problèmes de sécurité mémoire, ce qui montre les limites d’une approche basée uniquement sur le fuzzing.
Architecture et garanties de mémoire
Le projet wpd répond à ce besoin en étant écrit en Rust, un langage qui impose la vérification d’emprunt à la compilation. Le code principal est entièrement vérifiable, à l’exception d’une petite dépendance zerocopy jugée sûre après audit. Les parties SIMD, écrites à la main, sont confinées à des modules clairement délimités et peuvent être désactivées lors de la compilation ; dans ce mode, le décodage ne comporte aucun code unsafe. Cette approche contraste avec libwebp, qui repose sur du C « unsafe » et des intrinsics SIMD, augmentant la surface d’exposition aux débordements de tampon et aux use‑after‑free.
Analyse des performances
La sécurité n’est pas le seul objectif : wpd doit aussi surpasser libwebp en vitesse. Les benchmarks réalisés avec le jeu de données interne de l’équipe (image‑webp 0.2.4) et la version libwebp a1d89ff montrent les gains suivants :
1‑thread, lossy : 1.19× plus rapide
1‑thread, lossless: 2.74× plus rapide
multi‑thread, lossy : 2.68× plus rapide
multi‑thread, lossless: 3.19× plus rapideLes améliorations mono‑thread proviennent d’optimisations algorithmiques, tandis que les gains multi‑thread tirent parti d’une parallélisation plus fine du décodage d’images animées. Ainsi, wpd offre à la fois une meilleure latence pour les flux simples et une scalabilité accrue pour les contenus complexes.
Fonctionnalités et limites
wpd vise la parité fonctionnelle avec libwebp : prise en charge du WebP lossless, de la transparence alpha, des animations, de l’extraction ICC/EXIF/XMP, et de multiples formats de sortie (RGB, BGR, YUV420P, etc.). Certaines options avancées, comme le décodage de sous‑cadres d’animation sans recomposition ou le redimensionnement intégré, restent en cours de développement (indiquées par des cases vides dans le tableau de comparaison). Le projet est publié sous licence BSD 2‑Clause, ce qui facilite son intégration dans des projets propriétaires ou open source. Enfin, la communauté peut désactiver les routines SIMD pour obtenir un binaire entièrement vérifiable, au prix d’une perte de performance proportionnelle aux gains mesurés ci‑dessus.