重大なWebPゼロデイ脆弱性CVE-2023-4863を見つけて修正する方法
2023年10月5日
0 分で読めます先月、Apple Security Engineering and Architecture(SEA)は、トロント大学Munk SchoolのCitizen Labと共同で、2件の重大な脆弱性(CVE-2023-4863およびCVE-2023-5129)を特定しました。この脆弱性は、Chromiumベースのブラウザーや、Googleが提供するwebmproject/libwebpライブラリを悪用する、細工されたWebP画像に関するものです。脆弱性の詳細と最近の経緯については、以前のブログ記事をご覧ください。
特に、libwebpの脆弱性はブラウザーだけでなく、開発者エコシステム、オペレーティングシステム、コンテナにも影響します。libwebpの影響を受けることが判明したエコシステムとコンテナは以下のとおりです。

この脆弱性の影響範囲の広さは、さまざまな開発者エコシステムで直接依存関係としても、推移的依存関係としても検出されることからわかります。Cocoapods、Swift、Pythonのプロジェクトでは主に推移的依存関係として見つかるため、開発者が影響を把握しにくい場合があります。しかし、Snyk ContainerとSnyk Open Sourceはいずれも該当するパッケージを検出できます。Snykを今すぐ無料で利用して、プロジェクトに該当パッケージが含まれているか確認できます。

libwebpの影響について包括的な分析を行いましたが、セキュリティ専門家は今も、アプリケーション、エコシステム、オペレーティングシステムにおけるlibwebpのさまざまな用途を調査しています。この脆弱性は、.webp画像コーデックを使用してコンテンツをレンダリングするソフトウェアコンポーネント(ブラウザーやデザインツールなど)に影響するため、その範囲は今後も拡大し続けるでしょう。そのため、libwebpに関する最新情報を常に確認することが重要です。
このブログ記事では、この脆弱性がソフトウェアエコシステムに及ぼす影響をより深く理解し、対処する際にすぐ参照できる情報を提供します。
2023年10月3日時点で、このlibwebpの脆弱性を追跡していることが確認されているCVEは次のとおりです。
CVE-2023-4863:2023年9月11日に登録。CVSSスコアは
9.6、EPSSスコアは31.86%(97パーセンタイル)。注:詳細が明らかになる前、このCVEのスコアは8.8(「高」)と評価されていました。CVE-2023-5129:2023年9月25日に登録。CVSSスコアは最大値の
10でしたが、CVE採番機関として割り当てられていたGoogleにより、重複として2023年9月27日に後日却下されました。
脆弱性の詳細と最近の経緯については、以前のブログ記事をご覧ください。この記事では、以下の修正方法について説明します。
1. libwebpの使用箇所を特定する
ゼロデイ脆弱性への対処で最も難しいのは、自分の環境が影響を受けているか、またその箇所を特定することです。libwebpの場合も例外ではありません。libwebpは、プロジェクト内の依存関係として直接、または推移的依存関係として間接的に含まれている可能性があります。影響を把握しないまま、何らかの形で影響を受けている可能性が高いため、適切に対処するには使用箇所の特定が不可欠です。影響が及ぶ可能性がある対象には、次のようなものがあります。
libwebpライブラリに直接依存するソフトウェア、または推移的依存関係を介して間接的に依存するソフトウェアは、すべてこの脆弱性の影響を受けます。.webp画像のエンコードやデコードを行うソフトウェアは、すべてこの脆弱性の影響を受けます。
.webp画像を処理するツールをバンドルしているオペレーティングシステムやコンテナイメージは、すべてこの脆弱性の影響を受けます。
この脆弱性が開発者エコシステムに広範な影響を及ぼす要因の一つは、高水準プログラミング言語が基盤となるlibwebpライブラリを使用していることです。たとえば、2D・3Dゲームの制作に使われるGoDot Game Engineはlibwebpライブラリに依存しており、広く利用されているFFmpegユーティリティもlibwebpライブラリを使用しています。
Snykでlibwebpの脆弱性を検出する
Snykを使えば、libwebpの脆弱性を無料でさまざまな方法で検出できます。Snyk CLIを使うと、プロジェクトをローカルでテストできます。
アプリケーションの場合は、Snyk CLIで
snyk test --unmanagedを実行すると、リポジトリ内の管理対象外の依存関係を比較して、個々のパッケージとその脆弱性を検出できます。コンテナの場合は、
snyk container testを実行すると、脆弱なバージョンのlibwebpに依存するオペレーティングシステムのパッケージを検出できます。
Gitリポジトリ内のすべてのプロジェクトをスキャンすることもできます。使用している直接および推移的依存関係の一覧がレポートされます。このレポートで、libwebpへの依存の有無や、依存関係グラフ内で何経路から使用されているかを確認できます。また、すべてのプロジェクトを対象に「CVE-2023-4863」をすばやく検索することも可能です。

2a. libwebpを1.3.2以降にアップグレードする(オープンソース)
自動修正:SnykをGitリポジトリに接続すると、可能な場合に依存関係グラフを更新するプルリクエストを作成できます。その後、アプリケーションを再ビルドします。
手動修正:アプリケーションで
libwebpを直接依存関係として使用している場合は、依存関係ファイルを直接編集し、1.3.2以降にアップグレードできます。その後、アプリケーションを再ビルドします。手動修正:アプリケーションで
libwebpを推移的依存関係として使用している場合は、推移的なlibwebp依存関係が1.3.2以降になる、直接依存関係のバージョンを特定してください。その後、アプリケーションを再ビルドします。
2b. libwebpを1.3.2以降にアップグレードする(コンテナ)
自動修正:SnykをGitリポジトリに接続すると、可能な場合にDockerfileのベースイメージを更新するプルリクエストを作成できます。
https://snyk.io/test/docker/<image_name>を使って、提案されたベースイメージへのアップグレード後も脆弱性が残るかどうかを確認します。許容できるアップグレード方法を特定したら、コンテナを再ビルドします。手動修正:イメージに脆弱なバージョンの
libwebpが含まれており、ベースイメージをアップグレードできない、またはアップグレードを希望しない場合は、Snyk Containerの修正ガイダンスを使って自分でアップグレードできます。例:Debianベースのイメージで、Snyk Container CLIが次のように報告した場合:
ライブラリを手動でアップグレードするには、次のような内容を追加します。
3. 自動PRを活用してプロジェクトを監視する
この脆弱性はゼロデイであるため、影響が日々明らかになっています。そのため、問題を修正するための新たな推奨事項を確認できるよう、定期的にプロジェクトを積極的に監視することが重要です。Snykを利用している場合は、必ずプロジェクトの監視を有効にしてください(Snykアプリにリポジトリをインポートすると、デフォルトで有効になります)。有効にすると、更新時に実施されるテストに加え、Snykがプロジェクトを毎日自動でテストします。
こうした毎日のテストでは、新たな修正を適用できる箇所など、セキュリティを強化できるタイミングが自動で特定されます。たとえば、libwebpがpackage Aの推移的依存関係である場合、package Aがlibwebpの1.3.2以降を使用するバージョンをリリースする必要があります。現時点ではそのバージョンがなくても、翌日や翌週にリリースされる可能性があります。snyk monitorを使うと毎日テストが実行され、新しいバージョンが利用可能になった際にはPRが送られ、libwebpをアップグレードして脆弱性を修正できます。
また、この脆弱性に対する追加の修正が行われた場合や、新たな脆弱性につながる攻撃ベクトルが見つかった場合、SnykはPRなどを通じて通知します。これにより、新たな問題が発生した際に必要な対応をいち早く把握できます。
libwebpを使用するアプリを安全に保つ
Snykは、libwebpを直接または間接的な依存関係として使用するアプリケーション向けに、ワンクリックで修正PRを作成します。
