Hiểu về các cuộc tấn công tái nhập và cách ngăn chặn chúng 🔐

robot
Đang tạo bản tóm tắt

Các cuộc tấn công tái nhập có vẻ phức tạp lúc đầu. Hãy để tôi giải thích chúng bằng những thuật ngữ đơn giản và hiển thị cho bạn một số cách để giữ cho hợp đồng thông minh của bạn an toàn 🛡️

Tấn công Reentrancy là gì? 🧐

Đó là khi ContractB gọi lại vào ContractA trong khi ContractA vẫn đang chạy. Thật tồi tệ. Những kẻ tấn công thích lỗ hổng này để rút tiền từ các hợp đồng 💸

Hãy tưởng tượng điều này:

  • ContractA giữ 10 ETH
  • ContractB đã đặt 1 ETH
  • ContractB thì lấy cắp mọi thứ

Cơ Chế Tấn Công 🕵️‍♂️

Bạn cần hai điều quan trọng:

  1. attack() hàm để bắt đầu mọi thứ
  2. fallback() chức năng cho phần lén lút

Luồng chảy như sau:

  1. ContractB khởi động tấn công ( ) mà gọi đến withdraw của ContractA (
  2. ContractA kiểm tra số dư của ContractB
  3. ContractA gửi ETH đến ContractB
  4. Điều này kích hoạt fallback của ContractB ) (
  5. Vòng lặp tiếp tục. Tiền đã hết 🚨

Thật bất ngờ khi điều này có thể đơn giản nhưng lại tàn phá đến vậy.

Ví dụ mã dễ bị tấn công 📝

Đây là hình dạng của một hợp đồng dễ bị tổn thương: solidity function withdrawAll)( public { uint bal = balances[msg.sender]; require)bal > 0(;

)bool sent, ( = msg.sender.call{value: bal})""(;
require)sent, "Không thể gửi Ether"(;

balances[msg.sender] = 0; // Cập nhật SAU khi gửi? Lỗi lớn!

}

Hợp đồng tấn công làm điều này: solidity fallback)( bên ngoài có thể thanh toán { nếu)etherStore.balance >= 1 ether( etherStore.withdrawAll)(; }

function attack)( external payable { require)msg.value >= 1 ether(; etherStore.deposit{value: 1 ether})(; etherStore.withdrawAll)(; }

Ba Cách Để Ngăn Chặn Những Cuộc Tấn Công Này 🛡️

) 1. nonReentrant Modifier 🔒

solidity bool private locked = false;

modifier nonReentrant###( { require)!locked, "Không tái nhập"(; locked = true; _; locked = false; }

Thêm nó vào các chức năng dễ bị tổn thương. Đơn giản nhưng hiệu quả.

) 2. Mô hình Kiểm tra-Hiệu ứng-Tương tác 📊

Điều này rất quan trọng:

solidity function withdrawAll###( công khai { uint bal = balances[msg.sender]; require)bal > 0(;

balances[msg.sender] = 0; // Cập nhật ĐẦU TIÊN

)bool sent, ( = msg.sender.call{value: bal})""(; // SAU ĐÓ tương tác
require)sent, "Gửi Ether không thành công"(;

}

Cập nhật trạng thái của bạn trước. Tương tác sau. Mãi mãi.

) 3. Bảo vệ toàn cầu 🌐

Đối với các dự án lớn:

solidity hợp đồng GlobalReentrancyGuard { bool private locked = false;

modifier globalNonReentrant###( {
    require)!locked, "Không tái nhập"(;
    locked = true;
    _;
    locked = false;
}

}

Hãy để tất cả các hợp đồng của bạn kế thừa điều này. Hệ sinh thái an toàn hơn.

Xu Hướng Mới Nhất 🔥

Tính đến tháng 9 năm 2025, những cuộc tấn công này vẫn làm khổ DeFi. Không hoàn toàn rõ lý do tại sao các nhà phát triển lại liên tục mắc phải những sai lầm giống nhau. Các công cụ như Slither có thể phát hiện những vấn đề này. Echidna và Foundry giúp kiểm tra chúng 🚀

An ninh không chỉ là việc thêm một phần sửa đổi. Đó là một tư duy.

Stay vigilant out there! 🛡️

ETH-3.07%
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.
  • Phần thưởng
  • Bình luận
  • Đăng lại
  • Chia sẻ
Bình luận
0/400
Không có bình luận
  • Ghim
Giao dịch tiền điện tử mọi lúc mọi nơi
qrCode
Quét để tải xuống ứng dụng Gate
Cộng đồng
Tiếng Việt
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)