Phân tích cuộc tấn công tái nhập khoản vay nhanh của dự án Jarvis Network
Vào ngày 15 tháng 1 năm 2023, dự án Jarvis_Network đã bị tấn công trên mạng Polygon, gây ra thiệt hại khoảng 66.3 triệu MATIC. Phân tích cho thấy, kẻ tấn công đã lợi dụng Khoản vay nhanh và lỗ hổng tái nhập để thực hiện cuộc tấn công.
Phân tích ngăn xếp gọi giao dịch tấn công cho thấy, trong quá trình gọi lại, khi gọi cùng một hàm của cùng một hợp đồng với tham số đầu vào giống nhau nhưng giá trị trả về lại có sự khác biệt rõ rệt. Giá trị trả về trước và sau khi gọi lại lần lượt là:
Trước khi tái nhập: 1002157321772769944
Re vào sau: 10091002696492234934
Tái nhập xảy ra trong hàm remove_liquidity. Hàm này sẽ trả lại các token mà người dùng đã thêm khi loại bỏ tính thanh khoản. Do Polygon tương thích với EVM, việc chuyển MATIC cho hợp đồng đã kích hoạt tái nhập.
Phân tích sâu cho thấy, vấn đề nằm ở việc triển khai hàm getUnderlyingPrice. Hàm này liên quan đến một loạt các phép tính nội bộ và gọi ngoại bộ, trong đó quan trọng là giá trị trả về của hàm get_virtual_price. Giá trị trả về của hàm này bị ảnh hưởng bởi biến self.D, và việc cập nhật self.D xảy ra sau khi chuyển nhượng token.
Kẻ tấn công khi loại bỏ tính thanh khoản, MATIC chuyển vào hợp đồng tấn công sau đó đã kiểm tra giá token thông qua callback. Do self.D chưa được cập nhật, dẫn đến việc lấy giá sai. Kẻ tấn công đã lợi dụng sự chênh lệch thời gian này, trong lần gọi lại đã nâng giá vay lên khoảng 10 lần.
Mặc dù hàm remove_liquidity sử dụng bộ trang trí @nonreentrant('lock') để ngăn chặn việc tái nhập, nhưng kẻ tấn công đã vượt qua cơ chế bảo vệ này bằng cách tái nhập qua hợp đồng.
Cuộc tấn công này đã phơi bày một số vấn đề then chốt:
Logic thay đổi biến nằm ở ngoài cuộc gọi, dẫn đến việc lấy giá bất thường.
Tái nhập giữa các hợp đồng làm cho khóa tái nhập không còn hiệu lực.
Không tuân theo mô hình "Kiểm tra - Hiệu ứng - Tương tác" (Checks-Effects-Interactions).
Để ngăn chặn các cuộc tấn công tương tự, đề xuất phía dự án:
Thực hiện kiểm toán an ninh nghiêm ngặt
Đặt việc sửa đổi biến trước khi gọi bên ngoài
Áp dụng phương pháp nhiều nguồn dữ liệu để lấy giá
Tuân theo quy tắc mã hóa "Kiểm tra - Hiệu lực - Tương tác"
Thông qua những biện pháp này, có thể nâng cao đáng kể tính an toàn và ổn định của dự án.
https://img-cdn.gateio.im/webp-social/moments-9b2de9b00c52d3ff96d5a361df65769a.webp(
![Phân tích sự kiện tấn công tái nhập Khoản vay nhanh Jarvis Network])https://img-cdn.gateio.im/webp-social/moments-88f9283ee0923cff2a22405715721cd2.webp(
![Phân tích sự kiện tấn công tái nhập Khoản vay nhanh Jarvis Network])https://img-cdn.gateio.im/webp-social/moments-d41ac025ee561569cce3b941d7e07967.webp(
![Phân tích sự kiện tấn công tái nhập Khoản vay nhanh Jarvis Network])https://img-cdn.gateio.im/webp-social/moments-2c4474781d661306bc8c432dad3942c0.webp(
Xem bản gốc
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.
Jarvis Network遭Khoản vay nhanh重入攻击 损失66.3万MATIC
Phân tích cuộc tấn công tái nhập khoản vay nhanh của dự án Jarvis Network
Vào ngày 15 tháng 1 năm 2023, dự án Jarvis_Network đã bị tấn công trên mạng Polygon, gây ra thiệt hại khoảng 66.3 triệu MATIC. Phân tích cho thấy, kẻ tấn công đã lợi dụng Khoản vay nhanh và lỗ hổng tái nhập để thực hiện cuộc tấn công.
Phân tích ngăn xếp gọi giao dịch tấn công cho thấy, trong quá trình gọi lại, khi gọi cùng một hàm của cùng một hợp đồng với tham số đầu vào giống nhau nhưng giá trị trả về lại có sự khác biệt rõ rệt. Giá trị trả về trước và sau khi gọi lại lần lượt là:
Tái nhập xảy ra trong hàm remove_liquidity. Hàm này sẽ trả lại các token mà người dùng đã thêm khi loại bỏ tính thanh khoản. Do Polygon tương thích với EVM, việc chuyển MATIC cho hợp đồng đã kích hoạt tái nhập.
Phân tích sâu cho thấy, vấn đề nằm ở việc triển khai hàm getUnderlyingPrice. Hàm này liên quan đến một loạt các phép tính nội bộ và gọi ngoại bộ, trong đó quan trọng là giá trị trả về của hàm get_virtual_price. Giá trị trả về của hàm này bị ảnh hưởng bởi biến self.D, và việc cập nhật self.D xảy ra sau khi chuyển nhượng token.
Kẻ tấn công khi loại bỏ tính thanh khoản, MATIC chuyển vào hợp đồng tấn công sau đó đã kiểm tra giá token thông qua callback. Do self.D chưa được cập nhật, dẫn đến việc lấy giá sai. Kẻ tấn công đã lợi dụng sự chênh lệch thời gian này, trong lần gọi lại đã nâng giá vay lên khoảng 10 lần.
Mặc dù hàm remove_liquidity sử dụng bộ trang trí @nonreentrant('lock') để ngăn chặn việc tái nhập, nhưng kẻ tấn công đã vượt qua cơ chế bảo vệ này bằng cách tái nhập qua hợp đồng.
Cuộc tấn công này đã phơi bày một số vấn đề then chốt:
Để ngăn chặn các cuộc tấn công tương tự, đề xuất phía dự án:
Thông qua những biện pháp này, có thể nâng cao đáng kể tính an toàn và ổn định của dự án.
https://img-cdn.gateio.im/webp-social/moments-9b2de9b00c52d3ff96d5a361df65769a.webp(
![Phân tích sự kiện tấn công tái nhập Khoản vay nhanh Jarvis Network])https://img-cdn.gateio.im/webp-social/moments-88f9283ee0923cff2a22405715721cd2.webp(
![Phân tích sự kiện tấn công tái nhập Khoản vay nhanh Jarvis Network])https://img-cdn.gateio.im/webp-social/moments-d41ac025ee561569cce3b941d7e07967.webp(
![Phân tích sự kiện tấn công tái nhập Khoản vay nhanh Jarvis Network])https://img-cdn.gateio.im/webp-social/moments-2c4474781d661306bc8c432dad3942c0.webp(