Khám Phá Sâu Về Những Rủi Ro An Ninh Của Sentinel Value 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 làm điều kiện dừng trong các thuật toán lặp hoặc đệ quy. Giá trị Sentinel được sử dụng rộng rãi trong mã nguồn Chrome. Gần đây, các nhà nghiên cứu an ninh đã phát hiện ra rằng có thể thực hiện mã tùy ý trong sandbox của Chrome thông qua việc rò rỉ đối tượng TheHole. Đội ngũ Google đã nhanh chóng khắc phục lỗ hổng này.
Tuy nhiên, trong V8 vẫn còn những đối tượng nguyên thủy khác không nên bị lộ ra ngoài JavaScript. Bài viết này sẽ tập trung vào đối tượng Uninitialized Oddball, việc lộ diện của đối tượng này có thể dẫn đến các nguy cơ bảo mật rộng hơn. Hiện tại, phương pháp này vẫn có thể được sử dụng trong phiên bản mới nhất của V8, Google vẫn chưa khắc phục vấn đề này.
Cần lưu ý rằng phương pháp này có tính tổng quát cao.
CVE-2021-30551 đã đề xuất lần đầu tiên poc rò rỉ internal uninitialized oddball.
Trong poc của CVE-2022-1486 cũng đã trực tiếp rò rỉ UninitializedOddball.
Issue1352549( chưa được phân bổ CVE) đã trình bày mã khai thác đầy đủ.
Những trường hợp này đầy đủ chứng minh sự cần thiết phải kiểm tra toàn diện phần mềm có thể bị ảnh hưởng. Tính đến thời điểm hiện tại, Skype vẫn chưa khắc phục được lỗ hổng này.
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, các đối tượng này được sắp xếp liền kề trong bộ nhớ. Một khi các đối tượng gốc không nên bị lộ ra bị lộ vào JavaScript, có thể thực hiện việc thực thi mã tùy ý trong sandbox.
Để xác minh tính hiệu quả của phương pháp này trong phiên bản mới nhất của V8, chúng ta có thể thông qua việc sửa đổi các hàm native của V8 để làm lộ Uninitialized Oddball vào JavaScript. Cách cụ thể là sửa đổi độ lệch tương đối của hàm %TheHole() đối với isolate, để nó trả về Uninitialized Oddball.
Vượt qua bảo vệ HardenType
Bằng cách đơn giản hóa mã được cung cấp trong Issue1352549, chúng ta có thể thực hiện đọc tương đối tùy ý trong phiên bản V8 11.0.0:
Khi %TheHole() trả về UninitializedOddball, hàm đọc JavaScript đã tối ưu sẽ trực tiếp tính toán độ lệch theo ngữ nghĩa JavaScript mà không kiểm tra giá trị của obj.prop, dẫn đến sự nhầm lẫn kiểu, cho phép đọc tùy ý.
Tương tự như đối tượng TheHole, do uninitialized_oddball được sắp xếp ở phía trước trong bộ nhớ V8 và nguyên thủy hơn, nên dễ bị giả mạo hơn. Sau khi biện pháp TheHole bị vượt qua, phương pháp này trở thành giải pháp vượt qua ưa thích.
Phương pháp sửa chữa được đề xuất là khi hàm đã được tối ưu hóa trả về phần tử của mảng, hãy tăng cường kiểm tra mảng map, tránh tính toán trực tiếp độ lệch để trả về giá trị của mảng.
Cảnh báo PatchGap
Phân tích Issue1352549, chúng tôi phát hiện Skype hiện vẫn chưa sửa lỗi này. Trong môi trường x86, việc đọc và ghi tùy ý có chút khác biệt: do không có nén địa chỉ, việc đọc và ghi tùy ý trực tiếp liên quan đến toàn bộ tiến trình.
Mặc dù Skype đã kích hoạt ASLR, nhưng do tệp lớn, nếu đặt trực tiếp trong bộ nhớ 4GB, kẻ tấn công chỉ cần đọc và ghi vào địa chỉ cụ thể thì có khả năng cao sẽ đọc và ghi nội dung tệp 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, việc hoàn thành toàn bộ chuỗi khai thác lỗ hổng không phải là điều khó khăn.
Lần này PatchGap không chỉ liên quan đến Issue1352549, việc công khai phương pháp vượt qua mới còn làm giảm đáng kể độ khó khi khai thác các lỗ hổng tương tự như CVE-2022-1486 và CVE-2021-30551. Kẻ tấn công gần như không cần nghiên cứu thêm để khai thác hoàn toàn bất kỳ lỗ hổng nào làm rò rỉ uninitialized_oddball.
Tóm tắt
Bài viết này tóm tắt việc thảo luận về việc thực hiện đọc tùy ý thông qua việc rò rỉ uninitialized_Oddball trong giá trị Sentinel. Cũng có nhiều giá trị Sentinel khác trong V8, thường gặp sự cố khi thử nghiệm. Do Uninitialized_Oddball và TheHole đều có thể thực hiện việc vượt qua vòng trong V8, chúng ta có lý do để nghi ngờ rằng các giá trị Sentinel khác cũng có thể gây ra vấn đề tương tự.
Điều này mang lại cho chúng ta những gợi ý sau:
Các rò rỉ uninitialized_Oddball khác có thể dễ dàng thực hiện RCE của V8 không.
Google đã nhanh chóng sửa lỗi TheHole, nhưng việc để lâu vấn đề lợi dụng thu gom rác để thực hiện việc vượt qua ASLR cho thấy ranh giới về việc liệu các vấn đề như vậy có được coi là vấn đề an ninh chính thức hay không vẫn còn mập mờ.
Nếu coi đây là vấn đề an toàn chính thức, liệu có cần thiết phải đưa các giá trị Sentinel như %TheHole/uninitialized_Oddball vào biến trong fuzzer để khám phá các nguyên lý khai thác khác không.
Dù sao đi nữa, những vấn đề như vậy sẽ rút ngắn đáng kể chu kỳ mà kẻ tấn công có thể thực hiện 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.
10 thích
Phần thưởng
10
3
Chia sẻ
Bình luận
0/400
GateUser-afe07a92
· 20giờ trước
Google đang làm gì vậy mà cũng bị lộ
Xem bản gốcTrả lời0
SelfRugger
· 20giờ trước
Có vẻ như V8 năm nay sẽ có chuyện lớn.
Xem bản gốcTrả lời0
SchrodingerGas
· 20giờ trước
V8 vẫn đang làm việc sau một đêm ngủ, ai sẽ trả gas cho đợt này?
Phân tích độ sâu các nguy cơ bảo mật giá trị Sentinel của động cơ Chrome V8
Khám Phá Sâu Về Những Rủi Ro An Ninh Của Sentinel Value 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 làm điều kiện dừng trong các thuật toán lặp hoặc đệ quy. Giá trị Sentinel được sử dụng rộng rãi trong mã nguồn Chrome. Gần đây, các nhà nghiên cứu an ninh đã phát hiện ra rằng có thể thực hiện mã tùy ý trong sandbox của Chrome thông qua việc rò rỉ đối tượng TheHole. Đội ngũ Google đã nhanh chóng khắc phục lỗ hổng này.
Tuy nhiên, trong V8 vẫn còn những đối tượng nguyên thủy khác không nên bị lộ ra ngoài JavaScript. Bài viết này sẽ tập trung vào đối tượng Uninitialized Oddball, việc lộ diện của đối tượng này có thể dẫn đến các nguy cơ bảo mật rộng hơn. Hiện tại, phương pháp này vẫn có thể được sử dụng trong phiên bản mới nhất của V8, Google vẫn chưa khắc phục vấn đề này.
Cần lưu ý rằng phương pháp này có tính tổng quát cao.
CVE-2021-30551 đã đề xuất lần đầu tiên poc rò rỉ internal uninitialized oddball.
Trong poc của CVE-2022-1486 cũng đã trực tiếp rò rỉ UninitializedOddball.
Issue1352549( chưa được phân bổ CVE) đã trình bày mã khai thác đầy đủ.
Những trường hợp này đầy đủ chứng minh sự cần thiết phải kiểm tra toàn diện phần mềm có thể bị ảnh hưởng. Tính đến thời điểm hiện tại, Skype vẫn chưa khắc phục được lỗ hổng này.
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, các đối tượng này được sắp xếp liền kề trong bộ nhớ. Một khi các đối tượng gốc không nên bị lộ ra bị lộ vào JavaScript, có thể thực hiện việc thực thi mã tùy ý trong sandbox.
Để xác minh tính hiệu quả của phương pháp này trong phiên bản mới nhất của V8, chúng ta có thể thông qua việc sửa đổi các hàm native của V8 để làm lộ Uninitialized Oddball vào JavaScript. Cách cụ thể là sửa đổi độ lệch tương đối của hàm %TheHole() đối với isolate, để nó trả về Uninitialized Oddball.
Vượt qua bảo vệ HardenType
Bằng cách đơn giản hóa mã được cung cấp trong Issue1352549, chúng ta có thể thực hiện đọc tương đối tùy ý trong phiên bản V8 11.0.0:
Khi %TheHole() trả về UninitializedOddball, hàm đọc JavaScript đã tối ưu sẽ trực tiếp tính toán độ lệch theo ngữ nghĩa JavaScript mà không kiểm tra giá trị của obj.prop, dẫn đến sự nhầm lẫn kiểu, cho phép đọc tùy ý.
Tương tự như đối tượng TheHole, do uninitialized_oddball được sắp xếp ở phía trước trong bộ nhớ V8 và nguyên thủy hơn, nên dễ bị giả mạo hơn. Sau khi biện pháp TheHole bị vượt qua, phương pháp này trở thành giải pháp vượt qua ưa thích.
Phương pháp sửa chữa được đề xuất là khi hàm đã được tối ưu hóa trả về phần tử của mảng, hãy tăng cường kiểm tra mảng map, tránh tính toán trực tiếp độ lệch để trả về giá trị của mảng.
Cảnh báo PatchGap
Phân tích Issue1352549, chúng tôi phát hiện Skype hiện vẫn chưa sửa lỗi này. Trong môi trường x86, việc đọc và ghi tùy ý có chút khác biệt: do không có nén địa chỉ, việc đọc và ghi tùy ý trực tiếp liên quan đến toàn bộ tiến trình.
Mặc dù Skype đã kích hoạt ASLR, nhưng do tệp lớn, nếu đặt trực tiếp trong bộ nhớ 4GB, kẻ tấn công chỉ cần đọc và ghi vào địa chỉ cụ thể thì có khả năng cao sẽ đọc và ghi nội dung tệp 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, việc hoàn thành toàn bộ chuỗi khai thác lỗ hổng không phải là điều khó khăn.
Lần này PatchGap không chỉ liên quan đến Issue1352549, việc công khai phương pháp vượt qua mới còn làm giảm đáng kể độ khó khi khai thác các lỗ hổng tương tự như CVE-2022-1486 và CVE-2021-30551. Kẻ tấn công gần như không cần nghiên cứu thêm để khai thác hoàn toàn bất kỳ lỗ hổng nào làm rò rỉ uninitialized_oddball.
Tóm tắt
Bài viết này tóm tắt việc thảo luận về việc thực hiện đọc tùy ý thông qua việc rò rỉ uninitialized_Oddball trong giá trị Sentinel. Cũng có nhiều giá trị Sentinel khác trong V8, thường gặp sự cố khi thử nghiệm. Do Uninitialized_Oddball và TheHole đều có thể thực hiện việc vượt qua vòng trong V8, chúng ta có lý do để nghi ngờ rằng các giá trị Sentinel khác cũng có thể gây ra vấn đề tương tự.
Điều này mang lại cho chúng ta những gợi ý sau:
Các rò rỉ uninitialized_Oddball khác có thể dễ dàng thực hiện RCE của V8 không.
Google đã nhanh chóng sửa lỗi TheHole, nhưng việc để lâu vấn đề lợi dụng thu gom rác để thực hiện việc vượt qua ASLR cho thấy ranh giới về việc liệu các vấn đề như vậy có được coi là vấn đề an ninh chính thức hay không vẫn còn mập mờ.
Nếu coi đây là vấn đề an toàn chính thức, liệu có cần thiết phải đưa các giá trị Sentinel như %TheHole/uninitialized_Oddball vào biến trong fuzzer để khám phá các nguyên lý khai thác khác không.
Dù sao đi nữa, những vấn đề như vậy sẽ rút ngắn đáng kể chu kỳ mà kẻ tấn công có thể thực hiện khai thác hoàn toàn.