Hardhat ile Uygulamalı Re-Entrancy (Yeniden Giriş) Atağı
2016'daki meşhur DAO Hack'ine sebep olan ataktan nasıl korunulacağını akıllı kontrat örnekleriyle öğrenmeye ne dersiniz?
Günümüze kadar milyonlarca dolarlık hacklerin arkasındaki sebep olan re-entrancy (yeniden giriş) atağının ne olduğunu, nasıl önlemler alınması gerektiğini daha önce kaleme almıştım. Bugün ise işi biraz daha teknik kısma taşıyıp, hem güvenli hem güvensiz iki akıllı kontrat yazıp, hacklemeye çalışacağız. Bir önceki yazıyı okumak için;
Projeyi kendi bilgisayarınızda da test etmek için GitHub repomuzdaki kodları kullanabilirsiniz. Kodların tamamı için de lütfen ilgili repoyu inceleyin.
Adım adım yapılması gerekenler readme dosyasında mevcut, fakat burada da anlatacağım.
Akıllı Kontratlar
Bu proje için 3 adet akıllı kontratımız mevcut.
Thanks for reading SCDEVSTR Lab! Subscribe for free to receive new posts and support my work.
Subscribed
SafeStaking.sol (Güvenli olan staking kontratı)
VulnerableStaking.sol (Hack’e açık olan staking kontratı)
Attack.sol (Saldırıyı yapacak kişinin yazdığı kontrat)
Öncelikle Staking kontratlarına bakalım. Deposit ve withdraw fonksiyonlarını içeren basit bir kontrat yapımız var. İki kontrat arasındaki önemli farklar ise withdraw fonksiyonunda saklı.
nonReentrant modifier’ı
balances[msg.sender] ile bakiyenin ETH transferinden önce güncellenmesi
SafeStaking.sol
VulnerableStaking.sol
Şimdi kötü niyetli saldırı akıllı kontratının kritik kısmını inceleyelim. fallback fonksiyonunun içinde tekrardan staking kontratının withdraw fonksiyonunu çağırdığı için, staking kontratının bakiyesi bitene kadar çekim işlemi yapabiliyor.
Attack.sol
Test Zamanı
Hardhat sayesinde hızlı bir şekilde kontratlarımızda test yapabiliyoruz. Eğer Hardhat ile test nasıl yapılır diyorsanız, bize yorumda bulunun. Onunla ilgili de detaylı yazılar hazırlayabiliriz.
Test senaryomuz gayet basit.
User1 ve User2 staking kontratlarına 5’er ETH depozit ediyor ve her bir staking kontratlarında 10’ar ETH bulunduğunu kontrol ediyoruz.
VulnerableStaking testinden örnek kesit:
Saldırgan kendi kontratını oluşturup ilgili kontratlara saldırmaya çalışıyor.
Saldırıdan sonraki staking kontratlarının ve saldıranın kontratının ETH balancelarını inceleyerek hack olup olmadığını anlıyoruz.
VulnerableStaking testinden örnek kesit
Sonuç
İki staking kontratı için de testlerimizi yaptığımızda; re-entrancy atağına açık olan staking kontratının bakiyesi sıfırlanırken, güvenli staking kontratımızda kullanıcı bakiyelerine saldırı gerçekleşemediğini görüyoruz.
Test sonucu
Umarım faydalı bir yazı olmuştur. Kodların tamamı için GitHub reposunu inceleyebilirsiniz.
Yorumlarınızı buradan veya Twitter’dan bana iletebilirsiniz.
Hepinize iyi ve güvenli günler!