Phân tích kỹ thuật về việc tiết lộ Sentinel Value để vượt qua bảo vệ HardenProtect của Chrome V8
Giá trị Sentinel là giá trị đặc biệt trong thuật toán, thường được sử dụng như điều kiện dừng trong các thuật toán vòng lặp hoặc đệ quy. Trong mã nguồn Chrome có nhiều giá trị Sentinel. Gần đây, một nghiên cứu cho thấy, thông qua việc rò rỉ đối tượng TheHole có thể thực hiện việc thực thi mã tùy ý trong sandbox của CVE-2021-38003 và CVE-2022-1364. Nhóm Google sau đó đã cập nhật hai lỗ hổng này.
Ngoài đối tượng TheHole, V8 còn có các đối tượng nguyên thuỷ khác không nên bị lộ ra JavaScript. Bài viết này thảo luận về đối tượng Uninitialized Oddball, phương pháp vượt qua này vẫn có thể sử dụng cho phiên bản V8 mới nhất.
Hầu hết các đối tượng gốc của V8 được định nghĩa trong tệp v8/src/roots/roots.h, các đối tượng này được sắp xếp liền kề nhau trong bộ nhớ. Một khi các đối tượng gốc không nên bị rò rỉ bị rò rỉ vào JavaScript, có thể thực hiện việc thực thi mã tùy ý trong sandbox.
Để xác minh phương pháp này, bạn có thể sửa đổi các hàm native của V8, để rò rỉ Uninitialized Oddball vào JavaScript. Cụ thể, có thể thay đổi độ lệch tương đối của hàm %TheHole() so với isolate, để nó trả về Uninitialized Oddball.
Việc sử dụng Uninitialized Oddball có thể đạt được việc đọc và ghi tương đối tùy ý. Hàm đọc JavaScript đã được tối ưu hóa sẽ trực tiếp tính toán độ lệch theo ngữ nghĩa JavaScript, tìm giá trị của mảng, từ đó dẫn đến nhầm lẫn kiểu, thực hiện việc đọc tùy ý.
Giải pháp sửa chữa được đề xuất là, khi hàm tối ưu trả về phần tử của mảng, thêm kiểm tra đối với mảng map, để tránh tính toán độ lệch trực tiếp trả về giá trị của mảng.
Cần lưu ý rằng phương pháp này không chỉ áp dụng cho Chrome, mà các phần mềm khác sử dụng động cơ V8 cũng có thể bị ảnh hưởng. Ví dụ, Skype hiện vẫn chưa khắc phục lỗ hổng này. Trong x86, do không có nén địa chỉ, việc đọc và ghi tùy ý là trực tiếp so với toàn bộ tiến trình.
Nói chung, việc rò rỉ uninitialized_Oddball trong giá trị Sentinel có thể thực hiện đọc nguyên thủy tùy ý. V8 còn có các giá trị Sentinel khác có thể gây ra vấn đề tương tự. Đề nghị thêm những giá trị Sentinel này vào biến fuzzer để khai thác thêm nhiều nguyên thủy tiềm tàng. Bất kể có được coi là vấn đề an ninh chính thức hay không, những vấn đề này đều sẽ rút ngắn đáng kể chu kỳ mà hacker thực hiện khai thác hoàn chỉnh.
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.
11 thích
Phần thưởng
11
4
Chia sẻ
Bình luận
0/400
TommyTeacher
· 07-20 16:35
Quả thật có chút nguy hiểm.
Xem bản gốcTrả lời0
BrokeBeans
· 07-20 16:22
Cả ngày nghĩ đến việc đào hố, có tay làm bài tập không thú vị hơn sao?
Phân tích và phòng ngừa lỗ hổng rò rỉ Giá trị Sentinel của động cơ Chrome V8
Phân tích kỹ thuật về việc tiết lộ Sentinel Value để vượt qua bảo vệ HardenProtect của Chrome V8
Giá trị Sentinel là giá trị đặc biệt trong thuật toán, thường được sử dụng như điều kiện dừng trong các thuật toán vòng lặp hoặc đệ quy. Trong mã nguồn Chrome có nhiều giá trị Sentinel. Gần đây, một nghiên cứu cho thấy, thông qua việc rò rỉ đối tượng TheHole có thể thực hiện việc thực thi mã tùy ý trong sandbox của CVE-2021-38003 và CVE-2022-1364. Nhóm Google sau đó đã cập nhật hai lỗ hổng này.
Ngoài đối tượng TheHole, V8 còn có các đối tượng nguyên thuỷ khác không nên bị lộ ra JavaScript. Bài viết này thảo luận về đối tượng Uninitialized Oddball, phương pháp vượt qua này vẫn có thể sử dụng cho phiên bản V8 mới nhất.
Hầu hết các đối tượng gốc của V8 được định nghĩa trong tệp v8/src/roots/roots.h, các đối tượng này được sắp xếp liền kề nhau trong bộ nhớ. Một khi các đối tượng gốc không nên bị rò rỉ bị rò rỉ vào JavaScript, có thể thực hiện việc thực thi mã tùy ý trong sandbox.
Để xác minh phương pháp này, bạn có thể sửa đổi các hàm native của V8, để rò rỉ Uninitialized Oddball vào JavaScript. Cụ thể, có thể thay đổi độ lệch tương đối của hàm %TheHole() so với isolate, để nó trả về Uninitialized Oddball.
Việc sử dụng Uninitialized Oddball có thể đạt được việc đọc và ghi tương đối tùy ý. Hàm đọc JavaScript đã được tối ưu hóa sẽ trực tiếp tính toán độ lệch theo ngữ nghĩa JavaScript, tìm giá trị của mảng, từ đó dẫn đến nhầm lẫn kiểu, thực hiện việc đọc tùy ý.
Giải pháp sửa chữa được đề xuất là, khi hàm tối ưu trả về phần tử của mảng, thêm kiểm tra đối với mảng map, để tránh tính toán độ lệch trực tiếp trả về giá trị của mảng.
Cần lưu ý rằng phương pháp này không chỉ áp dụng cho Chrome, mà các phần mềm khác sử dụng động cơ V8 cũng có thể bị ảnh hưởng. Ví dụ, Skype hiện vẫn chưa khắc phục lỗ hổng này. Trong x86, do không có nén địa chỉ, việc đọc và ghi tùy ý là trực tiếp so với toàn bộ tiến trình.
Nói chung, việc rò rỉ uninitialized_Oddball trong giá trị Sentinel có thể thực hiện đọc nguyên thủy tùy ý. V8 còn có các giá trị Sentinel khác có thể gây ra vấn đề tương tự. Đề nghị thêm những giá trị Sentinel này vào biến fuzzer để khai thác thêm nhiều nguyên thủy tiềm tàng. Bất kể có được coi là vấn đề an ninh chính thức hay không, những vấn đề này đều sẽ rút ngắn đáng kể chu kỳ mà hacker thực hiện khai thác hoàn chỉnh.