Ana içeriğe geç

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

solidity
akıllı kontratlar
güvenlik
Orta düzey
Trailofbits
7 Eylül 2020
5 dakikalık okuma

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

  • Slither ile statik analiz. Programın tüm yolları, farklı program gösterimleri (örn. kontrol akış grafiği) aracılığıyla aynı anda tahmin edilir ve analiz edilir.
  • Echidna ile Bulandırma. Kod, sahte rastgele işlem üretimi 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, üzerinde kısıtlamaların kontrol edilebildiği matematiksel bir formüle çeviren resmi bir doğrulama tekniğidir.

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

TeknikAraçKullanımHızGözden kaçan hatalarYanlış Alarmlar
Statik AnalizSlitherCLI ve komut dosyalarısaniyelerOrtaDüşü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 tek tuşla erişim için API aracılığıyla veya kullanıcı tanımlı kontroller için API aracılığıyla Slither'ı çalıştırın.

Echidna'nın birkaç dakika çalışması gerekir ve yalnızca doğru pozitifler üretecektir. Echidna, Solidity dilinde yazılmış, kullanıcı tarafından sağlanan güvenlik özelliklerini kontrol eder. Rastgele keşfe dayalı olduğu için hataları gözden kaçırabilir.

Manticore "en ağır" analizi gerçekleştirir. Echidna gibi, Manticore da kullanıcı tarafından sağlanan özellikleri doğrular. Çalışması daha fazla zaman alacaktır, ancak bir özelliğin geçerliliğini kanıtlayabilir ve yanlış alarmlar bildirmez.

Önerilen iş akışı

Mevcut veya gelecekte eklenebilecek basit hataların olmadığı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. Bir fonksiyonun geçersiz kılınmasına karşı koruma gibi Solidity'de mevcut olmayan korumalar için özel denetimler geliştirmek üzere Slither'a geri dönün. Son olarak, aritmetik işlemler gibi kritik güvenlik özelliklerinin hedeflenmiş doğrulamasını gerçekleştirmek için Manticore'u kullanın.

  • Sık karşılaşılan sorunları yakalamak için Slither'ın CLI'ını kullanın
  • Sözleşmenizin üst düzey güvenlik özelliklerini test etmek için Echidna'yı kullanın
  • Özel statik denetimler 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 kusurlarını bulmak için en uygun olanlar değildir. Bunlar genellikle kodun pozitif davranışlarını test etmek için kullanılır (yani kod normal bağlamda beklendiği gibi çalışır), güvenlik kusurları ise geliştiricilerin dikkate almadığı uç durumlarda bulunma eğilimindedir. Onlarca akıllı sözleşme güvenlik incelemesi üzerine yaptığımız çalışmada, müşterimizin kodunda bulduğumuz güvenlik kusurlarının sayısı veya ciddiyeti üzerinde birim testi kapsamının hiçbir etkisi olmamıştır (opens in a new tab).

Güvenlik Özelliklerini Belirleme

Kodunuzu etkili bir şekilde test etmek ve doğrulamak için dikkat gerektiren alanları belirlemeniz gerekir. Güvenliğe ayırdığınız kaynaklar sınırlı olduğundan, çabanızı en iyi duruma getirmek için kod tabanınızın zayıf veya değerli kısımlarını belirlemek önemlidir. Tehdit modellemesi yardımcı olabilir. Şunları gözden geçirmeyi düşünün:

Bileşenler

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

Akıllı sözleşmeler için sıklıkla geçerli olan geniş alanlar şunları içerir:

  • Durum makinesi. Çoğu sözleşme bir durum makinesi olarak temsil edilebilir. Şunları kontrol etmeyi düşünün: (1) Hiçbir geçersiz duruma ulaşılamayacağı, (2) geçerli bir duruma ulaşılabileceği ve (3) hiçbir durumun sözleşmeyi tuzağa düşürmediği.

    • Echidna ve Manticore, durum makinesi belirtimlerini test etmek için tercih edilecek araçlardır.
  • Erişim denetimleri. Sisteminizde ayrıcalıklı kullanıcılar (ör. bir sahip, denetleyiciler, ...) varsa her kullanıcının yalnızca izin verilen 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, erişim denetimlerinin doğruluğunu kontrol edebilir. Örneğin Slither, yalnızca beyaz listeye alınmış işlevlerde onlyOwner niteleyicisinin eksik olduğunu kontrol edebilir. Echidna ve Manticore, yalnızca sözleşme belirli bir duruma ulaştığında verilen bir izin gibi daha karmaşık erişim denetimleri için kullanışlıdır.
  • Aritmetik işlemler. Aritmetik işlemlerin sağlamlığını kontrol etmek kritik öneme sahiptir. Her yerde SafeMath kullanmak, taşma/alt taşmayı önlemek için iyi bir adımdır ancak yuvarlama sorunları ve sözleşmeyi tuzağa düşüren kusurlar da dahil olmak üzere diğer aritmetik kusurları yine de göz önünde bulundurmalısınız.

    • Burada en iyi seçim Manticore'dur. Aritmetik, SMT çözücünün kapsamı dışındaysa Echidna kullanılabilir.
  • Kalıtım doğruluğu. Solidity sözleşmeleri büyük ölçüde çoklu kalıtıma dayanır. super çağrısı eksik olan bir gölgeleme işlevi ve yanlış yorumlanmış C3 doğrusallaştırma sırası gibi hatalar kolayca yapı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 dayanıyorsa, mevcut kâhinlerin yarısı tehlikeye atıldığında güvende kalır mı?

    • Manticore ve Echidna, sözleşmelerinizle olan harici etkileşimleri test etmek için en iyi seçimdir. Manticore, harici sözleşmeleri taklit etmek için yerleşik bir mekanizmaya sahiptir.
  • Standartlara uygunluk. Ethereum standartlarının (ör. ERC20) tasarımlarında geçmişten gelen kusurlar vardır. Üzerine inşa ettiğiniz standardın sınırlılıklarının farkında olun.

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

Araç seçim rehberi

BileşenAraçlarÖrnekler
Durum makinesiEchidna, Manticore
Erişim denetimiSlither, Echidna, ManticoreSlither alıştırma 2 (opens in a new tab), Echidna alıştırma 2 (opens in a new tab)
Aritmetik işlemlerManticore, EchidnaEchidna alıştırma 1 (opens in a new tab), Manticore alıştırmaları 1 - 3 (opens in a new tab)
Kalıtım doğruluğuSlitherSlither alıştırma 1 (opens in a new tab)
Harici etkileşimlerManticore, Echidna
Standartlara uygunlukSlither, Echidna, Manticoreslither-erc (opens in a new tab)

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

Halka açık denetimlerimiz, doğrulanmış veya test edilmiş özelliklerin örneklerini içerir. Gerçek dünyadaki güvenlik özelliklerini gözden geçirmek için aşağıdaki raporların Otomatik Test ve Doğrulama bölümlerini okumayı düşünün:

Sayfanın son güncellenmesi: 22 Ekim 2025

Bu rehber yararlı oldu mu?