Испорченный, потенциально искалеченные, или целочисленные значения вне основной области используются в ограниченном приемнике
Испорченный размер массива переменной длины обнаруживает массивы переменной длины (VLA), размер которых из небезопасного источника.
Если атакующий изменил размер вашего VLA к неожиданному значению, это может заставить вашу программу отказывать или неожиданно вести себя.
Если размер неположителен, поведение VLA не определено. Ваша программа не выполняет как ожидалось.
Если размер неограничен, VLA может вызвать исчерпание памяти или переполнение стека.
Подтвердите свой размер VLA, чтобы убедиться, что это положительно и меньше, чем максимальное значение.
enum {
SIZE10 = 10,
SIZE100 = 100,
SIZE128 = 128
};
int taintedvlasize(int size) {
int tabvla[size];
int res = 0;
for (int i=0 ; i<SIZE10 ; ++i) {
tabvla[i] = i*i;
res += tabvla[i];
}
return res;
}
В этом примере размер переменной длины массивов основан на входном параметре. Поскольку это значение входного параметра не проверяется, размер может быть отрицательным или слишком большим.
Одно возможное исправление должно проверять переменную размера прежде, чем создать массив переменной длины. Этот пример проверяет, больше ли размер, чем 10 и меньше чем 100, прежде, чем создать VLA
enum { SIZE10 = 10, SIZE100 = 100, SIZE128 = 128 }; int taintedvlasize(int size) { int res = 0; if (size>SIZE10 && size<SIZE100) { int tabvla[size]; for (int i=0 ; i<SIZE10 ; ++i) { tabvla[i] = i*i; res += tabvla[i]; } } return res; }
Указатель разыменовывает с испорченным смещением, обнаруживает разыменование указателя, или чтение или запись, с помощью переменной смещения из неизвестного или небезопасного источника.
Эта проверка фокусируется на динамически выделенных буферах. Для статических буферных смещений смотрите Array access with tainted index
.
Индекс может быть вне допустимой области значений массивов. Если испорченный индекс вне области значений массивов, он может вызвать:
Недостаточное наполнение буфера / подписывает, или пишущий в память перед началом буфера.
Переполнение буфера, или пишущий в память после конца буфера.
По чтению буфера или доступу к памяти после конца целенаправленного буфера.
Под чтением буфер или память доступа перед началом целенаправленного буфера.
Атакующий может использовать недопустимое чтение или записать, чтобы поставить под угрозу вашу программу.
Подтвердите индекс, прежде чем вы будете использовать переменную, чтобы получить доступ к указателю. Проверяйте, чтобы убедиться, что переменная в допустимой области значений и не переполняется.
#include <stdlib.h>
enum {
SIZE10 = 10,
SIZE100 = 100,
SIZE128 = 128
};
extern void read_pint(int*);
int taintedptroffset(int i) {
int* pint = (int*)calloc(SIZE10, sizeof(int));
int c = 0;
if(pint) {
/* Filling array */
read_pint(pint);
c = pint[i];
free(pint);
}
return c;
}
В этом примере функция инициализирует целочисленный указатель pint
. Указатель разыменовывается с помощью входного индекса i
. Значение i
могло быть вне области значений указателя, вызвав ошибку из области значений.
Одно возможное исправление должно подтвердить значение индекса. Если индекс в допустимой области значений, продолжите разыменование указателя.
#include <stdlib.h> enum { SIZE10 = 10, SIZE100 = 100, SIZE128 = 128 }; extern void read_pint(int*); int taintedptroffset(int i) { int* pint = (int*)calloc(SIZE10, sizeof(int)); int c = 0; if (pint) { /* Filling array */ read_pint(pint); if (i>0 && i<SIZE10) { c = pint[i]; } free(pint); } return c; }
Доступ к массиву с испорченным индексом обнаруживает чтение или запись в массив при помощи испорченного индекса, который не был подтвержден.
Индекс может быть вне допустимой области значений массивов. Если испорченный индекс вне области значений массивов, он может вызвать:
Недостаточное наполнение буфера / подписывает — пишущий в память перед началом буфера.
Переполнение буфера — пишущий в память после конца буфера.
Зачитываясь буфер — доступ к памяти после конца целенаправленного буфера.
Под чтением буфер или память доступа перед началом целенаправленного буфера.
Атакующий может использовать недопустимую операцию чтения, или операция записи создают к проблемам в вашей программе.
Перед использованием индекса, чтобы получить доступ к массиву, подтвердите индексное значение, чтобы убедиться, что это в области значений массивов.
#define SIZE100 100
extern int tab[SIZE100];
int taintedarrayindex(int num) {
return tab[num];
}
В этом примере индекс num
получает доступ к массиву tab
. Функция не проверяет, чтобы видеть, ли num
в области значений tab
.
Одно возможное исправление должно проверять, что num
находится в области значений перед использованием его.
#define SIZE100 100 extern int tab[SIZE100]; int taintedarrayindex(int num) { if (num >= 0 && num < SIZE100) { return tab[num]; } else { return -9999; } }
Разрешимость: неразрешимый |
[1] Выписки из стандарта "Техническая характеристика ISO/IEC TS 17961 - 2013-11-15" воспроизводятся с соглашением о AFNOR. Только исходный и полный текст стандарта, как опубликовано Выпусками AFNOR - доступный через веб-сайт www.boutique.afnor.org - имеет нормативное значение.
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.