Tăng cường an toàn bộ nhớ cho phông chữ web
(developer.chrome.com)- Skrifa là thư viện xử lý phông chữ mới được viết bằng Rust, được phát triển để thay thế FreeType và giúp Chrome xử lý phông chữ an toàn hơn
- Nhờ tính an toàn bộ nhớ của Rust, các vấn đề bảo mật giảm xuống và tốc độ cải tiến công nghệ phông chữ được tăng lên
- Việc chuyển từ FreeType sang Skrifa giúp nâng cao chất lượng mã và rút ngắn thời gian khắc phục lỗi bảo mật
Lý do thay thế FreeType
-
Trong môi trường web, cần có khả năng lấy các tài nguyên không đáng tin cậy từ nhiều nguồn khác nhau và sử dụng chúng một cách an toàn
-
Chrome đã áp dụng nhiều biện pháp bảo mật để sử dụng phông chữ web một cách an toàn
- Sandboxing: Vì mã không an toàn và phông chữ không đáng tin cậy, chúng được chạy trong một môi trường bảo vệ riêng biệt
- OpenType Sanitizer: Dọn dẹp và kiểm tra phông chữ trước khi xử lý
- Fuzzing: Kiểm thử diện rộng các thư viện liên quan đến xử lý phông chữ
-
FreeType được dùng làm thư viện xử lý phông chữ mặc định trên Android, ChromeOS và Linux
- Nếu xảy ra lỗ hổng bảo mật, có nguy cơ ảnh hưởng đến rất nhiều người dùng
Các vấn đề bảo mật lớn phát sinh từ FreeType
- 1. Sử dụng ngôn ngữ không an toàn
- Vì FreeType được viết bằng C, có thể phát sinh các lỗ hổng như lỗi bộ nhớ và tràn bộ đệm
- 2. Các vấn đề riêng của dự án
- Thiếu kiểu kích thước tường minh do sử dụng macro
- Các macro (
FT_READ_*,FT_PEEK_*) che giấu các kiểu kích thước tường minh (int16_tv.v.)
- Các macro (
- Lỗi lặp đi lặp lại trong mã mới
- Phát sinh vấn đề khi bổ sung hỗ trợ COLRv1 và OT-SVG
- Thiếu kiểm thử
- Việc tạo phông chữ kiểm thử phức tạp gặp khó khăn, dẫn đến thiếu kiểm thử
- Thiếu kiểu kích thước tường minh do sử dụng macro
- 3. Vấn đề phụ thuộc
- Các thư viện như bzip2, libpng, zlib mà FreeType sử dụng liên tục phát sinh vấn đề
- 4. Giới hạn của fuzzing
- Tệp phông chữ có cấu trúc dữ liệu phức tạp nên có những vấn đề không bị phát hiện qua fuzzing
- Phông chữ bao gồm các quy tắc phức hợp và state machine
- Khó tạo ra cấu trúc hợp lệ nên khó thực hiện fuzzing hiệu quả
- Tệp phông chữ có cấu trúc dữ liệu phức tạp nên có những vấn đề không bị phát hiện qua fuzzing
Quy trình đưa Skrifa vào và áp dụng trong Chrome
- Skia, thư viện đồ họa mà Chrome sử dụng, dùng FreeType cho metadata và kết xuất phông chữ
- Để thay FreeType bằng Skrifa, Chrome đã xây dựng lại backend phông chữ của Skia
Các giai đoạn triển khai Skrifa
- Chrome 128 (tháng 8 năm 2024):
- Thử nghiệm Skrifa với các định dạng phông chữ ít được dùng hơn như phông màu và CFF2
- Chrome 133 (tháng 2 năm 2025):
- Triển khai toàn diện Skrifa cho xử lý phông chữ web trên Linux, Android và ChromeOS
- Trên Windows và Mac, được dùng làm bộ xử lý thay thế khi hệ thống không hỗ trợ định dạng phông chữ
Tăng cường bảo mật và hiệu năng
- 1. Tăng cường an toàn bộ nhớ
- Rust mặc định bảo đảm an toàn bộ nhớ
- Tuy nhiên, để đạt hiệu năng, thư viện bytemuck được sử dụng
- Dùng khi cần diễn giải lại byte với cấu trúc kiểu mạnh
- Khi các bản cập nhật tương lai của Rust cho phép chuyển đổi an toàn, dự kiến sẽ chuyển sang chức năng đó
- 2. Cải thiện độ chính xác
- Skrifa tăng cường tính dễ đọc, khả năng bảo trì và hiệu năng đa luồng nhờ bảo đảm tính bất biến của cấu trúc dữ liệu
- Chất lượng mã được kiểm chứng bằng khoảng 700 bài kiểm thử đơn vị
- Dùng công cụ fauntlet để so sánh đầu ra của FreeType và Skrifa → xác nhận chất lượng hiển thị có khớp hay không
- 3. Kiểm thử diện rộng và tăng cường bảo mật
- Đã tiến hành kiểm thử fuzzing từ tháng 6 năm 2024 đối với Skrifa và mã tích hợp
- Đến nay đã phát hiện 39 lỗi → không phải lỗ hổng bảo mật (lỗi hiển thị hoặc sự cố có kiểm soát)
- Xác nhận việc cải thiện chất lượng mã mà không dẫn đến vấn đề bảo mật
- Đã tiến hành kiểm thử fuzzing từ tháng 6 năm 2024 đối với Skrifa và mã tích hợp
Kết luận và kế hoạch sắp tới
- Việc đưa Skrifa dựa trên Rust vào giúp tăng cường bảo mật và cải thiện chất lượng mã
- Nâng cao năng suất phát triển và mang lại môi trường phông chữ an toàn hơn cho người dùng
- Trong tương lai, có kế hoạch áp dụng Skrifa cho xử lý phông chữ hệ thống trên Linux và ChromeOS
2 bình luận
Lần trước là zlib, lần này là freetype…
Những lão làng kỳ cựu dần dần bị thay thế từng người một… cũng giống như cuộc đời con người nhỉ
Ý kiến trên Hacker News
Google cần ít nhất 0,25 kỹ sư phần mềm để khắc phục các vấn đề được phát hiện bằng fuzzing
Sức mạnh thực sự của Rust là khả năng chuyển đổi dần dần hướng tới tính an toàn và khả năng tích hợp vào các dự án hiện có
Tôi đang tìm hiểu về cách phông chữ được render tùy theo bố cục subpixel của tấm nền màn hình
Skia là một thư viện cao cấp thực hiện dàn trang văn bản nâng cao và cache glyph
Phông chữ được xử lý qua OpenType Sanitizer trước khi được dùng