Về CVE-2024-0517
CVE-2024-0517 là lỗ hổng ghi ngoài giới hạn trong công cụ JavaScript V8 của Google Chrome trước phiên bản 120.0.6099.224, cho phép kẻ tấn công từ xa khai thác lỗi heap thông qua trang HTML được tạo thủ công. Lỗ hổng này lần đầu tiên được báo cáo bởi Toan (Suto) Pham của Qrious Secure .
Lỗ hổng này phát sinh từ sự nhầm lẫn kiểu, xảy ra khi một ứng dụng phân bổ hoặc khởi tạo một tài nguyên như con trỏ, đối tượng hoặc biến bằng một kiểu, nhưng sau đó truy cập tài nguyên đó bằng một kiểu không tương thích với kiểu ban đầu (CWE-843) . Trong CVE này, sự nhầm lẫn kiểu được kích hoạt trong quá trình phân bổ bộ nhớ được gọi là phân bổ gấp, được Maglev, một trình biên dịch tối ưu hóa cho công cụ JavaScript V8, sử dụng để tối ưu hóa bộ nhớ.
Bằng cách khai thác lỗi nhầm lẫn kiểu và viết mã shell tùy ý bằng WebAssembly, kẻ tấn công có thể thực thi các lệnh trên máy của nạn nhân.
Các giai đoạn tấn công
Kẻ tấn công có thể lưu trữ một trang web chứa trang HTML được tạo thủ công và lừa người dùng truy cập trang web đó thông qua email lừa đảo hoặc mạng xã hội. Khi người dùng truy cập trang web bằng phiên bản Google Chrome dễ bị tấn công, mã độc được nhúng sẽ thực thi các lệnh tùy ý.
Công cụ JavaScript V8
Kẻ tấn công có thể lưu trữ một trang web chứa trang HTML được tạo thủ công và lừa người dùng truy cập trang web đó thông qua email lừa đảo hoặc mạng xã hội. Khi người dùng truy cập trang web bằng phiên bản Google Chrome dễ bị tấn công, mã độc được nhúng sẽ thực thi các lệnh tùy ý.
Maglev và Phân bổ gấp
Maglev, trình biên dịch tối ưu hóa trong V8, tăng cường thực thi mã và phân bổ bộ nhớ. Maglev chỉ chạy khi mã được thực thi thường xuyên và được đánh dấu là "nóng", cho biết nhu cầu thực thi nhanh hơn thông qua biên dịch thay vì diễn giải từng dòng chậm hơn.
Thông thường, việc phân bổ xảy ra ở các vùng bộ nhớ không liền kề, dẫn đến việc sử dụng bộ nhớ thưa thớt và không hiệu quả. Để giải quyết vấn đề này, V8 sử dụng một kỹ thuật gọi là phân bổ gấp, phân bổ nhiều biến liên tục và đồng thời. Maglev cũng tối ưu hóa việc phân bổ bằng cách sử dụng phân bổ gấp trong quá trình thực hiện.
Thu gom rác thải thế hệ
Để dọn dẹp các vùng bộ nhớ chưa sử dụng, V8 sử dụng kỹ thuật thu gom rác theo thế hệ (GC), chia bộ nhớ thành hai không gian: thế hệ trẻ và thế hệ cũ. Ngoài ra, có hai trình thu gom rác: trình thu gom rác phụ, có trách nhiệm dọn dẹp không gian trẻ và trình thu gom rác chính, xử lý việc dọn dẹp không gian cũ. Thế hệ trẻ là vùng bộ nhớ nơi các đối tượng mới được tạo ban đầu được phân bổ và thế hệ cũ là vùng bộ nhớ nơi các đối tượng tồn tại lâu dài được lưu trữ. Các đối tượng đã tồn tại qua nhiều chu kỳ GC phụ trong thế hệ trẻ cuối cùng sẽ được thăng cấp lên thế hệ cũ.
Phân tích lỗ hổng bảo mật
Tổng quan
Lỗ hổng này phát sinh khi một đối tượng được tạo từ một lớp kế thừa từ một lớp cơ sở mà không có hàm tạo được xác định rõ ràng (hàm tạo mặc định cơ sở) và một đối tượng khác được tạo sau đó. Do phân bổ gấp, việc phân bổ đối tượng đầu tiên có thể được theo sau bởi việc phân bổ đối tượng thứ hai. Nếu một sự kiện như thu gom rác xảy ra giữa hai lần phân bổ này, lỗ hổng nhầm lẫn kiểu có thể phát sinh.
Phân tích nguyên nhân gốc rễ
OPSWAT Các nghiên cứu sinh đã tiến hành phân tích chi tiết quy trình làm việc V8 trong quá trình phân bổ và xác định rằng các chức năng sau đây được gọi trong quá trình này:
Trong quy trình này, một sự cố đã được xác định trong hàm TryBuildFindNonDefaultConstructorOrConstruct: Hàm BuildAllocateFastObject mở rộng current_raw_allocation_ (một con trỏ đến vùng bộ nhớ được phân bổ cho nhiều biến cùng lúc) để xây dựng thể hiện lớp con, nhưng không xóa được thể hiện này bằng cách đặt thành null.
Kết quả là, đối tượng tiếp theo được tạo luôn được phân bổ ngay sau bộ nhớ được trỏ tới bởi current_raw_allocation_, bất kể bất kỳ sự kiện nào xảy ra trước lần phân bổ thứ hai.
Nếu GC được gọi, vùng bộ nhớ bên cạnh vùng bộ nhớ liền kề với current_raw_allocation_ có thể được gán cho các đối tượng khác. Điều này có thể dẫn đến tình huống sau khi GC được kích hoạt và một đối tượng khác được tạo, hai con trỏ tham chiếu đến cùng một vùng bộ nhớ nhưng có các kiểu dữ liệu khác nhau, dẫn đến lỗ hổng nhầm lẫn kiểu.
Khai thác
Để khai thác lỗ hổng này, OPSWAT Các nghiên cứu sinh đã tạo ra các phiên bản WebAssembly chứa shellcode và cố gắng kích hoạt nhầm lẫn kiểu bằng GC để kiểm soát bộ nhớ và thực thi shellcode:
Sự nhầm lẫn về loại kích hoạt
Trong quá trình khởi tạo, trước tiên chúng ta định nghĩa một mảng (_arrayObject) chứa các đối tượng rỗng. Tiếp theo, chúng ta xây dựng một thể hiện của lớp con cũng như một trình thu gom rác kích hoạt. Cuối cùng, chúng ta định nghĩa một mảng khác với số dấu phẩy động, có tên là _arrayDouble.
Những cấu trúc này phải được lặp lại để mã được thực thi nhiều lần, khiến V8 đánh dấu nó là "hot" và kích hoạt trình biên dịch Maglev. Chúng ta đạt được điều này bằng cách gọi hàm tạo của lớp con trong một vòng lặp như sau:
Sự nhầm lẫn về kiểu sẽ xảy ra sau khi khởi tạo các đối tượng này nhiều lần trong một vòng lặp.
Tạo các lệnh đọc và ghi nguyên thủy
Sau khi kích hoạt nhầm lẫn kiểu thành công, việc thực thi shellcode đòi hỏi phải đọc bộ nhớ và ghi đè bộ nhớ tại một địa chỉ được kiểm soát. Để thực hiện việc này, chúng tôi đã tạo các nguyên hàm đọc và ghi. Các nguyên hàm khai thác sẽ tận dụng siêu dữ liệu trong các đối tượng để cung cấp cho chúng tôi các vùng bộ nhớ đọc/ghi tùy ý và sử dụng vùng đó để chạy mã tùy ý.
Đọc và ghi các nguyên hàm trong bước này sẽ cho phép chúng ta kiểm soát con trỏ bảng Jump của phiên bản WebAssembly ở bước tiếp theo.
Tạo các phiên bản WebAssembly
Tiếp theo, chúng tôi tạo hai phiên bản WebAssembly: một để lưu trữ shellcode và một để kích hoạt shellcode. Để tránh ghi trực tiếp shellcode vào bộ nhớ của phiên bản WebAssembly thông qua các nguyên hàm đọc và ghi, chúng tôi định nghĩa một số giá trị hằng số dấu phẩy động trong phiên bản WebAssembly.
Kiểm soát con trỏ bảng nhảy của phiên bản WebAssembly
Sử dụng các nguyên hàm đọc và ghi; chúng tôi điều chỉnh con trỏ bảng nhảy của phiên bản WebAssembly thứ hai để bỏ qua một số byte của mã đã biên dịch của các hằng số trong phiên bản WebAssembly đầu tiên để các hằng số dấu phẩy động sẽ được diễn giải thành shellcode theo ý định của chúng tôi:
Chạy WebAssembly Instance để thực thi Shellcode
Cuối cùng, sau khi kích hoạt nhầm lẫn kiểu và sử dụng các nguyên hàm đọc/ghi để kiểm soát các con trỏ bảng nhảy của các thể hiện WebAssembly, chúng tôi đã gọi hàm được xuất của thể hiện WebAssembly thứ hai, hàm này khiến cho shellcode trong thể hiện WebAssembly đầu tiên được thực thi.
Mã lệnh shellcode mà chúng tôi đang sử dụng được thiết kế để chấm dứt mọi tiến trình trên máy Linux, bằng lệnh sau:
Mã lệnh để thực thi lệnh này, được chuyển đổi từ số dấu phẩy động, sẽ như sau:
Mô phỏng lỗ hổng bảo mật
Để mô phỏng việc khai thác này trong một kịch bản thực tế, OPSWAT Các nghiên cứu sinh đã tạo ra một trang HTML có chủ đích.
Một email lừa đảo có nhúng liên kết đến tên miền lưu trữ trang HTML được tạo thủ công này sẽ được gửi đến nạn nhân.
Nếu nạn nhân truy cập liên kết bằng phiên bản Google Chrome dễ bị tấn công, shellcode sẽ được thực thi, khiến tất cả các quy trình bị chấm dứt. Kết quả là người dùng sẽ bị đăng xuất, như được hiển thị bên dưới:
Khắc phục
MetaDefender Endpoint™ đã được sử dụng để chủ động giảm thiểu CVE này bằng cách tận dụng khả năng "Ứng dụng dễ bị tấn công" của nó. Giải pháp này xác định và hiển thị hiệu quả tất cả các CVE liên quan cho các ứng dụng Google Chrome trong môi trường điểm cuối. Để vô hiệu hóa mối đe dọa, người dùng có thể nhanh chóng gỡ cài đặt Chrome hoặc áp dụng bản vá bảo mật mới nhất. Bằng cách triển khai bất kỳ biện pháp đối phó nào, CVE sẽ được chứa hoàn toàn, giúp giảm đáng kể nguy cơ tấn công mạng thành công vào điểm cuối.
Cấp độ tiếp theo Endpoint Bảo vệ
Khám phá lý do tại sao các tổ chức, cơ quan và thực thể trên toàn thế giới tin tưởng MetaDefender Endpoint để bảo vệ các điểm cuối quan trọng. Hãy trao đổi với chuyên gia ngay hôm nay để tìm hiểu thêm và tự mình xem qua bản demo miễn phí.
Tham khảo
https://nvd.nist.gov/vuln/detail/CVE-2024-0517
https://cwe.mitre.org/data/def địnhs/843.html
https://blog.exodusintel.com/2024/01/19/google-chrome-v8-cve-2024-0517-out-of-bounds-write-code-execution/
https://jhalon.github.io/chrome-browser-exploitation-1/
https://wenderson.dev/blog/webgl-garbage-collection/
https://v8.dev/
https://github.com/Uniguri/CVE-nday/tree/master/Chrome/V8/CVE-2024-0517