Akıllı sözleşme denetimine Yeni Başlayanlar kılavuzuna hoş geldiniz! Akıllı sözleşme denetimine başlamanın en iyi yollarından biri, akıllı sözleşmelerdeki birkaç yaygın güvenlik açığı türüne atlamak ve bunlara bakmaktır.
Halihazırda Ethereum'un Solidity programlama dili hakkında temel bir anlayışa sahipseniz faydalı olacaktır. Noob katılık programcıları tarafından yazılan bazı kodlara bakacağız.
Yeniden Giriş Saldırısı
Gerçek Dünya Senaryosu:
Elinizde 50 çikolata olduğunu hayal edin. Senden her seferinde sadece 2 çikolata almasına izin verdiğin yaramaz bir kız kardeşin var. Ayrıca dişlerinin çürüyeceğinden korkarak ona günde 10'dan fazla çikolata vermek istemezsiniz. Bunu sağlamak için her akşam yanınızda kaç tane çikolata kaldığını sayarsınız. Bunun işe yarayacağını düşünüyor musun? Yoksa küçük kız kardeşin tarafından hacklenir miydin?
Ne yazık ki, işe yaramayacak! Akşama kadar kaç çikolatanız olduğundan habersiz olduğunuzu kız kardeşiniz anladı. Yani ertesi gün, küçük kız kardeşin akşamdan önce 6 kez seni ziyaret ediyor ve her seferinde 2 çikolata alıyor! Buna yeniden giriş saldırısı diyoruz.
Burada, kız kardeşiniz sizden 2 çikolata aldığında sayımı güncellemek yerine, akşamları sahip olduğunuz çikolata sayısını güncelliyorsunuz. Akıllı sözleşmede de böyle oluyor. Saldırgan aslında sözleşmeden bir miktar kriptoyu birden çok kez çekmekle meşgulken, akıllı sözleşme belirli bir dengeyi varsayar.
Gerçek Dünya Kodu Örneği:
Bu kod adlı bir akıllı sözleşmeye aittir. unbanked. Herkes, msg.sender'ın bakiyeleri (yani arayanın) bakiyesi olduğu sürece Bankasız bir sözleşmeden ether çekebilir. withdraw
işlev ) çekilmesi istenen miktardan büyük veya ona eşittir.
function withdraw(uint _amount) { require(balances[msg.sender] >= _amount); msg.sender.call.value(_amount)(); balances[msg.sender] -= _amount;
}
Gerekli miktarda ether göndermek için kullanılan bir call anahtar sözcüğü olduğuna dikkat edin. msg.sender
. Saldırgan, bir dosyada geri çekme işlevini çağırdığı Hırsız adlı bir sözleşme oluşturarak bundan yararlanabilir. fallback()
işlevi. Bir fallback()
Solidity'deki işlev, akıllı sözleşmeye eter gönderildiğinde yürütülen özel bir işlevdir.
Bu, bir saldırganın şunları yapabileceği anlamına gelir: geri çekme işlevini yinelemeli olarak çağır. Böylece, akıllı sözleşme güncellemelerinden önce, bakiyeler msg.sender
kodun son satırında, saldırgan zaten birçok kez etheri geri çekmiştir. Bakiyeler call anahtar sözcüğü kullanılmadan önce güncellenirse bu önlenebilir. kontroller-etkiler-etkileşimler desen.
Etki:
The ilk Yeniden Giriş Saldırısı 2016 yılında bir DAO'da (Merkezi Olmayan Özerk Kuruluş) meydana geldi ve yaklaşık 50 Milyon Dolarlık hack'le sonuçlandı. Bu hack'i tersine çevirmek için, Ethereum topluluğu, ETC (Ethereum Classic) ve ETH'ye (Ethereum) yol açan Ethereum blok zincirini böldü.
Aritmetik Taşma ve Azalma
Gerçek Dünya Senaryosu:
Bir düşünce oyunu oynayalım. Bir Döndürme çarkından oluşur ve kazanan, çarkı döndürmek için alabileceği en büyük sayıya göre belirlenir. Çark 256'dan -256'ya kadar her yerde işaretlenmiştir.
Oyunun kuralları, tüm oyuncular için işaretçinin her dönüşün başında 0'da durmasıdır. Ve bir oyuncunun sadece negatif sayılar yönünde dönmesine izin verilir. Bu oyunu nasıl kazanacaksınız?
Bu oyunu her seferinde kazanmak için iyi bir strateji, çarkı öyle bir güçle döndürmek olur ki çark -256'ya kadar döner ve tek seferde 256'ya döner. Bu mümkündür, çünkü 256, direksiyonda -256'dan hemen sonra gelir. Buna aritmetik taşma diyoruz. Ve aritmetik taşma bunun tam tersidir.
Gerçek Dünya Kodu Örneği:
An taşma veya taşma aritmetik bir işlem minimum veya maksimuma ulaştığında olur.
function withdraw(uint _amount) public { require(balances[msg.sender] - _amount > 0); address payable to = payable(msg.sender); to.transfer(_amount); balances[msg.sender] -= _amount;
}
The _amount
geri çekme işlevinin parametresi işaretsiz bir tamsayıdır. Bakiye eşlemesinin değeri (python'daki bir sözlük veya C++ veya Java'daki bir anahtar/değer çifti gibidir) aynı zamanda işaretsiz bir tamsayıdır.
mapping(address => uint256) public balances
Gerekli beyan, bakiyelerin olup olmadığını kontrol eder. msg.sender
pozitiftir veya değildir. Ancak bu ifade, miktar, bakiyelerden daha büyük olsa bile her zaman doğru olacaktır. msg.sender
. Bunun nedeni, hem balances
ve _amount
değişkenler unsigned tamsayı türündendir ve aritmetik sonuçları (alt akıştan sonra) da işaretsiz bir tamsayı olacaktır!
Ve hatırlayabileceğiniz gibi, işaretsiz bir tamsayı her zaman pozitiftir. Bu, bir saldırganın akıllı sözleşmeden sınırsız miktarda Ether çekebileceği anlamına gelir! Bu güvenlik açığı için ayrıntılı bir örnek ve uygulama kodu bulabilirsiniz okuyun.
Burada dikkat edilmesi gereken bir diğer önemli nokta, say iki işaretsiz tam sayı arasındaki aritmetik işlemin de işaretsiz bir tam sayı olmasıdır. İstenmeyen güvenlik ihlallerine neden olabileceğinden, akıllı sözleşmelerde bunun gözden kaçırılması tehlikeli olabilir!
function votes(uint postId, uint upvote, uint downvotes) { if (upvote - downvote < 0) { deletePost(postId) }
}
Yukarıdaki örnekte fark etmiş olabileceğiniz gibi, if ifadesi oldukça anlamsızdır. upvote - downvote
her zaman pozitif olacaktır. Ve gönderi silinse bile silinecek downvotes
daha büyüktür upvotes
. Bu tür saldırılardan kaçınmak için, aşağıdakilerden daha büyük bir Solidity derleyici sürümünün kullanılması önerilir. 0.8.0.
Etki:
denilen bir madeni para PoWH madeni para 2017'de piyasaya sürüldü. Bir Ponzi oyunu olmasına rağmen, o sırada yaklaşık 866 ETH veya 950,000 $ kayıpla sonuçlanan bir aritmetik taşma hatası nedeniyle saldırıya uğradı. Bu konuyu detaylı olarak okuyabilirsiniz okuyun.
Okumalısınız: Algorand'daki En Büyük DEX olan Tinyman'a Saldırıdan Dersler
Hizmeti engelleme saldırısı
Gerçek Dünya Senaryosu:
Bir Bitcoin Teknoloji Üniversitesinde olduğunuzu hayal edin. Herkes için ortak bir yemek masası olması dışında her şey yolunda görünüyor. Ve ne yazık ki, başka bir sınıftan, her zaman sizin sınıfınızdan herkesten önce yemek masasına oturmayı başaran çok az kişi var.
Pratik senaryoda, değerli zaman kaybına neden olan herkese temel hizmeti reddediyorlar. Buna 'Hizmet Reddi saldırısı' diyoruz.
Gerçek Dünya Kodu Örneği:
Denilen oyunda Eter Kralı, herkes kral olabilir. Ancak kral olmanın kuralı, bir kişinin mevcut kraldan daha fazla eter yatırması gerektiğidir. Bu, şu numarayı arayarak yapılabilir: claimThrone()
Kişinin doğrudan önceki krala eter gönderdiği ve yeni kral olduğu Eter Kralı sözleşmesinin işlevi.
function claimThrone() external payable { require(msg.value > balance, "Need to pay more to become the king"); (bool sent, ) = king.call{value: balance}(""); require(sent, "Failed to send Ether"); balance = msg.value; king = msg.sender; }
Tahmin edebileceğiniz gibi, bu kod bir DoS Saldırısına karşı savunmasızdır, ancak nasıl? Bunun için, Ethereum'da iki tür adres olduğunu anlamanız gerekecek - ilki, harici bir adres sahip olunan hesap veya sadece bir cüzdanın adresi ve ikincisi sözleşme adresi. Artık ether bu adres tiplerinden herhangi birinden gönderilebilir.
Bu, ether sözleşme adresi tarafından gönderilirse, sözleşme kral olacaktır. Ama varsayalım ki bu yeni sözleşmenin bir fallback()
sözleşme etheri kabul etmek istiyorsa gerekli olan işlev. Sonra yeni biri gelir ve aramayı denerse claimThrone()
işlev, her zaman başarısız olur!
Bunun da kısmen gerçekleştiğine dikkat edin. claimThrone()
işlev, ikinci gerekli ifadede eter transferinin başarılı olup olmadığını açıkça kontrol eder. Kodun tamamını bulabilir ve ona bir DoS saldırısı yapabilirsiniz. okuyun.
Kodun bir dizi büyük boyut üzerinde bir döngüsü varsa, bir kodun bir DoS saldırısına karşı savunmasız olması da mümkündür. Bu olur çünkü gaz limiti bu gibi durumlarda aşılabilir. bu konuda okuyabilirsiniz okuyun.
Etki:
adlı bir oyun Devlet ZihinselGörünüşe göre bir Ponzi şeması olan, ödemeyi işlemek için büyük miktarda gaza ihtiyaç duyulduğu için 1100 eter ile takıldı.
Güvensiz Rastgelelik
Gerçek Dünya Senaryosu:
Bir zamanlar, her zaman maymunu Pesky'nin eşlik ettiği Hesky adında bir adam vardı. Hesky piyango oyunları yönetti ve iyi karlar elde etti. Bir gün Alice, Hesky'nin maymunu Pesky'ye dikkatle baktığını fark etti. Sonra onun bir kağıda bir şeyler yazdığını ve bir zarfa kapattığını gördü. Merak ederek daha fazla araştırmaya karar verdi.
O akşamın ilerleyen saatlerinde Alice, piyangonun kazananının mühürlü zarfın alenen açılmasıyla belirlendiğini gördü. Alice onu birkaç gün izledikten sonra, Hesky'nin kazanan piyango numarasına Pesky'nin jestlerine bakarak karar verdiğini anladı (örneğin, maymun kafasını kaşıdıysa, Hesky 10 yazdı)! Artık Alice'in her piyangoyu kazanma formülü vardı ve sadece doğru numarayla piyango biletini alması gerekiyordu!
Hesky, piyango kazananına karar vermenin “rastgele” yolunun asla çözülemeyeceğini varsaymıştı, ama gerçekten yanılıyordu.
Gerçek Dünya Kodu Örneği:
Bu örnekte, bir bloğun numarası ile blok zaman damgasının birleşiminin karma değerine dayalı olarak rastgele bir sayı oluşturulur. bu hash daha sonra cevap değişkenine atanır. Şimdi bu (görünüşte) rastgele sayıyı tahmin eden herkes 1 Ether ile ödüllendiriliyor. Sizce bu hacklenemez mi?
function guess(uint _guess) public { uint answer = uint( keccak256(abi.encodePacked(blockhash(block.number - 1), block.timestamp)) ); if (_guess == answer) { (bool sent, ) = msg.sender.call{value: 1 ether}(""); require(sent, "Failed to send Ether"); } }
Hayır! Saldırgan, yanıt değişkenine atanan değeri oluşturmak için kodu kopyalayıp yapıştırarak bu rastgele sayıyı tahmin edebilir ve aynı yanıt değişkenini aynı yanıt değişkenine iletebilir. guess()
işlev!
guessTheRandomNumber.guess(answer);
Tam kodu bulabilirsiniz okuyun. Bu saldırıdan kaçınmak için, aşağıdaki gibi Doğrulanabilir Rastgele İşlev kullanılması önerilir. Zincir Bağlantı VRF'si.
Etki:
Saldırı nedeniyle yaklaşık 400 ETH kaybedildi. Akıllı Milyarlarca piyango sözleşme. Şaşırtıcı bir şekilde, sözleşme piyangosunun kendisi bile bir Ponzi şemasıydı (ah!).
zaman manipülasyonu
Gerçek Dünya Senaryosu:
Satoshi kurabiye yemeyi sever. Annesinin yaptığı her türlü kurabiyeyi çok seviyor. Ancak annesi çok katıdır ve çok fazla kurabiye yemenin onun için iyi olmadığını düşünür. Bu yüzden annesi, kurabiyeleri ancak akşam 8'de alacağına dair bir kural koyar.
O gün saat 7:45'te Satoshi annesine koşar ve kurabiye ister. Annesi sorar: "Saat kaç?"
"Saat 8!" - o cevaplar.
"Peki. O zaman dolabımdan kurabiyeleri al.”
Ve böylece, Satoshi, kurabiyelerini alabilmesi için zamanı 15 dakika ile başarılı bir şekilde manipüle edebildi! Ne kadar kurabiyeye aç bir adam!
Gerçek Dünya Kodu Örneği:
Bir bloğun zaman damgası yaklaşık olarak manipüle edilebilir. 15 saniye bir madenci tarafından. Bu şekilde, bir madenci uygun bir zaman damgası belirleyebilir ve işlemini, madenciliği yaptığı aynı bloğa dahil edebilir. İşlev play()
G-Dot adlı bir Oyun sözleşmesine aittir.
function play() public { require(now > 1640392200 && neverPlayed == true); neverPlayed = false; msg.sender.transfer(1500 ether);
}
Bu sözleşme, oyun işlevini ilk çağıran oyuncuya 1500 eter verir. Ancak görebileceğiniz gibi, oynatma işlevi yalnızca çağrıyı içeren işlemin şimdi veya blok.zaman damgası varsa çağrılabilir. play()
fonksiyonundan daha büyüktür. çağ zamanı 1640392200
Bir madenci bu zaman damgasını kolayca değiştirebilir ve arama işlemini dahil edebilir. play()
kendisi ilk oyuncu olacak şekilde aynı blokta çalışır. Bu şekilde madencinin oyunu kazanması garanti edilir!
Etki:
blok.timestamp, rasgele sayılar oluşturmak için kullanıldı. Hükümet ve bu nedenle zaman manipülasyon saldırılarına karşı savunmasızdı.
QuillAudits'e ulaşın
QuillAudits, tarafından tasarlanan güvenli bir akıllı sözleşme denetim platformudur. QuillHash
Teknolojileri.
Statik ve dinamik analiz araçları, gaz analizörleri ve simülatörler ile etkili manuel inceleme yoluyla güvenlik açıklarını kontrol etmek için akıllı sözleşmeleri titizlikle analiz eden ve doğrulayan bir denetim platformudur. Ayrıca, denetim süreci ayrıca kapsamlı birim testlerinin yanı sıra yapısal analizleri de içerir.
Potansiyeli bulmak için hem akıllı sözleşme denetimleri hem de sızma testleri yapıyoruz
platformun bütünlüğüne zarar verebilecek güvenlik açıkları.
Akıllı sözleşme denetiminde herhangi bir yardıma ihtiyacınız olursa, uzmanlarımıza ulaşmaktan çekinmeyin. burada!
Çalışmalarımızdan haberdar olmak için Topluluğumuza Katılın: -
Twitter | LinkedIn | Facebook | Telegram
Sonrası Akıllı Sözleşme Denetimine Yeni Başlayanlar Kılavuzu: Bölüm 1 İlk çıktı Quillhash Blogu.
Kaynak: https://blog.quillhash.com/2022/01/19/beginners-guide-to-smart-contract-auditing-part-1/
- "
- &
- 000
- 2016
- 7
- Hakkımızda
- Hesap
- adres
- Türkiye
- zaten
- Rağmen
- analiz
- denetim
- özerk
- Başlangıç
- İYİ
- Bitcoin
- blockchain
- Böcek
- satın almak
- çağrı
- durumlarda
- Çekler
- klasik
- kod
- Sikke
- kombinasyon
- ortak
- topluluk
- içeren
- sözleşme
- sözleşmeleri
- kurabiye
- olabilir
- Oluşturma
- kripto
- akım
- DAO
- gün
- Merkezi olmayan
- Hizmet Reddi
- ayrıntı
- Dex
- aşağı
- kolayca
- yemek
- ETH
- Eter
- Ethereum
- Etereum blok zincir
- Ethereum Classic
- örnek
- sömürmek
- ince
- Ad
- Ücretsiz
- işlev
- oyun
- Games
- GAZ
- oluşturmak
- GitHub
- gidiş
- Tercih Etmenizin
- rehberlik
- kesmek
- kesmek
- esrar
- baş
- okuyun
- Ne kadar
- HTTPS
- araştırmak
- IT
- Java
- kaydol
- atlama
- King
- dil
- büyük
- çizgi
- Uzun
- bakıyor
- piyango
- adam
- milyon
- anne
- sayılar
- kuruluşlar
- kâğıt
- model
- İnsanlar
- parça
- platform
- OYNA
- oyuncu
- ponzi
- Ponzi şeması
- güç kelimesini seçerim
- süreç
- Programcılar
- Programlama
- halka açık
- ters
- yorum
- "Rewards"
- kurallar
- Satoshi
- güvenlik
- set
- akıllı
- akıllı sözleşme
- Akıllı Sözleşmeler
- So
- katılık
- bir şey
- Dönme
- bölmek
- başladı
- Açıklama
- Stratejileri
- başarılı
- Başarılı olarak
- teknoloji
- testleri
- İçinden
- zaman
- araçlar
- işlem
- unbanked
- üniversite
- Güncellemeler
- değer
- güvenlik açıkları
- güvenlik açığı
- Savunmasız
- Cüzdan
- Ne
- tekerlek
- DSÖ
- kazanmak
- İş
- yazı yazıyor