1. Anasayfa
  2. Akıllı Sözleşme

Solidity Akıllı Sözleşmelerini Hacklemek

Bugün Solidity programlama dili kullanılarak yazılmış akıllı sözleşmeleri hacklemeye bakacağız. PWNX Academy'de taşma/taşma güvenlik açığını düzelteceğiz

Solidity Akıllı Sözleşmelerini Hacklemek
Solidity Akıllı Sözleşmelerini Hacklemek
0

Solidity Akıllı Sözleşmelerini Hacklemek

Web3 ideolojisinin merkezinde, merkezileşme sorunlarını iyileştirme ve çözme arzusu vardır. İnsanlara gücü geri vermeyi ve kullanıcıların verilerini ve kimliklerini kontrol etmelerini sağlamayı amaçlar. Ancak, herhangi bir teknolojide olduğu gibi, güvenlik hassas bir konudur. 

Bugün Solidity programlama dili kullanılarak yazılmış akıllı sözleşmeleri hackleme modeline bakacağız. PWNX Academy’de taşma/düşme güvenlik açığını gidereceğiz . PWNX, öğrenme ve eğitim amaçlı bilgisayar sistemlerine ve uygulamalarına saldırı ve savunma saldırı tekniklerini deneyebileceğiniz tamamen kontrollü bir ortamda (sandbox) orijinal CTF (Bayrağı Yakala) laboratuvarları sunar.

Laboratuvar Mimarisi

Önce laboratuvarı inceleyelim. VPN kullanarak, PWNX’in dahili ağına bağlanıyoruz, burada bir sunucu Ganache aracılığıyla yerel bir blok zinciri ortaya çıkarıyor.

Ganache, hızla gelişen dağıtılmış Ethereum ve farklı blok zincirleri için kişisel bir blok zinciridir. Merkezi olmayan uygulamalarınızı (dApp’ler) güvenli ve belirleyici bir ortamda geliştirmek, dağıtmak ve test etmek için geliştirme yaşam döngüsü boyunca Ganache kullanabilirsiniz.

PWNX Lab Mimarisi

Kaynak Kodunu Analiz Edin

Dahili ağa bağlanıp laboratuvara girdiğimizde, hemen bazı heyecan verici veriler ve kodlar fark edeceğiz. Sol tarafta, sözleşmenin mantığını anlatan Solidity ile yazılmış akıllı sözleşme kodunu görüyoruz. Sağ tarafta, ABI olarak adlandırılan şeyi biliyoruz.

Uygulama İkili Arayüzü (ABI), blok zinciri dışındaki Ethereum ekosistemindeki sözleşmelerle ve sözleşmeden sözleşmeye etkileşim için standart bir yoldur.

Okuma Önerisi : Solidity Eğitimi: ABI hakkında her şey

Solidity Eğitimi

Bu Challenge, aşağıdaki akıllı sözleşmeyi talep etmeyi ve sahibi olmayı amaçlamaktadır.

Ayrıca buna sahibiz:

  • Cüzdan adresi
  • İşlemleri imzalamak için özel anahtar
  • Akıllı sözleşmelerin adresi

İlk adım olarak akıllı sözleşme kodunu yerel olarak analiz ederek başlıyoruz. Sözleşmeyi yerel sistemimizde derlememizi ve test etmemizi sağlayan REMIX IDE‘yi kullanabiliriz.

Remix IDE
Remix IDE

Her akıllı sözleşme, kodu yürütecek derleyici sürümünü belirten pragma yönergesiyle başlar.

Yapıcı işlevi, akıllı sözleşmeler blok zincirinde dağıtıldığında yürütülür ve sözleşmeye dağıtılan adres, sözleşme sahibi olur (sahiplik eylemi).

  • Adres türünde olan ve yapıcı çağrıldığında belirtilen, sahibi adında özel bir değişken vardır.
  • Sözleşmede, bakiyeler adı verilen bir haritalama vardır. Solidity‘de eşleme bir tür HaspMap veya sözlüktür .
  • Senaryomuzda, bu eşleme, her bir adresin ne kadar ether/token’a sahip olduğunu belirten bir adres “veritabanı”nı temsil eder.
  • GetBalance ve getOwner adlı iki küçük fonksiyonumuz var. Bu iki işlev halka açıktır, yani blok zincirinin durumunu değiştirmezler; getBalance, kullanıcının eşleme veri yapısında sahip olduğu eter/token miktarını döndürerek yalnızca ondan veri döndürürler. Bunu Solidity‘de yapmak için msg.sender‘ı kullanabiliriz.
  • msg, solidity kodunuzdaki global bir değişkendir ve işlemi temsil eder. msg nesnesinin gönderici değeri, akıllı sözleşmeyi dağıtan işlemin gerçek göndericisidir.
  • getOwner işlevi, yapıcıda bildirilen _owner parametrelerini döndürür, bu nedenle akıllı sözleşmenin sahip adresini döndürür.

Güvenlik Açığı’nı Anlamak:

Aşağıdaki kod parçacığında, bir adresin akıllı sözleşmeye para aktarmasına izin veren transfer adlı bir işlev görebiliriz:

İşlev aktarımı, bir boole değeri döndüren bir genel işlev olan uint ( işaretsiz tamsayı değeri ) gerektirir.

16. satırda, gerekli ifadeye sahibiz. request, true veya false olan iki boole değeri döndürür. Belirtilen gereksinim gerçek bir değer döndürürse, kod buna göre akabilir ve işlev görebilir. Döndürülen değer false ise bir hata oluşur ve kod o noktada durur.

Koşul, akıllı sözleşmeye bir miktar aktarmak isteyen adresin 20’den büyük veya ona eşit ve 100’den küçük veya ona eşit olmasını gerektirir.

24. satırda, sahibin adresinin hesap bakiyesinin (işlemi gerçekleştiren) msg.sender’ın hesap bakiyesinden az olup olmadığını kontrol eden ikinci bir if ifademiz var, böylece akıllı sözleşmenin sahipliğini talep etmek mümkündür. .

if ifadesi (satır 18), msg.sender bakiyesinin olup olmadığını kontrol eder, bu, işlemi yapan adresin eşleme veri yapısı içindeki bakiyenin 0’a eşit olması durumunda, aktarılması gereken tutarı toplayacağı ve 20 çıkar. Aksi takdirde, transfer fonksiyonuna girilen tutarı düşecek ve ona 20 ekleyecektir.

Bu, akıllı sözleşmelerdeki Taşma/Düşük Akış Güvenlik Açığının klasik bir örneğidir.

Okuma Önerisi : Solidity Akıllı Sözleşme Güvenliği

Solidity Eğitimi

Akıllı sözleşmelerin en yaygın güvenlik tuzaklarından biri birim taşması/taşması. Taşma/taşma sorunu, kripto sahibinin hesabı için feci bir kayba neden olabilir ve kripto korsanını zahmetsizce zengin edebilir.

uint sarma olarak da bilinen birim taşması/düşük akışı, bir N-bitlik tamsayı için yukarıdaki maksimumdan daha büyük bir sonuç üreten veya bir N-bitlik için aşağıdaki minimumdan daha küçük bir sonuç üreten bir aritmetik işlemdir.

Bu, Underflow’un klasik bir örneğidir. 0 olan bir birimden 2 çıkarırsanız, değeri 2**256 -2 olarak değiştirir.

Taşma ile alt taşma durumunun tam tersini yaşıyoruz. 2**256 -1 olan bir uint’ten +3 eklemek taşma durumuna neden olur çünkü uint taşması, uint max’tan daha büyük bir sayı olduğunda gerçekleşir ve bu da sayının 0’a geri dönmesiyle sonuçlanır.

Artık bu zorlukla başa çıkmak için gereken tüm bilgiye sahip olduğumuza göre, sözleşmeden yararlanalım.

Yerel Sömürü

Başlamak için önce akıllı sözleşmeyi derleyeceğiz ve konuşlandıracağız. Akıllı sözleşmeyi dağıtmak için, sahip olacak bir adrese ihtiyacımız var (REMIX adreslerini kullanıyoruz) ve denge eşlemesine girecek bir değer girmemiz gerekiyor.

Devreye alındıktan sonra, mevcut tüm işlevleri gösteren sözleşme altta görünecektir. Durum değiştirmeyen fonksiyonların mavi renkle, transfer fonksiyonlarının ise turuncu renkle gösterildiğini görüyoruz.

İlk çağrı olarak, sahibinin bakiyesini kontrol etmek için getBalance işlevini çağırabiliriz. 

Şimdi hesabı değiştirin ve farklı bir adres alın (yine Remix’ten), akıllı sözleşmeye miktar olarak 21 göndermek için transfer işlevini çağırmaya gidiyoruz. Konsolda işlemin başarılı olduğunu ve getbalance fonksiyonunu çağırarak 1 elde ettiğimizi görebiliriz.

Bunun nedeni, sözleşmenin ilk ifadede (satır 18) yer almasıdır. Adres ilk kez bir miktar transfer ettiğinde, mevcut bakiyesi sıfırdır, yani 1 alırız.

Şimdi tek yapmamız gereken işlemi tekrarlamak. Transfer fonksiyonunu tekrar çağırarak, mapping içindeki bakiyemiz sıfır olmayacaktır. Sözleşme, kodu ikinci if ifadesinde çalıştırarak matematiksel taşmaya neden olur. 

İkinci if ifadesinde, bu sefer msg.sender‘ın adres bakiyesi, sahibinin bakiyesinden daha fazla olacak ve akıllı sözleşmedeki güvenlik açığından yararlanmamıza ve mülkiyeti talep etmemize izin verecek.

Artık güvenlik açığını anladığımıza göre, PWNX mücadelesine dönebilir ve laboratuvarı tamamlayabiliriz.

Bizim dışımızdaki bir blockchain ile iletişim kurmamız gerektiğinden, yerel sistemimizde az önce test ettiğimiz şeyi yapabilen bir komut dosyası oluşturmalıyız.

Uzaktan Sömürüye Başlarken

Web3.py, Ethereum ile etkileşim için bir Python kütüphanesidir. İşlemlerin gönderilmesine, akıllı sözleşmelerle etkileşimde bulunulmasına, blok verilerinin okunmasına ve diğer çeşitli kullanım durumlarına yardımcı olmak için genellikle merkezi olmayan uygulamalarda (dapp’ler) bulunur.

İlgili fonksiyonları çağırarak ABI üzerinden akıllı sözleşmelerle iletişim kurabiliyoruz.

Python betiğini inceleyelim:

  • Bir HTTP URL’miz var; bu, akıllı sözleşme ile RPC çağrıları aracılığıyla iletişim kurmamızı sağlayan ganache sağlayıcısıdır.
  • Buradan, ihtiyacımız olan fonksiyonları çağırabilmemiz için ABI’mızı içe aktarıyoruz.
  • Akıllı sözleşme adresini tanımlıyoruz ve web3.eth.contract komutu ile bağlanıyoruz.
  • Buradan getOwner gibi fonksiyonları çağırabiliriz. Durumu değiştirmeyen çağrıların, blok zincirinin durumunu değiştirmeden değerleri okumaya gittikleri için tam olarak çağrı olarak adlandırıldığını not ediyoruz.

Komut dosyasını çalıştırdıktan sonra konsolda sözleşmenin, bakiyenin ve nonce’nin sahibinin kim olduğunu görebiliriz.

Nonce, yapılan işlemlerin bildirimini tutan basit bir sayaçtır, bu durumda, sözleşme yalnızca dağıtıldığı için.

Şimdi istismarımızı değiştireceğiz ve transfer işlevini çağıran, alt akışa neden olan işlemi oluşturmaya gideceğiz.

Bu sefer blok zincirinin durumunu değiştirecek işlemi oluşturmak için buildTransaction yöntemini kullanıyoruz.

Görüldüğü gibi işlemi oluşturduktan sonra challange tarafından verilen private key ile imzalıyoruz ve rawTransaction fonksiyonu ile çalıştırıyoruz.

 Son olarak, reçeteyi alıyoruz .

Komut dosyasını çalıştırdıktan sonra işlem hash ve diğer verileri döndürerek işlemin başarılı olduğunu görebiliriz. Blok zincirinin durumunu değiştirdikten ve güvenlik açığından yararlandıktan sonra, hadi doğrulayalım.

Gördüğümüz gibi adresin sahibi farklıydı. Kodu çalıştırdıktan sonra artık adresimiz sözleşmenin sahibi oluyor, bayrağı teslim alıyoruz.

İlginizi Çekebilir

Zero To Hero : Web3.0 ve Solidity Geliştirme Yol Haritası 2023

Solidity Programlama Dili Öğrenme yolculuğunuz hakkında daha iyi rehberlik almak için Solidity nedir? Ethereum Akıllı Sözleşmelerinin Dili Rehberi içeriğimize göz atın. Dilerseniz Yeni Başlayanlar için Solidity – Akıllı Sözleşme Geliştirme Hızlandırılmış Kursuna katılın.

Çalışmaya nereden başlayacağım diyenler için Blockchain ​​Developer Olmak İçin Yol Haritası içeriğine de muhakkak bakın.

Gelin aklınızdaki soruları SUPERPEER sohbetinde cevaplayalım.

Bu makaleyi okuduğunuz için teşekkürler! Bana destek olmak isterseniz;

Beni TwitterLinkedin ve YouTube‘da takip edin.

Kısa bir yorum bırakmayı UNUTMAYIN!

Hasan YILDIZ, Girişimci. Doktora Öğrencisi. Yazmayan YAZILIMCI. Veri Şeysi. Eğitmen...

Yazarın Profili

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir