Web3 dünyasında bir akıllı kontratı "deploy" etmek işin sadece başlangıcıdır. Solidity geliştiricileri için en büyük kâbuslardan biri olan Reentrancy (Yeniden Giriş) saldırılarını inceliyoruz.
Saldırı Mantığı: Saldırgan kontrat, kurban kontrattan para çekerken kurban kontratın bakiyesi güncellenmeden önce fallback() fonksiyonunu kullanarak çekim işlemini tekrar tekrar tetikler.
Örnek Kod Bloğu (Zafiyetli):
// GÜVENSİZ KOD
function withdraw() public {
uint bal = balances[msg.sender];
require(bal > 0);
(bool sent, ) = msg.sender.call{value: bal}("");
require(sent, "Transfer basarisiz");
balances[msg.sender] = 0; // Güncelleme transferden sonra! (HATA)
}
Çözüm: Her zaman Checks-Effects-Interactions modelini uygulayın. Önce kontrol edin, sonra durumu (state) güncelleyin, en son transferi gerçekleştirin. Ayrıca OpenZeppelin’in ReentrancyGuard kütüphanesindeki nonReentrant modifier'ını kullanmak hayat kurtarır.
Yorumlar
Yorum Gönder