1. Anasayfa
  2. 100 Günde Solidity

🧵 100GündeSolidity 073 : Denial of Service (Hizmet Reddi)

🧵 100GündeSolidity 073 : Denial of Service (Hizmet Reddi)
Hizmet Reddi
0

Hizmet Reddi

Merhaba,

Bu e-bülten, Solidity öğrenenler için önemli bir konu olan “Denial of Service” (Hizmet Reddi) saldırılarını ele almaktadır. Hizmet reddi saldırıları, bir sistem veya hizmetin normal işleyişini engelleyerek kullanılabilirliğini azaltan veya tamamen durduran bir tür siber saldırıdır. Solidity smart contract’ları da bu tür saldırılara maruz kalabilir ve bu nedenle, bu bülten, smart contract geliştiricilerinin bu saldırılardan korunmalarına yardımcı olacak bilgiler sunacaktır.

İyi okumalar!

Hizmet Reddi Nedir?

Hizmet Reddi (DoS – Denial of Service), bir sistem veya hizmetin meşru kullanıcılarına hizmet verememesine neden olan bir siber saldırı türüdür. Bu saldırı türünde, saldırganlar, hedef sistem veya hizmete aşırı yük bindirerek normal işleyişini engelleyebilir veya tamamen durdurabilirler.

DoS saldırıları, aynı zamanda Distributed Denial of Service (DDoS) olarak da adlandırılabilir. Bu tür saldırılarda, saldırganlar, çok sayıda cihazı ele geçirerek hedefe saldırı gerçekleştirirler. Bu cihazlar, genellikle botnet olarak adlandırılan bir ağ oluştururlar ve saldırıyı gerçekleştirmek için kontrol edilirler.

DoS saldırıları, birçok farklı şekilde gerçekleştirilebilir. Örneğin, saldırganlar, ağ trafiğini artırarak, hedef sistem veya hizmetin kullanılabilirliğini azaltabilirler. Ayrıca, saldırganlar, hedef sistemi doğrudan saldırarak, sistemi çökertebilirler veya işlevsiz hale getirebilirler.

Smart Contract’ların Hizmet Reddi Saldırılarına Karşı Hassasiyeti

Smart contract’lar, blok zincirinde çalışan kodlardır ve açık kaynak kodlu olduklarından herkes tarafından görüntülenebilirler. Bu nedenle, smart contract’lar da diğer yazılım sistemleri gibi hizmet reddi saldırılarına karşı hassastırlar.

Smart contract’ların hizmet reddi saldırılarına karşı hassasiyeti, aşağıdaki nedenlerden dolayı artar:

  1. Akıllı sözleşmeler genellikle kendi kendini yönetir: Akıllı sözleşmeler, blok zincirinde otomatik olarak çalışır ve insan müdahalesine ihtiyaç duymaz. Bu nedenle, bir hizmet reddi saldırısı durumunda, akıllı sözleşme sistemi kendini koruyamaz ve hedef olabilir.
  2. Blok zinciri kaynakları sınırlıdır: Akıllı sözleşmeler, blok zincirinde çalıştığından, blok zinciri kaynakları sınırlıdır. Bu nedenle, hizmet reddi saldırılarına maruz kalan bir akıllı sözleşme sistemi, blok zincirinin diğer işlemlerini de etkileyebilir ve blok zincirinin genel performansını düşürebilir.
  3. Akıllı sözleşmeler geri alınamazdır: Blok zincirindeki işlemler geri alınamazdır. Bu nedenle, bir hizmet reddi saldırısı durumunda, zarar geri alınamaz ve kaynaklar kaybedilir.

Bu nedenlerden dolayı, smart contract geliştiricilerinin, hizmet reddi saldırılarına karşı koruma sağlamak için ek önlemler alması gereklidir.

Hizmet Reddi Saldırılarına Karşı Korunma Yöntemleri

Hizmet reddi saldırılarına karşı korunmak için smart contract geliştiricileri aşağıdaki önlemleri alabilirler:

  1. İşlem sürelerini sınırlama: Smart contract’lar, işlem sürelerini sınırlama özelliğiyle donatılabilir. Bu, bir işlem belirli bir süre içinde tamamlanmazsa, işlemin otomatik olarak iptal edilmesini sağlar. Bu önlem, akıllı sözleşmelerin, aşırı yüklenme veya yanıt verememe gibi hizmet reddi saldırılarına karşı daha dirençli hale getirilmesine yardımcı olabilir.
  2. Doğru giriş doğrulaması: Smart contract’lar, kullanıcıların kimliklerini doğrulamalarını gerektirebilir. Bu önlem, saldırganların sahte hesaplar veya kimliklerle akıllı sözleşmelere erişmesini engeller.
  3. Veri doğrulaması: Smart contract’lar, girdi verilerinin doğruluğunu kontrol edebilir. Bu önlem, saldırganların akıllı sözleşmeleri yanıltan sahte verilerle saldırmasını engeller.
  4. Akıllı sözleşmelerin doğru şekilde yazılması: Akıllı sözleşmeler, doğru şekilde yazılmadığı takdirde hizmet reddi saldırılarına daha duyarlı hale gelebilirler. Smart contract geliştiricileri, akıllı sözleşmeleri doğru şekilde kodlamalı ve güvenlik açıklarını önlemek için test etmelidirler.
  5. Akıllı sözleşmelerin izlenmesi: Smart contract’lar, blok zincirinde çalıştığından, takip edilmeleri zor olabilir. Ancak, akıllı sözleşmelerin izlenmesi, hizmet reddi saldırılarına karşı erken uyarı sistemleri kurulmasına yardımcı olabilir.
  6. Güvenlik denetimleri: Smart contract geliştiricileri, akıllı sözleşmeleri güvenlik açıklarına karşı düzenli olarak denetlemelidirler. Bu, hizmet reddi saldırılarına karşı daha dirençli smart contract’ların oluşturulmasına yardımcı olabilir.

Bu önlemler, smart contract geliştiricilerinin, hizmet reddi saldırılarına karşı korunmak için alabilecekleri yöntemlerdir. Ancak, her durumda, smart contract geliştiricilerinin, en son güvenlik önlemlerini takip etmeleri ve geliştirdikleri smart contract’ların güvenliğini sürekli olarak kontrol etmeleri önemlidir.

Solidity’de Hizmet Reddi Saldırılarına Karşı Güvenlik İpuçları

Solidity’de hizmet reddi saldırılarına karşı korunmak için aşağıdaki güvenlik ipuçlarına dikkat edilebilir:

  1. Gas Limitleri: Solidity’de gas limitleri, işlem süresini sınırlamak için kullanılır. Gas limitleri, hizmet reddi saldırılarına karşı önemli bir savunma mekanizmasıdır. Gas limitleri, smart contract’ların doğru şekilde ayarlanmasıyla kullanılabilir.
  2. Veri Doğrulama: Solidity, veri doğrulama için bazı özellikler sunar. Veri doğrulama, kullanıcıların kimliklerini doğrulama, girdi verilerinin doğruluğunu kontrol etme ve sahte verilerle saldırılara karşı koruma sağlamak için kullanılabilir.
  3. Akıllı Sözleşme Denetimi: Solidity, akıllı sözleşmelerin güvenliğini artırmak için bir dizi denetim sağlar. Bu denetimler, güvenlik açıklarını bulma ve düzeltme konusunda yardımcı olabilir.
  4. Gas Optimize Etme: Gas optimizasyonu, Solidity’de hizmet reddi saldırılarına karşı önemli bir savunma mekanizmasıdır. Bu, işlemlerin daha hızlı ve daha az maliyetli bir şekilde gerçekleştirilmesine yardımcı olabilir.
  5. Akıllı Sözleşme Testleri: Solidity’de akıllı sözleşme testleri yapmak, hizmet reddi saldırılarına karşı korunmak için önemlidir. Bu, güvenlik açıklarını tespit etmek ve düzeltmek için bir fırsat sağlar.
  6. Güvenli Bibliyotekler Kullanma: Solidity, güvenliği artırmak için bir dizi kütüphane sağlar. Bu kütüphaneler, akıllı sözleşmelerin güvenliğini artırmak için kullanılabilir.

Bu ipuçları, Solidity ile geliştirilen smart contract’ların hizmet reddi saldırılarına karşı korunmasına yardımcı olabilir. Ancak, her durumda, smart contract geliştiricilerinin güvenlik önlemlerini sürekli olarak gözden geçirmesi ve güncellemesi önemlidir.

Akıllı Sözleşme Örneği Analizi

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

/*
The goal of KingOfEther is to become the king by sending more Ether than
the previous king. Previous king will be refunded with the amount of Ether
he sent.
*/

/*
1. Deploy KingOfEther
2. Alice becomes the king by sending 1 Ether to claimThrone().
2. Bob becomes the king by sending 2 Ether to claimThrone().
   Alice receives a refund of 1 Ether.
3. Deploy Attack with address of KingOfEther.
4. Call attack with 3 Ether.
5. Current king is the Attack contract and no one can become the new king.

What happened?
Attack became the king. All new challenge to claim the throne will be rejected
since Attack contract does not have a fallback function, denying to accept the
Ether sent from KingOfEther before the new king is set.
*/

contract KingOfEther {
    address public king;
    uint public balance;

    function claimThrone() external payable {
        require(msg.value > balance, "Need to pay more to become the king");

        (bool sent, ) = king.call{value: balance}("");
        require(sent, "Failed to send Ether");

        balance = msg.value;
        king = msg.sender;
    }
}

contract Attack {
    KingOfEther kingOfEther;

    constructor(KingOfEther _kingOfEther) {
        kingOfEther = KingOfEther(_kingOfEther);
    }

    // You can also perform a DOS by consuming all gas using assert.
    // This attack will work even if the calling contract does not check
    // whether the call was successful or not.
    //
    // function () external payable {
    //     assert(false);
    // }

    function attack() public payable {
        kingOfEther.claimThrone{value: msg.value}();
    }
}

Bu akıllı sözleşme, “KingOfEther” adlı bir oyunu simüle ediyor. Oyunun amacı, önceki kraldan daha fazla Ether göndererek kral olmak. Eski kral gönderdiği Ether miktarı kadar geri ödeme alıyor. Yeni bir kral olmak için, mevcut kralın gönderdiğinden daha fazla Ether göndermeniz gerekiyor.

Saldırı senaryosu, bir saldırganın “Attack” adlı başka bir akıllı sözleşme kullanarak “KingOfEther” akıllı sözleşmesini hizmet reddi saldırısıyla çökertmeye çalışmasıdır. Saldırgan, “Attack” akıllı sözleşmesine bir miktar Ether gönderir ve bu sözleşme, “KingOfEther” sözleşmesine gönderilen Ether’i kabul etmeyecek şekilde programlanmıştır.

Bununla birlikte, saldırıyı gerçekleştirmek için “Attack” sözleşmesi, “KingOfEther” sözleşmesinin adresini alarak inşa edilir. Saldırgan daha sonra “attack” fonksiyonunu çağırarak “KingOfEther” sözleşmesine Ether gönderir. Bu, “claimThrone” fonksiyonunu çağırmak için kullanılan aynı fonksiyonu çağırarak gerçekleştirilir. “Attack” sözleşmesi, “KingOfEther” sözleşmesinin fallback fonksiyonunu çağırmadığı için, Ether’i kabul etmeyecek ve böylece hizmet reddi saldırısı gerçekleştirilecektir.

Bu akıllı sözleşmede bulunan güvenlik zafiyeti, bir akıllı sözleşmenin bir başka akıllı sözleşme tarafından saldırıya uğrayabileceğini göstermektedir. Bu zafiyeti önlemek için, “KingOfEther” sözleşmesi gibi akıllı sözleşmelerin, diğer sözleşmelerden gelebilecek etkilere karşı korumalı olması gerekmektedir. Buna ek olarak, akıllı sözleşme yazarları, sözleşmelerinde olası saldırı senaryolarını dikkate alarak güvenliği artırmalıdır.

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

contract KingOfEther {
    address public king;
    uint public balance;
    mapping(address => uint) public balances;

    function claimThrone() external payable {
        require(msg.value > balance, "Need to pay more to become the king");

        balances[king] += balance;

        balance = msg.value;
        king = msg.sender;
    }

    function withdraw() public {
        require(msg.sender != king, "Current king cannot withdraw");

        uint amount = balances[msg.sender];
        balances[msg.sender] = 0;

        (bool sent, ) = msg.sender.call{value: amount}("");
        require(sent, "Failed to send Ether");
    }
}

Bu akıllı sözleşme KingOfEther adlı bir oyunu tasvir etmektedir. Oyunun amacı, bir kullanıcının daha önce yollanan Ether miktarını aşarak yeni kral olmasıdır. Önceki krala gönderilen Ether miktarı geri ödenir. Bu akıllı sözleşme örneği, sözleşmeye gönderilen Ether’i işlemden geçirmemek için gerçekleştirilen Hizmet Reddi saldırısını öğrenmek ve engellemek için bir örnek sunmaktadır.

Sözleşme, claimThrone adlı bir fonksiyon ile başlamaktadır. Bu fonksiyon, yeni kral olmak için sözleşmeye Ether gönderen kullanıcılar tarafından çağrılır. Bu kullanıcı, daha önce yollanan Ether miktarını aşarsa yeni kral olur ve önceki krala gönderilen Ether miktarı geri ödenir. Bu fonksiyon ayrıca, önceki krala ödenen Ether miktarını takip eden bir balances mapping’i kullanarak kaydedilmektedir.

withdraw adlı bir fonksiyon da bulunmaktadır. Bu fonksiyon, kullanıcıların kendi bakiyelerini çekmelerine olanak tanır. Mevcut kralın bakiyesinden çekim yapılması engellenir. Kullanıcının bakiyesi, balances mappinginden alınır ve sıfırlanır. Kullanıcının adresine Ether göndermek için call fonksiyonu kullanılır.

Bu örnek, Hizmet Reddi saldırısının önlenmesi için alternatif bir yaklaşım sunmaktadır. Kullanıcıların Ether’lerini çekebilmesi, Hizmet Reddi saldırısının söz konusu olmamasını sağlar.

Hizmet Reddi Saldırılarına Karşı Daha Fazla Kaynak ve Okumalar

Hizmet Reddi saldırılarına karşı önlem almak ve bu konuda daha fazla bilgi edinmek isteyenler için aşağıdaki kaynaklar faydalı olabilir:

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

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