Ngôn ngữ Move lại xuất hiện lỗ hổng nghiêm trọng: Tràn số nguyên có thể dẫn đến Nút sập
Gần đây, các nhà nghiên cứu an ninh đã phân tích sâu về ngôn ngữ Move và phát hiện ra một lỗ hổng tràn số nguyên mới. Lỗ hổng này xuất hiện trong quá trình xác minh an toàn tham chiếu của ngôn ngữ Move, có thể dẫn đến việc Nút bị sập.
Ngôn ngữ Move sẽ thực hiện xác thực mã trước khi thực thi bytecode, chia thành bốn bước. Lỗ hổng được phát hiện lần này nằm 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 các tham chiếu, bao gồm kiểm tra xem có tồn tại tham chiếu lơ lửng hay không, truy cập tham chiếu biến có an toàn hay không, v.v.
Sự kích hoạt của lỗ hổng liên quan đến khái niệm khối cơ bản trong ngôn ngữ Move. Khối cơ bản là một đoạn mã không có lệnh nhánh ngoài điểm vào và điểm ra. Move nhận diện khối cơ bản bằng cách duyệt mã byte và tìm lệnh nhánh.
Trong quá trình xác thực an toàn khi trích dẫn, hệ thống sẽ quét mã byte trong mỗi khối cơ bản để xác định xem tất cả các thao tác trích dẫn có hợp pháp hay không. Quá trình này sử dụng cấu trúc AbstractState, bao gồm hai thành phần quan trọng là borrow graph và locals.
Lỗi xuất hiện trong hàm join_. Khi tổng chiều dài tham số và chiều dài biến cục bộ vượt quá 256, do việc sử dụng kiểu u8 để biểu diễn chỉ số cục bộ, có thể xảy ra tràn số nguyên. Mặc dù Move có cơ chế kiểm tra số lượng locals, nhưng không bao gồm chiều dài tham số.
Bằng cách tận dụng lỗ hổng tràn này, kẻ tấn công có thể xây dựng một khối mã lặp lại để thay đổi trạng thái của khối. Khi khối cơ bản được thực thi lại, nếu chỉ thị cần truy cập chỉ mục không tồn tại trong bản đồ locals mới, điều này sẽ dẫn đến sự cố chương trình.
Các nhà nghiên cứu đã cung cấp một mã xác minh khái niệm (PoC), cho thấy cách kích hoạt lỗ hổng này. Bằng cách thiết lập các tham số cụ thể và số lượng biến cục bộ, độ dài của map locals có thể giảm xuống còn 8. Trong lần thực thi tiếp theo, việc cố gắng truy cập vào chỉ số không tồn tại 57 sẽ dẫn đến panic.
Lỗ hổng này một lần nữa chứng minh rằng không có mã nào hoàn toàn an toàn. Mặc dù ngôn ngữ Move đã thực hiện kiểm tra tĩnh trước khi thực thi, nhưng vẫn có thể bị vượt qua bởi tràn số nguyên. Các nhà nghiên cứu khuyên các nhà thiết kế ngôn ngữ Move nên thêm nhiều mã kiểm tra hơn trong thời gian chạy để ngăn ngừa các vấn đề tương tự xảy ra.
Hiện tại, nhóm nghiên cứu đã phát hiện ra một lỗ hổng khác của ngôn ngữ Move, sẽ chia sẻ thêm chi tiết trong thời gian tới. Những phát hiện này có ý nghĩa quan trọng trong việc cải thiện tính an toàn của ngôn ngữ 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.
12 thích
Phần thưởng
12
4
Chia sẻ
Bình luận
0/400
PositionPhobia
· 18giờ trước
Mã này có bao nhiêu cái bẫy vậy, đi được một cái thì tính một cái.
Lỗ hổng tràn số nguyên trong ngôn ngữ Move: Rủi ro khi tham chiếu xác thực an toàn
Ngôn ngữ Move lại xuất hiện lỗ hổng nghiêm trọng: Tràn số nguyên có thể dẫn đến Nút sập
Gần đây, các nhà nghiên cứu an ninh đã phân tích sâu về ngôn ngữ Move và phát hiện ra một lỗ hổng tràn số nguyên mới. Lỗ hổng này xuất hiện trong quá trình xác minh an toàn tham chiếu của ngôn ngữ Move, có thể dẫn đến việc Nút bị sập.
Ngôn ngữ Move sẽ thực hiện xác thực mã trước khi thực thi bytecode, chia thành bốn bước. Lỗ hổng được phát hiện lần này nằm 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 các tham chiếu, bao gồm kiểm tra xem có tồn tại tham chiếu lơ lửng hay không, truy cập tham chiếu biến có an toàn hay không, v.v.
Sự kích hoạt của lỗ hổng liên quan đến khái niệm khối cơ bản trong ngôn ngữ Move. Khối cơ bản là một đoạn mã không có lệnh nhánh ngoài điểm vào và điểm ra. Move nhận diện khối cơ bản bằng cách duyệt mã byte và tìm lệnh nhánh.
Trong quá trình xác thực an toàn khi trích dẫn, hệ thống sẽ quét mã byte trong mỗi khối cơ bản để xác định xem tất cả các thao tác trích dẫn có hợp pháp hay không. Quá trình này sử dụng cấu trúc AbstractState, bao gồm hai thành phần quan trọng là borrow graph và locals.
Lỗi xuất hiện trong hàm join_. Khi tổng chiều dài tham số và chiều dài biến cục bộ vượt quá 256, do việc sử dụng kiểu u8 để biểu diễn chỉ số cục bộ, có thể xảy ra tràn số nguyên. Mặc dù Move có cơ chế kiểm tra số lượng locals, nhưng không bao gồm chiều dài tham số.
Bằng cách tận dụng lỗ hổng tràn này, kẻ tấn công có thể xây dựng một khối mã lặp lại để thay đổi trạng thái của khối. Khi khối cơ bản được thực thi lại, nếu chỉ thị cần truy cập chỉ mục không tồn tại trong bản đồ locals mới, điều này sẽ dẫn đến sự cố chương trình.
Các nhà nghiên cứu đã cung cấp một mã xác minh khái niệm (PoC), cho thấy cách kích hoạt lỗ hổng này. Bằng cách thiết lập các tham số cụ thể và số lượng biến cục bộ, độ dài của map locals có thể giảm xuống còn 8. Trong lần thực thi tiếp theo, việc cố gắng truy cập vào chỉ số không tồn tại 57 sẽ dẫn đến panic.
Lỗ hổng này một lần nữa chứng minh rằng không có mã nào hoàn toàn an toàn. Mặc dù ngôn ngữ Move đã thực hiện kiểm tra tĩnh trước khi thực thi, nhưng vẫn có thể bị vượt qua bởi tràn số nguyên. Các nhà nghiên cứu khuyên các nhà thiết kế ngôn ngữ Move nên thêm nhiều mã kiểm tra hơn trong thời gian chạy để ngăn ngừa các vấn đề tương tự xảy ra.
Hiện tại, nhóm nghiên cứu đã phát hiện ra một lỗ hổng khác của ngôn ngữ Move, sẽ chia sẻ thêm chi tiết trong thời gian tới. Những phát hiện này có ý nghĩa quan trọng trong việc cải thiện tính an toàn của ngôn ngữ Move.