| Integer Underflow Açıklığı (CWE-191) | |||||
| Bu makalede Integer Underflow (CWE-191), yani Integer Düşmesi açıklığı anlatılacaktır.
Açıklık Önem Derecesi: Düşük Açıklığın Etkisi: işlevlerin uygun çalışmaması, servis dışı kalma, komut çalıştırma Açıklığın Açıklaması: Uygulamalarda kaynak kodlarda yer alabilen aritmetik işlemlerde yaşanan taşmalar veri bozulmalarına (örn; değer hesaplamalarında maksimum değerlerin minimum değer olmasına), sistemlerin çökmesine, sonsuz döngüler oluşmasına, mantıksal hataların meydana gelmesine (örn; güvenlik mekanizmalarının atlatılmasına), verinin çöp olmasına veya kayba uğramasına neden olabilir. Aritmetik işlemlerde taşmalar tampon taşmasına (buffer overflow’a) dönüşürlerse taşan sayısal değerler ile bellekte işlemler gerçekleştirilebilir ve keyfi komut çalıştırma sonucuna kadar varılabilir. Tüm sayısal veri tipleri bir bitsel temsile sahiptir. Eğer bir aritmetik işlemde bir değer kendisinin bitsel temsilindeki bit miktarını aşarsa, yani maksimum değerin üzerine çıkarsa o zaman bitsel temsilin en başına yeni bir hane olarak ilave gelen (yani taşan) sayı kırpılacaktır ve değişken geri kalan bitler ile minimum değerden başlayacaktır. Buna “aritmetik taşma” (arithmetic overflow) veya diğer yaygın bilinen yanlış adıyla “integer taşması” (integer overflow) adı verilir. “Integer Taşması” yanlış bir isimlendirmedir, çünkü integer veri tipinin dışındaki veri tiplerinde de bu taşma durumu meydana gelebilmektedir. Eğer bir aritmetik işlemde bir değer kendisinin bitsel temsilindeki bit miktarını aşarsa, yani minimum değerin daha aşağısına inerse o zaman bitsel temsilin en başına yeni bir hane olarak ilave gelen (yani taşan) sayı kırpılacaktır ve değişken geri kalan bitler ile maksimum değerden başlayacaktır. Buna “integer düşmesi” (integer underflow) adı verilir. “Integer Overflow” ve “Integer Underflow” işlemine şu örnekler verilebilir:
Aritmetik taşma açıklığına şu kod örnekleri verilebilir: Java - Güvensiz Kod Bloğu:
// ENG: Addition Vulnerable to “Overflow” and “Underflow”
// TUR: “Overflow” ve “Underflow” Zafiyetli Toplama
public static int vuln_addition1(int a, int b) {
return a + b;
}
Bu örnekte istemci girdisi olan a ve b signed int değişken değerleri hiçbir sınır değer kontrolü olmadan toplama işlemine tabi tutulmaktadır. Bu toplama sonucu int (integer) veri tipi bitsel temsilini aşabilir. Taşan bitin kırpılması sonrası kalan bitler ile küçük bir değer toplam sonucu olarak dönebilir. Dolayısıyla bu kod bloğu güvensiz kabul edilmektedir. Java - Güvensiz Kod Bloğu:
// ENG: Incorrect Check - Vulnerable to Underflow, and
// Incorrect Negative Value Handling
// TUR: Doğru Olmayan Kontrol - “Underflow” Zafiyetli
// ve Doğru Olmayan Negatif Değer Değerlendirici
public static int vuln_addition2(int a, int b) {
if(a+b < 0)
throw new RuntimeException ("Integer overflow!");
return a + b;
}
Bu örnekte istemci girdisi olan a ve b signed int değişken değerleri integer overflow için sınır değer kontrolüne sahiptir, fakat underflow için sınır değer kontrolüne sahip değildir. Bu toplama yine güvensiz kabul edilmektedir. Java - Güvenli Kod Bloğu (1):
// ENG: Addition That will Throw Exception in Case of
// Overflow or Underflow
// TUR: Overflow veya Underflow Durumunda İstisna Fırlatan
// Toplama
public static int safe_addition1(int a, int b) {
if (a > 0 && b > 0 && a + b < 0)
throw new RuntimeException ("Integer overflow!");
if (a < 0 && b < 0 && a + b > 0)
throw new RuntimeException ("Integer underflow!");
return a+b;
}
Bu örnekte ise “Integer Overflow” veya “Integer Underflow” için kontroller girildiğinden istemci girdisi a ve b signed integer’ları kontrol sonrası toplanmaktadır. Dolayısıyla bu kod “Integer Overflow” ve “Integer Underflow”a karşı güvenli kabul edilmektedir. Java - Güvenli Kod Bloğu (2):
// ENG: Using a bigger data type to hold all the
// possible result values
// TUR: Tüm Olası Sonuç Değerlerini Tutmak İçin
// Daha Büyük Veri Tipi Kullanma
public static short safe_addition2(short a, short b) {
int total = a+b;
if(total > Short.MAX_VALUE)
return Short.MAX_VALUE;
if(total < Short.MIN_VALUE)
return Short.MIN_VALUE;
return (short)total;
}
Bu örnekte de a ve b istemci girdi değişkenleri için int veri tipinden bitsel temsili daha küçük olan short veri tipi kullanılmıştır. Böylece küçük girdiler daha büyük değişkende toplanarak veri kaybı önlenmeye çalışılmıştır. Aritmetik işlem sonrası toplam değeri eğer short veri tipinin maksimum ve minimum değerleri arasındaysa bu değer döndürülmektedir, fakat eğer toplam değeri short veri tipinin maksimum ve minimum değerleri arasında değilse bu durumda short veri tipinin sınır değerlerinden maksimum veya minimum değer toplam sonucu olarak döndürülmektedir. Bu kodda da “Integer Overflow” ve “Integer Underflow” kontrolü olması dolayısıyla güvenli bir yol kabul edilmektedir. Açıklığın Önlemi: Aritmetik işlem sonucu integer overflow olmasın diye aritmetik işlemde kullanılan istemci girdileri değerleri tanımlı bir minimum & maksimum değer aralığında mı kontrol edilmelidir. Ancak ondan sonra bu değişkenler aritmetik işlemde kullanılmalıdır. Yararlanılan Kaynaklar:
|
|||||
Bu yazı 25.10.2025 tarihinde, saat 03:09:21'de yazılmıştır.
25.10.2025 tarihi ve 00:12:16 saatinde ise güncellenmiştir. |
|||||
|
|||||
| Yorumlar |
|||||
| Henüz yorum girilmemiştir. | |||||
| Yorum Ekle | |||||
Bu yazı 25.10.2025 tarihinde, saat 03:09:21'de yazılmıştır.
25.10.2025 tarihi ve 00:12:16 saatinde ise güncellenmiştir.