Bên trong việc vượt qua HardenProtect của Chrome V8 thông qua việc rò rỉ Giá trị Sentinel
Lời nói đầu
Giá trị Sentinel là một giá trị đặc biệt trong thuật toán, thường được sử dụng như một điều kiện dừng trong các thuật toán lặp hoặc đệ quy. Giá trị này được sử dụng rộng rãi trong mã nguồn Chrome. Gần đây, các nhà nghiên cứu an ninh phát hiện ra rằng việc rò rỉ đối tượng TheHole có thể cho phép thực thi mã tùy ý trong sandbox của Chrome. Đội ngũ Google đã nhanh chóng khắc phục hai lỗ hổng này.
Tuy nhiên, trong V8 vẫn tồn tại các đối tượng nguyên thủy khác không nên được tiết lộ cho JavaScript. Bài viết này sẽ thảo luận về một đối tượng mới: Uninitialized Oddball. Phương pháp vượt qua này lần đầu tiên xuất hiện trong một vấn đề được gửi bởi thành viên Project0, và hiện vẫn có thể sử dụng trong phiên bản V8 mới nhất.
Cần lưu ý rằng phương pháp này có tính linh hoạt cao:
Trong CVE-2021-30551, POC đầu tiên là lộ ra biến oddball chưa được khởi tạo nội bộ.
POC của CVE-2022-1486 cũng đã tiết lộ UninitializedOddball.
Một vấn đề chưa phân bổ CVE cũng đã sử dụng phương pháp này.
Những ví dụ này đủ để chứng minh tầm quan trọng của vấn đề, đáng để xem xét lại phần mềm có thể bị ảnh hưởng.
Giá trị Sentinel trong V8
Hầu hết các đối tượng nguyên bản của V8 được định nghĩa trong tệp v8/src/roots/roots.h, và chúng được sắp xếp liền kề nhau trong bộ nhớ. Một khi những đối tượng nguyên bản này không nên bị lộ ra bị lộ vào JavaScript, điều đó có thể dẫn đến việc thực thi mã tùy ý trong sandbox.
Chúng ta có thể làm rò rỉ Uninitialized Oddball vào JavaScript bằng cách sửa đổi các hàm native của V8. Cách cụ thể là sửa đổi độ lệch tương đối của hàm %TheHole() đối với isolate, để nó trả về Uninitialized Oddball.
Vượt qua HardenType
Việc sử dụng Uninitialized Oddball có thể thực hiện đọc và ghi tương đối tùy ý. Chìa khóa nằm ở chỗ, hàm read đã được tối ưu hóa chỉ kiểm tra thuộc tính prop của obj, nhưng không kiểm tra giá trị của obj.prop như một key. Điều này dẫn đến việc xảy ra nhầm lẫn kiểu trong quá trình tính toán, từ đó thực hiện đọc tùy ý.
Trên kiến trúc x86, do không có nén địa chỉ, việc đọc và ghi tùy ý là tương đối so với toàn bộ tiến trình. Mặc dù thiếu đi sự tiện lợi mà việc nén địa chỉ mang lại, nhưng do một số tệp phần mềm lớn có kích thước lớn, vẫn có khả năng cao để đọc và ghi nội dung mục tiêu.
Cảnh báo PatchGap
Lần này PatchGap không chỉ liên quan đến Issue1352549, mà còn bao gồm nhiều lỗ hổng tương tự như Issue1314616 và Issue1216437. Sau khi phương pháp vượt qua mới được công khai, độ khó khai thác những lỗ hổng này đã giảm đáng kể. Tin tặc gần như không cần nghiên cứu thêm để hoàn thành chuỗi khai thác đầy đủ.
Tóm tắt
Trong V8 còn có nhiều giá trị Sentinel khác, chúng cũng có thể gặp phải các vấn đề tương tự. Điều này cho chúng ta một số gợi ý:
Các lỗ hổng uninitialized_Oddball khác có thể dẫn đến RCE V8 không?
Liệu những vấn đề này có nên được coi là vấn đề an ninh chính thức không?
Trong thử nghiệm Fuzzer, có nên thêm giá trị Sentinel vào như một biến không?
Dù sao đi nữa, những vấn đề như vậy sẽ rút ngắn đáng kể chu kỳ mà hacker có thể khai thác triệt để, điều này đáng để chúng ta đặc biệt chú ý.
Trang này có thể chứa nội dung của bên thứ ba, được cung cấp chỉ nhằm mục đích thông tin (không phải là tuyên bố/bảo đảm) và không được coi là sự chứng thực cho quan điểm của Gate hoặc là lời khuyên về tài chính hoặc chuyên môn. Xem Tuyên bố từ chối trách nhiệm để biết chi tiết.
Lỗ hổng mới của động cơ Chrome V8: Rò rỉ Uninitialized Oddball vượt qua sandbox
Bên trong việc vượt qua HardenProtect của Chrome V8 thông qua việc rò rỉ Giá trị Sentinel
Lời nói đầu
Giá trị Sentinel là một giá trị đặc biệt trong thuật toán, thường được sử dụng như một điều kiện dừng trong các thuật toán lặp hoặc đệ quy. Giá trị này được sử dụng rộng rãi trong mã nguồn Chrome. Gần đây, các nhà nghiên cứu an ninh phát hiện ra rằng việc rò rỉ đối tượng TheHole có thể cho phép thực thi mã tùy ý trong sandbox của Chrome. Đội ngũ Google đã nhanh chóng khắc phục hai lỗ hổng này.
Tuy nhiên, trong V8 vẫn tồn tại các đối tượng nguyên thủy khác không nên được tiết lộ cho JavaScript. Bài viết này sẽ thảo luận về một đối tượng mới: Uninitialized Oddball. Phương pháp vượt qua này lần đầu tiên xuất hiện trong một vấn đề được gửi bởi thành viên Project0, và hiện vẫn có thể sử dụng trong phiên bản V8 mới nhất.
Cần lưu ý rằng phương pháp này có tính linh hoạt cao:
Trong CVE-2021-30551, POC đầu tiên là lộ ra biến oddball chưa được khởi tạo nội bộ.
POC của CVE-2022-1486 cũng đã tiết lộ UninitializedOddball.
Một vấn đề chưa phân bổ CVE cũng đã sử dụng phương pháp này.
Những ví dụ này đủ để chứng minh tầm quan trọng của vấn đề, đáng để xem xét lại phần mềm có thể bị ảnh hưởng.
Giá trị Sentinel trong V8
Hầu hết các đối tượng nguyên bản của V8 được định nghĩa trong tệp v8/src/roots/roots.h, và chúng được sắp xếp liền kề nhau trong bộ nhớ. Một khi những đối tượng nguyên bản này không nên bị lộ ra bị lộ vào JavaScript, điều đó có thể dẫn đến việc thực thi mã tùy ý trong sandbox.
Chúng ta có thể làm rò rỉ Uninitialized Oddball vào JavaScript bằng cách sửa đổi các hàm native của V8. Cách cụ thể là sửa đổi độ lệch tương đối của hàm %TheHole() đối với isolate, để nó trả về Uninitialized Oddball.
Vượt qua HardenType
Việc sử dụng Uninitialized Oddball có thể thực hiện đọc và ghi tương đối tùy ý. Chìa khóa nằm ở chỗ, hàm read đã được tối ưu hóa chỉ kiểm tra thuộc tính prop của obj, nhưng không kiểm tra giá trị của obj.prop như một key. Điều này dẫn đến việc xảy ra nhầm lẫn kiểu trong quá trình tính toán, từ đó thực hiện đọc tùy ý.
Trên kiến trúc x86, do không có nén địa chỉ, việc đọc và ghi tùy ý là tương đối so với toàn bộ tiến trình. Mặc dù thiếu đi sự tiện lợi mà việc nén địa chỉ mang lại, nhưng do một số tệp phần mềm lớn có kích thước lớn, vẫn có khả năng cao để đọc và ghi nội dung mục tiêu.
Cảnh báo PatchGap
Lần này PatchGap không chỉ liên quan đến Issue1352549, mà còn bao gồm nhiều lỗ hổng tương tự như Issue1314616 và Issue1216437. Sau khi phương pháp vượt qua mới được công khai, độ khó khai thác những lỗ hổng này đã giảm đáng kể. Tin tặc gần như không cần nghiên cứu thêm để hoàn thành chuỗi khai thác đầy đủ.
Tóm tắt
Trong V8 còn có nhiều giá trị Sentinel khác, chúng cũng có thể gặp phải các vấn đề tương tự. Điều này cho chúng ta một số gợi ý:
Các lỗ hổng uninitialized_Oddball khác có thể dẫn đến RCE V8 không?
Liệu những vấn đề này có nên được coi là vấn đề an ninh chính thức không?
Trong thử nghiệm Fuzzer, có nên thêm giá trị Sentinel vào như một biến không?
Dù sao đi nữa, những vấn đề như vậy sẽ rút ngắn đáng kể chu kỳ mà hacker có thể khai thác triệt để, điều này đáng để chúng ta đặc biệt chú ý.