Akıllı Kontratlarda Güvenlik
Uzun süredir aklımda olan ama hazırlamaya bir türlü fırsat bulamadığım akıllı kontrat güvenliği konusunda bir makale serisinin ilkini sonunda tamamlayabildim. Bu yazımda akıllı kontratların güvenliğinin önemi, kullanılan araçlar, Bu araçların nasıl kullanıldığı, ne kadar yeterli oldukları ve audit süreci için hazırlık gibi konuları ele alacağım. Inanın bana kullanılan yöntemler biraz ileri seviye de olsa çok havalı ve hoş :)
Akıllı kontratların güvenliği başlı başına apayrı bir süreç zaten. Oldukça titiz ve detaylı düşünülüp yapılması gerekiyor. Bu yüzden, akıllı kontrat geliştirmekten daha fazla zaman ve dikkat istiyor. Öncelikle bir çok audit ekibi var, audit ekiplerinin işi ise tamamen gelen projelerin tüm akıllı kontratlarını A’dan Z’ye taramak, testlerini yapmak ve tüm potansiyel açıkları, geliştirmeleri rapor etmek. Şu an da bir projeye bakıldığında ilk bakılan özelliklerinden biri de, yaygın olarak bilinen audit firmalarından en az birinin denetiminden geçmiş mi diye kontrol etmek. Aşağıya en çok bilinen audit firmalarını bırakıyorum.
Bu firmalara projenizi gönderiyorsunuz (belli bir fiyat karşılığında) ve size belli bir süre boyunca yaptıkları detaylı testler sonucunda rapor sunuyorlar. Eğer bir projenin güvenliğini merak ediyorsanız, onun audit raporuna mutlaka bakın. Çoğu proje audit raporunu veya raporlarını güven sağlamak için paylaşır zaten.
Buraya kadar audit sürecinin ne olduğundan kısaca bahsettik. Şimdi projenizi audit firmasına göndermeden önce veya göndermek yerine kendiniz nasıl test edebilirsiniz ondan bahsedelim. Öncelikle bu alanda topluluğun yararı için içerik hazırlamış ve kullanmış çok güzel bir site var. Defi Safety adından bu site de defi alanında görüp görebileceğiniz hemen hemen bütün projeleri denetlemişler ve bunları belli kriterlere göre puanlayıp sıralamışlar. Puanlamaların ne kadar doğru ne kadar yanlış olduğunun garantisini veremem, zaten amacım projelerin puanlarına bakıp ona göre değerlendirin demek değil. Asıl göstermek istediğim kısım şurası;
Puanlama kısmına bakmaya gerek yok, sadece bir proje incelenirken hangi kriterler dikkate alınıyor bunu görmenizi istedim. Bu kriterlerin her biri proje geliştirilirken ele alınmalı ve en sonunda audit’e gönderilmeli proje. Yani projenizi audit’e göndermeden önce projenin dökümantasyonundan tutun kontratların yazım şekline kadar özen göstermelisiniz. Bir proje yukarıda ki hemen hemen bütün kriterleri ortalama sağlıyor ve audit raporları paylaşılmışsa, o projenin rug-pull(scam olma) yapma ihtimali oldukça düşük olacaktır. Bütün bunlara rağmen kontratlar da güvenlik açığı çıkabilir (günümüzde örneklerini görmeye devam ediyoruz.) ama bu herkesin alması gereken bir risk zaten.
Yukarıda ki her bir maddeyi tek tek anlatmayacağım bu makale de fakat isteyenler yukarda bıraktığım linkten girip herbirini inceleyebilirler. Artık güvenlik araçlarına sırayla bakmaya başlayalım. Bunlardan başka araçlar da olabilir fakat paylaşacaklarım hem kendi kullandığım hem de en yaygın olanlar.
1. SLITHER
Slither, statik solidity analiz framework’üdür. Python’da yazılmış ve içerisinde tam 74 tane dedektör bulunuyor. Bu dedektörler potansiyel akıllı kontrat açıklarını tespit etmek için oluşturulmuş scriptlerdir. Slither sizin akıllı kontratınızı bu dedektörler aracılığıyla tarıyor ve herhangi bir açık tespit ederse raporluyor. Fakat bu dedektörler yeterli değil, sadece kontratınızda yaygın güvenlik açıklarının olmadığına emin olmak için slither ile taratmak ekstra güven sağlar.
Ayrıca eğer python bilginiz ve akıllı kontrat güvenliğinden anlıyorsanız, kendi dedektörlerinizi de yazmanıza olanak sağlıyor. Çalıştırması oldukça basit, verdiğim github linkinde nasıl çalıştılabileceğiniz ve sonuçları bastıracağınız anlatılmış. Bu araçların kullanım örneklerini bir diğer makaleye bırakmak istiyorum çünkü çok uzayabilir.
2. ECHIDNA
Öncelikle Echidna çalıştırabilmeniz için bilgisayarınızda
Slither
kurulu olmalı.
Echidna daha komplike bir araçtır ve ben dahil çoğu kişinin ilk defa duyacağı üzere Haskell adından bir dil ile yazılmıştır. Daha anlamlı bir tanım olarak ise echidna, akıllı kontratlar da fuzzing testing
yapmaya olanak sağlayan bir araçtır. Çoğunuz fuzzing
kavramını ilk defa duyuyor olabilir. Fuzzing testing, programa geçersiz, beklenmeyen ve rastgele inputlar vererek sonuçların beklenenden farklı olup olmadığını test etmeye yarayan otomatik yazılım test tekniğidir. Daha akılda canlanması için bir akıllı kontrat fonksiyonuna çok büyük veya çok küçük input değerler vermek şeklinde bir use case düşünebilirsiniz.
Echidna çalıştırması ve test etmesi çok daha zor bir araçtır çünkü bütün testleri elle yazmanız gerekmektedir. Nasıl yazılacağı github da güzelce anlatılmış, echidna testlerini de projenize dahil etmek güvenliği büyük ölçüde arttıracaktır. Echidna ile kontratınızın istediğiniz fonksiyonu veya bölümü için test yazabilir ve bu testlerin sonucunda o fonksiyonun her durumda beklenen şekilde çalışacağından emin olabilirsiniz. Testler solidity ile yazılıyor ve şu komut ile echidna-test myContract.sol
yazdığınız testi kontratınız üzerinde çalıştırabilirsiniz.
3. MANTICORE
Son olarak ise Manticore aracını ele alalım. Manticore diğerlerine kıyasla implement etmesi ve kullanması daha zor olan bir araçtır. Manticore tanım olarak, akıllı kontrat analizi için simgesel uygulama aracı olarak geçmektedir. Bilmemiz gereken en önemli özelliği, kontratlar üzerinde sembolik inputlar kullanarak, o kontratın gelebileceği bütün durumları ayrıntılı olarak inceleyip raporlamasıdır. Bu gerçekten çok zor ve zaman alan bir denetim, bu yüzden de manticore’un taraması 24 saatten fazla alabiliyor. Kontratların kompleksliğine göre değişmekle beraber taramanın tamamlanması çok uzun süreler alabiliyor (1 hafta süren tarama duymuştum :)).
Manticore da python ile geliştirildi ve echidna gibi size kendi testlerinizi yazmanıza da olanak sağlıyor. Testlerinizi python ile yazmanız gerekmektedir. Ayrıca manticore ile vyper
diliyle yazılmış kontratları da test etmeniz mümkün. Şu komut ile kontrat taramasını basitçe başlatabiliyorsunuz → manticore myContract.sol
Bu araçları docker aracılığıyla da çalıştırmanız mümkün, hepsinin hem CLI
hem de docker
seçenekleri mevcut. Bu araçların kullanım örneğine bu makale de girmek istemedim çünkü örnek bir akıllı kontrat kullanarak testler vs. yazmamız gerekecek, o yüzden bunu diğer makaleye bırakmak daha iyi olacaktır. Ama kendiniz isterseniz bir akıllı kontratı alıp slither, echidna veya manticore ile test edebilirsiniz. Dökümanları biraz eksik ve ağır da olsa anlaşılamayacak gibi değil.
Bir proje geliştirirken kontratlarınızın unit testlerinin yanında bu araçlarla da test etmenizi, taramanızı ve sonuçlarını repo içerisinde paylaşmanızı tavsiye ederim. Hatta çoğu proje bu araçları CI/CD
süreçlerine implement ediyorlar. CI/CD
sürecini github actions olarak tanımlayabilirim. Örnek vermek gerekirse, repo her Pull Request
aldığında otomatik olarak slither
taraması, echidna
ve manticore
ile yazılmış testlerin çalıştırılması gibi işlemlerin otomatik yerine getirilmesi ve PR’ın bu testlerden geçtiği takdirde merge
işlemine hazır olması sağlanıyor.
Daha somut olarak, bir akıllı kontratımızın olduğunu varsayalım. Bu kontrata bir özellik eklenecek. Kontratımıza bu özelliği ekleyerek geliştirmesini yaptık ve şimdi ana projeye merge
etmek için PR açıyoruz. PR açtığımız anda slither
eklediğimiz özellikle beraber kontratımızı baştan aşağı tarıyor ve eklenen özelliğin bir açığa sebebiyet verip vermediğini kontrol ediyor. Eğer bir açık bulamazsa PR’ın merge
için hazır olduğuna yeşil ışık yakıyor. Bu sadece bir use case, bu şekilde araçları farklı durumlar için kullanabilirsiniz.
Evet 3 farklı güvenlik aracını da anlatmaya çalıştım. Akıllı kontratlarda güvenlik gerçekten çok teknik bir konu ve bunu basit bir dille anlatmak oldukça zor. Bu araçlar da çok komplike şeyler ve anlaması başta çok zor gelebiliyor. Elimden geldiğince anlaşılır anlatmaya çalıştım ama yine anlatamamış olabilirim. Tavsiyem bunların dökümanlarını incelemek, defiSafety
yazılarını okumak ve bu araçları test etmeye çalışmaktır.
Başka bir makale de bunları tek tek test etmeyi göstermeye çalışacağım. Son olarak demek istediğim ise göreceğiniz üzere bir akıllı kontratı yazmak aslında işin çok ufak bir kısmı, bu kontrat için testler yazmak, denetimini yapmak sürecin büyük bölümünü kaplıyor.
Bir sonraki makalede görüşmek üzere…
Murat ÇELİKTEPE
LinkedIn → celiktepemurat
Twitter → muratctp