Phân tích khai thác lỗ hổng Giá trị Sentinel của động cơ Chrome V8: Thực hiện RCE mà không cần nghiên cứu thêm.

robot
Đang tạo bản tóm tắt

Phân tích khai thác lỗ hổng 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 làm điều kiện dừng trong thuật toán lặp hoặc đệ quy. Trong mã nguồn Chrome có rất nhiều giá trị Sentinel. Trước đây, có nghiên cứu chỉ ra rằng, thông qua việc rò rỉ đối tượng TheHole có thể thực hiện mã tùy ý trong hộp cát của Chrome. Nhóm Google sau đó đã khắc phục các lỗ hổng liên quan.

Tuy nhiên, trong V8 vẫn còn tồn tại 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 thảo luận về đối tượng Uninitialized Oddball, việc rò rỉ của nó có thể dẫn đến các phương pháp vượt qua sandbox vẫn có thể được sử dụng trong phiên bản mới nhất của V8.

Cần lưu ý rằng phương pháp này có tính phổ quát nhất định:

  1. CVE-2021-30551 PoC ban đầu là rò rỉ oddball chưa khởi tạo nội bộ.

  2. PoC của CVE-2022-1486 cũng đã tiết lộ UninitializedOddball.

  3. Issue1352549 ( chưa được phân phối CVE) đã được mô tả chi tiết cách khai thác.

Các trường hợp này cho thấy khả năng tấn công bằng cách lợi dụng lỗ hổng Uninitialized Oddball đáng được chú ý.

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, chúng được sắp xếp cạnh nhau trong bộ nhớ. Khi những đối tượng gốc không nên bị rò rỉ này bị rò rỉ vào JavaScript, có thể thực hiện việc thi hành mã tùy ý trong sandbox.

Để xác minh điều này, có thể sửa đổi giá trị trả về của hàm native %TheHole() của V8 thành Uninitialized Oddball.

Tiết lộ độc quyền cách vượt qua Chrome v8 HardenProtect thông qua việc rò rỉ Sentinel Value

Vượt qua bảo vệ HardenType

Issue1352549 đã cung cấp mã vượt qua đầy đủ. Logic cốt lõi sau khi được đơn giản hóa như sau:

javascript function read(obj, idx) { return obj[idx]; }

let uninitialized = %TheHole(); let arr = [1.1]; let res = read(uninitialized, 0x12345); %DebugPrint(res);

Đoạn mã này vẫn có thể thực hiện đọc tương đối tùy ý trong phiên bản V8 11.0.0 mới nhất.

Tiết lộ độc quyền việc vượt qua Chrome v8 HardenProtect thông qua việc rò rỉ Sentinel Value

Phân tích mã lắp ráp của hàm read đã được tối ưu hóa, có thể thấy rằng nó chỉ kiểm tra thuộc tính prop của obj có đúng hay không, nhưng không kiểm tra giá trị của obj.prop như một key. Điều này dẫn đến việc xảy ra nhầm lẫn kiểu trong quá trình tính toán, thực hiện việc đọc tùy ý.

Tiết lộ độc quyền cách vượt qua Chrome v8 HardenProtect bằng cách lộ giá trị Sentinel

Khi truyền vào uninitialized_oddball, bắt đầu tính toán từ obj theo chỉ thị cụ thể, cuối cùng hoàn thành việc đọc tùy ý trong chỉ thị vmovsd xmm0,[r9+r11*8+0x7], dữ liệu được lưu trong thanh ghi xmm0.

Tiết lộ độc quyền về việc vượt qua Chrome v8 HardenProtect thông qua việc rò rỉ Sentinel Value

Phương pháp sửa chữa được đề xuất là, khi hàm tối ưu hóa trả về 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 độ dịch để trả về giá trị của mảng.

Độc quyền tiết lộ cách vượt qua Chrome v8 HardenProtect thông qua việc rò rỉ Sentinel Value

Cảnh báo PatchGap

Trong quá trình kiểm tra phần mềm có thể tồn tại PatchGap, phát hiện ra rằng Skype hiện vẫn chưa khắc phục lỗ hổng này. Trên kiến trúc x86, do không có nén địa chỉ, việc đọc và ghi tùy ý là trực tiếp liên quan đến toàn bộ tiến trình.

Mặc dù Skype đã bật ASLR, nhưng do tệp của nó khá lớn, nếu đặt trực tiếp vào bộ nhớ 4GB, 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 sẽ đọc và ghi nội dung tệp của Skype. Kết hợp với các phương pháp truyền thống như phân tích PE, có thể hoàn thành toàn bộ chuỗi khai thác lỗ hổng.

Tiết lộ độc quyền cách vượt qua Chrome v8 HardenProtect thông qua việc rò rỉ Sentinel Value

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 vấn đề tương tự như Issue1314616 và Issue1216437. Hacker gần như không cần nghiên cứu thêm để có thể thực hiện khai thác hoàn chỉnh bất kỳ lỗ hổng uninitialized_oddball nào trước đây.

Tiết lộ độc quyền cách vượt qua Chrome v8 HardenProtect thông qua việc rò rỉ Sentinel Value

Tóm tắt

Bài viết này giới thiệu phương pháp thực hiện đọc tùy ý thông qua việc tiết lộ uninitialized_Oddball trong giá trị Sentinel. Còn tồn tại các giá trị Sentinel khác trong V8, có thể dẫn đến các vấn đề tương tự. Điều này cho chúng ta những hiểu biết sau:

  1. Các lỗ hổng uninitialized_Oddball khác có thể dễ dàng dẫn đến RCE của V8 hay không.

  2. Vẫn còn tranh cãi liệu các vấn đề như vậy có nên được coi là vấn đề an ninh chính thức hay không.

  3. Trong fuzzer có thể xem xét việc đưa các giá trị Sentinel như %TheHole/uninitialized_Oddball vào biến, nhằm khai thác các nguyên lý sử dụng khác.

Dù sao đi nữa, những vấn đề như vậy sẽ rút ngắn đáng kể chu kỳ mà hacker có thể khai thác hoàn toàn.

Tiết lộ độc quyền cách vượt qua Chrome v8 HardenProtect thông qua việc rò rỉ Sentinel Value

Tiết lộ độc quyền cách vượt qua Chrome v8 HardenProtect thông qua việc rò rỉ Sentinel Value

SENC-4.48%
Xem bản gốc
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 thưởng
  • 5
  • Đăng lại
  • Chia sẻ
Bình luận
0/400
CoffeeNFTradervip
· 07-22 08:13
Một lỗ hổng bảo mật nữa, hoảng loạn một đống.
Xem bản gốcTrả lời0
Hash_Banditvip
· 07-21 21:23
khai thác động cơ js đã trở nên thực tế...khai thác độ khó đã đạt tối đa
Xem bản gốcTrả lời0
ConsensusDissentervip
· 07-20 00:25
Một hố đen mã nữa đã xuất hiện, thật đáng sợ.
Xem bản gốcTrả lời0
Blockblindvip
· 07-20 00:19
v8 cũng có lỗ hổng lớn như vậy? Cười chết
Xem bản gốcTrả lời0
BlockchainTalkervip
· 07-20 00:12
thực sự ngạc nhiên khi V8 vẫn gặp khó khăn với điều này... p.s. đâu là sự cách ly thời gian chạy của fam?
Xem bản gốcTrả lời0
Giao dịch tiền điện tử mọi lúc mọi nơi
qrCode
Quét để tải xuống ứng dụng Gate
Cộng đồng
Tiếng Việt
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)