3 puan yazan GN⁺ 2025-03-21 | 2 yorum | WhatsApp'ta paylaş
  • Skrifa, Rust ile yazılmış yeni bir font işleme kütüphanesi olup Chrome'da font işlemesini daha güvenli hale getirmek için mevcut FreeType'ın yerine geliştirilmiştir
  • Rust'ın bellek güvenliği sayesinde güvenlik sorunları azalır ve font teknolojilerindeki iyileştirme hızı artar
  • FreeType'tan Skrifa'ya geçişle birlikte kod kalitesi yükseldi ve güvenlik düzeltmeleri için gereken süre kısaldı

FreeType'ı neden değiştiriyoruz?

  • Web ortamında güvenilmeyen kaynaklar farklı yerlerden alınabilmeli ve güvenli şekilde kullanılabilmelidir

  • Chrome, web fontlarını güvenli kullanmak için çeşitli güvenlik önlemleri uyguluyordu

    • Sandboxing: Kod güvenli değildir ve fontlar güvenilir olmayabilir, bu yüzden ayrı bir korumalı ortamda çalıştırılır
    • OpenType Sanitizer: Fontlar işlenmeden önce temizlenir ve denetlenir
    • Fuzzing: Font işleme ile ilgili kütüphaneler kapsamlı biçimde test edilir
  • FreeType, Android, ChromeOS ve Linux'ta varsayılan font işleme kütüphanesi olarak kullanılır

    • Güvenlik açığı ortaya çıkarsa çok sayıda kullanıcı etkilenebilir

FreeType'ta ortaya çıkan başlıca güvenlik sorunları

  • 1. Güvenli olmayan bir dil kullanımı
    • FreeType C ile yazıldığı için bellek hataları ve buffer overflow gibi güvenlik açıkları oluşabilir
  • 2. Projeye özgü sorunlar
    • Makro kullanımı nedeniyle açık boyut türlerinin eksikliği
      • Makrolar(FT_READ_*, FT_PEEK_*) açık boyut türlerini (int16_t vb.) gizler
    • Yeni kodda hataların tekrar tekrar ortaya çıkması
      • COLRv1 ve OT-SVG desteği eklenirken sorunlar yaşandı
    • Yetersiz test
      • Karmaşık test fontları üretmek zor olduğu için test kapsamı yetersiz kaldı
  • 3. Bağımlılık sorunları
    • FreeType'ın kullandığı bzip2, libpng, zlib gibi kütüphanelerde tekrar eden sorunlar yaşandı
  • 4. Fuzzing'in sınırları
    • Font dosyaları, karmaşık veri yapıları nedeniyle fuzzing ile bulunamayan sorunlar barındırabilir
      • Fontlar birleşik kurallar ve state machine'ler içerir
      • Geçerli yapılar üretmek zor olduğundan etkili fuzzing yürütmek güçleşir

Skrifa'nın kullanıma alınması ve Chrome'a entegrasyon süreci

  • Chrome'un kullandığı grafik kütüphanesi Skia, font meta verileri ve render işlemleri için FreeType kullanıyordu
  • Chrome, FreeType'ı Skrifa ile değiştirmek için Skia'nın font backend'ini yeniden oluşturdu

Skrifa'nın devreye alınma aşamaları

  • Chrome 128 (Ağustos 2024):
    • Renkli fontlar ve CFF2 gibi daha az kullanılan font biçimlerinde Skrifa denemeli olarak devreye alındı
  • Chrome 133 (Şubat 2025):
    • Linux, Android ve ChromeOS'ta web fontu işlemede Skrifa tamamen devreye alındı
    • Windows ve Mac'te ise sistem font biçimini desteklemediğinde yedek işleyici olarak kullanılır

Güvenlik ve performansın güçlendirilmesi

  • 1. Bellek güvenliğinin güçlendirilmesi
    • Rust varsayılan olarak bellek güvenliği sağlar
    • Ancak performans için bytemuck kütüphanesi kullanılır
      • Güçlü tip yapılarıyla baytların yeniden yorumlanmasının gerektiği durumlarda kullanılır
      • Rust'ın gelecekteki güncellemelerinde güvenli dönüşüm mümkün olduğunda buna geçilmesi planlanıyor
  • 2. Doğruluğun iyileştirilmesi
    • Skrifa, veri yapılarının değişmezliğini (immutable) garanti ederek kod okunabilirliğini, bakım kolaylığını ve çok iş parçacıklı performansı artırır
    • Yaklaşık 700 birim testi ile kod kalitesi doğrulanmıştır
    • fauntlet aracı kullanılarak FreeType ve Skrifa çıktıları karşılaştırıldı → görüntü kalitesinin eşleşip eşleşmediği doğrulandı
  • 3. Kapsamlı test ve güvenlik güçlendirmesi
    • Skrifa ve entegrasyon kodu için Haziran 2024'ten beri fuzzing testleri yürütülüyor
      • Şu ana kadar 39 hata bulundu → bunlar güvenlik açığı değil (görsel hata veya kontrollü çökme)
      • Kod kalitesinin güvenlik sorununa dönüşmeden iyileştirildiği görüldü

Sonuç ve gelecek planları

  • Rust tabanlı Skrifa'nın devreye alınmasıyla güvenlik güçlendi ve kod kalitesi arttı
  • Geliştirme verimliliği yükseldi ve kullanıcılara daha güvenli bir font ortamı sunuldu
  • Gelecekte Linux ve ChromeOS'un sistem fontu işlemesinde de Skrifa'nın kullanılması planlanıyor

2 yorum

 
iolothebard 2025-03-22

Geçen sefer zlib, bu sefer freetype
Eskiler birer birer sahneden çekilirken… insan dünyasına da benziyor.

 
GN⁺ 2025-03-21
Hacker News görüşleri
  • Google'da fuzzing ile bulunan sorunları çözmek için en az 0,25 yazılım mühendisi gerekiyor

    • Bu ek iş yükünü ölçme biçimini beğendim
    • FreeType kullanmasak bile TTF hinting komutlarını tam olarak kullanmanın bir yolu olmasını isterdim
    • Windows ve macOS'ta artık düzgün hinting'i etkinleştirmenin bir yolu yok gibi görünüyor
    • FreeType da 2.7 sürümünden beri varsayılan olarak uygun olmayan hinting kullanıyor
    • Düzgün hinting uygulanmış metnin nasıl göründüğünü merak ediyorsanız ekran görüntüsüne bakabilirsiniz
    • Windows'un XP'den beri font hinting'den vazgeçtiğinden şüpheleniyorum
    • UI ölçeklendirme ve farklı çözünürlüklü ekranlarda raster görselleri görüntülemek bulanıklığa yol açıyor
  • Rust'ın gerçek gücü, güvenliğe doğru kademeli geçiş ve mevcut projelere entegre edilebilme yeteneğidir

    • Büyük çaplı yeniden yazımlara gerek kalmadan bileşenleri tek tek taşıyabilirsiniz
  • Fontların monitör panelinin alt piksel düzenine göre nasıl render edildiğini öğreniyorum

    • Windows, tüm panellerin RGB düzeni kullandığını varsayıyor ve ClearType yazılımı fontları bu varsayıma göre render ediyor
    • Yeni ekran türlerinde metin saçaklanması ortaya çıkıyor
    • MacType veya Better ClearType Tuner gibi üçüncü taraf araçlar var, ancak Chrome ya da Electron'da çalışmıyorlar
    • Yeni panel teknolojileri yaygınlaştıkça alt piksel düzenini grafik katmanına iletecek bir standardı tanımlamaya yönelik çaba gerekiyor
    • Blur Busters tarafında bazı çalışmalar görülüyor, ancak üreticilerin farkındalığı hâlâ yetersiz
  • Skia, gelişmiş metin yerleşimi yapan ve glifleri önbelleğe alan gelişmiş bir kütüphanedir

    • Skia C++ ile yazılmıştır ve Google tarafından yapılmıştır
    • FreeType, glifleri ölçer ve render eder; çeşitli anti-aliasing modlarını ve hinting'i destekler
    • FreeType C ile yazılmıştır ve Google tarafından yapılmamıştır
    • FreeType'ın neden önce Rust ile yeniden yazıldığını merak ediyorum
  • Fontlar, OpenType Sanitizer tarafından işlenmeden önce buradan geçiriliyor

    • Font formatı gerçekten bu kadar kötü mü de dosyaları sanitize etmek gerekiyor diye merak ediyorum
    • Tamsayı taşması, güvenlik açığının nedenlerinden biri olarak tanımlanıyor
    • Birçok dil taşmayı algılamıyor ve RISC-V gibi modern mimariler de taşma tuzağı içermiyor
    • Rust gibi yeni dillerin neden taşma tuzağı içermediğini anlayamıyorum