Solidity üzerinde geliştirilen akıllı sözleşmelerin bilinen ve bilinmeyen çeşitli saldırılara açık olması gibi, küçük bir kaçağın nasıl finansal bir kayba (değişen büyüklükte) yol açtığını az önce gördük. Sömürücüler, akıllı sözleşmelere göz atmak ve saldırıları gerçekleştirmek için onları manipüle etmek için hatalardan ve boşluklardan yararlanır. Burada, Solidity programlama dilinde en sık karşılaşılan 5 hatanın kapsamlı bir listesini sunuyoruz.
QuillAudits'te, her hack olayının özünü almak için uyarlanabilir metodolojiyi takip ediyor ve olası tehditlerden kaçınmak için öğrendiklerini gelecekteki akıllı sözleşmelere uyguluyoruz.
Solidity programlama dilindeki hatalar
1. İşaretlenmemiş Harici Arama
Bu konuyu ilk etapta çekiyoruz çünkü bu en yaygın olarak gözlemlenen Solidity tuzaklarından biri. Genel olarak, herhangi bir harici hesaba ether göndermek, Aktar() işlev. Bunun dışında harici arama yapmak için en çok kullanılan iki fonksiyon; aramak(), ve gönder (), burada esas olarak aramak() işlevi, geliştiriciler tarafından çok yönlü harici aramalar yapmak için yaygın olarak kullanılır.
Rağmen aramak() ve gönder () işlevler, çağrının başarılı olup olmadığını belirten bir boole değeri döndürür. Böylece bu durumda, işlevlerden herhangi biri varsa aramak() or gönder () görevi yerine getiremezse, bir yanlış. Bu nedenle, geliştirici dönüş değerini çapraz kontrol etmezse, bu bir tuzak haline gelir.
Güvenlik Açığı
Aşağıdaki örneği düşünün:
sözleşme Loto{
boolpublic ödenenÇıkış =yanlış;
genel kazanana hitap edin;
uintpublic kazanç miktarı;
// … burada ekstra işlevsellik
function sendToWinner()genel{
gerektirir(!payedOut);
kazanan.send(winAmount);
payedOut =doğru;
}
function geri çekmeLeftOver()public{
gerektirir(payedOut);
msg.sender.send(bu.denge);
}
}
Yukarıdaki Loto benzeri sözleşmede, bir kazanan alır Kazanma Miktarı Herhangi bir harici ajandan çekilmek üzere biraz arta kalan eter.
Burada, sözleşmeye ilişkin tuzak [11] satırında mevcuttur, burada bir göndermek yanıtın çapraz doğrulaması olmadan kullanılır. Yukarıdaki örnekte, bir kazanan işlemi başarısız olan (ya Gaz eksikliğinden veya kasıtlı olarak geri dönüş işlevini başlatan bir sözleşmeyse), yetkilendirir ödenen ayarlanacak gerçek ether işleminin başarılı olup olmadığına bakılmaksızın. Bu durumda, herhangi bir istismarcı, kazananlar yoluyla kazançlar geri çekilmeLeftOver fonksiyonu.
QuillAudit'in Yaklaşımı
Şirket içi geliştirici ekibimiz, bu hatayı aşağıdakilerin kullanımıyla çözer: [Aktar] yerine işlev [gönder] [transfer] işlevi, harici işlem geri dönerse geri dönecektir. Ve [gönder] kullanıyorsanız, dönüş değerini her zaman çapraz kontrol edin.
İzlediğimiz sağlam yaklaşımlardan biri, bir [geri çekilme modeli] kullanmaktır. Burada, harici gönderme işlevini kod tabanının geri kalanından mantıksal olarak yalıtıyoruz ve potansiyel olarak başarısız işlemlerin yükünü, geri çekme işlevini çağıran son kullanıcı olduğu için son kullanıcıya yerleştiriyoruz.
2. Yeniden Giriş
Ethereum akıllı sözleşmeleri, diğer harici sözleşmelerden gelen kodları arar ve kullanır ve bunu gerçekleştirmek için sözleşmelerin harici aramalar göndermesi gerekir. Bu harici çağrılar savunmasızdır ve saldırılara açıktır, bu tür bir saldırı son zamanlarda DAO hack durumunda gerçekleşti.
Güvenlik Açığı
Saldırganlar, bir sözleşme bilinmeyen bir adrese ether gönderdiğinde bu tür saldırıları gerçekleştirir. Bu durumda saldırgan, fallback işlevinde kötü amaçlı koda sahip harici bir adreste sözleşme oluşturabilir ve sözleşme bu adrese ether gönderdiğinde bu kötü amaçlı kod çağrılır.
Gerçek: 'Yeniden Giriş' terimi, harici bir kötü niyetli sözleşme savunmasız sözleşme üzerinde bir işlev çağırdığında ve ardından kod yürütme yolunun onu 'yeniden girmesi' gerçeğinden türetilmiştir.
Aşağıdaki örneği göz önünde bulundurun, mevduat sahiplerinin haftada sadece 1 ether çekmesine izin veren bir Ethereum kasası.
sözleşme EtherStore {
uint256 genel para çekmeLimit = 1 eter;
mapping(adres => uint256) public lastWithdrawTime;
eşleme(adres => uint256) kamu bakiyeleri;
function mevduatFunds() harici ödenecek {
bakiyeler[msg.sender] += msg.value;
}
function para çekmeFunds (uint256 _weiToWithdraw) public {
require(balances[msg.sender] >= _weiToWithdraw);
// para çekmeyi sınırla
require(_weiToWithdraw <= para çekmeLimit);
// geri çekilmek için izin verilen süreyi sınırla
require(şimdi >= lastWithdrawTime[msg.sender] + 1 hafta);
request(msg.sender.call.value(_weiToWithdraw)());
bakiyeler[msg.sender] -= _weiToWithdraw;
lastWithdrawTime[msg.sender] = şimdi;
}
}
Yukarıdaki sözleşmede, [depositFunds] ve [drawFunds] olmak üzere iki genel işlevimiz var. [depositFunds] gönderenin bakiyesini artırmak için kullanılırken, [withdrawFunds] çekilecek tutarı belirtir. Bu durumda çekilecek miktarın 1 eterden az olması başarılı olacaktır.
Buradaki tuzak, eter transferinin gerçekleştiği satır [17]'de yatmaktadır. Saldırgan, tek yapıcı parametresi olarak [EtherStores]'in sözleşme adresiyle kötü niyetli bir sözleşme oluşturabilir. Bu, [etherStore]'u genel bir değişken yapar, dolayısıyla saldırıya daha yatkın olur.
QuilllAudit'in Yaklaşımı
Akıllı sözleşmelerde olası yeniden giriş güvenlik açıklarından kaçınmak için çeşitli teknikler izliyoruz. İlk ve mümkün olan en iyi yol, etheri herhangi bir harici sözleşmeye aktarırken yerleşik [transfer] işlevini kullanmaktır.
İkinci olarak, etheri sözleşmeden göndermeden önce durum değişkenlerindeki tüm mantık değişikliklerinin yapılmasını sağlamak önemlidir. [EtherStore] örneğinde, [18] ve [19] satırları [17] satırından önce yerleştirilmelidir.
Üçüncü bir teknik, yeniden giriş yapan aramaları önlemek için de kullanılabilir; bir muteks tanıtılması yoluyla. Kod yürütme sırasında sözleşmeyi kilitleyecek bir durum değişkeninin eklenmesidir.
3. Varsayılan Görünürlükler
Solidity'de kullandığımız işlevler için görünürlük belirteçleri vardır ve bunlar nasıl çağrılabileceklerini belirtirler. İşlevlerin çağrılmasını belirleyen görünürlüktür; harici olarak kullanıcılar tarafından, diğer türetilmiş sözleşmelerle, yalnızca dahili veya yalnızca harici olarak. Görünürlük belirteçlerinin hatalı kullanımının akıllı sözleşmelerde nasıl büyük güvenlik açığına neden olabileceğine bakalım.
Güvenlik Açığı
Varsayılan olarak, işlevin görünürlüğü [genel]'dir, bu nedenle harici kullanıcılar belirli bir görünürlük olmadan işlevleri çağırabilir. Hata, geliştiricilerin özel olması gereken (veya sözleşmenin kendisinde çağrılabilen) işlevlerin görünürlüğünü belirtmeyi unuttukları zaman ortaya çıkar. Örneğin;
HashForEther sözleşmesi {
fonksiyon çekmeKazançları() {
// Adresin son 8 onaltılık karakteri 0 ise kazanan
require(uint32(msg.sender) == 0);
_sendWinnings();
}
işlev _sendWinnings() {
msg.sender.transfer(bu.denge);
}
}
Yukarıdaki sözleşme basit bir adres tahmin etme ödül oyunudur. Bunda, işlevlerin görünürlüğünün belirtilmediğini görebiliriz, özellikle [ _sendWinnings] işlevi [public] (varsayılan olarak), dolayısıyla bu, ödülü çalmak için herhangi bir adres aracılığıyla çağrılabilir.
QuillAudit'in Yaklaşımı
Şirket içi ekibimiz, her zaman en iyi denetim uygulamalarını takip eden deneyimli geliştiricilerden oluşmaktadır, burada işlevlerin görünürlüğü açıkça belirtilmeli, halka açık tutulacak olsalar bile belirtilmelidir.
4. Yapıcıların Kullanımının Korunması
Genel olarak Yapıcılar, sözleşmeleri başlatırken kritik ve ayrıcalıklı görevleri gerçekleştirmek için kullanılan özel işlevler olarak adlandırılır. Solidity'den [v0.4.22] önce, inşaatçılar onları içeren sözleşmede kullanılan adı taşıyordu. Şimdi, geliştirme aşamasında sözleşme adının değiştirildiği ancak yapıcı adının aynı kaldığı bir durumu düşünün, bu boşluk aynı zamanda saldırganlara akıllı sözleşmenize kolay bir giriş sağlayabilir.
Güvenlik Açığı
Sözleşme adı değiştirilirse ancak inşaatçının adı değişmezse ciddi sonuçlara yol açabilir. Örneğin:
sözleşme SahibiCüzdanı {
kamu sahibine hitap etmek;
// yapıcı
işlev sahibiCüzdan(adres _sahip) genel {
sahip = _sahip;
}
// Geri çekilmek. Eter toplayın.
function () ödenecek {}
işlev geri çekme() genel {
gerektirir(msg.sender == sahip);
msg.sender.transfer(bu.denge);
}
}
Yukarıdaki sözleşmede, [geri çekme] işlevini çağırarak yalnızca sahibinin etheri çekebileceğini görebiliriz. Burada zafiyet, kurucu sözleşmeden farklı olarak isimlendirildiği için ortaya çıkar (ilk harf farklıdır!). Böylece, sömüren [ownerWallet] işlevini çağırabilir ve kendisini sahip olarak yetkilendirebilir ve ardından [geri çekme] çağrısı yaparak sözleşmedeki tüm etheri geri çekebilir.
QuillAudit'in Yaklaşımı
Solidity derleyicisinin [0.4.22] sürümüne uyuyoruz. Bu sürüm bir anahtar kelime tanıttı; Sözleşme adıyla eşleşmesi için işlevin adını gerektiren [yapıcı].
5. Tx.Origin Kimlik Doğrulaması
Burada [Tx.Origin], Solidity'nin global değişkenidir, çağrıyı veya işlemi ilk olarak yürüten hesabın adresini içerir. Bu değişken, kimlik doğrulama için kullanılamaz, çünkü bu, sözleşmeyi kimlik avı saldırılarına karşı savunmasız hale getirir.
Güvenlik Açığı
Kullanıcıları [tx.origin] değişkeni aracılığıyla yetkilendiren sözleşmeler, kullanıcıları hatalı sözleşme üzerinde kimliği doğrulanmış eylemler gerçekleştirmeye yönlendiren harici saldırılara maruz kalır. Aşağıdaki örneği göz önünde bulundurun:
sözleşme Phishing {
kamu sahibine hitap etmek;
yapıcı (adres _sahibi) {
sahip = _sahip;
}
function () harici ödenebilir {} // ether topla
function geri çekmeAll(adres _alıcı) public {
require(tx.origin == sahip);
_recipient.transfer(bu.denge);
}
}
Burada [11] satırında, sözleşme [tx.origin] yardımıyla [drawAll] işlevine yetki veriyor.
QuillAudit'in Yaklaşımı
Akıllı sözleşmelerde yetkilendirme için genellikle [tx.origin] kullanmaktan kaçınırız. [tx.origin] kullanımı kesinlikle yasak olmasa da, bazı özel kullanım durumları vardır. Harici sözleşmelerin mevcut sözleşmeyi çağırmasını engellemek için [tx.origin] kullanabiliriz, [require(tx.origin == msg.sender)] biçimindeki [require] ile yürütülebilir. Sözleşmeyi normal kodsuz adreslerle sınırlayan mevcut sözleşmeyi aramak için ara sözleşmelerin çağrılmasını önlemek için yapılır.
Son Özet
Solidity dilindeki beş yaygın tuzağı kapsamlı bir şekilde ele aldık. Akıllı sözleşmeler geliştirirken, tasarım gereği değişmez olduklarını unutmamalıyız, bu da onları bir kez oluşturduğumuzda kaynak kodunu yamalamanın bir yolu olmadığı anlamına gelir.
Bu, geliştiriciler için dağıtımdan önce mevcut güvenlik testi ve denetleme araçlarından yararlanma konusunda büyük bir zorluk teşkil ediyor.
Akıllı sözleşmelere yönelik potansiyel kötü niyetli tehditlerin ve bazılarının yukarıda bahsettiğimiz risklerin keşfedilmesi, şirket içi denetim uzmanlarından oluşan ekibimiz tarafından çok benzersiz ve sağlam bir şekilde gerçekleştirilir. QuillAudits olarak, sözleşmenizi güvenli ve emniyetli tutmak için sözleşmenizi tüm yazılım güvenlik uygulamalarıyla güncel tutmak için güvenlik araştırmalarına elimizden gelenin en iyisini yapıyoruz.
QuillHash'a ulaşın
Yılların endüstri mevcudiyetiyle, QuillHash dünya çapında kurumsal çözümler sunmuştur. Uzmanlardan oluşan bir ekiple QuillHash, DeFi işletmesi de dahil olmak üzere çeşitli endüstri çözümleri sunan lider bir blockchain geliştirme şirketidir.Akıllı sözleşmeler denetiminde herhangi bir yardıma ihtiyacınız varsa, uzmanlarımıza ulaşmaktan çekinmeyin burada!
Daha fazla güncelleme için QuillHash'ı takip edin
Kaynak: https://blog.quillhash.com/2021/06/04/top-5-common-errors-in-solidity-programming-language/
- 11
- Hesap
- avantaj
- Türkiye
- denetim
- Doğrulama
- yetki
- İYİ
- blockchain
- Böcek
- böcek
- çağrı
- durumlarda
- Sebeb olmak
- meydan okuma
- kod
- ortak
- şirket
- sözleşme
- sözleşmeleri
- akım
- DAO
- Defi
- Dizayn
- Geliştirici
- geliştiriciler
- gelişme
- kuruluş
- Eter
- Ethereum
- Etkinlikler
- uzmanlara göre
- mali
- Ad
- takip et
- Airdrop Formu
- Ücretsiz
- işlev
- gelecek
- oyun
- GAZ
- Küresel
- harika
- kesmek
- okuyun
- Ne kadar
- HTTPS
- Kocaman
- Dahil olmak üzere
- sanayi
- IT
- dil
- öncülük etmek
- önemli
- çizgi
- Liste
- Maç
- Diğer
- sahip
- Patch
- model
- Kimlik avı
- kimlik avı saldırıları
- reçete
- mevcut
- özel
- Programlama
- halka açık
- çeken
- araştırma
- yanıt
- DİNLENME
- güvenli
- güvenlik
- Hizmetler
- set
- Basit
- küçük
- akıllı
- akıllı sözleşme
- Akıllı Sözleşmeler
- So
- Yazılım
- katılık
- Çözümler
- Eyalet
- başarı
- Test yapmak
- Kaynak
- tehditler
- zaman
- üst
- üst 5
- işlem
- işlemler
- us
- kullanıcılar
- değer
- Tonoz
- görünürlük
- güvenlik açıkları
- güvenlik açığı
- Savunmasız
- hafta
- DSÖ
- içinde
- yıl