3 điểm bởi GN⁺ 2025-03-21 | 2 bình luận | Chia sẻ qua WhatsApp
  • 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_t v.v.)
    • 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ử
  • 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ả

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

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

 
iolothebard 2025-03-22

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ỉ

 
GN⁺ 2025-03-21
Ý 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

    • Tôi thích cách họ đo lường phần công việc bổ sung này
    • Tôi mong có cách sử dụng đầy đủ các lệnh hinting TTF ngay cả khi không dùng FreeType
    • Có vẻ như Windows và macOS không còn cách nào để bật hinting đúng nghĩa nữa
    • FreeType cũng đặt hinting không đúng chuẩn làm mặc định kể từ phiên bản 2.7
    • Nếu muốn biết văn bản được hinting đúng cách trông như thế nào, có thể xem ảnh chụp màn hình
    • Tôi nghi ngờ Windows đã từ bỏ font hinting kể từ thời XP
    • UI scaling và việc xem hình ảnh raster trên các màn hình có độ phân giải khác nhau gây ra hiện tượng mờ
  • 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ó

    • Có thể di chuyển từng thành phần một mà không cần viết lại trên quy mô lớn
  • 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

    • Windows giả định mọi tấm nền đều dùng bố cục RGB, và phần mềm ClearType render phông chữ theo giả định đó
    • Trên các loại màn hình mới, hiện tượng viền màu quanh chữ xuất hiện
    • Có các công cụ bên thứ ba như MacType hay Better ClearType Tuner, nhưng chúng không hoạt động với Chrome hoặc Electron
    • Khi công nghệ tấm nền mới trở nên phổ biến, cần có nỗ lực định nghĩa một tiêu chuẩn để truyền bố cục subpixel tới lớp đồ họa
    • Có thể thấy một số nỗ lực từ Blur Busters, nhưng nhận thức của các nhà cung cấp vẫn còn thiếu
  • 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

    • Skia được viết bằng C++ và do Google tạo ra
    • FreeType đo kích thước và render glyph, đồng thời hỗ trợ nhiều chế độ anti-aliasing và hinting khác nhau
    • FreeType được viết bằng C và không phải do Google tạo ra
    • Tôi thắc mắc vì sao FreeType lại được viết lại bằng Rust trước
  • Phông chữ được xử lý qua OpenType Sanitizer trước khi được dùng

    • Tôi tự hỏi liệu định dạng phông chữ có tệ đến mức cần phải sanitize tệp hay không
    • Tràn số nguyên được xác định là một trong những nguyên nhân gây ra lỗ hổng
    • Nhiều ngôn ngữ không phát hiện tràn số, và ngay cả các kiến trúc hiện đại như RISC-V cũng không có overflow trap
    • Tôi không thể hiểu vì sao các ngôn ngữ mới như Rust lại không bao gồm overflow trap