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, trong quá trình nghiên cứu 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 xác minh an toàn tham chiếu, quá trình kích hoạt của nó khá thú vị. Bài viết này sẽ phân tích sâu về lỗ hổng này, đồng thời giới thiệu kiến thức nền tảng liên quan đến ngôn ngữ Move.
Ngôn ngữ Move sẽ xác minh các đơn vị mã trước khi thực thi bytecode, và toàn bộ quá trình xác minh chia thành 4 bước. Lỗ hổng được phát hiện lần này xuất hiện trong bước reference_safety.
Mô-đun xác minh an toàn chịu trách nhiệm kiểm tra xem có tồn tại 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, việc truy cập tham chiếu lưu trữ toàn cầu có an toàn hay không, v.v. Quá trình xác minh bắt đầu từ hàm analyze_function, xác minh từng khối cơ bản.
Trong ngôn ngữ Move, khối cơ bản là một dãy mã không có chỉ thị nhánh ngoại trừ đầu vào và đầu ra. Hệ thống xác định khối cơ bản bằng cách duyệt mã byte, tìm tất cả các chỉ thị nhánh và chu trình.
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 an toàn tham chiếu sẽ quét các chỉ thị bytecode trong từng khối cơ bản của hàm, xác định tất cả các thao tác tham chiếu có hợp pháp hay không. Quá trình xác minh sử dụng cấu trúc AbstractState, bao gồm đồ thị mượn và hai thành phần locals, nhằm đảm bảo tính an toàn của các tham chiếu trong hàm.
Trong quá trình xác minh, hệ thống sẽ thực hiện việc tạo mã khối cơ bản để tạo ra trạng thái sau (post state), sau đó sẽ hợp nhất trạng thái trước (pre state) và trạng thái sau để cập nhật trạng thái khối. Nếu trạng thái thay đổi và có vòng lặp, thì khối cơ bản sẽ được thực hiện lại cho đến khi trạng thái sau bằng với trạng thái trước hoặc xảy ra lỗi.
Lỗi xuất hiện trong hàm join_. Khi độ dài tham số cộng với độ dài biến cục bộ vượt quá 256, việc sử dụng loại u8 để lặp qua locals sẽ gây ra tràn số nguyên. Mặc dù ngôn ngữ Move có quy trình kiểm tra số lượng locals, nhưng chỉ kiểm tra số lượng biến cục bộ mà không bao gồm độ dài tham số.
Sự tràn số nguyên này có thể dẫn đến tấn công từ chối dịch vụ. Kẻ tấn công có thể tạo ra một khối mã lặp lại, lợi dụng sự tràn để thay đổi trạng thái của khối. Khi hàm execute_block được thực thi lại, nếu chỉ số mà lệnh cần truy cập không có trong bản đồ locals của AbstractState mới, điều đó sẽ dẫn đến sự cố hệ thống.
Để minh họa lỗ hổng này, chúng ta có thể xây dựng một khối cơ bản chứa các lệnh nhánh vô điều kiện. Bằng cách thiết lập các tham số phù hợp và số lượng biến cục bộ, có thể làm cho độ dài của locals map tràn ra 8. Trong lần thực hiện thứ hai, việc cố gắng truy cập offset không tồn tại sẽ dẫn đến panic.
Lỗ hổng này nhắc nhở chúng ta rằng ngay cả những ngôn ngữ được thiết kế cẩn thận cũng có thể tồn tại rủi ro an ninh. Đối với ngôn ngữ Move, nên bổ sung thêm nhiều mã kiểm tra trong quá trình thực thi để ngăn ngừa các tình huống bất ngờ. Hiện tại, Move chủ yếu thực hiện kiểm tra an ninh trong giai đoạn xác minh, nhưng một khi việc xác minh bị bỏ qua, có thể gây ra những vấn đề nghiêm trọng hơn.
Là những người tiên phong trong nghiên cứu an ninh ngôn ngữ Move, chúng tôi sẽ tiếp tục khám phá sâu hơn các vấn đề an ninh liên quan, đóng góp vào sự phát triển khỏe 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.
17 thích
Phần thưởng
17
6
Chia sẻ
Bình luận
0/400
TokenUnlocker
· 13giờ trước
Sao lại là tràn số nguyên nữa vậy?
Xem bản gốcTrả lời0
BearMarketGardener
· 20giờ trước
move lại gặp sự cố rồi à
Xem bản gốcTrả lời0
RunWithRugs
· 08-02 18:07
Sao lại có lỗ hổng an ninh nữa vậy?
Xem bản gốcTrả lời0
TestnetFreeloader
· 08-02 18:07
Lại có bề mặt tấn công rồi, tốt quá!
Xem bản gốcTrả lời0
JustAnotherWallet
· 08-02 18:02
Lại có chuyện xảy ra, kiểm tra phải chịu trách nhiệm.
Mô-đun bảo mật ngôn ngữ Move phát hiện lỗ hổng tràn số nguyên mới
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, trong quá trình nghiên cứu 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 xác minh an toàn tham chiếu, quá trình kích hoạt của nó khá thú vị. Bài viết này sẽ phân tích sâu về lỗ hổng này, đồng thời giới thiệu kiến thức nền tảng liên quan đến ngôn ngữ Move.
Ngôn ngữ Move sẽ xác minh các đơn vị mã trước khi thực thi bytecode, và toàn bộ quá trình xác minh chia thành 4 bước. Lỗ hổng được phát hiện lần này xuất hiện trong bước reference_safety.
Mô-đun xác minh an toàn chịu trách nhiệm kiểm tra xem có tồn tại 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, việc truy cập tham chiếu lưu trữ toàn cầu có an toàn hay không, v.v. Quá trình xác minh bắt đầu từ hàm analyze_function, xác minh từng khối cơ bản.
Trong ngôn ngữ Move, khối cơ bản là một dãy mã không có chỉ thị nhánh ngoại trừ đầu vào và đầu ra. Hệ thống xác định khối cơ bản bằng cách duyệt mã byte, tìm tất cả các chỉ thị nhánh và chu trình.
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 an toàn tham chiếu sẽ quét các chỉ thị bytecode trong từng khối cơ bản của hàm, xác định tất cả các thao tác tham chiếu có hợp pháp hay không. Quá trình xác minh sử dụng cấu trúc AbstractState, bao gồm đồ thị mượn và hai thành phần locals, nhằm đảm bảo tính an toàn của các tham chiếu trong hàm.
Trong quá trình xác minh, hệ thống sẽ thực hiện việc tạo mã khối cơ bản để tạo ra trạng thái sau (post state), sau đó sẽ hợp nhất trạng thái trước (pre state) và trạng thái sau để cập nhật trạng thái khối. Nếu trạng thái thay đổi và có vòng lặp, thì khối cơ bản sẽ được thực hiện lại cho đến khi trạng thái sau bằng với trạng thái trước hoặc xảy ra lỗi.
Lỗi xuất hiện trong hàm join_. Khi độ dài tham số cộng với độ dài biến cục bộ vượt quá 256, việc sử dụng loại u8 để lặp qua locals sẽ gây ra tràn số nguyên. Mặc dù ngôn ngữ Move có quy trình kiểm tra số lượng locals, nhưng chỉ kiểm tra số lượng biến cục bộ mà không bao gồm độ dài tham số.
Sự tràn số nguyên này có thể dẫn đến tấn công từ chối dịch vụ. Kẻ tấn công có thể tạo ra một khối mã lặp lại, lợi dụng sự tràn để thay đổi trạng thái của khối. Khi hàm execute_block được thực thi lại, nếu chỉ số mà lệnh cần truy cập không có trong bản đồ locals của AbstractState mới, điều đó sẽ dẫn đến sự cố hệ thống.
Để minh họa lỗ hổng này, chúng ta có thể xây dựng một khối cơ bản chứa các lệnh nhánh vô điều kiện. Bằng cách thiết lập các tham số phù hợp và số lượng biến cục bộ, có thể làm cho độ dài của locals map tràn ra 8. Trong lần thực hiện thứ hai, việc cố gắng truy cập offset không tồn tại sẽ dẫn đến panic.
Lỗ hổng này nhắc nhở chúng ta rằng ngay cả những ngôn ngữ được thiết kế cẩn thận cũng có thể tồn tại rủi ro an ninh. Đối với ngôn ngữ Move, nên bổ sung thêm nhiều mã kiểm tra trong quá trình thực thi để ngăn ngừa các tình huống bất ngờ. Hiện tại, Move chủ yếu thực hiện kiểm tra an ninh trong giai đoạn xác minh, nhưng một khi việc xác minh bị bỏ qua, có thể gây ra những vấn đề nghiêm trọng hơn.
Là những người tiên phong trong nghiên cứu an ninh ngôn ngữ Move, chúng tôi sẽ tiếp tục khám phá sâu hơn các vấn đề an ninh liên quan, đóng góp vào sự phát triển khỏe mạnh của hệ sinh thái Move.