Phân tích cuộc tấn công tái nhập khoản vay nhanh của dự án Jarvis Network
Dữ liệu cho thấy, vào lúc 17:43:37 UTC ngày 15 tháng 1 năm 2023, dự án Jarvis_Network đã bị tấn công, thiệt hại 663,101 MATIC.
Phân tích ngăn xếp gọi giao dịch phát hiện ra rằng trong quá trình loại bỏ thanh khoản có logic gọi lại. Trước và sau khi gọi lại một hàm của cùng một hợp đồng, tham số truyền vào giống nhau, nhưng giá trị trả về chênh lệch lớn:
Thời điểm trước khi tái nhập: 1,002,157,321,772,769,944
Tái nhập: 10,091,002,696,492,234,934
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 và EVM là chuỗi đồng cấu, việc chuyển MATIC cho hợp đồng sẽ kích hoạt tái nhập của hợp đồng.
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 bên ngoài, trong đó điểm mấu chốt là giá trị trả về của hàm get_virtual_price.
Giá trị trả về của hàm get_virtual_price bị ảnh hưởng bởi biến self.D. Trong hàm remove_liquidity, việc cập nhật self.D diễn ra sau khi chuyển token. Kẻ tấn công khi gỡ bỏ thanh khoản, MATIC được chuyển đến hợp đồng tấn công, và khi gọi callback fallback, nó đã truy vấn giá token trước. Do self.D chưa được cập nhật, dẫn đến việc lấy giá không chính xác.
Quy trình hàm remove_liquidity:
Hủy LP của người dùng
Gửi tiền ký quỹ của người dùng
Cập nhật self.D
Kẻ tấn công thực hiện gọi lại ở bước 2, lợi dụng giá trị self.D chưa được cập nhật để vay mượn, đã nhận được số vốn gấp 10 lần giá bình thường.
Mặc dù hàm remove_liquidity đã sử dụng @nonreentrant('lock') để ngăn chặn tấn công tái nhập, nhưng kẻ tấn công đã vượt qua cơ chế bảo vệ này thông qua tái nhập giữa các hợp đồng.
Cuộc tấn công này đã phơi bày một số vấn đề quan trọng:
Logic thay đổi biến sau khi gọi từ bên ngoà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 mất hiệu lực khóa tái nhập
Không tuân thủ mô hình "Kiểm tra - Hiệu lực - Tương tác" (Checks-Effects-Interactions)
Để nâng cao tính bảo mật, nhóm dự án nê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
Sử dụng nhiều nguồn dữ liệu để lấy giá
Tuân theo quy tắc lập trình "đánh giá trước, ghi vào biến sau, sau đó thực hiện gọi bên ngoài"
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, hiệu quả ngăn ngừa các cuộc tấn công tương tự.
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.
11 thích
Phần thưởng
11
5
Chia sẻ
Bình luận
0/400
DisillusiionOracle
· 07-25 05:19
Lại có cá bị nổ chết.
Xem bản gốcTrả lời0
FlatlineTrader
· 07-23 14:13
又 một đồ ngốc领盒饭啦
Xem bản gốcTrả lời0
MidnightGenesis
· 07-23 14:09
Mức độ mã hóa không đủ, điều này đã nên xảy ra.
Xem bản gốcTrả lời0
CryptoGoldmine
· 07-23 13:59
Một bằng chứng dữ liệu khác: hợp đồng thông minh hồi tố thiệt hại 65w
Jarvis Network遭Khoản vay nhanh重入攻击损失663,101 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
Dữ liệu cho thấy, vào lúc 17:43:37 UTC ngày 15 tháng 1 năm 2023, dự án Jarvis_Network đã bị tấn công, thiệt hại 663,101 MATIC.
Phân tích ngăn xếp gọi giao dịch phát hiện ra rằng trong quá trình loại bỏ thanh khoản có logic gọi lại. Trước và sau khi gọi lại một hàm của cùng một hợp đồng, tham số truyền vào giống nhau, nhưng giá trị trả về chênh lệch lớn:
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 và EVM là chuỗi đồng cấu, việc chuyển MATIC cho hợp đồng sẽ kích hoạt tái nhập của hợp đồng.
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 bên ngoài, trong đó điểm mấu chốt là giá trị trả về của hàm get_virtual_price.
Giá trị trả về của hàm get_virtual_price bị ảnh hưởng bởi biến self.D. Trong hàm remove_liquidity, việc cập nhật self.D diễn ra sau khi chuyển token. Kẻ tấn công khi gỡ bỏ thanh khoản, MATIC được chuyển đến hợp đồng tấn công, và khi gọi callback fallback, nó đã truy vấn giá token trước. Do self.D chưa được cập nhật, dẫn đến việc lấy giá không chính xác.
Quy trình hàm remove_liquidity:
Kẻ tấn công thực hiện gọi lại ở bước 2, lợi dụng giá trị self.D chưa được cập nhật để vay mượn, đã nhận được số vốn gấp 10 lần giá bình thường.
Mặc dù hàm remove_liquidity đã sử dụng @nonreentrant('lock') để ngăn chặn tấn công tái nhập, nhưng kẻ tấn công đã vượt qua cơ chế bảo vệ này thông qua tái nhập giữa các hợp đồng.
Cuộc tấn công này đã phơi bày một số vấn đề quan trọng:
Để nâng cao tính bảo mật, nhóm dự án nê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, hiệu quả ngăn ngừa các cuộc tấn công tương tự.