HN 日本語サマリー

← 一覧へ戻る
プログラミング

メモリ安全なWebPデコーダー

Memory-Safe WebP Decoding (halide.cx)

15 pointsby computerbuster1 コメント

要約

本記事では、libwebpよりも高速で安全なWebPデコーダーであるwpdを紹介しています。Rustで書かれたwpdは、CVE-2023-4863のようなメモリ安全性の脆弱性に対処し、単一スレッドおよびマルチスレッドの両方で優れたパフォーマンスを発揮します。wpdはlibwebpの代替として、セキュリティと速度の両面で改善を提供することを目指しています。

全文翻訳

wpdはlibwebpよりも高速で安全なWebPデコーダーであり、CVE-2023-4863のような脆弱性からWebを保護するために設計されています。同時に、wpdは速度においても現状維持に甘んじることなく、代替手段と比較して優れた単一スレッドパフォーマンスを提供し、マルチスレッドでの並列処理も向上させています。ソースコード: https://github.com/halidecx/wpd 安全性 画像デコーダーやその他の画像処理ライブラリは、OSレベルからサンドボックス化されたブラウザプロセスまで、あらゆる場所で使用されています。また、これらは複雑で信頼できない入力データを処理するため、メモリ安全性のバグに対して脆弱です。CVE-2023-4863は、Chrome、Firefox、Signal、Microsoft Teamsなどを実行する数十億台のデバイスに影響を与えた可能性があり、CISAはこれが実際に悪用されていることを確認し、その後、既知の悪用された脆弱性カタログに追加しました。このような脆弱性は、ほぼすべての消費者向けハードウェアに深刻な影響を与えます。libwebpは過去よりも安全になっている可能性が高いですが、ファジングによってメモリ安全性を「解決」したわけではありません。Chromiumチームによると、深刻度の高いセキュリティバグの約70%はメモリ安全性の問題に起因しています。これを解決するために、wpdはRustで書かれており、パフォーマンスのために手書きのアセンブリルーチンを使用しています。デコーダーに含まれる手書きのSIMDは、注意深くスコープが定められ、正しさが確認されており、主にリスクの低い場所に存在します。それにもかかわらず、環境を強化したい消費者は、手書きのアセンブリなしでwpdをコンパイルできます。これにより、私たちが書いた非SIMDコードは完全に検証可能なメモリ安全性を持つことになり、唯一のunsafeコードは検証済みのzerocopyクレートに含まれるものだけになります。これは、すべてunsafe CでSIMD組み込み関数を使用して書かれたlibwebpよりも大幅な改善です。 パフォーマンス 安全であるだけでは十分ではありません。image-webpはすでにそれをカバーしています。パフォーマンスを犠牲にすることなく安全性を確保するために、wpdをより高速にする必要もありました。開発者テストデータの一部を使用してwpdのベンチマークを行い、libwebpと比較しました。その結果は以下の通りです。 1スレッド、ロッシー: 1.19倍高速 1スレッド、ロスレス: 2.74倍高速 マルチスレッド、ロッシー: 2.68倍高速 マルチスレッド、ロスレス: 3.19倍高速 私たちのテストスイートは、アニメーションWebPコンテンツと静止コンテンツを混在させているため、マルチスレッドの結果は並列画像デコードの恩恵を受け、そこではより印象的な向上が見られます。単一スレッドの優位性は、純粋なアルゴリズムの改善によるものです。これらの数値は、wpdリポジトリのベンチマークハーネスから取得したもので、image-webp 0.2.4とlibwebp a1d89ffを使用しています。 機能 wpdの目標はlibwebpとの機能同等性も達成することです。libwebpに依存するすべてのユースケースはアップグレードに値します。image-webpと比較して、wpdはいくつかの追加機能が含まれた、真のlibwebp代替品です。 機能 | image-webp | libwebp | wpd ---|---|---|--- ロッシーWebP | ☑ | ☑ | ☑ ロスレスWebP | ☑ | ☑ | ☑ アルファ透明度 | ☑ | ☑ | ☑ 合成フレームによるアニメーション | ☑ | ☑ | ☑ アニメーションの期間とループ回数 | ☑ | ☑ | ☑ アニメーションの巻き戻し/リセット | ☑ | ☑ | ☑ 生の(Raw)アニメーションサブフレームデコード | ☐ | ⚠¹ | ☑ デコードせずに画像寸法とアルファの検査 | ☐ | ☑ | ☑ ICC、EXIF、XMP抽出 | ☑ | ☑ | ☑ RGB/RGBA出力 | ☑ | ☑ | ☑ BGR/BGRA/ARGB出力 | ☐ | ☑ | ☑ プリマルチプライドアルプ出力 | ☐ | ☑ | ☑ YUV420P出力 | ⚠² | ☑ | ☑ YUVA420P出力 | ☐ | ☑ | ☑ RGB565およびRGBA4444出力 | ☐ | ☑ | ☑ BGR565およびBGRA4444出力 | ☐ | ☐ | ☑ 組み込みクロッピング | ☐ | ☑ | ☑ 組み込みスケーリング | ☐ | ☑ | ☑ 自動アスペクト比維持によるスケーリング | ☐ | ☑ | ☑ 垂直反転 | ☐ | ☑ | ☑ 選択可能なシンプル/ファンシー色差アップサンプリング | ☑ | ☑ | ☑ ロッシーインループフィルタリングのオプションバイパス | ☐ | ☑ | ☑ 色/アルファディザリング制御 | ☐ | ☐ | ☑ 追加バイトによる段階的デコード | ☐ | ☑ | ☑ 累積バッファによる段階的デコード | ☐ | ☑ | ☑ 静止画像デコード完了前に完了した行へのアクセス | ☐ | ☑ | ☑ 呼び出し元所有の出力バッファ | ☑ | ☑ | ☑ 負のストライドを含む設定可能な出力ストライド | ☑ | ☑ | ☑ 内部マルチスレッドデコード | ☐ | ☑ | ☑ 明示的なスレッド数設定 | ☐ | ☐³ | ☑ 並列アニメーションフレームの先読み | ☐ | ☐ | ☑ フレーム割り当て/デコード前のピクセル数制限設定 | ☐ | ☐ | ☑ 明示的な最適化SIMD実装 | ☐ | ☑ | ☑ C ABI | ☑ | ☑ | ☑ Rust API | ☑ | ☐ | ☑ ¹フレームペイロードをデマルチプレックスし、画像デコーダーに渡す必要があります。そのアニメーションデコーダーは合成キャンバスを返します。 ²低レベルVP8デコーダーによって公開されます。呼び出し元はWebPコンテナからVP8ペイロードを抽出する必要があります。その完全なWebPデコーダーはRGB/RGBAを出力します。 ³スレッド数を要求するのではなく、スレッドを有効にするブール値を提供します。 目標 私たちは可能な限りオープンソースに貢献したいと考えています。このプロジェクトは、fcvvdpとfmetricsに続く、私たちのオープンソースカタログへの3番目の追加です。wpdのリリースにより、私たちは公式にクローズドソース(Iris-WebPおよび現在未リリースのAperture)よりも多くの主要なオープンソースプロジェクトを持つことになります。将来的にはこの比率をさらにオープンソースに偏らせたいと考えており、クローズドエンコーダーと同様に、私たちのオープンワークをファーストクラスのサポートターゲットとして常にサポートすることを約束します。wpdのセキュリティ目標をさらに推進するため、世界の最も重要なソフトウェアを保護することに関心のあるサイバーセキュリティ企業との提携を検討しています。今日、誰もがwpdを無料で利用できるようにしたいと考えています。もし何か障害があれば、遠慮なくお知らせください。対応するか、ご自身でコードをプッシュしてください。wpdを採用していただけることを楽しみにしています。これは、私たちが管理できる最も寛容なオープンソースライセンスであるBSD 2-Clauseの下で提供されています。私たちの開発をフォローしている方は、まもなく私たちから再び耳にするでしょう。ご期待ください。wpdが価値あるものとなることを願っています!メールでお問い合わせください。