Webフォントのメモリ安全性を強化
(developer.chrome.com)- Skrifa は Rust で書かれた新しいフォント処理ライブラリで、既存の FreeType を置き換え、Chrome でより安全にフォント処理を行うために開発された
- Rust のメモリ安全性によりセキュリティ問題が減少し、フォント技術の改善速度も向上
- FreeType から Skrifa への移行により、コード品質が向上し、セキュリティ修正にかかる時間も短縮
FreeType を置き換える理由
-
Web 環境では、信頼できないリソースをさまざまな出所から取得して安全に利用できる必要がある
-
Chrome では Web フォントを安全に利用するため、複数のセキュリティ対策を適用してきた
- サンドボックス化(Sandboxing): コードが安全ではなく、フォントも信頼できないため、別個の保護環境で実行
- OpenType Sanitizer: フォント処理の前にフォントを整理して検査
- ファジング(Fuzzing): フォント処理関連ライブラリを広範囲にテスト
-
FreeType は Android、ChromeOS、Linux で標準のフォント処理ライブラリとして使われている
- セキュリティ脆弱性が発生すると、多くのユーザーに影響するリスクがある
FreeType で発生した主なセキュリティ問題
- 1. 安全でない言語の使用
- FreeType は C で書かれているため、メモリエラーやバッファオーバーフローなどのセキュリティ脆弱性が発生しうる
- 2. プロジェクト固有の問題
- マクロ使用による明示的なサイズ型の不足
- マクロ(
FT_READ_*,FT_PEEK_*) が明示的なサイズ型(int16_t など)を隠している
- マクロ(
- 新しいコードでバグが繰り返し発生
- COLRv1 および OT-SVG サポート追加時に問題が発生
- テスト不足
- 複雑なテスト用フォントの生成が難しく、テスト不足の問題が生じた
- マクロ使用による明示的なサイズ型の不足
- 3. 依存関係の問題
- FreeType が使用する bzip2、libpng、zlib などのライブラリで繰り返し問題が発生
- 4. ファジングの限界
- フォントファイルは複雑なデータ構造のため、ファジングで発見されない問題が生じる
- フォントには複合的な規則と状態機械(state machine)が含まれる
- 有効な構造の生成が難しく、効果的なファジングを進めにくい
- フォントファイルは複雑なデータ構造のため、ファジングで発見されない問題が生じる
Skrifa の導入と Chrome への適用プロセス
- Chrome で使われるグラフィックスライブラリ Skia は、フォントメタデータとレンダリングに FreeType を使用している
- Chrome は FreeType を Skrifa に置き換えるため、Skia のフォントバックエンドを新たに構築した
Skrifa 導入段階
- Chrome 128 (2024年8月):
- カラーフォントや CFF2 のような、あまり使われないフォント形式に対して Skrifa を試験適用
- Chrome 133 (2025年2月):
- Linux、Android、ChromeOS で Web フォント処理に Skrifa を全面導入
- Windows と Mac では、システムがフォント形式をサポートしない場合の代替処理系として使用
セキュリティと性能の強化
- 1. メモリ安全性の強化
- Rust は基本的にメモリ安全性を保証する
- ただし、性能のために bytemuck ライブラリを使用
- 強力な型構造を持ち、バイト列の再解釈が必要な場合に使用
- Rust の今後の更新で安全な変換が可能になれば、その機能へ移行する予定
- 2. 正確性の改善
- Skrifa はデータ構造の不変性(immutable)を保証することで、コードの可読性・保守性・マルチスレッド性能を高めている
- 約 700件のユニットテスト でコード品質を検証
- fauntlet ツールを使って FreeType と Skrifa の出力を比較し、描画品質が一致するか確認
- 3. 広範なテストとセキュリティ強化
- Skrifa および統合コードに対して 2024年6月からファジングテスト を実施
- 現在までに 39 件のバグを発見 → セキュリティ脆弱性ではない(視覚的な不具合または制御されたクラッシュ)
- セキュリティ問題につながらない形でコード品質が改善されたことを確認
- Skrifa および統合コードに対して 2024年6月からファジングテスト を実施
結論と今後の計画
- Rust ベースの Skrifa 導入により、セキュリティ強化とコード品質改善の効果
- 開発生産性が向上し、ユーザーにより安全なフォント環境を提供
- 今後は Linux と ChromeOS のシステムフォント処理にも Skrifa を適用する計画
2件のコメント
前は zlib、今度は freetype…
古参たちが一人また一人と押し流されていくのは…人の世と似ていますね
Hacker Newsの意見
Googleでfuzzingによって発見された問題を修正するには、少なくとも0.25人分のソフトウェアエンジニアが必要
Rustの真の強みは、安全性への段階的な移行と既存プロジェクトに統合できる能力にある
フォントがモニターパネルのサブピクセル配列に応じてどのようにレンダリングされるかを学んでいる
Skiaは高度なテキストレイアウトを行い、グリフをキャッシュする高機能ライブラリである
フォントはOpenType Sanitizerで処理される前に通される