1. Anasayfa
  2. 100 Günde Solidity

🧵 100GündeSolidity 075 – Hacks : Kötü Amaçlı Kodu Harici Sözleşmeyle Gizleme

🧵 100GündeSolidity 075 – Hacks : Kötü Amaçlı Kodu Harici Sözleşmeyle Gizleme
Kötü Amaçlı Kodu Harici Sözleşmeyle Gizleme
0

Kötü Amaçlı Kodu Harici Sözleşmeyle Gizleme (Hiding Malicious Code with External Contract)

Merhaba, bu e-bültenin konusu “Harici Sözleşme ile Zararlı Kodların Gizlenmesi“. Solidity dilinde yazılan akıllı sözleşmelerde güvenlik oldukça önemlidir. Ancak saldırganlar, zararlı kodları akıllı sözleşmelerin içine yerleştirmek yerine, harici sözleşmelerde saklayarak tespit edilmesini engelleyebilirler. Bu e-bülten, bu konuda bilinmesi gerekenler ve korunma yöntemleri hakkında bilgi verecektir.

Harici Sözleşme ile Zararlı Kodların Gizlenmesi

Akıllı sözleşmeler, taraflar arasında güvenilir bir şekilde işlem yapılmasına olanak sağlayan kodlar dizisidir. Ancak, sözleşmeler içerisine yerleştirilmiş zararlı kodlar, sözleşmenin kullanımını tehlikeye atabilir. Saldırganlar, bu zararlı kodları harici sözleşmelerde saklayarak, ana sözleşmenin işlevselliğini etkilemeden gizleyebilirler.

Örneğin, saldırganlar bir ödeme sözleşmesi oluşturabilir ve içine zararlı bir fonksiyon ekleyebilirler. Ancak, bu fonksiyonu ana sözleşmeye yerleştirmek yerine, ayrı bir harici sözleşme olarak kaydedebilirler. Bu şekilde, ana sözleşme üzerinde yapılan denetimlerde zararlı kodların bulunma ihtimali azalır.

Harici sözleşmelerde saklanan zararlı kodlar, ana sözleşmeler üzerinde kontrolsüz erişime neden olabilir. Bu nedenle, geliştiricilerin harici sözleşmelerin güvenliği hakkında da dikkatli olmaları gerekmektedir.

Saldırganların Yöntemleri

Saldırganlar, harici sözleşmeleri kullanarak ana sözleşmeleri hedef alabilirler. Bazı saldırgan yöntemleri şunlardır:

  1. “Proxy” sözleşmeleri: Saldırganlar, ana sözleşmenin işlevlerini bir proxy sözleşmesine yönlendirebilirler. Bu sayede, saldırganlar ana sözleşmenin fonksiyonlarını manipüle edebilirler.
  2. “Saldırgan sözleşmeler”: Saldırganlar, ana sözleşmenin işlevlerine benzer bir görünüme sahip bir sözleşme oluşturarak, kullanıcıları bu sözleşmeyi kullanmaya yönlendirebilirler. Bu sayede, kullanıcılar zararlı kodlara maruz kalabilirler.
  3. “Depolama sözleşmeleri”: Saldırganlar, ana sözleşmenin içerisinde depolama alanı olarak kullanılan sözleşmelere zararlı kodlar yerleştirebilirler.
  4. “Oracle sözleşmeleri”: Saldırganlar, dış veri kaynaklarına erişim sağlamak için kullanılan sözleşmelerdeki zararlı kodlar aracılığıyla, ana sözleşmeyi hedef alabilirler.

Bu gibi saldırılardan korunmak için, geliştiricilerin harici sözleşmelerin güvenliği hakkında da dikkatli olmaları gerekmektedir. Ayrıca, ana sözleşmelerin içerisinde kullanılan harici sözleşmelerin güvenliğinin sağlanması da önemlidir.

Zararlı Kodların Tespit Edilmesi

Zararlı kodların tespiti, akıllı sözleşmelerin güvenliği açısından önemlidir. Ancak, zararlı kodların harici sözleşmelerde gizlenmesi, tespitini zorlaştırabilir. Bununla birlikte, bazı yöntemler kullanarak zararlı kodların tespit edilmesi mümkündür:

  1. Analiz araçları: Solidity dili için birçok analiz aracı mevcuttur. Bu araçlar, sözleşme kodunu analiz ederek, potansiyel güvenlik açıklarını ve zararlı kodları tespit edebilirler.
  2. Harici sözleşmelerin izlenmesi: Ana sözleşmelerin, kullanılan harici sözleşmelerin güvenliği hakkında bilgi sahibi olmaları gerekir. Bu sayede, harici sözleşmelerdeki zararlı kodlar da tespit edilebilir.
  3. Test ağları: Sözleşmelerin test edildiği ağlarda, zararlı kodların tespiti daha kolay olabilir. Test ağları üzerinde, sözleşmelerin davranışlarının izlenmesi ve zararlı kodların tespiti için test senaryoları oluşturulabilir.
  4. Güvenlik açığı raporları: Solidity dilinde yazılan sözleşmelerde keşfedilen güvenlik açıkları, birçok forum ve raporlama platformunda paylaşılmaktadır. Bu raporlar incelenerek, benzer zararlı kodların tespiti mümkündür.

Zararlı kodların tespiti, önemli bir konudur ve geliştiricilerin bu konuda dikkatli olmaları gerekmektedir.

Korunma Yöntemleri

Zararlı kodların kullanımıyla ilgili riskleri azaltmak için, Solidity dilinde yazılan akıllı sözleşmelerin geliştiricileri aşağıdaki yöntemleri kullanabilirler:

  1. Harici sözleşmelerin doğrulanması: Kullanılan harici sözleşmelerin doğrulanması, sözleşmelerin güvenliği açısından önemlidir. Harici sözleşmelerin kaynak kodu açık bir şekilde yayınlanmışsa, kaynak kodu incelenerek zararlı kodların tespiti mümkündür.
  2. Sözleşmelerin güvenliği açısından analiz edilmesi: Solidity dilinde yazılan sözleşmeler, birçok analiz aracıyla analiz edilebilir. Bu araçlar, sözleşmelerin güvenliği açısından potansiyel riskleri belirleyebilir ve güvenliği artırmak için önerilerde bulunabilirler.
  3. Saldırılara karşı savunma mekanizmaları: Sözleşmelerde kullanılan savunma mekanizmaları, sözleşmelerin güvenliği açısından önemlidir. Örneğin, “require” ifadesi ile belirli koşulların sağlanmadığı durumlarda işlemlerin durdurulması, sözleşmelerin güvenliğini artıran bir mekanizmadır.
  4. Sözleşmelerin test edilmesi: Sözleşmelerin test edilmesi, sözleşmelerin güvenliği açısından önemlidir. Test ağları üzerinde, sözleşmelerin davranışlarının izlenmesi ve potansiyel güvenlik açıklarının tespiti için test senaryoları oluşturulabilir.
  5. Doğru ve güvenli kodlama: Güvenli bir kodlama yaklaşımı benimsemek, sözleşmelerin güvenliği açısından önemlidir. Bu yaklaşım, güvenlik açıklarını en aza indirmek ve zararlı kodların kullanımını önlemek için etkili bir yöntemdir.

Yukarıdaki yöntemlerin kullanımı, Solidity dilinde yazılan sözleşmelerin güvenliği açısından önemlidir. Bu yöntemler, sözleşmelerin güvenliğini artırarak, saldırılara karşı daha dayanıklı hale getirirler.

Akıllı Sözleşme Örneği ANALİZİ

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

/*
Let's say Alice can see the code of Foo and Bar but not Mal.
It is obvious to Alice that Foo.callBar() executes the code inside Bar.log().
However Eve deploys Foo with the address of Mal, so that calling Foo.callBar()
will actually execute the code at Mal.
*/

/*
1. Eve deploys Mal
2. Eve deploys Foo with the address of Mal
3. Alice calls Foo.callBar() after reading the code and judging that it is
   safe to call.
4. Although Alice expected Bar.log() to be execute, Mal.log() was executed.
*/

contract Foo {
    Bar bar;

    constructor(address _bar) {
        bar = Bar(_bar);
    }

    function callBar() public {
        bar.log();
    }
}

contract Bar {
    event Log(string message);

    function log() public {
        emit Log("Bar was called");
    }
}

// This code is hidden in a separate file
contract Mal {
    event Log(string message);

    // function () external {
    //     emit Log("Mal was called");
    // }

    // Actually we can execute the same exploit even if this function does
    // not exist by using the fallback
    function log() public {
        emit Log("Mal was called");
    }
}

Bu örnek, bir saldırganın zararlı bir akıllı sözleşmeyi (Mal) bir diğer akıllı sözleşme içinde (Foo) gizleyerek, bir kullanıcının (Alice) zararlı kodu tetiklemesini amaçlamaktadır.

Foo ve Bar adında iki akıllı sözleşme yer almaktadır. Foo, Bar ile iletişim kurabilen bir sözleşmedir. Sözleşme Bar, “log” adında bir fonksiyona sahiptir ve bu fonksiyon “Bar was called” adlı bir mesaj yayınlar.

Saldırgan (Eve), Mal adlı bir sözleşme oluşturur ve onu Foo sözleşmesinde bar adresi olarak kullanır. Mal sözleşmesi, “log” adında bir fonksiyona sahiptir ve bu fonksiyon “Mal was called” adlı bir mesaj yayınlar.

Alice, Foo sözleşmesini çalıştırmak istediğinde, Bar sözleşmesinin kaynak kodunu inceleyerek, Foo sözleşmesinin güvenli olduğunu düşünür. Ancak, Foo sözleşmesi, bar adresi olarak Mal sözleşmesini kullanmaktadır. Dolayısıyla, Foo.callBar() işlevi çalıştırıldığında, aslında Mal.log() fonksiyonu çalıştırılmaktadır.

Bu örnekte, sözleşmelerin kaynak kodları açık bir şekilde yayınlanmıştır. Ancak, bir saldırganın, sözleşme adreslerini değiştirerek zararlı kodları gizlemesi mümkündür. Bu nedenle, akıllı sözleşmelerin geliştiricileri, güvenlik açığı risklerini en aza indirmek için yukarıda belirtilen yöntemleri kullanmalıdır.

Bar public bar;

constructor() public {
    bar = new Bar();
}

Bu örnek, bir akıllı sözleşmenin bir başka sözleşme ile iletişim kurarak onu çağırmasını ve kullanmasını göstermektedir.

İlk önce, Bar adlı bir akıllı sözleşme oluşturulur. Sonra, Bar sözleşmesinin örneği Foo adlı bir başka sözleşmede oluşturulur. Bu, Bar sözleşmesinin içeriklerine erişebilmenizi ve Bar işlevlerini Foo sözleşmesinde kullanabilmenizi sağlar.

Foo sözleşmesinin constructor fonksiyonunda, bar adlı bir Bar türünde değişken oluşturulur ve Bar sözleşmesinin bir örneği bu değişkene atanır. Bu, Bar sözleşmesindeki işlevlere erişim sağlar.

Böylece, Foo sözleşmesinin bar değişkeni, Bar sözleşmesinin işlevlerine erişebilir. Bu, Bar sözleşmesinin fonksiyonlarını kullanarak veri saklayabilir, işlem yapabilir veya diğer işlevleri çağırabilir.

Sonuç Bağlamı

Akıllı sözleşmelerin güvenliği, önemli bir konudur ve akıllı sözleşmelerin birbirleriyle etkileşimlerinin nasıl çalıştığı önemli bir husustur. Bu örnekte, kötü niyetli bir kişi (Eve) tarafından yapılan bir saldırı gösterilmiştir ve sözleşmelerin nasıl güvence altına alınabileceği hakkında bazı öneriler sunulmuştur.

Akıllı sözleşmelerin etkileşimleri, özellikle harici sözleşmelerin kullanımı durumunda, büyük bir dikkat gerektirir. Bu nedenle, sözleşme geliştiricileri, kodlarını dikkatle incelemeli ve harici sözleşmeleri kullanmadan önce, sözleşmelerin kodunu ve işlevlerini iyice anlamalıdır.

Kullanıcılar da, akıllı sözleşmeleri kullanmadan önce, sözleşmenin kodunu dikkatle incelemeli ve tüm işlevleri anlamalıdır. Ayrıca, kullanıcıların işlem yapmadan önce, işlemin gerçekleştirileceği sözleşmenin adresini doğrulamaları ve sözleşmenin güvenilirliğini kontrol etmeleri önerilir.

Sonuç olarak, akıllı sözleşmelerin güvenliği, sözleşme geliştiricileri ve kullanıcılar tarafından dikkatle ele alınmalıdır. Güvenlik konusunda bilinçli olunmalı ve her zaman en iyi uygulamaların izlenmesi gerekmektedir.

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!

solidity101 - Solidity, 2015 yılında Christian Reitwiessner liderliğinde piyasaya sürülen, büyük harf kullanımına göre ikinci en büyük kripto para piyasası olan Ethereum tarafından oluşturulan yepyeni bir programlama dilidir.

Yazarın Profili
İlginizi Çekebilir

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