Ana içeriğe geç

Akıllı sözleşme güvenlik araçlarına yönelik bir kılavuz

solidityakıllı kontratlargüvenlik
Orta düzey
Trailofbits
Güvenli sözleşmeler oluşturmak(opens in a new tab)
7 Eylül 2020
5 dakikalık okuma minute read

Üç farklı test ve program analizi tekniği kullanacağız:

  • Slither ile statik analiz. Programın tüm yolları, farklı program sunumları (örn. control-flow-graph) aracılığıyla aynı anda tahmin edilir ve analiz edilir
  • Echidna ile bulandırma. Kod, işlemlerin sözde rastgele oluşumu ile yürütülür. Bulandırıcı, belirli bir özelliği ihlal etmek için bir dizi işlem bulmaya çalışacaktır.
  • Manticore ile sembolik yürütme. Her yürütme yolunu matematiksel bir formüle çeviren ve üzerinde en üst kısıtlamaların kontrol edilebileceği resmi bir doğrulama tekniği.

Her tekniğin avantajları ve yetersizlikleri vardır ve hepsi belirli durumlarda faydalı olacaktır:

TeknikAraçKullanımHızKaçırılan hatalarYanlış Alarmlar
Statik AnalizSlitherCLI ve komut dosyalarısaniyelerorta seviyedüşük
BulandırmaEchidnaSolidity özellikleridakikadüşükyok
Sembolik YürütmeManticoreSolidity özellikleri ve komut dosyalarısaatyok*yok

* tüm yollar zaman aşımı olmadan araştırılırsa

Slither, sözleşmeleri saniyeler içinde analiz eder ancak statik analiz yanlış alarmlara neden olabilir ve karmaşık kontroller (örn. aritmetik kontroller) için daha az uygun olacaktır. Yerleşik algılayıcılara push-button erişimi için API aracılığıyla veya kullanıcı tanımlı kontroller için API aracılığıyla Slither'ı çalıştırın.

Echidna, birkaç dakika çalışmaya ihtiyaç duyar ve sadece doğru pozitifler üretir. Echidna Solidity'de yazılmış, kullanıcı tarafından sağlanan güvenlik özelliklerini kontrol eder. Rastgele keşfe dayalı olduğu için hataları kaçırabilir.

Manticore "en büyük ağırlık" analizini uygular. Echidna gibi, Manticore da kullanıcı tarafından sağlanan özellikleri doğrular. Çalıştırmak için daha fazla zamana ihtiyacı olacak ancak bir özelliğin geçerliliğini kanıtlayabilir ve yanlış alarmları bildirmez.

Önerilen iş akışı

Şu anda hiçbir basit hatanın bulunmadığından veya daha sonra tanıtılacağından emin olmak için Slither'ın yerleşik algılayıcılarıyla başlayın. Kalıtım, değişken bağımlılıkları ve yapısal sorunlarla ilgili özellikleri kontrol etmek için Slither'ı kullanın. Kod tabanı büyüdükçe, durum makinesinin daha karmaşık özelliklerini test etmek için Echidna'yı kullanın. Geçersiz kılınan bir fonksiyona karşı koruma gibi, Solidity'de bulunmayan korumalar için özel kontroller geliştirmek için Slither'ı tekrar ziyaret edin. Son olarak, aritmetik işlemler gibi kritik güvenlik özelliklerinin hedefli doğrulamasını gerçekleştirmek için Manticore'u kullanın.

  • Slither'ın CLI'sını yaygın sorunları yakalamak için kullanın
  • Sözleşmenizin üst düzey güvenlik özelliklerini test etmek için Echidna'yı kullanın
  • Özel statik kontrolleri yazmak için Slither kullanın
  • Kritik güvenlik özelliklerinin derinlemesine güvencesini istediğinizde Manticore'u kullanın

Birim testleri üzerine bir not. Yüksek kaliteli yazılım oluşturmak için birim testleri gereklidir. Ancak, bu teknikler güvenlik açıklarını bulmak için en uygun teknikler değildir. Genellikle kodun olumlu davranışlarını test etmek için kullanılırlar (yani kod normal bağlamda beklendiği gibi çalışır), güvenlik kusurları ise geliştiricilerin dikkate almadığı uç durumlarda bulunma eğilimindedir. Düzinelerce akıllı sözleşme güvenlik incelemesini içeren çalışmamızda birim test kapsamı, müşterimizin kodunda bulduğumuz güvenlik açıklarının sayısı veya ciddiyeti üzerinde hiçbir etkiye sahip değildi(opens in a new tab).

Güvenlik Özelliklerinin Belirlenmesi

Kodunuzu etkili bir şekilde test etmek ve doğrulamak için dikkat edilmesi gereken alanları belirlemelisiniz. Güvenlik için harcanan kaynaklarınız sınırlı olduğundan, çabanızı optimize etmek için kod tabanınızın zayıf veya yüksek değerli kısımlarının kapsamını belirlemek önemlidir. Tehdit modelleme yardımcı olabilir. Şunları incelemeyi düşünün:

Bileşenler

Neyi kontrol etmek istediğinizi bilmek, doğru aracı seçmenize de yardımcı olacaktır.

Akıllı sözleşmelerle sıklıkla ilgili olan geniş alanlar şunları içerir:

  • Durum makinesi. Çoğu sözleşme bir durum makinesi olarak temsil edilebilir. (1) Hiçbir geçersiz duruma ulaşılıp ulaşılamayacağını, (2) durum, ulaşılabilir olduğu konusunda kesin olup olmadığını ve (3) herhangi bir durumun sözleşmeyi tuzağa düşürüp düşürmediğini kontrol edin.

    • Echidna ve Manticore, durum makinesi özelliklerini test etmek için tercih edilen araçlardır.
  • Erişim kontrolleri. Sisteminizde ayrıcalıklı kullanıcılar varsa (örn. sahip, denetleyiciler vb.), (1) her kullanıcının yalnızca yetkilendirilmiş eylemleri gerçekleştirebildiğinden ve (2) hiçbir kullanıcının daha ayrıcalıklı bir kullanıcının eylemlerini engelleyemediğinden emin olmalısınız.

    • Slither, Echidna ve Manticore, doğru erişim kontrollerini kontrol edebilir. Örneğin Slither, yalnızca beyaz listeye alınan fonksiyonlarda onlyOwner niteleyicisinin bulunmadığını kontrol edebilir. Echidna ve Manticore, yalnızca sözleşme belirli bir duruma ulaştığında verilen izin gibi daha karmaşık erişim kontrolü için kullanışlıdır.
  • Aritmetik işlemler. Aritmetik işlemlerin sağlamlığının kontrol edilmesi çok önemlidir. SafeMath'i her yerde kullanmak, taşmayı/yetersizlikleri önlemek için iyi bir adımdır ancak yine de yuvarlama sorunları ve sözleşmeyi tuzağa düşüren kusurlar dahil diğer aritmetik kusurları göz önünde bulundurmalısınız.

    • Manticore en iyi seçimdir. Aritmetik SMT çözücünün kapsamı dışındaysa Echidna kullanılabilir.
  • Kalıtım doğruluğu. Solidity sözleşmeleri ağırlıklı olarak çoklu kalıtıma dayalıdır. Bir super çağrısının eksik olduğu gölgeleme fonksiyonu ve yanlış yorumlanmış c3 doğrusallaştırma sırası gibi hatalar kolayca ortaya çıkarılabilir.

    • Slither, bu sorunların tespit edilmesini sağlayan araçtır.
  • Harici etkileşimler. Sözleşmeler birbirleriyle etkileşime girer ve bazı harici sözleşmelere güvenilmemelidir. Örneğin, sözleşmeniz harici kâhinlere dayalıysa, kullanılan kâhinlerin yarısının tehlikeye girmesi durumunda sözleşme güvende kalacak mı?

    • Manticore ve Echidna, sözleşmelerinizle harici etkileşimleri test etmek için en iyi seçimdir. Manticore, harici sözleşmeleri yoklamak için yerleşik bir mekanizmaya sahiptir.
  • Standart uyum. Ethereum standartı tasarımlarının (örn. ERC20) geçmişlerinde bir çok hata bulunur. Üzerine inşa ettiğiniz standardın sınırlamalarının farkında olun.

    • Slither, Echidna ve Manticore, belirli bir standarttan sapmaları tespit etmenize yardımcı olacaktır.

Araç seçimi kopya kağıdı

BileşenAraçlarÖrnekler
Durum makinesiEchidna, Manticore
Erişim kontrolüSlither, Echidna, ManticoreSlither 2. alıştırma(opens in a new tab), Echidna 2. alıştırma(opens in a new tab)
Aritmetik operasyonlarManticore, EchidnaEchidna 1. alıştırma(opens in a new tab), Manticore 1.-3. alıştırma(opens in a new tab)
Kalıtım doğruluğuSlitherSlither 1. alıştırma(opens in a new tab)
Harici etkileşimlerManticore, Echidna
Standart uyumSlither, Echidna, Manticoreslither-erc(opens in a new tab)

Hedeflerinize bağlı olarak diğer alanların kontrol edilmesi gerekecektir, ancak bu kaba taneli odak alanları, herhangi bir akıllı sözleşme sistemi için iyi bir başlangıçtır.

Herkese açık denetimlerimiz, doğrulanmış veya test edilmiş özelliklerin örneklerini içerir. Gerçek dünyadaki güvenlik özelliklerini incelemek için aşağıdaki raporların Automated Testing and Verification bölümlerini okuyun:

Son düzenleme: @kaanmetu(opens in a new tab), 23 Kasım 2023

Bu rehber yararlı oldu mu?