Phân tích lỗ hổng tràn số nguyên trong kiểm tra an toàn tham chiếu ngôn ngữ Move
Gần đây, một lỗ hổng tràn số nguyên mới trong quá trình xác thực an toàn được trích dẫn của ngôn ngữ Move đã được phát hiện. Lỗ hổng này xuất hiện trong bước reference_safety của đơn vị mã xác thực, liên quan đến khối cơ bản và cơ chế an toàn tham chiếu trong ngôn ngữ Move.
Ngôn ngữ Move sẽ thực hiện xác minh mã trước khi thực thi mã byte, chia thành bốn bước. Kiểm tra an toàn tham chiếu là một khâu quan trọng, được sử dụng để kiểm tra xem có tồn tại tham chiếu lơ lửng hay không, liệu việc truy cập vào các tham chiếu biến có an toàn hay không, v.v. Quá trình xác minh sẽ duyệt qua các chỉ thị mã byte của từng khối cơ bản.
Khối cơ bản là đoạn mã không có các lệnh phân nhánh ngoại trừ lệnh vào và ra. Ngôn ngữ Move xác định các khối cơ bản bằng cách kiểm tra các lệnh phân nhánh và lặp. Kiểm tra tính hợp lệ tham chiếu sẽ quét các lệnh trong mỗi khối cơ bản để xác định tính hợp pháp của các thao tác tham chiếu.
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 quan trọng là locals và đồ thị mượn. Việc xác thực sẽ so sánh trạng thái trước và sau khi thực hiện, hợp nhất kết quả và truyền bá đến các khối tiếp theo.
Lỗi xuất hiện trong hàm join_. Khi tổng chiều dài của tham số và chiều dài của biến cục bộ vượt quá 256, do việc sử dụng loại u8 để lặp qua locals, sẽ xảy ra tràn số nguyên. Điều này có thể dẫn đến bản đồ locals mới khác với trước đó, và khi thực hiện lại, nó sẽ truy cập vào chỉ mục không tồn tại, gây ra từ chối dịch vụ.
Mã PoC kích hoạt tràn số nguyên bằng cách thiết lập các tham số nhất định và số lượng biến cục bộ, dẫn đến độ dài của bản đồ locals mới bị rút ngắn. Khi thực hiện lại, truy cập vào offset không tồn tại, cuối cùng gây ra panic.
Lỗ hổng này cho thấy ngay cả ngôn ngữ kiểu tĩnh cũng có thể có vấn đề về bảo mật. Đề xuất các nhà thiết kế ngôn ngữ Move nên thêm nhiều kiểm tra bảo mật hơn trong thời gian chạy, thay vì chỉ dựa vào các kiểm tra trong giai đoạn xác minh. Đồng thời cũng phản ánh tầm quan trọng của việc kiểm toán mã.
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.
Lỗi tràn số nguyên trong xác thực an toàn tham chiếu ngôn ngữ Move có thể dẫn đến từ chối dịch vụ
Phân tích lỗ hổng tràn số nguyên trong kiểm tra an toàn tham chiếu ngôn ngữ Move
Gần đây, một lỗ hổng tràn số nguyên mới trong quá trình xác thực an toàn được trích dẫn của ngôn ngữ Move đã được phát hiện. Lỗ hổng này xuất hiện trong bước reference_safety của đơn vị mã xác thực, liên quan đến khối cơ bản và cơ chế an toàn tham chiếu trong ngôn ngữ Move.
Ngôn ngữ Move sẽ thực hiện xác minh mã trước khi thực thi mã byte, chia thành bốn bước. Kiểm tra an toàn tham chiếu là một khâu quan trọng, được sử dụng để kiểm tra xem có tồn tại tham chiếu lơ lửng hay không, liệu việc truy cập vào các tham chiếu biến có an toàn hay không, v.v. Quá trình xác minh sẽ duyệt qua các chỉ thị mã byte của từng khối cơ bản.
Khối cơ bản là đoạn mã không có các lệnh phân nhánh ngoại trừ lệnh vào và ra. Ngôn ngữ Move xác định các khối cơ bản bằng cách kiểm tra các lệnh phân nhánh và lặp. Kiểm tra tính hợp lệ tham chiếu sẽ quét các lệnh trong mỗi khối cơ bản để xác định tính hợp pháp của các thao tác tham chiếu.
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 quan trọng là locals và đồ thị mượn. Việc xác thực sẽ so sánh trạng thái trước và sau khi thực hiện, hợp nhất kết quả và truyền bá đến các khối tiếp theo.
Lỗi xuất hiện trong hàm join_. Khi tổng chiều dài của tham số và chiều dài của biến cục bộ vượt quá 256, do việc sử dụng loại u8 để lặp qua locals, sẽ xảy ra tràn số nguyên. Điều này có thể dẫn đến bản đồ locals mới khác với trước đó, và khi thực hiện lại, nó sẽ truy cập vào chỉ mục không tồn tại, gây ra từ chối dịch vụ.
Mã PoC kích hoạt tràn số nguyên bằng cách thiết lập các tham số nhất định và số lượng biến cục bộ, dẫn đến độ dài của bản đồ locals mới bị rút ngắn. Khi thực hiện lại, truy cập vào offset không tồn tại, cuối cùng gây ra panic.
Lỗ hổng này cho thấy ngay cả ngôn ngữ kiểu tĩnh cũng có thể có vấn đề về bảo mật. Đề xuất các nhà thiết kế ngôn ngữ Move nên thêm nhiều kiểm tra bảo mật hơn trong thời gian chạy, thay vì chỉ dựa vào các kiểm tra trong giai đoạn xác minh. Đồng thời cũng phản ánh tầm quan trọng của việc kiểm toán mã.