Akıllı Sözleşmeler Yeniden Giriş Saldırılarının Kavramasından Nasıl Kurtulur? PlatoBlockchain Veri Zekası. Dikey Arama. Ai.

Yeniden Giriş Saldırılarının Kavramasından Akıllı Sözleşmeler Nasıl Kurtulur?

Okuma zamanı: 6 dakika

En büyük kripto hacklerine ve onlar için kaybedilen göz sulandıran rakamlara daha yakından bakarsak, kodlama kusurlarından kök salmış olacaklardır.

Güvenlik açığının bu tür yaygın durumlarından biri, Yeniden Giriş saldırısıdır. Bununla birlikte, yanlış yönetilen yeniden girişten kaynaklanan yıkıcı etki, saldırıyı başlatmak kadar basit gelmeyebilir.

Bilinen ve iyi duyurulan bir konu olmasına rağmen, akıllı sözleşmelerde Reentrancy hatasının ortaya çıkması her zaman kaçınılmazdır. 

Reentrancy güvenlik açığı, geçtiğimiz yıllarda bilgisayar korsanları tarafından ne sıklıkla istismar edildi? O nasıl çalışır? Akıllı sözleşmelerin Reentrancy hatalarına karşı para kaybetmesini nasıl engelleyebilirim? Bu soruların cevaplarını bu blogda bulun.

Öyleyse, çok geçmeden, hafızadaki en büyük yeniden giriş saldırılarını tazeleyelim. 

En Rezil Gerçek Zamanlı Yeniden Giriş Hacklerinden Bazıları 

Projeler üzerinde en yıkıcı etkilere neden olan yeniden giriş saldırıları, bu ikisinden birini veya hatta ikisini birden yapmakla sonuçlandı. 

  • Ether'i akıllı sözleşmelerden tamamen boşaltın
  • Bilgisayar korsanları akıllı sözleşme koduna gizlice giriyor

Artık birkaç Reentrancy saldırısı vakasını ve etkilerini gözlemleyebiliriz. 

Haziran 2016: DAO saldırısı – 3.54 milyon veya 150 milyon dolar Eter

Nisan 2020: Uniswap/Lendf.Me hack – 25 milyon dolar

2021 olabilir: BurgerSwap hack – 7.2 milyon dolar

2021 Ağustos: KREM FİNANSI kesmek - 18.8 milyon dolar

Mart 2022: Ola Finans – 3.6 milyon dolar

Temmuz 2022: OMNI protokolü – 1.43 milyon dolar

Reentrancy saldırılarının asla modası geçmediği çok açık. Aşağıdaki pasajlarda bunun hakkında derin bilgiler edinelim. 

Reentrancy saldırısına genel bakış

“Tekrar tekrar girmek” anlamına gelen “Yeniden Giriş” adından itibaren. Yeniden giriş saldırısı iki sözleşme içerir: Kurban sözleşmesi ve Saldırgan sözleşmesi. 

Saldırgan sözleşmesi, kurban sözleşmesindeki yeniden giriş güvenlik açığından yararlanır. Bunu başarmak için geri çekme işlevini kullanır. 

Saldırgan sözleşmesi, kurban sözleşmesindeki bakiye güncellenmeden önce tekrarlanan aramalar yaparak kurban sözleşmesinden fonları boşaltmak için çekme işlevini çağırır. Mağdur sözleşmesi bakiyeyi kontrol edecek, para gönderecek ve bakiyeyi güncelleyecektir. 

Ancak, fonların gönderilmesi ve sözleşmedeki bakiyenin güncellenmesi zaman çerçevesi içinde, saldırgan sözleşme sürekli olarak para çekmek için çağrı yapar. Sonuç olarak, saldırgan sözleşmesi tüm fonları boşaltana kadar kurban sözleşmesinde bakiye güncellenmez.

Yeniden giriş sömürüsünün ciddiyeti ve maliyeti, performans sergilemek için korkunç bir ihtiyaç alarmı veriyor. akıllı sözleşme denetimleri bu tür hataları gözden kaçırma olasılığını ortadan kaldırmak için. 

Yeniden Giriş Saldırısının açıklayıcı görünümü

Aşağıdaki basitleştirilmiş örnekten yeniden giriş saldırısı kavramını anlayalım. 

İşte iki sözleşme: Savunmasız sözleşme ve Hacker sözleşmesi

Hacker sözleşmesi, savunmasız sözleşmeden çekilmek için bir çağrı yapar. Çağrıyı aldıktan sonra, savunmasız sözleşme, bilgisayar korsanı sözleşmesindeki fonları kontrol eder ve ardından fonları bilgisayar korsanına aktarır. 

Bilgisayar korsanı fonları alır ve savunmasız sözleşmedeki bakiye güncellenmeden önce savunmasız sözleşmeyi tekrar çağıran geri dönüş işlevini uygular. Böylece aynı işlemi tekrarlayarak, bilgisayar korsanı, savunmasız sözleşmeden fonları tamamen geri çeker. 

Yeniden Giriş Saldırılarının Kavramasından Akıllı Sözleşmeler Nasıl Kurtulur?

Saldırgan Tarafından Kullanılan Geri Dönüş İşlevinin Özellikleri 

  • Harici olarak çağrılabilirler. Yani yazıldığı sözleşmeden aranamazlar.
  • Adsız işlev
  • Geri dönüş işlevi, içinde keyfi mantık içermez
  • ETH, ekteki akıllı sözleşmesine gönderildiğinde ve herhangi bir alma() işlevi bildirilmediğinde geri dönüş tetiklenir.

Yeniden Giriş Saldırısını Teknik Bir Bakıştan Analiz Etme 

Örnek bir sözleşmeyi ele alalım ve yeniden giriş saldırısının nasıl gerçekleştiğini anlayalım.

Kötü Amaçlı Sözleşme

contract Attack {
    DepositFunds public depositFunds;

    constructor(address _depositFundsAddress) {
        depositFunds = DepositFunds(_depositFundsAddress);
    }

    // Fallback is called when DepositFunds sends Ether to this contract.
    fallback() external payable {
        if (address(depositFunds).balance >= 1 ether) {
            depositFunds.withdraw();
        }
    }

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


}

Bu, saldırganın 2ETH yatırdığı saldırgan sözleşmesidir. Saldırgan, savunmasız sözleşmedeki geri çekme işlevini çağırır. Savunmasız sözleşmeden fonlar alındığında, geri dönüş işlevi tetiklenir. 

Geri dönüş daha sonra geri çekme işlevini yürütür ve fonu savunmasız sözleşmeden boşaltır. Bu döngü, savunmasız sözleşmeden fonlar tamamen tükenene kadar devam eder.

Hassas Sözleşme

contract DepositFunds {
    mapping(address => uint) public balances;

    function deposit() public payable {
        balances[msg.sender] += msg.value;
    }

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

        (bool sent, ) = msg.sender.call{value: bal}("");
        require(sent, "Failed to send Ether");

        balances[msg.sender] = 0;
    }


}

Korunmasız sözleşmenin 30ETH'si var. Burada geri çekme() işlevi, talep edilen miktarı saldırgana gönderir. Bakiye güncellenmediği için tokenlar tekrar tekrar saldırgana aktarılır. 

Yeniden Giriş Saldırılarının Türleri

  • Tek işlevli yeniden giriş 
function withdraw() external {
   uint256 amount = balances[msg.sender];
   require(msg.sender.call.value(amount)());
   balances[msg.sender] = 0;
}

Msg.sender.call.value(amount)(), bakiyeler[msg.sender] = 0 güncellenmeden önce saldırgan sözleşme geri dönüş işlevinin geri çekme() işlevini çağırdığı fonları aktarır.

  • İşlevler Arası Yeniden Giriş
function transfer(address to, uint amount) external {
   if (balances[msg.sender] >= amount) {
       balances[to] += amount;
       balances[msg.sender] -= amount;
   }
}
function withdraw() external {
   uint256 amount = balances[msg.sender];
   require(msg.sender.call.value(amount)());
   balances[msg.sender] = 0;
}

İşlevler arası yeniden giriş, tanımlanması çok daha karmaşıktır. Buradaki fark, geri dönüş işlevinin, geri çekme olarak adlandırdığı tek işlevli yeniden girişten farklı olarak aktarımı çağırmasıdır.

Yeniden Giriş Saldırılarına Karşı Önleme

Kontroller-Etkiler-Etkileşim Modeli: Kontroller-etkiler-etkileşim düzeni, işlevlerin yapılandırılmasına yardımcı olur. 

Program önce koşulları kontrol edecek şekilde kodlanmalıdır. Kontrolleri geçtikten sonra, sözleşmelerin durumu üzerindeki etkiler çözülmeli ve ardından harici işlevler çağrılabilir. 

function withdraw() external {
   uint256 amount = balances[msg.sender];
   balances[msg.sender] = 0;
   require(msg.sender.call.value(amount)());
}

Burada yeniden yazılan kod, kontroller-etkiler-etkileşim düzenini takip eder. Burada, harici bir arama yapılmadan önce bakiye sıfırlanır. 

değiştirici kullanımı

İşleve uygulanan noReentrant değiştiricisi, yeniden giriş çağrısı olmamasını sağlar. 

contract ReEntrancyGuard {
    bool internal locked;

    modifier noReentrant() {
        require(!locked, "No re-entrancy");
        locked = true;
        _;
        locked = false;
    }
}

Sonunda

En etkili adım, QuillAudits gibi önde gelen bir güvenlik firmasından akıllı sözleşme denetimleri almaktır; burada denetçiler kodun yapısını yakından takip eder ve geri dönüş işlevinin nasıl çalıştığını kontrol eder. İncelenen modellere dayalı olarak, eğer varsa kodun yeniden yapılandırılması için öneriler verilir. savunmasız davranışlar

Fonların güvenliği, herhangi bir zarara uğramadan hemen önce sağlanır. 

FAQs

Yeniden giriş saldırısı nedir?

Güvenlik açığı bulunan sözleşmedeki bir işlev güvenilmeyen bir sözleşmeye çağrı yaptığında yeniden giriş saldırısı gerçekleşir. Güvenilmeyen sözleşme, saldırganın, fonlar tamamen tükenene kadar savunmasız sözleşmeye yinelemeli çağrılar yapan sözleşmesi olacaktır. 

reentran nedir?

Yeniden girme eylemi, kodun yürütülmesini kesintiye uğratmak ve yeniden girme olarak da bilinen işlemi yeniden başlatmak anlamına gelir.

Yeniden giriş bekçisi nedir?

Yeniden giriş koruması, işlevin tekrar tekrar çağrılmasını önleyen bir değiştirici kullanır. Yeniden giriş koruması örneğini bulmak için yukarıdaki blogu okuyun.

Akıllı sözleşmelere yapılan bazı saldırılar nelerdir?

Akıllı sözleşmeler, yeniden giriş, zaman damgası bağımlılığı, aritmetik taşmalar, DoS saldırıları vb. gibi çok sayıda güvenlik açığına maruz kalır. Bu nedenle, sözleşmenin mantığını çökerten hiçbir hata bulunmadığından emin olmak için denetim şarttır.

69 Görünümler

Zaman Damgası:

Den fazla tüyo