Hardhat ile Uygulamalı Re-Entrancy (Yeniden Giriş) Atağı

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?

·

2 min read

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

  1. SafeStaking.sol (Güvenli olan staking kontratı)

  2. VulnerableStaking.sol (Hack’e açık olan staking kontratı)

  3. 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!

Did you find this article valuable?

Support Buildchain by becoming a sponsor. Any amount is appreciated!