Khám phá những rủi ro an ninh do sự rò rỉ Sentinel Value trong động cơ Chrome V8
Giá trị Sentinel là giá trị được sử dụng làm dấu hiệu đặc biệt trong thuật toán, thường được dùng làm điều kiện dừng trong vòng lặp hoặc đệ quy. Trong mã nguồn của engine Chrome V8 có nhiều giá trị Sentinel, trong đó một số không nên bị rò rỉ vào môi trường JavaScript. Bài viết này sẽ thảo luận về cách vượt qua cơ chế HardenProtect của Chrome V8 bằng cách rò rỉ đối tượng Uninitialized Oddball.
Giá trị Sentinel trong V8
Tập tin roots.h trong mã nguồn V8 định nghĩa một lượng lớn đối tượng gốc, chúng được sắp xếp liền kề trong bộ nhớ. Một khi những đối tượng này bị rò rỉ vào JavaScript, điều đó có thể dẫn đến việc thoát khỏi sandbox.
Chúng ta có thể xác minh điều này bằng cách sửa đổi các hàm native của V8. Ví dụ, sửa đổi độ lệch của hàm %TheHole() để nó trả về đối tượng Uninitialized Oddball thay vì đối tượng TheHole.
Vượt qua bảo vệ HardenType
Việc sử dụng đối tượng Uninitialized Oddball có thể thực hiện việc đọc bộ nhớ tương đối tùy ý. Chìa khóa nằm ở hàm đọc JavaScript đã được tối ưu hóa, chỉ kiểm tra thuộc tính prop của đối tượng có đúng hay không, nhưng không kiểm tra giá trị với khóa là obj.prop. Điều này dẫn đến sự nhầm lẫn kiểu trong quá trình tính toán, từ đó thực hiện việc đọc tùy ý.
Phân tích mã lắp ráp đã được tối ưu hóa cho thấy, khi truyền uninitialized_oddball, chương trình sẽ trực tiếp tính toán độ lệch và đọc dữ liệu, mà không thực hiện kiểm tra kiểu. Phương pháp này dễ dàng xây dựng và khai thác hơn so với đối tượng TheHole.
Giải pháp sửa chữa được đề xuất là thêm kiểm tra đối với mảng map khi hàm tối ưu hóa trả về các phần tử của mảng, tránh việc trả về giá trị của mảng thông qua tính toán độ lệch.
Cảnh báo an ninh PatchGap
Ngoài việc chú ý đến các lỗ hổng lịch sử đã biết, chúng ta còn cần lưu ý đến những vấn đề mà nhà sản xuất âm thầm sửa chữa trong các thành phần cơ bản. Qua phân tích, phát hiện phần mềm Skype đến nay vẫn chưa khắc phục được lỗ hổng này. Trên nền tảng x86, do thiếu nén địa chỉ, phạm vi đọc và ghi tùy ý lớn hơn, gần như có thể đọc và ghi toàn bộ không gian tiến trình.
Lần này, PatchGap không chỉ liên quan đến Issue1352549, mà còn bao gồm Issue1314616 và Issue1216437 cùng các lỗ hổng tương tự khác. Sau khi phương pháp vượt qua mới được công khai, độ khó khai thác các lỗ hổng này đã giảm đáng kể, khiến kẻ tấn công gần như không cần nghiên cứu thêm để hoàn thành chuỗi khai thác hoàn chỉnh.
Tóm tắt
Bài viết này tóm tắt việc khám phá phương pháp đọc tùy ý thông qua việc rò rỉ Uninitialized Oddball. Trong V8 cũng tồn tại nhiều giá trị Sentinel khác, chúng cũng có thể dẫn đến các vấn đề tương tự. Điều này nhắc nhở chúng ta:
Các lỗ hổng uninitialized_Oddball khác cũng có thể dẫn đến việc thoát khỏi sandbox V8.
Vấn đề này có nên được coi là lỗ hổng bảo mật chính thức hay không vẫn còn gây tranh cãi.
Xem xét việc thêm giá trị Sentinel như một biến trong kiểm tra mờ để phát hiện các phương pháp khai thác mới.
Dù sao đi nữa, những vấn đề này sẽ rút ngắn đáng kể thời gian mà kẻ tấn công có thể khai thác hoàn toàn, rất đáng được 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.
Phân tích rủi ro bảo mật và khai thác từ việc rò rỉ Giá trị Sentinel của động cơ Chrome V8
Khám phá những rủi ro an ninh do sự rò rỉ Sentinel Value trong động cơ Chrome V8
Giá trị Sentinel là giá trị được sử dụng làm dấu hiệu đặc biệt trong thuật toán, thường được dùng làm điều kiện dừng trong vòng lặp hoặc đệ quy. Trong mã nguồn của engine Chrome V8 có nhiều giá trị Sentinel, trong đó một số không nên bị rò rỉ vào môi trường JavaScript. Bài viết này sẽ thảo luận về cách vượt qua cơ chế HardenProtect của Chrome V8 bằng cách rò rỉ đối tượng Uninitialized Oddball.
Giá trị Sentinel trong V8
Tập tin roots.h trong mã nguồn V8 định nghĩa một lượng lớn đối tượng gốc, chúng được sắp xếp liền kề trong bộ nhớ. Một khi những đối tượng này bị rò rỉ vào JavaScript, điều đó có thể dẫn đến việc thoát khỏi sandbox.
Chúng ta có thể xác minh điều này bằng cách sửa đổi các hàm native của V8. Ví dụ, sửa đổi độ lệch của hàm %TheHole() để nó trả về đối tượng Uninitialized Oddball thay vì đối tượng TheHole.
Vượt qua bảo vệ HardenType
Việc sử dụng đối tượng Uninitialized Oddball có thể thực hiện việc đọc bộ nhớ tương đối tùy ý. Chìa khóa nằm ở hàm đọc JavaScript đã được tối ưu hóa, chỉ kiểm tra thuộc tính prop của đối tượng có đúng hay không, nhưng không kiểm tra giá trị với khóa là obj.prop. Điều này dẫn đến sự nhầm lẫn kiểu trong quá trình tính toán, từ đó thực hiện việc đọc tùy ý.
Phân tích mã lắp ráp đã được tối ưu hóa cho thấy, khi truyền uninitialized_oddball, chương trình sẽ trực tiếp tính toán độ lệch và đọc dữ liệu, mà không thực hiện kiểm tra kiểu. Phương pháp này dễ dàng xây dựng và khai thác hơn so với đối tượng TheHole.
Giải pháp sửa chữa được đề xuất là thêm kiểm tra đối với mảng map khi hàm tối ưu hóa trả về các phần tử của mảng, tránh việc trả về giá trị của mảng thông qua tính toán độ lệch.
Cảnh báo an ninh PatchGap
Ngoài việc chú ý đến các lỗ hổng lịch sử đã biết, chúng ta còn cần lưu ý đến những vấn đề mà nhà sản xuất âm thầm sửa chữa trong các thành phần cơ bản. Qua phân tích, phát hiện phần mềm Skype đến nay vẫn chưa khắc phục được lỗ hổng này. Trên nền tảng x86, do thiếu nén địa chỉ, phạm vi đọc và ghi tùy ý lớn hơn, gần như có thể đọc và ghi toàn bộ không gian tiến trình.
Lần này, PatchGap không chỉ liên quan đến Issue1352549, mà còn bao gồm Issue1314616 và Issue1216437 cùng các lỗ hổng tương tự khác. Sau khi phương pháp vượt qua mới được công khai, độ khó khai thác các lỗ hổng này đã giảm đáng kể, khiến kẻ tấn công gần như không cần nghiên cứu thêm để hoàn thành chuỗi khai thác hoàn chỉnh.
Tóm tắt
Bài viết này tóm tắt việc khám phá phương pháp đọc tùy ý thông qua việc rò rỉ Uninitialized Oddball. Trong V8 cũng tồn tại nhiều giá trị Sentinel khác, chúng cũng có thể dẫn đến các vấn đề tương tự. Điều này nhắc nhở chúng ta:
Các lỗ hổng uninitialized_Oddball khác cũng có thể dẫn đến việc thoát khỏi sandbox V8.
Vấn đề này có nên được coi là lỗ hổng bảo mật chính thức hay không vẫn còn gây tranh cãi.
Xem xét việc thêm giá trị Sentinel như một biến trong kiểm tra mờ để phát hiện các phương pháp khai thác mới.
Dù sao đi nữa, những vấn đề này sẽ rút ngắn đáng kể thời gian mà kẻ tấn công có thể khai thác hoàn toàn, rất đáng được chú ý.