Phân tích vấn đề an ninh do rò rỉ Giá trị Sentinel trong động cơ Chrome v8
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 thuật toán lặp hoặc đệ quy. Trong mã nguồn Chrome có nhiều giá trị Sentinel, một số trong đó nếu bị rò rỉ vào môi trường JavaScript có thể dẫn đến vấn đề bảo mật.
Trước đây, có nghiên cứu cho thấy, việc rò rỉ đối tượng TheHole có thể thực hiện mã tùy ý trong sandbox của Chrome. Đội ngũ Google ngay sau đó đã khắc phục các CVE liên quan. Tuy nhiên, ngoài đối tượng TheHole, trong v8 còn có các đối tượng nguyên thủy khác không nên bị rò rỉ vào JS. Bài viết này sẽ thảo luận về đối tượng Uninitialized Oddball, phương pháp vượt qua này hiện vẫn có thể được sử dụng trong phiên bản V8 mới nhất.
Điều đáng lưu ý là phương pháp này có tính tổng quát nhất định:
Trong CVE-2021-30551, POC ban đầu là rò rỉ oddball chưa khởi tạo nội bộ.
Trong CVE-2022-1486, POC cũng đã trực tiếp rò rỉ UninitializedOddball.
Issue1352549( đã cung cấp mã khai thác hoàn chỉnh cho CVE) chưa được phân bổ.
Những trường hợp này cho thấy việc rò rỉ Uninitialized Oddball có thể dẫn đến các vấn đề an ninh nghiêm trọng.
Giá trị Sentinel trong V8
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, những đối tượng này được sắp xếp lần lượt trong bộ nhớ. Nếu để lộ những đối tượng gốc không nên bị lộ ra JavaScript, có thể thực hiện việc thực thi mã tùy ý trong sandbox.
Để xác minh điều này, chúng ta có thể sửa đổi hàm native của V8, làm rò rỉ Uninitialized Oddball vào JavaScript. Cụ thể, có thể sửa đổi độ lệch của hàm %TheHole() tương đối với isolate, để nó trả về Uninitialized Oddball.
Vượt qua bảo vệ HardenType
Sử dụng Uninitialized Oddball có thể thực hiện đọc tương đối tùy ý. Mã chính như sau:
javascript
function read(obj, idx) {
trả về obj[idx];
}
let uninitialized_oddball = %TheHole();
let ab = new ArrayBuffer(8);
let fa = new Float64Array(ab);
let ia = new BigInt64Array(ab);
let evil = [1.1, 2.2, 3.3];
evil.prop = 1;
%ChuẩnBịChứcNăngTốiƯuHóa(đọc);
đọc(ác, 0);
đọc(ác, 1);
%Tối ưu chức năng trong cuộc gọi tiếp theo(đọc);
đọc(ác, 0);
let val = read(uninitialized_oddball, "prop");
fa[0] = val;
console.log(ia[0]);
Trong mã lắp ghép đã được tối ưu hóa, sẽ trực tiếp tính toán độ lệch theo ngữ nghĩa JavaScript và trả về giá trị của mảng, mà không kiểm tra obj.prop là giá trị của key. Điều này dẫn đến sự nhầm lẫn kiểu, từ đó thực hiện việc đọc tùy ý.
Do vì Uninitialized Oddball được sắp xếp ở phía trước trong bộ nhớ V8 và nguyên thủy hơn, dễ dàng giả mạo hơn đối tượng TheHole, nên đây là phương pháp ưa thích để vượt qua HardenType.
Giải pháp sửa chữa đề 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ử mảng, tránh tính toán độ lệch để trả về giá trị mảng trực tiếp.
Cảnh báo PatchGap
Phân tích sau khi xem xét Issue1352549, một số phần mềm có thể gặp phải vấn đề PatchGap. Ví dụ, Skype hiện vẫn chưa khắc phục lỗ hổng này. Trên nền tảng x86, do không có nén địa chỉ, việc đọc và ghi tùy ý là tương đối với toàn bộ tiến trình.
Mặc dù Skype đã bật ASLR, nhưng do tệp khá lớn, kẻ tấn công chỉ cần đọc và ghi vào một địa chỉ cố định, thì có khả năng cao để đọc và ghi vào nội dung tệp của Skype. Kết hợp với việc phân tích PE và các phương pháp truyền thống khác, có thể hoàn thành toàn bộ chuỗi khai thác lỗ hổng.
Lần này, PatchGap không chỉ liên quan đến Issue1352549 mà còn làm giảm đáng kể độ khó khai thác các lỗ hổng tương tự như CVE-2022-1486 và CVE-2021-30551. Tin tặc gần như không cần nghiên cứu thêm để thực hiện khai thác hoàn chỉnh.
Tóm tắt
Bài viết này tóm tắt cách thực hiện đọc tùy ý thông qua việc rò rỉ Uninitialized Oddball. Trong V8 còn nhiều giá trị Sentinel khác, có thể tồn tại nguy cơ bảo mật tương tự. Điều này cho chúng ta những gợi ý sau:
Việc rò rỉ các Oddball không được khởi tạo khác có thể dễ dàng thực hiện RCE V8 hay không.
Có còn tranh cãi về việc liệu những vấn đề như vậy có nên được coi là vấn đề an ninh chính thức hay không.
Trong Fuzzer, có cần thiết phải thêm các biến như %TheHole/Uninitialized Oddball để khai thác các nguyên mẫu khai thác mới không.
Dù sao đi nữa, những vấn đề nà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.
6 thích
Phần thưởng
6
5
Chia sẻ
Bình luận
0/400
HallucinationGrower
· 5giờ trước
Ôi trời ơi, sao có thể lộ ra được như vậy?
Xem bản gốcTrả lời0
CodeAuditQueen
· 5giờ trước
Một bề mặt tấn công biến thể CVE khác, ậc ậc
Xem bản gốcTrả lời0
WhaleWatcher
· 5giờ trước
Google đang chơi lửa à? Quay ngược lịch sử
Xem bản gốcTrả lời0
BearMarketSurvivor
· 5giờ trước
Thật sự là không bao giờ sửa hết bug.
Xem bản gốcTrả lời0
CryptoAdventurer
· 5giờ trước
Lại đến lúc nộp thuế IQ rồi sao? Ai hiểu thì hiểu.
Rò rỉ giá trị Sentinel của động cơ V8 gây ra rủi ro an ninh Vectơ tấn công Oddball chưa khởi tạo trở thành một loại hình tấn công mới
Phân tích vấn đề an ninh do rò rỉ Giá trị Sentinel trong động cơ Chrome v8
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 thuật toán lặp hoặc đệ quy. Trong mã nguồn Chrome có nhiều giá trị Sentinel, một số trong đó nếu bị rò rỉ vào môi trường JavaScript có thể dẫn đến vấn đề bảo mật.
Trước đây, có nghiên cứu cho thấy, việc rò rỉ đối tượng TheHole có thể thực hiện mã tùy ý trong sandbox của Chrome. Đội ngũ Google ngay sau đó đã khắc phục các CVE liên quan. Tuy nhiên, ngoài đối tượng TheHole, trong v8 còn có các đối tượng nguyên thủy khác không nên bị rò rỉ vào JS. Bài viết này sẽ thảo luận về đối tượng Uninitialized Oddball, phương pháp vượt qua này hiện vẫn có thể được sử dụng trong phiên bản V8 mới nhất.
Điều đáng lưu ý là phương pháp này có tính tổng quát nhất định:
Trong CVE-2021-30551, POC ban đầu là rò rỉ oddball chưa khởi tạo nội bộ.
Trong CVE-2022-1486, POC cũng đã trực tiếp rò rỉ UninitializedOddball.
Issue1352549( đã cung cấp mã khai thác hoàn chỉnh cho CVE) chưa được phân bổ.
Những trường hợp này cho thấy việc rò rỉ Uninitialized Oddball có thể dẫn đến các vấn đề an ninh nghiêm trọng.
Giá trị Sentinel trong V8
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, những đối tượng này được sắp xếp lần lượt trong bộ nhớ. Nếu để lộ những đối tượng gốc không nên bị lộ ra JavaScript, có thể thực hiện việc thực thi mã tùy ý trong sandbox.
Để xác minh điều này, chúng ta có thể sửa đổi hàm native của V8, làm rò rỉ Uninitialized Oddball vào JavaScript. Cụ thể, có thể sửa đổi độ lệch của hàm %TheHole() tương đối với isolate, để nó trả về Uninitialized Oddball.
Vượt qua bảo vệ HardenType
Sử dụng Uninitialized Oddball có thể thực hiện đọc tương đối tùy ý. Mã chính như sau:
javascript function read(obj, idx) { trả về obj[idx]; }
let uninitialized_oddball = %TheHole(); let ab = new ArrayBuffer(8); let fa = new Float64Array(ab); let ia = new BigInt64Array(ab);
let evil = [1.1, 2.2, 3.3]; evil.prop = 1;
%ChuẩnBịChứcNăngTốiƯuHóa(đọc); đọc(ác, 0); đọc(ác, 1); %Tối ưu chức năng trong cuộc gọi tiếp theo(đọc); đọc(ác, 0);
let val = read(uninitialized_oddball, "prop"); fa[0] = val; console.log(ia[0]);
Trong mã lắp ghép đã được tối ưu hóa, sẽ trực tiếp tính toán độ lệch theo ngữ nghĩa JavaScript và trả về giá trị của mảng, mà không kiểm tra obj.prop là giá trị của key. Điều này dẫn đến sự nhầm lẫn kiểu, từ đó thực hiện việc đọc tùy ý.
Do vì Uninitialized Oddball được sắp xếp ở phía trước trong bộ nhớ V8 và nguyên thủy hơn, dễ dàng giả mạo hơn đối tượng TheHole, nên đây là phương pháp ưa thích để vượt qua HardenType.
Giải pháp sửa chữa đề 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ử mảng, tránh tính toán độ lệch để trả về giá trị mảng trực tiếp.
Cảnh báo PatchGap
Phân tích sau khi xem xét Issue1352549, một số phần mềm có thể gặp phải vấn đề PatchGap. Ví dụ, Skype hiện vẫn chưa khắc phục lỗ hổng này. Trên nền tảng x86, do không có nén địa chỉ, việc đọc và ghi tùy ý là tương đối với toàn bộ tiến trình.
Mặc dù Skype đã bật ASLR, nhưng do tệp khá lớn, kẻ tấn công chỉ cần đọc và ghi vào một địa chỉ cố định, thì có khả năng cao để đọc và ghi vào nội dung tệp của Skype. Kết hợp với việc phân tích PE và các phương pháp truyền thống khác, có thể hoàn thành toàn bộ chuỗi khai thác lỗ hổng.
Lần này, PatchGap không chỉ liên quan đến Issue1352549 mà còn làm giảm đáng kể độ khó khai thác các lỗ hổng tương tự như CVE-2022-1486 và CVE-2021-30551. Tin tặc gần như không cần nghiên cứu thêm để thực hiện khai thác hoàn chỉnh.
Tóm tắt
Bài viết này tóm tắt cách thực hiện đọc tùy ý thông qua việc rò rỉ Uninitialized Oddball. Trong V8 còn nhiều giá trị Sentinel khác, có thể tồn tại nguy cơ bảo mật tương tự. Điều này cho chúng ta những gợi ý sau:
Việc rò rỉ các Oddball không được khởi tạo khác có thể dễ dàng thực hiện RCE V8 hay không.
Có còn tranh cãi về việc liệu những vấn đề như vậy có nên được coi là vấn đề an ninh chính thức hay không.
Trong Fuzzer, có cần thiết phải thêm các biến như %TheHole/Uninitialized Oddball để khai thác các nguyên mẫu khai thác mới không.
Dù sao đi nữa, những vấn đề nà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ú ý.