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, thiệt hại 663,101 MATIC. Qua việc phân tích ngăn xếp gọi của giao dịch tấn công, phát hiện ra có logic gọi lại. Trong quá trình gọi lại, với cùng một hàm của cùng một hợp đồng, các tham số truyền vào giống nhau, nhưng giá trị trả về khác biệt rất 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 đồng cấu với EVM, việc chuyển MATIC cho hợp đồng sẽ kích hoạt tái nhập.
Phân tích sâu cho thấy, vấn đề nằm ở việc thực hiện hàm getUnderlyingPrice. Hàm này liên quan đến nhiều cuộc gọi hợp đồng, cuối cùng ảnh hưởng đến 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 khi việc cập nhật self.D diễn ra sau khi chuyển tiền.
Kẻ tấn công khi loại bỏ tính thanh khoản, MATIC chuyển đến hợp đồng tấn công sau đó gọi hàm fallback để truy vấn giá. Do self.D được cập nhật sau khi chuyển khoản, dẫn đến việc lấy giá trước đó bị sai. Quy trình phương pháp loại bỏ tính thanh khoản như sau: 1) hủy LP của người dùng; 2) gửi vốn staking của người dùng; 3) cập nhật self.D.
self.D được sử dụng để tính giá, nó cũng sẽ được cập nhật khi thêm thanh khoản. Quỹ thanh khoản của kẻ tấn công lớn hơn, trong điều kiện bình thường, giá trị self.D sẽ nhỏ hơn nhiều. Nhưng kẻ tấn công thực hiện gọi lại ở bước 2 và vay với giá cao hơn giá gốc gấp 10 lần. Điều này là do giá trị self.D tăng lên khi thêm thanh khoản, trong khi không được cập nhật kịp thời khi gỡ bỏ thanh khoản.
Mặc dù phương pháp remove_liquidity đã sử dụng @nonreentrant('lock') để ngăn chặn reentrancy, nhưng kẻ tấn công đã thực hiện reentrancy vào các hợp đồng khác để vay vốn, làm cho khóa reentrancy không còn hiệu lực.
Nguyên nhân chính của cuộc tấn công lần này là do logic sửa đổi biến sau khi gọi từ bên ngoài, dẫn đến việc lấy giá bất thường. Gọi lại giữa các hợp đồng làm mất hiệu lực khóa gọi lại. Đề nghị các 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 từ bên ngoài, sử dụng phương pháp lấy giá từ nhiều nguồn dữ liệu. Tuân thủ quy tắc lập trình "đầu tiên kiểm tra, sau đó ghi vào biến, sau đó thực hiện gọi bên ngoài" (Checks-Effects-Interactions) có thể nâng cao 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 xâm 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.
9 thích
Phần thưởng
9
7
Đăng lại
Chia sẻ
Bình luận
0/400
All-InQueen
· 08-05 00:42
Blockchain lại thấy sập, mệt quá
Xem bản gốcTrả lời0
HalfBuddhaMoney
· 08-02 05:37
Há cũng không được nhiều như vậy đâu...
Xem bản gốcTrả lời0
ZeroRushCaptain
· 08-02 05:37
Một lần nữa lại mất một người, toàn bộ tiền tiết kiệm đã trôi hết rồi. Lỗ vốn, Sam Altman cố lên!
Xem bản gốcTrả lời0
ForkLibertarian
· 08-02 05:29
Tay nhanh như vậy, Cắt lỗ Rug Pull cũng đã muộn.
Xem bản gốcTrả lời0
StakeTillRetire
· 08-02 05:24
Một thảm họa tái nhập khác, đã tự kỷ.
Xem bản gốcTrả lời0
SighingCashier
· 08-02 05:13
Chơi thất bại rồi phải không? Lại là lỗ hổng tái nhập.
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
Vào 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. Qua việc phân tích ngăn xếp gọi của giao dịch tấn công, phát hiện ra có logic gọi lại. Trong quá trình gọi lại, với cùng một hàm của cùng một hợp đồng, các tham số truyền vào giống nhau, nhưng giá trị trả về khác biệt rất 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 đồng cấu với EVM, việc chuyển MATIC cho hợp đồng sẽ kích hoạt tái nhập.
Phân tích sâu cho thấy, vấn đề nằm ở việc thực hiện hàm getUnderlyingPrice. Hàm này liên quan đến nhiều cuộc gọi hợp đồng, cuối cùng ảnh hưởng đến 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 khi việc cập nhật self.D diễn ra sau khi chuyển tiền.
Kẻ tấn công khi loại bỏ tính thanh khoản, MATIC chuyển đến hợp đồng tấn công sau đó gọi hàm fallback để truy vấn giá. Do self.D được cập nhật sau khi chuyển khoản, dẫn đến việc lấy giá trước đó bị sai. Quy trình phương pháp loại bỏ tính thanh khoản như sau: 1) hủy LP của người dùng; 2) gửi vốn staking của người dùng; 3) cập nhật self.D.
self.D được sử dụng để tính giá, nó cũng sẽ được cập nhật khi thêm thanh khoản. Quỹ thanh khoản của kẻ tấn công lớn hơn, trong điều kiện bình thường, giá trị self.D sẽ nhỏ hơn nhiều. Nhưng kẻ tấn công thực hiện gọi lại ở bước 2 và vay với giá cao hơn giá gốc gấp 10 lần. Điều này là do giá trị self.D tăng lên khi thêm thanh khoản, trong khi không được cập nhật kịp thời khi gỡ bỏ thanh khoản.
Mặc dù phương pháp remove_liquidity đã sử dụng @nonreentrant('lock') để ngăn chặn reentrancy, nhưng kẻ tấn công đã thực hiện reentrancy vào các hợp đồng khác để vay vốn, làm cho khóa reentrancy không còn hiệu lực.
Nguyên nhân chính của cuộc tấn công lần này là do logic sửa đổi biến sau khi gọi từ bên ngoài, dẫn đến việc lấy giá bất thường. Gọi lại giữa các hợp đồng làm mất hiệu lực khóa gọi lại. Đề nghị các 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 từ bên ngoài, sử dụng phương pháp lấy giá từ nhiều nguồn dữ liệu. Tuân thủ quy tắc lập trình "đầu tiên kiểm tra, sau đó ghi vào biến, sau đó thực hiện gọi bên ngoài" (Checks-Effects-Interactions) có thể nâng cao 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 xâm 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(