Phân tích Giá trị Sentinel trong động cơ Google Chrome V8 và những rủi ro an ninh của nó
Giá trị Sentinel là một giá trị đặc biệt trong thuật toán, thường được sử dụng như điều kiện kết thúc trong vòng lặp hoặc đệ quy. Mã nguồn của Chrome chứa nhiều giá trị Sentinel, trong đó một số nếu bị rò rỉ vào môi trường JavaScript có thể dẫn đến vấn đề an ninh. Bài viết này sẽ khám phá các phương pháp sử dụng đối tượng Uninitialized Oddball bị rò rỉ để vượt qua cơ chế HardenProtect của Chrome V8.
Giá trị Sentinel trong V8
Tệp roots.h trong mã nguồn V8 định nghĩa nhiều đối tượng gốc, chúng được sắp xếp lần lượt trong bộ nhớ. Nếu những đối tượng gốc không nên bị lộ cho JavaScript bị rò rỉ, có thể dẫn đến việc thoát khỏi sandbox. Vụ rò rỉ đối tượng TheHole trước đây là một ví dụ điển hình.
Để xác minh vấn đề trong phiên bản mới nhất V8, có thể sửa đổi hàm %TheHole() để nó trả về đối tượng Uninitialized Oddball:
javascript
print(%DebugPrint(%TheHole()));
// Xuất: Giá trị chưa được khởi tạo
Vượt qua bảo vệ HardenType
Sử dụng Uninitialized Oddball có thể xây dựng mã PoC như sau để thực hiện đọc tùy ý:
javascript
function read(obj, idx) {
return obj[idx];
}
let uninitialized = %TheHole();
let arr = [1.1];
%Chuẩn bị hàm tối ưu hóa ( đọc );
read(arr, 0);
đọc(arr, 0);
%Tối ưu hóa hàm trong cuộc gọi tiếp theo(đọc);
read(arr, 0);
print(read(uninitialized, 0x1234n));
Hàm read sau khi tối ưu hóa bằng cách phản biện có thể thấy rằng nó không kiểm tra nghiêm ngặt kiểu Value của obj.prop, mà trực tiếp tính toán độ lệch theo ngữ nghĩa JavaScript và trả về phần tử mảng, từ đó gây ra sự nhầm lẫn kiểu và thực hiện đọc tùy ý.
Đề xuất phương án sửa chữa là khi hàm đã được tối ưu trả về các phần tử của mảng, thêm kiểm tra đối với mảng map, tránh tính toán trực tiếp giá trị trả về của độ lệch.
Lời khuyên rủi ro PatchGap
Phân tích cho thấy, một số phần mềm như Skype có thể gặp vấn đề PatchGap, vẫn chưa được sửa chữa lỗ hổng này. Hacker có thể lợi dụng lỗ hổng này để hoàn thành chuỗi khai thác trong thời gian ngắn.
Ngoài ra, sau khi công bố phương pháp vượt qua mới, độ khó khai thác một số lỗ hổng lịch sử ( như Issue1314616, Issue1216437) đã giảm đáng kể. Đề nghị các nhà sản xuất đánh giá lại rủi ro an ninh liên quan đến các lỗ hổng này.
Tóm tắt
Còn nhiều giá trị Sentinel khác trong V8 đáng để nghiên cứu thêm. Đề xuất xem xét việc đưa %TheHole/Uninitialized_Oddball và các giá trị khác vào Fuzzer, khai thác các nguyên lý khai thác mới. Dù vấn đề này có được coi là vấn đề an toàn hay không, nó có thể rút ngắn đáng kể chu kỳ khai thác hoàn chỉnh của hacker.
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 và khai thác lỗ hổng an toàn giá trị Sentinel của động cơ Chrome V8
Phân tích Giá trị Sentinel trong động cơ Google Chrome V8 và những rủi ro an ninh của nó
Giá trị Sentinel là một giá trị đặc biệt trong thuật toán, thường được sử dụng như điều kiện kết thúc trong vòng lặp hoặc đệ quy. Mã nguồn của Chrome chứa nhiều giá trị Sentinel, trong đó một số nếu bị rò rỉ vào môi trường JavaScript có thể dẫn đến vấn đề an ninh. Bài viết này sẽ khám phá các phương pháp sử dụng đối tượng Uninitialized Oddball bị rò rỉ để vượt qua cơ chế HardenProtect của Chrome V8.
Giá trị Sentinel trong V8
Tệp roots.h trong mã nguồn V8 định nghĩa nhiều đối tượng gốc, chúng được sắp xếp lần lượt trong bộ nhớ. Nếu những đối tượng gốc không nên bị lộ cho JavaScript bị rò rỉ, có thể dẫn đến việc thoát khỏi sandbox. Vụ rò rỉ đối tượng TheHole trước đây là một ví dụ điển hình.
Để xác minh vấn đề trong phiên bản mới nhất V8, có thể sửa đổi hàm %TheHole() để nó trả về đối tượng Uninitialized Oddball:
javascript print(%DebugPrint(%TheHole())); // Xuất: Giá trị chưa được khởi tạo
Vượt qua bảo vệ HardenType
Sử dụng Uninitialized Oddball có thể xây dựng mã PoC như sau để thực hiện đọc tùy ý:
javascript function read(obj, idx) { return obj[idx]; }
let uninitialized = %TheHole(); let arr = [1.1]; %Chuẩn bị hàm tối ưu hóa ( đọc ); read(arr, 0); đọc(arr, 0); %Tối ưu hóa hàm trong cuộc gọi tiếp theo(đọc); read(arr, 0);
print(read(uninitialized, 0x1234n));
Hàm read sau khi tối ưu hóa bằng cách phản biện có thể thấy rằng nó không kiểm tra nghiêm ngặt kiểu Value của obj.prop, mà trực tiếp tính toán độ lệch theo ngữ nghĩa JavaScript và trả về phần tử mảng, từ đó gây ra sự nhầm lẫn kiểu và thực hiện đọc tùy ý.
Đề xuất phương án sửa chữa là khi hàm đã được tối ưu trả về các phần tử của mảng, thêm kiểm tra đối với mảng map, tránh tính toán trực tiếp giá trị trả về của độ lệch.
Lời khuyên rủi ro PatchGap
Phân tích cho thấy, một số phần mềm như Skype có thể gặp vấn đề PatchGap, vẫn chưa được sửa chữa lỗ hổng này. Hacker có thể lợi dụng lỗ hổng này để hoàn thành chuỗi khai thác trong thời gian ngắn.
Ngoài ra, sau khi công bố phương pháp vượt qua mới, độ khó khai thác một số lỗ hổng lịch sử ( như Issue1314616, Issue1216437) đã giảm đáng kể. Đề nghị các nhà sản xuất đánh giá lại rủi ro an ninh liên quan đến các lỗ hổng này.
Tóm tắt
Còn nhiều giá trị Sentinel khác trong V8 đáng để nghiên cứu thêm. Đề xuất xem xét việc đưa %TheHole/Uninitialized_Oddball và các giá trị khác vào Fuzzer, khai thác các nguyên lý khai thác mới. Dù vấn đề này có được coi là vấn đề an toàn hay không, nó có thể rút ngắn đáng kể chu kỳ khai thác hoàn chỉnh của hacker.