Skip to content

Buffer under-read

Bir buffer'ın başının öncesindeki memory'den oku; negatif bir index ya da underflow olmuş bir pointer üzerinden (CWE-127).

Mechanism

Note

CWE-127 (Buffer Under-read): "Ürün, hedeflenen buffer'dan önceki memory konumlarına referans veren index'ler veya pointer'lar gibi buffer access mekanizmalarını kullanarak bir buffer'dan okur." Bu "pointer ya da index'i buffer'dan önceki bir konuma decrement edildiğinde, pointer arithmetic geçerli memory konumunun başlangıcından önceki bir konumla sonuçlandığında ya da negatif bir index kullanıldığında" olur.

Invariant şu: C array/pointer access ne bir upper ne de bir lower bound doğrular. Yalnızca index < len'i (upper bound) doğrulayan ama asla index >= 0'ı doğrulamayan bir check, negatif bir index'in buffer'ın altındaki memory'yi dereference etmesine izin verir ve ondan önce gelen data neyse onu açığa çıkarır (ve over-read'lerde olduğu gibi, leak'lenmiş pointer'lar ASLR'yi bypass edebilir).

Walkthrough

MITRE'nin gösterici örneği — bug, eksik lower-bound check'tir:

int getValueFromArray(int *array, int len, int index) {
    int value;
    if (index < len) {            // BUG: no check that index >= 0
        value = array[index];     // negative index -> reads before array
    } else {
        value = -1;               // rejected (only the missing lower bound is the bug)
    }
    return value;
}
// Fix: if (index >= 0 && index < len) { ... }

Beklenen davranış: index = -1 (ya da herhangi bir negatif değer) ile çağırmak index < len testini geçer ve array[-1]'i dereference eder; buffer'dan hemen önceki word'ü okur — hassas-data disclosure'ı ya da bir crash. Bu, buffer underwrite'ın read karşılığıdır.

Detection

  • AddressSanitizer / Valgrind out-of-bounds read'i işaretler.
  • Static analysis, array access'te kullanılan kontrolsüz signed index'leri yakalar.

Mitigation

  • Her iki bound'u da doğrula: 0 <= index < len.
  • size_t index'leri yalnızca non-negative kökeni teyit ettikten sonra tercih et; korumasız bir signed→unsigned conversion negatif değeri saklayabilir (bkz. signed-to-unsigned conversion error).
  • Bounds-check yapan container type'ları kullan.

References