
Google逐步将Chrome字型处理函式库从FreeType搬迁至Skrifa。Skrifa是一款以Rust开发的新函式库,目的是提升字型处理的记忆体安全性,减少安全漏洞,并提升开发效率。这项变更已在Chrome 133上实行,首先应用于Linux、Android和ChromeOS的网页字型处理,计画之后扩展至作业系统字型处理上。
Rust语言的记忆体安全特性,被认为能有效解决由C语言开发的FreeType,长期存在的记忆体管理问题,如阵列越界存取、使用后释放(Use-After-Free)及整数溢位等安全漏洞。
FreeType字型处理函式库长期以来广受使用,负责解析、转换和渲染字型,使其适用于各种萤幕与解析度。Chrome过去在Android、ChromeOS及Linux平台上都依赖FreeType进行字型运算,如字距调整、轮廓载入,与字型显示最佳化处理TrueType字型微调(Hinting)等。
随着网路应用的蓬勃发展,浏览器需要能更安全地处理来自未知来源的网页字型,而以C语言开发的FreeType函式库,其低层记忆体管理机制使得安全性维护成本不断攀升。Google在内部安全评估中发现,仅是透过模糊测试(Fuzzing)发现与修复FreeType漏洞,每年至少需要0.25位全职工程师的资源投入,即使如此,仍有部分漏洞无法及时拦截,甚至在漏洞已进入用户端后才被发现。
这些问题促使Google寻找新的解决方案,而Rust内建的记忆体安全机制成为理想选择,以Rust开发的Skrifa属于Fontations函式库家族的一部分,并与Chrome的图形函式库Skia整合。Skrifa的开发以几个核心原则为基础,其资料结构设计为不可变,提升程序的可读性与可维护性,同时提高多执行绪运算的效率。
Google由于要确保Skrifa与FreeType的字型品质相符,还开发了一款名为fauntlet的工具,以大亮字型测试比对Skrifa与FreeType的输出,确保新系统能够维持既有的字型显示品质。此外,Google在Skia内部进行了广泛的像素对比测试,以验证不同字型渲染模式,如反锯齿与字型微调模式下,Skrifa的表现仍与FreeType一致。
Skrifa自2024年6月开始持续进行模糊测试,至今已发现39个错误,不过这些错误皆非安全性漏洞,仅影响视觉呈现或导致受控的崩溃,不会造成可利用的安全风险。Google在开发中选择使用Rust bytemuck函式库,执行安全的型别转换,避免Rust内部不允许的直接位元转换操作,进一步保证记忆体存取的安全性。
目前,Skrifa已全面取代Chrome 133上的网页字型处理功能,并计画在未来进一步扩展至作业系统字型的解析工作,首先从Linux与ChromeOS开始,接着扩展至Android。