Phát hiện lỗ hổng tràn số nguyên mới trong mô-đun bảo mật tham chiếu của ngôn ngữ Move
Gần đây, các nhà nghiên cứu trong quá trình phân tích sâu về ngôn ngữ Move đã phát hiện ra một lỗ hổng tràn số nguyên mới. Lỗ hổng này tồn tại trong mô-đun an toàn tham chiếu, có thể dẫn đến các cuộc tấn công từ chối dịch vụ nghiêm trọng. Bài viết này sẽ giới thiệu chi tiết về quá trình phát hiện và các thông tin kỹ thuật liên quan đến lỗ hổng này.
Cơ chế an toàn tham chiếu của ngôn ngữ Move
Ngôn ngữ Move đã tham khảo tư tưởng của Rust, hỗ trợ hai loại tham chiếu: tham chiếu không thay đổi (&) và tham chiếu có thể thay đổi (&mut). Mô-đun an toàn tham chiếu xác minh tính hợp pháp của tất cả các thao tác tham chiếu bằng cách quét các khối cơ bản và các lệnh bytecode trong hàm.
Quá trình xác minh chủ yếu bao gồm các bước sau:
Phân tích từng khối cơ bản
Thực thi mã khối cơ bản tạo ra trạng thái sau
Kết hợp trạng thái trước và trạng thái sau
Cập nhật trạng thái khối và lan truyền đến các khối tiếp theo
Trong đó, state bao gồm hai thành phần chính là locals và borrow graph, được sử dụng để đảm bảo tính an toàn của các tham chiếu trong hàm.
Chi tiết lỗ hổng
Lỗ hổng này xuất hiện trong hàm join_ của mô-đun bảo mật tham chiếu. Khi tổng chiều dài của tham số hàm và chiều dài biến cục bộ lớn hơn 256, việc sử dụng loại u8 để lặp qua locals sẽ dẫn đến tràn số nguyên.
Cụ thể là:
iter_locals() trả về một iterator kiểu u8
Khi độ dài tham số + độ dài biến cục bộ > 256 sẽ bị tràn
Các nhà phát triển dường như nhận ra cần kiểm tra điều này, nhưng mã thực tế chỉ kiểm tra số lượng biến cục bộ.
Khai thác lỗ hổng
Sử dụng lỗ hổng này có thể tạo ra một khối mã vòng lặp:
Khi thực hiện lần đầu tiên sẽ kích hoạt tràn, thay đổi bản đồ locals
Truy cập chỉ mục locals không tồn tại khi thực hiện lần thứ hai, dẫn đến panic
Điều này sẽ gây ra sự cố nút, hình thành cuộc tấn công từ chối dịch vụ.
Tái hiện lỗ hổng
Các nhà nghiên cứu đã cung cấp một PoC để tái tạo lỗ hổng này:
Đặt parameters và locals đều là SignatureIndex(0), làm cho num_locals là 264
Độ dài của bản đồ locals mới trở thành 8 sau lần thực thi đầu tiên
Khi thực hiện lần thứ hai, copyloc(57) truy cập vào offset không tồn tại dẫn đến panic.
Tóm tắt và đề xuất
Lỗ hổng này cho thấy:
Không có mã code an toàn tuyệt đối, kiểm tra tĩnh có thể bị bỏ qua.
Kiểm toán mã rất quan trọng, có thể phát hiện sự bất cẩn của nhà phát triển
Ngôn ngữ Move nên tăng cường kiểm tra thời gian chạy, chứ không chỉ dựa vào kiểm tra an ninh trong giai đoạn xác minh.
Các nhà nghiên cứu kêu gọi các nhà thiết kế ngôn ngữ Move củng cố cơ chế an toàn thời gian chạy để ngăn chặn việc khai thác các lỗ hổng tương tự gây ra các vấn đề nghiêm trọng hơn.
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
16 thích
Phần thưởng
16
7
Chia sẻ
Bình luận
0/400
SmartContractWorker
· 07-07 12:14
Lại ra khỏi nồi rồi, sửa chữa phải tốn công sức.
Xem bản gốcTrả lời0
staking_gramps
· 07-06 05:24
Lỗi này thật nghiệp dư quá.
Xem bản gốcTrả lời0
ChainMaskedRider
· 07-06 05:22
Kỹ năng viết mã thật sự không tinh tế lắm.
Xem bản gốcTrả lời0
MissedTheBoat
· 07-06 05:20
Lại có lỗ hổng, Move cũng không có gì đặc biệt.
Xem bản gốcTrả lời0
GateUser-c799715c
· 07-06 05:19
Mã ai viết mà sao tệ vậy
Xem bản gốcTrả lời0
YieldChaser
· 07-06 05:17
u8 lại gặp vấn đề rồi
Xem bản gốcTrả lời0
BridgeJumper
· 07-06 05:09
Phát triển không quy chuẩn, sửa lỗi hai hàng nước mắt
Module an toàn của ngôn ngữ Move phát hiện lỗ hổng tràn số nguyên có thể dẫn đến tấn công từ chối dịch vụ
Phát hiện lỗ hổng tràn số nguyên mới trong mô-đun bảo mật tham chiếu của ngôn ngữ Move
Gần đây, các nhà nghiên cứu trong quá trình phân tích sâu về ngôn ngữ Move đã phát hiện ra một lỗ hổng tràn số nguyên mới. Lỗ hổng này tồn tại trong mô-đun an toàn tham chiếu, có thể dẫn đến các cuộc tấn công từ chối dịch vụ nghiêm trọng. Bài viết này sẽ giới thiệu chi tiết về quá trình phát hiện và các thông tin kỹ thuật liên quan đến lỗ hổng này.
Cơ chế an toàn tham chiếu của ngôn ngữ Move
Ngôn ngữ Move đã tham khảo tư tưởng của Rust, hỗ trợ hai loại tham chiếu: tham chiếu không thay đổi (&) và tham chiếu có thể thay đổi (&mut). Mô-đun an toàn tham chiếu xác minh tính hợp pháp của tất cả các thao tác tham chiếu bằng cách quét các khối cơ bản và các lệnh bytecode trong hàm.
Quá trình xác minh chủ yếu bao gồm các bước sau:
Trong đó, state bao gồm hai thành phần chính là locals và borrow graph, được sử dụng để đảm bảo tính an toàn của các tham chiếu trong hàm.
Chi tiết lỗ hổng
Lỗ hổng này xuất hiện trong hàm join_ của mô-đun bảo mật tham chiếu. Khi tổng chiều dài của tham số hàm và chiều dài biến cục bộ lớn hơn 256, việc sử dụng loại u8 để lặp qua locals sẽ dẫn đến tràn số nguyên.
Cụ thể là:
Khai thác lỗ hổng
Sử dụng lỗ hổng này có thể tạo ra một khối mã vòng lặp:
Điều này sẽ gây ra sự cố nút, hình thành cuộc tấn công từ chối dịch vụ.
Tái hiện lỗ hổng
Các nhà nghiên cứu đã cung cấp một PoC để tái tạo lỗ hổng này:
Tóm tắt và đề xuất
Lỗ hổng này cho thấy:
Các nhà nghiên cứu kêu gọi các nhà thiết kế ngôn ngữ Move củng cố cơ chế an toàn thời gian chạy để ngăn chặn việc khai thác các lỗ hổng tương tự gây ra các vấn đề nghiêm trọng hơn.