3 ポイント 投稿者 GN⁺ 2025-03-21 | 2件のコメント | WhatsAppで共有
  • 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 が使用する bzip2libpngzlib などのライブラリで繰り返し問題が発生
  • 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 件のバグを発見 → セキュリティ脆弱性ではない(視覚的な不具合または制御されたクラッシュ)
      • セキュリティ問題につながらない形でコード品質が改善されたことを確認

結論と今後の計画

  • Rust ベースの Skrifa 導入により、セキュリティ強化とコード品質改善の効果
  • 開発生産性が向上し、ユーザーにより安全なフォント環境を提供
  • 今後は Linux と ChromeOS のシステムフォント処理にも Skrifa を適用する計画

2件のコメント

 
iolothebard 2025-03-22

前は zlib、今度は freetype…
古参たちが一人また一人と押し流されていくのは…人の世と似ていますね

 
GN⁺ 2025-03-21
Hacker Newsの意見
  • Googleでfuzzingによって発見された問題を修正するには、少なくとも0.25人分のソフトウェアエンジニアが必要

    • こうした追加作業の測り方は気に入っている
    • FreeTypeを使わなくても、TTFヒンティング命令を完全に利用できる方法があればよいと思う
    • WindowsとmacOSでは、もはや適切なヒンティングを有効にする方法がないように見える
    • FreeTypeも2.7以降は不適切なヒンティングをデフォルトにしている
    • 適切にヒンティングされたテキストがどう見えるか気になるなら、スクリーンショットを参照できる
    • WindowsはXP以降、フォントヒンティングを諦めたのではないかと疑っている
    • UIスケーリングや、さまざまな解像度の画面でラスタ画像を見ることがぼやけの原因になっている
  • Rustの真の強みは、安全性への段階的な移行と既存プロジェクトに統合できる能力にある

    • 大規模な書き直しをせずに、コンポーネントを1つずつ移行できる
  • フォントがモニターパネルのサブピクセル配列に応じてどのようにレンダリングされるかを学んでいる

    • WindowsはすべてのパネルがRGB配列を使うと仮定しており、ClearTypeソフトウェアはその仮定に基づいてフォントをレンダリングする
    • 新しいディスプレイタイプではテキストのフリンジが発生する
    • MacTypeやBetter ClearType Tunerのようなサードパーティーツールは存在するが、ChromeやElectronでは動作しない
    • 新しいパネル技術が一般化するにつれて、サブピクセル配列をグラフィックレイヤーに伝える標準を定義する取り組みが必要だ
    • Blur Bustersでいくつかの取り組みは見られるが、ベンダーの認識はまだ不足している
  • Skiaは高度なテキストレイアウトを行い、グリフをキャッシュする高機能ライブラリである

    • SkiaはC++で書かれており、Googleが作った
    • FreeTypeはグリフを計測してレンダリングし、さまざまなアンチエイリアスモードとヒンティングをサポートする
    • FreeTypeはCで書かれており、Google製ではない
    • なぜFreeTypeが先にRustで再実装されたのか気になる
  • フォントはOpenType Sanitizerで処理される前に通される

    • ファイルをサニタイズしなければならないほど、フォント形式はそんなにひどいのだろうかと思う
    • 整数オーバーフローが脆弱性の原因の1つとして特定されている
    • 多くの言語はオーバーフローを検出せず、RISC-Vのような現代的なアーキテクチャにもオーバーフロートラップは含まれていない
    • Rustのような新しい言語が、なぜオーバーフロートラップを含まないのか理解できない