Reentrancy Saldırılarını Anlamak & Bunları Önlemenin Yolları 🔐

robot
Abstract generation in progress

Reentrancy saldırıları ilk başta karmaşık görünebilir. Bunları basit terimlerle açıklayayım ve akıllı sözleşmelerinizi güvende tutmanın bazı yollarını göstereyim 🛡️

Reentrancy Saldırısı Nedir? 🧐

Bu, ContractB'nin ContractA'nın hala çalıştığı sırada geri çağrılmasıdır. Kötü şeyler. Saldırganlar, sözleşmelerden fonları boşaltmak için bu açığı çok severler 💸

Bunu hayal et:

  • ContractA 10 ETH tutar
  • ContractB 1 ETH yatırdı
  • ContractB daha sonra her şeyi çalar

Saldırı Mekanizması 🕵️‍♂️

İki ana şeye ihtiyacınız var:

  1. attack() fonksiyonu her şeyi başlatmak için
  2. fallback() sneaky kısmı için fonksiyon

Akış şu şekilde gider:

  1. ContractB, ContractA'nın withdraw() fonksiyonunu çağıran attack() saldırısını başlatır.
  2. ContractA, ContractB'nin bakiyesini kontrol eder
  3. ContractA, ContractB'ye ETH gönderir
  4. Bu, ContractB'nin geri dönüşünü tetikler ()
  5. Döngü devam ediyor. Para gitti 🚨

Bunun ne kadar basit ama yıkıcı olabileceği biraz şaşırtıcı.

Güvenlik Açığı Olan Kod Örneği 📝

İşte savunmasız bir sözleşmenin nasıl göründüğü: solidity function withdrawAll() public { uint bal = balances[msg.sender]; require(bal > 0);

(bool sent, ) = msg.sender.call{value: bal}("");
require(sent, "Ether gönderme başarısız");

balances[msg.sender] = 0; // Gönderdikten SONRA güncelleme? Büyük bir hata!

}

Saldırı sözleşmesi bunu yapar: solidity fallback() harici ödenecek { eğer(etherStore.bakiye >= 1 ether) etherStore.withdrawAll(); }

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

Bu Saldırıları Durdurmanın Üç Yolu 🛡️

1. nonReentrant Modifier 🔒

solidity bool özel kilitli = false;

modifier nonReentrant() { require(!locked, "No reentrancy"); kilitli = true; _; locked = false; }

Zayıf fonksiyonlara ekleyin. Basit ama etkili.

2. Kontroller-Etkiler-Etkileşimler Deseni 📊

Bu çok önemli:

solidity function withdrawAll() public { uint bal = balances[msg.sender]; require(bal > 0);

balances[msg.sender] = 0; // FIRST'i Güncelle

(bool gönderildi, ) = msg.sender.call{value: bal}(""); // O ZAMAN etkileşim
require(gönder, "Ether gönderme başarısız");

}

Önce durumunuzu güncelleyin. Sonra etkileşimde bulunun. Her zaman.

3. Küresel Koruma 🌐

Büyük projeler için:

solidity sözleşme GlobalReentrancyGuard { bool private locked = false;

modifier globalNonReentrant() {
    require(!locked, "No reentrancy");
    locked = true;
    _;
    locked = false;
}

}

Tüm sözleşmelerinizin bunu miras almasını sağlayın. Daha güvenli bir ekosistem.

Son Trendler 🔥

Eylül 2025 itibarıyla, bu saldırılar DeFi'yi hâlâ rahatsız ediyor. Geliştiricilerin neden aynı hataları yapmaya devam ettikleri tamamen net değil. Slither gibi araçlar bu sorunları tespit edebilir. Echidna ve Foundry bunları test etmeye yardımcı olur 🚀

Güvenlik sadece bir değiştirici eklemekle ilgili değildir. Bu bir zihniyettir.

Dikkatli olun! 🛡️

ETH2.91%
View Original
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
  • Reward
  • Comment
  • Repost
  • Share
Comment
0/400
No comments
  • Pin
Trade Crypto Anywhere Anytime
qrCode
Scan to download Gate App
Community
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)