Web fontlarında bellek güvenliğinin güçlendirilmesi
(developer.chrome.com)- 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_tvb.) gizler
- Makrolar(
- 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ı
- Makro kullanımı nedeniyle açık boyut türlerinin eksikliği
- 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
- Font dosyaları, karmaşık veri yapıları nedeniyle fuzzing ile bulunamayan sorunlar barındırabilir
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ü
- Skrifa ve entegrasyon kodu için Haziran 2024'ten beri fuzzing testleri yürütülüyor
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
Geçen sefer
zlib, bu seferfreetype…Eskiler birer birer sahneden çekilirken… insan dünyasına da benziyor.
Hacker News görüşleri
Google'da fuzzing ile bulunan sorunları çözmek için en az 0,25 yazılım mühendisi gerekiyor
Rust'ın gerçek gücü, güvenliğe doğru kademeli geçiş ve mevcut projelere entegre edilebilme yeteneğidir
Fontların monitör panelinin alt piksel düzenine göre nasıl render edildiğini öğreniyorum
Skia, gelişmiş metin yerleşimi yapan ve glifleri önbelleğe alan gelişmiş bir kütüphanedir
Fontlar, OpenType Sanitizer tarafından işlenmeden önce buradan geçiriliyor