ISO/IEC TS 17961 [taintsink]

Испорченный, потенциально искалеченные, или целочисленные значения вне основной области используются в ограниченном приемнике

Описание

Управляйте определением

Испорченный, потенциально искалеченные, или целочисленные значения вне основной области используются в ограниченном приемнике. [1]

Реализация Polyspace

Это средство проверки проверяет на эти проблемы:

  • Испорченный размер массива переменной длины.

  • Указатель разыменовывает с испорченным смещением.

  • Доступ к массиву с испорченным индексом.

Примеры

развернуть все

Проблема

Испорченный размер массива переменной длины обнаруживает массивы переменной длины (VLA), размер которых из небезопасного источника.

Риск

Если атакующий изменил размер вашего 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;
}

В этом примере размер переменной длины массивов основан на входном параметре. Поскольку это значение входного параметра не проверяется, размер может быть отрицательным или слишком большим.

Коррекция — проверяет размер VLA

Одна возможная коррекция должна проверять переменную размера прежде, чем создать массив переменной длины. Этот пример проверяет, больше ли размер, чем 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;
    }
}

Проверяйте информацию

Разрешимость: неразрешимый

Введенный в R2019a


[1]  Выписки из стандарта "Техническая характеристика ISO/IEC TS 17961 - 2013-11-15" воспроизводятся с соглашением о AFNOR. Только исходный и полный текст стандарта, как опубликовано Выпусками AFNOR - доступный через веб-сайт www.boutique.afnor.org - имеет нормативное значение.