Introductie van wpd

wpd is een snellere en veiligere WebP-decoder dan libwebp, ontworpen om het web te beschermen tegen kwetsbaarheden zoals CVE-2023-4863. Tegelijkertijdbehoudt wpd niet alleen de status quo wat betreft snelheid; het biedt superieure single-threaded prestaties en schaalt beter over meerdere threads vergeleken met alternatieven.

Broncode: https://github.com/halidecx/wpd

Veiligheid

Beeldecoders en andere bibliotheken voor beeldverwerking worden overal gebruikt, van het besturingssysteem tot sandboxed browserprocessen. Omdat ze complexe, onvertrouwde inputdata verwerken, zijn ze kwetsbaar voor bugs in de geheugenveiligheid (memory safety). CVE-2023-4863 trof potentieel miljarden apparaten die Chrome, Firefox, Signal, Microsoft Teams en meer draaien. CISA bevestigde dat deze kwetsbaarheid actief in het wild werd misbruikt, waarna het werd toegevoegd aan hun catalogus van bekende benutte kwetsbaarheden. Dergelijke kwetsbaarheden hebben ernstige gevolgen voor bijna alle consumentenhardware.

Hoewel libwebp waarschijnlijk veiliger is dan voorheen, wordt geheugenveiligheid niet "opgelost" door enkel uitgebreid gebruik van fuzzing. Volgens het Chromium-team is ongeveer 70% van hun beveiligingsbugs met een hoge ernst afkomstig van problemen met de geheugenveiligheid.

Om dit aan te pakken is wpd geschreven in Rust, met handgeschreven assembly-routines voor de prestaties. De handgeschreven SIMD in de decoder is zorgvuldig afgebakend en gecontroleerd op correctheid, en bevindt zich grotendeels op minder risicovolle plaatsen. Desondanks kan wpd voor consumenten die hun omgeving willen harden worden gecompileerd zonder handgeschreven assembly. Dit maakt de geschreven non-SIMD code volledig verifieerbaar geheugenveilig, waarbij de enige onveilige code zich bevindt in de getoetste zerocopy-crate. Dit is een aanzienlijke verbetering ten opzichte van libwebp, dat volledig is geschreven in onveilig C met SIMD-intrinsics.

Prestaties

Het is niet voldoende om alleen veiliger te zijn; dat is met image-webp al geregeld. We moesten wpd ook sneller maken, zodat veiligheid niet ten koste ging van de prestaties.

We hebben wpd gebenchmarkt op een subset van onze testdata voor ontwikkelaars. Vergeleken met libwebp is wpd:

  • 1-thread, lossy: 1,19x sneller
  • 1-thread, lossless: 2,74x sneller
  • multi-thread, lossy: 2,68x sneller
  • multi-thread, lossless: 3,19x sneller

Omdat onze testsuite geanimeerde WebP-inhoud mengt met stilstaande beelden, maken onze multi-threaded resultaten gebruik van parallelle beelddecodering, wat leidt tot indrukwekkendere winst. Ons voordeel bij single-threading is een puur algoritmische verbetering.

Deze cijfers zijn afkomstig uit ons benchmarking-framework in de wpd-repository, gebruikmakend van image-webp 0.2.4 en libwebp a1d89ff.

Functies

Het bereiken van feature-pariteit met libwebp is ook een doel voor wpd, aangezien elk scenario dat afhankelijk is van libwebp een upgrade verdient. Vergeleken met image-webp is wpd een volwaardige vervanger voor libwebp, met enkele extra functies:

Decoder functieimage-webplibwebpwpd
Lossy WebP☑☑☑
Lossless WebP☑☑☑
Alpha-transparantie☑☑☑
Animatie met samengestelde frames☑☑☑
Animatieduur en loop-aantal☑☑☑
Animatie terugspoelen/resetten☑☑☑
Ruwe animatie subframe decodering☐⚠¹☑
Inspectie van geometrie, blend en disposal per frame zonder decodering☐☑☑
Inspectie van afmetingen en alpha zonder decodering☑☑☑
ICC, EXIF en XMP extractie☑☑☑
RGB/RGBA output☑☑☑
BGR/BGRA/ARGB output☐☑☑
Premultiplied alpha output☐☑☑
YUV420P output⚠²☑☑
YUVA420P output☐☑☑
RGB565 en RGBA4444 output☐☑☑
BGR565 en BGRA4444 output☐☐☑
Ingebouwde cropping☐☑☑
Ingebouwde scaling☐☑☑
Scaling met automatische behoud van aspectratio☐☑☑
Verticale flip☐☑☑
Selecteerbare eenvoudige/geavanceerde chroma upsampling☑☑☑
Optionele bypass van lossy in-loop filtering☐☑☑
Color/alpha dithering controls☐☑☐
Incrementele decodering via toegevoegde bytes☐☑☑
Incrementele decodering via cumulatieve borrowed buffer☐☑☑
Toegang tot voltooide rijen voordat still-image decode klaar is☐☑☑
Output buffer beheerd door aanroeper☑☑☑
Configureerbare output strides, inclusief negatieve strides☐☑☑
Interne multithreaded decodering☐☑☑
Expliciete instelling voor aantal threads☐☐³☑
Parallelle animatie frame decode-ahead☐☐☑
Configureerbare pixel-count limiet voor frame allocatie/decode☐☐☑
Expliciete geoptimaliseerde SIMD implementaties☐☑☑
C ABI☐☑☑
Rust API☑☐☑

Toelichtingen bij de tabel: ¹ Vereist het demuxen van de frame-payload en het doorgeven hiervan aan de image-decoder. De animatie-decoder geeft samengestelde canvases terug. ² Wordt blootgesteld door de low-level VP8-decoder; de aanroeper moet de VP8-payload uit de WebP-container extraheren. De volledige WebP-decoder geeft RGB/RGBA output. ³ Biedt een boolean om threading in te schakelen, in plaats van een specifiek gevraagd aantal threads.

Opmerking: Formaat- en verwerkingsrijen beschrijven de mogelijkheden voor stilstaande beelden. libwebp bevat libwebpdemux; de samengestelde animatie-API ondersteunt minder formaten en opties. De subframe-modus van wpd sluit crop/scale/flip uit, en de partial-row API sluit animaties en getransformeerde output uit.

Doelen

We willen zoveel mogelijk teruggeven aan open source. Dit project is onze derde toevoeging aan onze open source-catalogus, samen met fcvvdp en fmetrics. De release van wpd betekent dat we officieel meer grote open source-projecten hebben dan closed source (Iris-WebP en de nog niet uitgebrachte Aperture). We willen dat deze verhouding in de toekomst nog verder doorslaat naar open source, en we committeren ons eraan om ons open werk te ondersteunen als eersteklas doelen, niet anders dan onze gesloten encoders.

Om onze beveiligingsdoelen voor wpd verder te brengen, onderzoeken we partnerschappen met cybersecuritybedrijven die geïnteresseerd zijn in het beveiligen van de meest kritische software ter wereld. We willen dat iedereen wpd vandaag gratis kan gebruiken; als er iets is dat je hierin tegenhoudt, aarzel dan niet om ons te laten weten wat dat is, zodat we het kunnen oplossen (of push zelf wat code!).

We kijken ernaar uit om te zien dat mensen wpd gaan gebruiken. Het valt onder de meest permissieve open source-licentie die we kunnen hanteren, de BSD 2-Clause. Als je onze ontwikkelingen hebt gevolgd, dan hoor je binnenkort weer van ons, dus blijf op de hoogte – we hopen dat je wpd waardevol vindt!