

Lưu ý của biên tập viên: Bài viết này đến từPeckShield(ID:PeckShield), được in lại bởi Odaily với sự cho phép.
Lưu ý của biên tập viên: Bài viết này đến từ
, được in lại bởi Odaily với sự cho phép.
Bắt đầu từ 08:58 sáng ngày 18 tháng 4, một nền tảng DeFi Uniswap đã bị tin tặc tấn công bằng lỗ hổng reentrancy. Nhóm bảo mật PeckShield đã nhanh chóng xác định được vấn đề và phát hiện ra rằng tin tặc đã sử dụng các lỗ hổng tương thích của các tiêu chuẩn Uniswap và ERC777 để thực hiện các cuộc tấn công vào lại.
Thật không may, chỉ 24 giờ sau, vào lúc 08:45 sáng ngày 19 tháng 4, một nền tảng DeFi nổi tiếng khác là Lendf.Me cũng bị tin tặc tấn công theo cách tương tự.
Nguyên tắc tấn công của hacker là: kẻ tấn công sử dụng cơ chế gọi lại transferFrom() theo tiêu chuẩn Ethereum ERC777 để chiếm đoạt giao dịch khi gọi hàm gọi lại _callTokensToSend() trong nội bộ và tiến hành tấn công độc hại trước khi hàm _move() thực sự cập nhật sự cân bằng.
Chi tiết lỗ hổng tấn công chi tiết, chúng tôi sẽ giới thiệu chi tiết ở phần sau của bài viết.
Figure 1: ERC777 transferFrom()
Mô tả hình ảnh
tiêu đề phụ
Các vấn đề về khả năng tương thích của danh mục đầu tư kinh doanh tiêu chuẩn ERC777
Một trong những chức năng của tiện ích mở rộng tiêu chuẩn là cung cấp cơ chế "hook", cho phép các địa chỉ hoặc hợp đồng thông thường kiểm soát hoặc từ chối gửi Token bằng cách đăng ký chức năng hook tokensToSend(). Điều này ban đầu đã củng cố giao diện kiểm soát rủi ro của Mã thông báo trên cơ sở ERC20, đây là một cải tiến có lợi. Tuy nhiên, do tính chất có thể kết hợp của các dự án DeFi, khi một hợp đồng được gọi giữa các sản phẩm khác nhau, độ phức tạp của logic nghiệp vụ của nó cũng sẽ tăng lên rất nhiều, điều này tạo ra khả năng xảy ra các cuộc tấn công tiêm mã.
Figure 2: ERC777-Compatible tokensToSend() Hijacking
Mô tả hình ảnh
Figure 3: OpenZeppelin's Exploit Demo (Hook Setup)
Sau đó, kẻ tấn công có thể làm bất cứ điều gì trong tokensToSend() giống như chức năng hook trên PC truyền thống. Như thể hiện trong hình bên dưới, kẻ tấn công có thể thực hiện nhiều giao dịch cho cùng một giao dịch.
Figure 4: OpenZeppelin's Exploit Demo (Hook Function)
Mô tả hình ảnh
Uniswap là công ty đầu tiên khai thác các vấn đề tương thích ERC777 để thực hiện các cuộc tấn công. Như được hiển thị trong ảnh chụp màn hình của giao dịch độc hại trong Bloxy (hash: 0x9cb1d93d6859883361e8c2f9941f13d6156a1e8daa0ebe801b5d0b5a612723c1), lệnh gọi tokenToEthSwapInput() được thực hiện bên trong hàm. Điều này có nghĩa là kẻ tấn công có thể thao túng tỷ giá hối đoái của giao dịch trước, sau đó đổi một imBTC khác để lấy nhiều ETH hơn với mức giá thấp hơn.
Figure 5: Uniswap Hack
Phân tích tấn công Lendf.Me Figure 6: Lendf.Me Hack Khoảng 24 giờ sau khi Uniswap bị tấn công, một nền tảng DeFi khác là Lendf.Me cũng bị tấn công. Dưới đây là ảnh chụp màn hình của một trong các giao dịch tấn công. Như thể hiện trong hình, khi hàm chuyển nhượng thực transferFrom() được gọi trong hàm supply(), hợp đồng của kẻ tấn công móc nối sẽ nhúng một hoạt động rút tiền để đánh cắp khoản rút tiền() của Lendf.Me. Cần lưu ý rằng logic kinh doanh thông thường phải là Số dư trong hợp đồng dự án sẽ trừ đi 290 imBTC mà kẻ tấn công đã rút. Tuy nhiên, khi supply() trả về, số dư chưa được đặt lại và vẫn là 290 imBTC ( dòng 1,599 ). Kẻ tấn công kiểm soát và sửa đổi số tiền thế chấp imBTC của kẻ tấn công trong Lendf.Me. Với khoản thế chấp imBTC đủ lớn, kẻ tấn công có thể cho vay tất cả tài sản có sẵn thuộc hơn 10 loại từ các cặp giao dịch thanh khoản khác nhau (tổng giá trị tài sản là 25.236.849,44 đô la Mỹ) ). Figure 7: Lendf.Me Hack Details tiêu đề phụ Như thể hiện trong hình trên, sau khi kẻ tấn công kiếm được lợi nhuận, anh ta ngay lập tức chuyển từng Mã thông báo sang tài khoản được liên kết của nó 0xa9bf70, sau đó kẻ tấn công trao đổi WETH, PAX, BUSD phổ biến và các Mã thông báo khác thông qua các nền tảng như 1inch.exchange và ParaSwap. thành các mã thông báo ETH, DAI, BAT và gửi các mã thông báo TUSD, USDT vào nền tảng cho vay Aave. Cho đến nay, số dư của kẻ tấn công và tài khoản được liên kết của nó được hiển thị ở trên.Mô tả hình ảnh
Mô tả hình ảnh
tiêu đề phụ đề xuất sửa chữa Nhóm bảo mật PeckShield theo đây khuyến nghị rằng các nhà phát triển có thể sử dụng phương pháp "Kiểm tra-Hiệu ứng-Tương tác" để ngăn chặn các cuộc tấn công vào lại như vậy. Ví dụ: trong supply() của Lendf.Me, nếu số dư token được cập nhật trước, thì doTransferIn() được gọi. Điều này sẽ khiến một cuộc tấn công không thể thiết lập lại số dư sau khi rút tiền(). Mặt khác, các tính năng tiêu chuẩn ERC777 chắc chắn sẽ kích hoạt cơ chế hook, vì vậy chúng ta cần phát hiện và ngăn chặn tất cả các chức năng giao dịch khỏi rủi ro đăng nhập lại. Ví dụ: nếu cung cấp () và rút tiền () chạy cùng lúc và một mutex được thêm vào, thì kẻ tấn công không thể thực hiện thao tác rút tiền () bên trong hàm cung cấp (). Điểm cuối cùng không thể bỏ qua là chúng ta cần xem xét nghiêm túc các rủi ro hệ thống có thể xảy ra đối với danh mục đầu tư kinh doanh DeFi. kinh doanh các sản phẩm khác nhau Khi kết hợp, xem xét các vấn đề kiểm soát rủi ro hệ thống tiềm ẩn do logic kinh doanh khác nhau của chúng.đề xuất sửa chữa
