1 điểm bởi GN⁺ 2024-03-17 | 1 bình luận | Chia sẻ qua WhatsApp

Fuzzing Ladybird bằng các công cụ của Google Project Zero

  • Domato là trình fuzz DOM do Google Project Zero phát triển, tạo ra số lượng lớn các trang web chứa HTML, CSS và JavaScript chủ yếu hợp lệ nhưng kỳ lạ.
  • Các trang web được tạo ra có kích thước khoảng 500 KiB, chứa đầy JS, CSS và HTML "thú vị" đủ để làm công cụ trình duyệt bất ngờ.
  • Domato được cho là đã phát hiện nhiều lỗi trong các trình duyệt lớn, và điều này đã được áp dụng cho Ladybird để tìm ra và sửa các vấn đề.

Vấn đề #1: thẻ <th> nằm bên trong <mfrac>

  • Trong đầu ra do Domato tạo ra, đã phát hiện trường hợp đặt <th> bên trong <mfrac>.
  • Trên bản build Ladybird được biên dịch với UBSAN (Undefined Behavior SANitizer), đã xảy ra lỗi dereference con trỏ null.
  • Việc triển khai trước đó giả định rằng các phần tử <th><td> luôn có <table> ở phía trên trong cây DOM, nhưng quy tắc này có thể bị phá vỡ khi tạo thủ công các nút DOM bằng JavaScript API.
  • Để khắc phục, thay vì giả định các phần tử <th><td> luôn thuộc về một <table>, đã sửa bằng cách dùng first_ancestor_of_type<HTMLTableElement>().

Vấn đề #2: gán trình xử lý sự kiện window trong DOM đã tách rời

  • Khi chạy fuzzer, nhanh chóng gặp thêm một vấn đề khác.
  • Tài liệu được tạo qua DOMParser không có đối tượng window, và điều này gây ra sự cố.
  • Document::window() đã được sửa để trả về giá trị nullable, đồng thời xử lý trường hợp null ở nhiều nơi.
  • Trên tài liệu không có window, việc gán document.body.onblur được sửa để không làm gì cả.

Vấn đề #3: đệ quy vô hạn trong SVG <linearGradient>

  • SVG có thể khai báo gradient kế thừa màu bằng cách tham chiếu tới các gradient khác.
  • Do không xét trường hợp gradient tự tham chiếu chính nó, đã xảy ra vòng lặp vô hạn.
  • Để xử lý cả các chu kỳ tham chiếu kéo dài qua nhiều bước, hệ thống theo dõi tất cả gradient đã đi qua và dừng lần theo chuỗi khi gặp lại gradient đã được truy cập trước đó.

Vấn đề #4: truy cập thuộc tính window của iframe đã bị xóa

  • Khi iframe bị xóa khỏi DOM, tài liệu nội dung tương ứng sẽ bị tách khỏi browsing context.
  • Đã phát hiện lỗi trong đặc tả HTML khi giả định sự tồn tại của browsing context lúc truy cập thuộc tính của đối tượng window.
  • Một issue đã được gửi cho đặc tả HTML, và phía Ladybird đã thêm kiểm tra null để khắc phục vấn đề.

Vấn đề #5: vòng lặp vô hạn trong Element.before()

  • Trang không tải xong và mức sử dụng CPU luôn giữ ở 100%.
  • Một lỗi trong phần triển khai before() đã gây ra vòng lặp vô hạn.
  • Đã sửa để lần theo chuỗi sibling thông qua previous_sibling->previous_sibling thay vì node->previous_sibling.

Kết luận

  • Trong một ngày, đã phát hiện 5 lỗi thực sự và sửa tất cả.
  • Các công cụ như fuzzer là nguồn lực tuyệt vời cho những ai muốn làm phần mềm trở nên vững chắc hơn.
  • Khi Ladybird đủ ổn định để xử lý đầu vào fuzzing liên tục, có thể chạy tự động trên cloud để phát hiện thêm nhiều vấn đề.

Ý kiến của GN⁺

  • Bài viết này mô tả quá trình engine trình duyệt Ladybird sửa các lỗi được phát hiện bằng fuzzer Domato của Google Project Zero.
  • Fuzzing là một kỹ thuật rất hiệu quả để tìm ra các lỗ hổng bảo mật trong phần mềm, và các nhà phát triển có thể dùng nó để làm mã nguồn của mình vững chắc hơn.
  • Bài viết nhấn mạnh tầm quan trọng của fuzzing với lập trình viên, đồng thời cung cấp góc nhìn về cách nó được áp dụng trong thực tế.
  • Nếu nhìn một cách phê phán, fuzzing kiểm tra phản ứng của phần mềm trước những đầu vào không lường trước được, nên có thể không phản ánh hoàn toàn mẫu sử dụng của người dùng thực tế.
  • Các công cụ fuzzing khác có chức năng tương tự gồm AFL (American Fuzzy Lop) hoặc LibFuzzer, và các nhà phát triển có thể dùng chúng để kiểm thử dự án của mình.
  • Bằng việc áp dụng kỹ thuật này, các nhà phát triển Ladybird có thể sửa những lỗi được phát hiện để cải thiện độ ổn định của trình duyệt, từ đó nâng cao trải nghiệm người dùng và tăng cường bảo mật.

1 bình luận

 
GN⁺ 2024-03-17
Ý kiến Hacker News
  • Giá trị của đặc tả được chứng minh qua nhiều cách triển khai khác nhau

    Bài viết này cho thấy vì sao việc có nhiều cách triển khai cho cùng một đặc tả lại quan trọng. Đã tìm ra một vấn đề, và có lẽ sẽ còn nhiều vấn đề khác nữa.

  • Khả năng ngay cả một nhóm nhỏ cũng có thể tạo ra những điều đáng kinh ngạc

    Thể hiện sự hào hứng trước việc một nhóm nhỏ có thể thực hiện những dự án tuyệt vời. Đây là điều khó làm ở các công ty có nhiều bên liên quan.

  • Ngạc nhiên trước tốc độ phát triển nhanh của dự án nhờ phần triển khai SVG

    Bày tỏ sự ấn tượng khi dự án đang tiến triển nhanh hơn dự đoán, và đặc biệt bị cuốn hút bởi tin phần triển khai SVG đã hoàn thành.

  • Cần có cách tiếp cận sâu hơn trong việc giải quyết vấn đề khi phát triển phần mềm

    Lập luận rằng các nhà phát triển không nên chỉ dừng lại ở việc tìm và sửa lỗi, mà cần hiểu nguyên nhân gốc rễ của vấn đề và tìm các lỗi tương tự trong toàn bộ codebase. Dù sự bất ổn và lỗi trong phần mềm hiện đại phần nào đến từ những ràng buộc của chủ nghĩa tư bản, vẫn cần nhấn mạnh rằng hoàn toàn có thể phát triển phần mềm tốt hơn.

  • Tò mò liệu engine web của Ladybird có tham gia Web Engine Hackfest năm nay hay không

    Bày tỏ sự quan tâm về việc liệu Ladybird có tham gia Web Engine Hackfest năm nay hay không.

  • Thắc mắc về việc không còn video YouTube liên quan đến hacking

    Bày tỏ sự tiếc nuối vì các video YouTube liên quan đến hacking dường như không còn được cập nhật nữa.

  • Phản ứng thú vị với cụm từ "fuzzing ladybird"

    Cho rằng cụm từ "fuzzing ladybird" nghe vừa buồn cười vừa có phần hoang dã.

  • Âm thầm hy vọng Ladybird có thể thống trị thế giới

    Bí mật hy vọng rằng một ngày nào đó Ladybird có thể thống trị thế giới, đồng thời dặn đừng nói điều đó với ai.

  • [Bình luận đã bị xóa]

    Thông báo rằng một bình luận cụ thể đã bị xóa.