Phân tích lỗ hổng tràn số nguyên trong xác thực an toàn tham chiếu ngôn ngữ Move
Gần đây, các nhà nghiên cứu đã phát hiện một lỗ hổng tràn số nguyên mới khi phân tích sâu về Aptos Moveevm. Lỗ hổng này tồn tại trong quá trình xác minh an toàn tham chiếu của ngôn ngữ Move, cụ thể liên quan đến bước reference_safety. Bài viết này sẽ đi sâu khám phá lỗ hổng này và giải thích quá trình kích hoạt cũng như tác động tiềm ẩn của nó.
Quy trình xác minh của ngôn ngữ Move
Ngôn ngữ Move sẽ thực hiện xác thực đơn vị mã trước khi thực thi bytecode, quá trình này được chia thành 4 bước. Lỗ hổng được phát hiện lần này xảy ra trong bước reference_safety. Bước này chủ yếu được sử dụng để xác thực tính an toàn của tham chiếu, bao gồm kiểm tra xem có tham chiếu lơ lửng hay không, việc truy cập tham chiếu có thể thay đổi có an toàn hay không, và việc truy cập tham chiếu lưu trữ toàn cầu có an toàn hay không.
Quá trình xác thực trước hết sẽ nhận diện khối cơ bản. Trong ngôn ngữ Move, khối cơ bản được xác định bằng cách duyệt mã byte, tìm tất cả các lệnh nhánh và chu trình. Mỗi khối cơ bản là một đoạn mã không có lệnh nhánh ngoại trừ điểm vào và điểm ra.
Cơ chế xác thực an toàn trích dẫn
Ngôn ngữ Move hỗ trợ hai loại tham chiếu: tham chiếu không thay đổi (&) và tham chiếu thay đổi (&mut). Mô-đun xác minh an toàn tham chiếu sẽ quét mã byte của từng khối cơ bản trong hàm theo từng hàm, xác định xem tất cả các thao tác tham chiếu có hợp pháp hay không.
Quá trình xác thực sử dụng cấu trúc AbstractState để biểu thị trạng thái, bao gồm hai thành phần chính là borrow graph và locals. Trong quá trình xác thực, sẽ so sánh sự thay đổi trạng thái trước và sau khi thực hiện khối cơ bản, và truyền kết quả đến các khối theo sau.
Chi tiết lỗ hổng
Lỗi tồn tại trong hàm join_. Hàm này được sử dụng để hợp nhất trạng thái trước và sau khi thực thi các khối cơ bản. Vấn đề nằm ở phương thức iter_locals(), nó trả về một trình lặp kiểu u8. Khi tổng chiều dài tham số hàm vượt quá tổng chiều dài của các biến cục bộ là 256, sẽ dẫn đến tràn số nguyên.
Mặc dù ngôn ngữ Move có quá trình kiểm tra số lượng locals, nhưng chỉ kiểm tra số lượng biến cục bộ, không bao gồm độ dài tham số. Điều này có thể là sự sơ suất của các nhà phát triển.
Khai thác lỗ hổng và ảnh hưởng
Bằng cách tận dụng lỗ hổng tràn số nguyên này, kẻ tấn công có thể cấu tạo các khối mã vòng lặp đặc biệt, thay đổi trạng thái của khối. Khi thực thi lại khối cơ bản, nếu chỉ số truy cập của hướng dẫn không tồn tại trong bản đồ locals mới, nó sẽ dẫn đến từ chối dịch vụ (DoS).
Cụ thể, trong mô-đun reference safety, các mã thao tác như MoveLoc/CopyLoc/FreeRef có thể gây ra panic do truy cập vào LocalIndex không tồn tại, dẫn đến việc toàn bộ nút bị sập.
Tóm tắt và đề xuất
Lỗ hổng này một lần nữa chứng minh rằng ngay cả những ngôn ngữ được thiết kế cẩn thận cũng có thể tiềm ẩn rủi ro an ninh. Đối với ngôn ngữ Move, chúng tôi khuyến nghị:
Tăng cường kiểm tra mã, tránh những sơ suất tương tự.
Tăng cường mã kiểm tra trong thời gian chạy Move, không chỉ dựa vào kiểm tra an ninh trong giai đoạn xác thực.
Tăng cường các biện pháp an ninh trong giai đoạn vận hành, ngăn chặn việc bỏ qua xác thực gây ra các vấn đề nghiêm trọng hơn.
Là những người tiên phong trong nghiên cứu an toàn ngôn ngữ Move, chúng tôi sẽ tiếp tục khám phá sâu các vấn đề an toàn liên quan, góp phần vào sự phát triển lành mạnh của hệ sinh thái Move.
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.
21 thích
Phần thưởng
21
9
Chia sẻ
Bình luận
0/400
LiquidationWatcher
· 07-07 17:46
Ôi trời, lại một vụ khai thác defi nữa... khiến tôi nhớ lại những hồi ức lớn của năm 2022.
Xem bản gốcTrả lời0
BearMarketSunriser
· 07-07 02:16
move chết tiệt ah,炒a còn không bằng炒b
Xem bản gốcTrả lời0
SundayDegen
· 07-06 08:36
Tsk, lỗi này thực sự hơi tầm thường.
Xem bản gốcTrả lời0
MoonRocketman
· 07-05 04:47
Chiều cao chặn của Move đã mất 256, hãy cảnh giác với rủi ro rơi tên lửa.
Xem bản gốcTrả lời0
Web3ProductManager
· 07-05 04:47
nhìn vào dữ liệu funnel chuyển đổi, lỗi tràn này = ma sát UX lớn thật sự
Phân tích lỗ hổng tràn số nguyên xác thực an toàn của ngôn ngữ Move
Phân tích lỗ hổng tràn số nguyên trong xác thực an toàn tham chiếu ngôn ngữ Move
Gần đây, các nhà nghiên cứu đã phát hiện một lỗ hổng tràn số nguyên mới khi phân tích sâu về Aptos Moveevm. Lỗ hổng này tồn tại trong quá trình xác minh an toàn tham chiếu của ngôn ngữ Move, cụ thể liên quan đến bước reference_safety. Bài viết này sẽ đi sâu khám phá lỗ hổng này và giải thích quá trình kích hoạt cũng như tác động tiềm ẩn của nó.
Quy trình xác minh của ngôn ngữ Move
Ngôn ngữ Move sẽ thực hiện xác thực đơn vị mã trước khi thực thi bytecode, quá trình này được chia thành 4 bước. Lỗ hổng được phát hiện lần này xảy ra trong bước reference_safety. Bước này chủ yếu được sử dụng để xác thực tính an toàn của tham chiếu, bao gồm kiểm tra xem có tham chiếu lơ lửng hay không, việc truy cập tham chiếu có thể thay đổi có an toàn hay không, và việc truy cập tham chiếu lưu trữ toàn cầu có an toàn hay không.
Quá trình xác thực trước hết sẽ nhận diện khối cơ bản. Trong ngôn ngữ Move, khối cơ bản được xác định bằng cách duyệt mã byte, tìm tất cả các lệnh nhánh và chu trình. Mỗi khối cơ bản là một đoạn mã không có lệnh nhánh ngoại trừ điểm vào và điểm ra.
Cơ chế xác thực an toàn trích dẫn
Ngôn ngữ Move hỗ trợ hai loại tham chiếu: tham chiếu không thay đổi (&) và tham chiếu thay đổi (&mut). Mô-đun xác minh an toàn tham chiếu sẽ quét mã byte của từng khối cơ bản trong hàm theo từng hàm, xác định xem tất cả các thao tác tham chiếu có hợp pháp hay không.
Quá trình xác thực sử dụng cấu trúc AbstractState để biểu thị trạng thái, bao gồm hai thành phần chính là borrow graph và locals. Trong quá trình xác thực, sẽ so sánh sự thay đổi trạng thái trước và sau khi thực hiện khối cơ bản, và truyền kết quả đến các khối theo sau.
Chi tiết lỗ hổng
Lỗi tồn tại trong hàm join_. Hàm này được sử dụng để hợp nhất trạng thái trước và sau khi thực thi các khối cơ bản. Vấn đề nằm ở phương thức iter_locals(), nó trả về một trình lặp kiểu u8. Khi tổng chiều dài tham số hàm vượt quá tổng chiều dài của các biến cục bộ là 256, sẽ dẫn đến tràn số nguyên.
Mặc dù ngôn ngữ Move có quá trình kiểm tra số lượng locals, nhưng chỉ kiểm tra số lượng biến cục bộ, không bao gồm độ dài tham số. Điều này có thể là sự sơ suất của các nhà phát triển.
Khai thác lỗ hổng và ảnh hưởng
Bằng cách tận dụng lỗ hổng tràn số nguyên này, kẻ tấn công có thể cấu tạo các khối mã vòng lặp đặc biệt, thay đổi trạng thái của khối. Khi thực thi lại khối cơ bản, nếu chỉ số truy cập của hướng dẫn không tồn tại trong bản đồ locals mới, nó sẽ dẫn đến từ chối dịch vụ (DoS).
Cụ thể, trong mô-đun reference safety, các mã thao tác như MoveLoc/CopyLoc/FreeRef có thể gây ra panic do truy cập vào LocalIndex không tồn tại, dẫn đến việc toàn bộ nút bị sập.
Tóm tắt và đề xuất
Lỗ hổng này một lần nữa chứng minh rằng ngay cả những ngôn ngữ được thiết kế cẩn thận cũng có thể tiềm ẩn rủi ro an ninh. Đối với ngôn ngữ Move, chúng tôi khuyến nghị:
Là những người tiên phong trong nghiên cứu an toàn ngôn ngữ Move, chúng tôi sẽ tiếp tục khám phá sâu các vấn đề an toàn liên quan, góp phần vào sự phát triển lành mạnh của hệ sinh thái Move.