Chrome、WebPのヒープバッファオーバーフロー脆弱性を修正
(chromereleases.googleblog.com)- デスクトップ版 Chrome の Stable および Extended Stable チャネル向けアップデートが、WebP のヒープバッファオーバーフロー脆弱性の修正を含んで配布された
- 新しいビルドは Mac・Linux で 116.0.5845.187、Windows で 116.0.5845.187/.188 となっており、数日から数週間にわたって順次適用される
- 今回のリリースに含まれるセキュリティ修正は 1 件で、CVE-2023-4863 は Critical に分類されている
- Apple SEAR と University of Toronto Munk School の The Citizen Lab が、2023 年 9 月 6 日にこの脆弱性を報告した
- Google は 実際の悪用事例 が存在すると明らかにしており、修正版が適用されるまではバグの詳細情報へのアクセスが制限される可能性がある
デスクトップ Chrome チャネルのアップデート
- Stable および Extended Stable チャネルが、デスクトップ向けの新しいビルドに更新された
- プラットフォーム別の Stable チャネルのバージョンは次のとおり
- Mac: 116.0.5845.187
- Linux: 116.0.5845.187
- Windows: 116.0.5845.187/.188
- Extended Stable チャネルも別バージョンで配布される
- Windows: 116.0.5845.188
- Mac: 116.0.5845.187
- アップデートは 数日から数週間 にわたって段階的に配布される
- 今回のビルドの全変更一覧は log で確認できる
セキュリティ修正: CVE-2023-4863
- 今回のリリースには セキュリティ修正 1 件 が含まれる
- 外部研究者が貢献した主な修正は次の脆弱性
- Critical CVE-2023-4863: WebP のヒープバッファオーバーフロー
- バグ番号: 1479274
- 報告者: Apple Security Engineering and Architecture(SEAR)、University of Toronto Munk School の The Citizen Lab
- 報告日: 2023 年 9 月 6 日
- 報奨金額: $NA
実際の悪用と情報公開の制限
- Google は CVE-2023-4863 のエクスプロイト が実環境で存在すると明らかにした
- バグの詳細情報やリンクへのアクセスは、大多数のユーザーが修正版へアップデートするまで制限される可能性がある
- 同じバグが、他のプロジェクトも依存している サードパーティライブラリ に存在し、まだ修正されていない場合にも制限が維持される可能性がある
セキュリティバグの検出と報告経路
- 多くのセキュリティバグは次のツールで検出されている
- リリースチャネルの切り替え方法は Chromium release channels 案内 で確認できる
- 新しい issue は crbug.com に報告でき、支援は Chrome community help forum で受けられる
1件のコメント
Hacker News の意見
Google Chrome では WebP 画像はレンダラープロセスでデコードされるため、エクスプロイトが成功しても、サンドボックス内でのレンダラーコード実行までに限られる
レンダラーは非常に複雑なので毎年多くのエクスプロイトが見つかるが、レンダラーでコード実行を得ても、通常のWebページが持つ権限を大きく超えることはできない
特にローカルファイルシステム上のファイルを見たり残したりすることはできず、別ドメインのCookieも読めない
ただちに最優先というわけではないが、野生でそうしたエクスプロイトがすでに出回っているのでなければ、大きな不便がないタイミングでできるだけ早くパッチを当てるべき
1つのサイトやフロントエンドに縛られないという点で、強化版XSSに近い
あ、間違ったスレッドに付けてしまった。https://news.ycombinator.com/item?id=37479576 の「jpeg is good enough」への返信のつもりだった
それにJavaScriptをオフにしていても、突然Webサイトが依然としてコードを実行できるようになるということではないのか?
だから、ブラウザ開発者が新フォーマットの導入に慎重なことに、より共感するようになった
WebPはJPEGに対する利点が大きくなく、主に透明度くらいで、成功も限定的だった
それなのに今や複数の高優先度のセキュリティホールにつながり、libwebpにリンクしているあらゆる場所で、今後1か月にわたってパッチを配布しなければならない状況だ
新しいことをするなという意味ではないが、開発者はコストをかなり大きく過小評価しがちだと思う
WebPエコシステムがはるかに未成熟なのは確かだが、より古いフォーマット処理コードにもセキュリティ問題はかなりあったはずだと確信している
それでも論理は妥当だ。数週間前までは、ネットユーザーたちはJPEG XLをできるだけ早く導入すべきで、そのためにはブラウザ開発者が「参照デコーダーのコードをコードベースに含めるだけ」で「コストはほとんどない」と主張する雰囲気だった
他の画像フォーマットやライブラリもバグだらけである可能性は高いが、主要ソフトウェアで使われていないので誰も気にしない
特に、こうしたバグを見つけて悪用できる能力のある人にとっては、時間に対する見返りが悪いからだ
長く使われないからといってバグが減るわけではない
画像エンコーダーとデコーダー、そして他のエンコーダー/デコーダーが安全でない言語を使わなければ、こうしたバグを作り込む可能性は低くなる
それとは別に、必要以上にコードを複雑にする文化や、細部をきちんと理解していない開発者たちも問題だと思う
この修正は今日の Firefox 117.0.1 と Fenix 117.1.0 に入っている: https://hg.mozilla.org/releases/mozilla-release/rev/e245ca21...
参考までに、image crateには安全なRustで書かれた WebPデコーダー実装 がある: https://github.com/image-rs/image
長い間かなり未完成だったが、昨年多くのWebP機能が実装された
Chromiumは今ではRust依存関係の使用を認めるポリシーがあるので、Chromiumも導入を始められるのではないか?
問題の元のコミット: https://github.com/webmproject/libwebp/commit/f75dfbf23d1df1...
このバグを修正するコミット: https://github.com/webmproject/libwebp/commit/902bc919033134...
元のコミットはハフマンデコーダを最適化したもの。このデコーダはよく知られた最適化を使い、Nビットを先読みして、実際に何ビットを消費すべきか、どのシンボルをデコードすべきかを決める。あるいは、複数シンボルのNビット接頭辞であれば、残りのビットについてどのテーブルを参照すべきかを決める。
旧バージョンは短いシンボルにはルックアップテーブルを使っていたが、長いシンボルにはグラフ探索が必要だった。新バージョンはルックアップテーブルの配列を使って改善した。各エントリは
(nbits, value)を持ち、nbitsは消費するビット数、valueは通常シンボルである。ただしnbitsが N を超える場合、valueはテーブルインデックスとして解釈され、nbitsはそのサブツリーで最も長いコード長として再解釈される。そのため、後続の各テーブルは2^(nbits - N)個のエントリを持つ必要がある。ルートテーブルは常に2^Nエントリに固定される。新バージョンはシンボル数を基準に最大エントリ数(
kTableSize)を計算していた。当然ながらハフマン木は信頼できない入力に由来し、nbitsが非常に大きくなるケースは容易に想像できる。VP8 Lossless では具体的に最大15ビットまで許容されるため、すべての LUT がそれぞれ別個の補助テーブルにマップされると、可能な最大テーブルは2^N + 2^15エントリになる。これを作るのにもそれほど多くのシンボルは必要なく、各テーブルにつき16-N個のシンボルで十分である。興味深いことに、コード自体にはテーブルサイズだけを計算するモード(
root_table == NULLでVP8LBuildHuffmanTableを呼ぶ)があったが、なぜか使われておらず、固定の最大サイズを仮定していた。そのため、エントリ数が最大になるようにハフマン木を作ると、割り当て領域を越えて書き込んでしまう。なぜこうなったのかは理解できる。ハフマンデコード段階は多くの圧縮フォーマットで計算量が最も大きい部分の一つなので、小さな改善も重要だ。上記の最適化はよく知られているが、長いコードパスは一般にまれだと考えられており、最適化の優先度は低かった。元のコミットメッセージはこの仮定に反論し、マージされ得た。メモリ安全な言語がこの問題を防げたかどうかも確信しにくい。珍しく、ここではオーバーフローチェックを積極的に避けたくなるケースだからだ。
[1] ただしメモリ破壊はタイトなループではなくテーブル構築中に発生するので、部分的なオーバーフローチェックは大いに役立ったはずだ。実際の修正では
ReadSymbol関数はまったく変更されていない。それでもタイトなループの安全性は正当化される必要があり、誤った正当化はすべてを台無しにし得る。境界チェックが不要だという話が正しいなら問題ない。WUFFS はランタイム境界チェックを出力しない。
しかし今回のように、ソフトウェアが境界を越えていて誤っている場合、WUFFS ではコンパイルされない。
「それは不可能だ」と思うかもしれないし、WUFFS が汎用プログラミング言語ならその通りだ。ライスの定理によれば、非自明な意味的性質は決定不能である。
幸い、WUFFS は汎用言語ではない。ほとんどのソフトウェアは WUFFS では書けないが、画像コーデックは書ける。
ただ、この種の問題を捕まえる自動テストを作れたのかも気になる。
個人的に扱うコードでは、一部の計算を別関数に切り出して独立にテストできる。ここでは性能のために難しかったのかもしれないが、確信はない。
BuildHuffmanTableの 範囲外書き込み の修正https://github.com/webmproject/libwebp/commit/902bc919033134...
Google がこのバグを見つけた後、libwebp 用のファザーを最適化し、その結果さらに多くのバグを見つけている、という意味かもしれない。
Apple が報告したもののように見え、このセキュリティアップデートと非常によく似ている: https://support.apple.com/en-us/HT213906
そのため、かなり可能性は高そうだ。Apple が内部的に ImageIO で libwebp を使っているか、似たようなミスをした可能性がある。
画像コーデックには脆弱性の長い歴史がある。
実際の画像処理は、メモリ安全な FORTRAN IV でも書けるほどきれいな線形コードになり得るが、圧縮が入ると可変長データ構造やポインタ追跡などが多くなる。
そこに高速に実行しなければならないというプレッシャーも加わる。
これも Electron に影響があるのか? もしそうなら、どのバージョンなのか?
興味深いのは、内部的に Electron を使っている Signal Desktop が Linux ではサンドボックスなしで実行されること [1][2]
[0] https://github.com/electron/electron/pull/39824
[1] https://github.com/signalapp/Signal-Desktop/issues/5195
[2] https://github.com/signalapp/Signal-Desktop/pull/4381
これを現実的に悪用する経路はあるのか?
聞いたところでは、64ビットでは ヒープスプレー はもはや実用的ではないらしい
メモリ内に上書きできる予測可能なオブジェクトがあるのか?
64ビットでもカーネルエクスプロイトではヒープスプレーは今でも確実に使われている。V8 エクスプロイトで人々がどんなプリミティブを使っているのかはよく分からない