Bỏ qua HardenProtect Chrome V8 thông qua việc rò rỉ Giá trị Sentinel
Giá trị Sentinel là giá trị đặc biệt trong thuật toán, thường được sử dụng làm điều kiện dừng cho vòng lặp hoặc đệ quy. Trong mã nguồn Chrome có nhiều giá trị Sentinel. Trước đây có nghiên cứu chỉ ra cách sử dụng đối tượng TheHole để rò rỉ thực hiện mã tùy ý trong sandbox. Bài viết này sẽ thảo luận về một đối tượng gốc V8 khác - Uninitialized Oddball, phương pháp này hiện vẫn có thể sử dụng trong phiên bản mới nhất của V8.
Phương pháp này có tính phổ quát:
Vấn đề 1216437 đã đề xuất khái niệm rò rỉ internal uninitialized oddball.
Trong Issue1314616 cũng đã trực tiếp lộ ra UninitializedOddball, mặc dù phương pháp khai thác lúc đó vẫn chưa rõ ràng.
Vấn đề 1352549 đáng được chú ý về ảnh hưởng tiềm năng của nó.
Hiện tại, một số phần mềm vẫn chưa sửa lỗi này.
Hầu hết các đối tượng gốc trong 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 liền kề nhau trong bộ nhớ. Một khi các đối tượng gốc không nên bị lộ ra đã được công khai cho JavaScript, có thể thực hiện mã tùy ý trong sandbox.
Để xác minh phương pháp này, có thể sửa đổi hàm native của V8, để lộ Uninitialized Oddball ra JavaScript. Cụ thể, có thể sửa đổi độ lệch tương đối của hàm %TheHole() so với isolate.
Mã nguồn chính của phương pháp bỏ qua này như sau:
javascript
function read(obj, prop) {
return obj[prop];
}
let uninitialized_oddball = %TheHole();
let arr = [1.1, 2.2, 3.3];
for (let i = 0; i < 100000; i++) {
read(arr, 0);
}
let val = read(uninitialized_oddball, 0);
console.log(val);
Trong thử nghiệm V8 11.0.0, khi %TheHole() trả về UninitializedOddball, vẫn có thể thực hiện đọc tương đối tùy ý.
Cấu trúc lắp ráp chính của hàm read đã được tối ưu hóa như sau:
Khi truyền vào uninitialized_oddball, bắt đầu tính toán từ obj tại địa chỉ 0x558b20004086, cuối cùng hoàn thành việc đọc tùy ý trong lệnh vmovsd, dữ liệu được lưu trong thanh ghi xmm0.
Phương pháp sửa chữa được đề xuất là thêm kiểm tra mảng map khi hàm tối ưu hóa trả về các phần tử của mảng, tránh tính toán trực tiếp độ lệch để trả về giá trị của mảng.
Cần lưu ý rằng, một số phần mềm vẫn chưa khắc phục lỗ hổng này. Cách khai thác trên nền tảng x86 có sự khác biệt nhỏ, 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. Ngay cả khi ASLR được bật, do tệp quá lớn, vẫn có xác suất cao để đọc và ghi vào nội dung mục tiêu.
Phương pháp vượt qua mới này đã giảm đáng kể độ khó trong việc khai thác các lỗ hổng tương tự trước đây. Đề xuất xem xét lại tất cả các lỗ hổng rò rỉ uninitialized_oddball.
Trong V8 còn tồn tại các giá trị Sentinel khác, chúng cũng có thể gây ra các vấn đề tương tự. Điều này cho chúng ta những gợi ý sau:
Các lỗ hổng uninitialized_Oddball khác có dễ dàng thực hiện V8 RCE hay không.
Vấn đề này có nên được coi là vấn đề an ninh một cách chính thức hay không vẫn còn gây tranh cãi.
Có nên thêm giá trị Sentinel vào biến trong Fuzzer để khám phá các nguyên lý khai thác mới không.
Dù sao đi nữa, những vấn đề như vậy sẽ rút ngắn đáng kể thời gian mà hacker có thể khai thác hoàn toàn.
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
Động cơ Chrome V8 tái hiện lỗ hổng bảo mật: Lỗ hổng rò rỉ giá trị Sentinel có thể vượt qua sandbox
Bỏ qua HardenProtect Chrome V8 thông qua việc rò rỉ Giá trị Sentinel
Giá trị Sentinel là giá trị đặc biệt trong thuật toán, thường được sử dụng làm điều kiện dừng cho vòng lặp hoặc đệ quy. Trong mã nguồn Chrome có nhiều giá trị Sentinel. Trước đây có nghiên cứu chỉ ra cách sử dụng đối tượng TheHole để rò rỉ thực hiện mã tùy ý trong sandbox. Bài viết này sẽ thảo luận về một đối tượng gốc V8 khác - Uninitialized Oddball, phương pháp này hiện vẫn có thể sử dụng trong phiên bản mới nhất của V8.
Phương pháp này có tính phổ quát:
Vấn đề 1216437 đã đề xuất khái niệm rò rỉ internal uninitialized oddball.
Trong Issue1314616 cũng đã trực tiếp lộ ra UninitializedOddball, mặc dù phương pháp khai thác lúc đó vẫn chưa rõ ràng.
Vấn đề 1352549 đáng được chú ý về ảnh hưởng tiềm năng của nó.
Hiện tại, một số phần mềm vẫn chưa sửa lỗi này.
Hầu hết các đối tượng gốc trong 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 liền kề nhau trong bộ nhớ. Một khi các đối tượng gốc không nên bị lộ ra đã được công khai cho JavaScript, có thể thực hiện mã tùy ý trong sandbox.
Để xác minh phương pháp này, có thể sửa đổi hàm native của V8, để lộ Uninitialized Oddball ra JavaScript. Cụ thể, có thể sửa đổi độ lệch tương đối của hàm %TheHole() so với isolate.
Mã nguồn chính của phương pháp bỏ qua này như sau:
javascript function read(obj, prop) { return obj[prop]; }
let uninitialized_oddball = %TheHole(); let arr = [1.1, 2.2, 3.3];
for (let i = 0; i < 100000; i++) { read(arr, 0);
}
let val = read(uninitialized_oddball, 0); console.log(val);
Trong thử nghiệm V8 11.0.0, khi %TheHole() trả về UninitializedOddball, vẫn có thể thực hiện đọc tương đối tùy ý.
Cấu trúc lắp ráp chính của hàm read đã được tối ưu hóa như sau:
0x558b20004086 mov r11,rdi 0x558b20004089 movzx edi,byte ptr [r11+0xb] 0x558b2000408d cmp edi,0x81 0x558b20004093 jnz 0x558b200040d8 0x558b20004095 mov r9,qword ptr [r11+0xf] 0x558b20004099 kiểm tra esi,esi 0x558b2000409b js 0x558b200040d8 0x558b2000409d movsxd r11,esi 0x558b200040a0 cmp r11,qword ptr [r9+0xf] 0x558b200040a4 jae 0x558b200040d8 0x558b200040a6 vmovsd xmm0,[r9+r11*8+0x7]
Khi truyền vào uninitialized_oddball, bắt đầu tính toán từ obj tại địa chỉ 0x558b20004086, cuối cùng hoàn thành việc đọc tùy ý trong lệnh vmovsd, dữ liệu được lưu trong thanh ghi xmm0.
Phương pháp sửa chữa được đề xuất là thêm kiểm tra mảng map khi hàm tối ưu hóa trả về các phần tử của mảng, tránh tính toán trực tiếp độ lệch để trả về giá trị của mảng.
Cần lưu ý rằng, một số phần mềm vẫn chưa khắc phục lỗ hổng này. Cách khai thác trên nền tảng x86 có sự khác biệt nhỏ, 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. Ngay cả khi ASLR được bật, do tệp quá lớn, vẫn có xác suất cao để đọc và ghi vào nội dung mục tiêu.
Phương pháp vượt qua mới này đã giảm đáng kể độ khó trong việc khai thác các lỗ hổng tương tự trước đây. Đề xuất xem xét lại tất cả các lỗ hổng rò rỉ uninitialized_oddball.
Trong V8 còn tồn tại các giá trị Sentinel khác, chúng cũng có thể gây ra các vấn đề tương tự. Điều này cho chúng ta những gợi ý sau:
Các lỗ hổng uninitialized_Oddball khác có dễ dàng thực hiện V8 RCE hay không.
Vấn đề này có nên được coi là vấn đề an ninh một cách chính thức hay không vẫn còn gây tranh cãi.
Có nên thêm giá trị Sentinel vào biến trong Fuzzer để khám phá các nguyên lý khai thác mới không.
Dù sao đi nữa, những vấn đề như vậy sẽ rút ngắn đáng kể thời gian mà hacker có thể khai thác hoàn toàn.