Tainted NULL or non-null-terminated string

Аргумент из небезопасного источника и может быть NULL или не ОТКЛЮЧЕННЫЙ ПУСТЫМ УКАЗАТЕЛЕМ

Описание

Этот дефект происходит, когда строки из небезопасных источников используются в стандартных программах обработки строк, которые неявно разыменовывают буфер строки, например, strcpy или sprintf. Чтобы рассмотреть весь вход снаружи текущего аналитического периметра как небезопасный, используйте -consider-analysis-perimeter-as-trust-boundary.

Испорченный NULL или не пустая отключенная строка не повышает дефекта для строки, возвращенной от вызова до scanf- семейство variadic функции. Точно так же никакой дефект не повышен, когда вы передаете строку с %s спецификатор к printf- семейство variadic функции.

Риск

Если строка из небезопасного источника, возможно, что атакующий управлял строкой или указал указатель строки на различную ячейку памяти.

Если строкой является NULL, стандартная программа строки не может разыменовать строку, заставив программу отказать. Если строка не отключена пустым указателем, строка, которую знает стандартная сила не, когда строка заканчивается. Эта ошибка может заставить вас писать за пределы, вызвав переполнение буфера.

Фиксация

Подтвердите строку, прежде чем вы будете использовать ее. Проверяйте что:

  • Строка не является ПУСТОЙ.

  • Строка отключена пустым указателем

  • Размер строки совпадает с ожидаемым размером.

Примеры

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define SIZE128 128
#define MAX 40
extern void print_str(const char*);
void warningMsg(void)
{
	char userstr[MAX];
	read(0,userstr,MAX);
	char str[SIZE128] = "Warning: ";
	strncat(str, userstr, SIZE128-(strlen(str)+1));
	print_str(str);
}


В этом примере, строка str конкатенирован с аргументом userstr. Значение userstr неизвестно. Если размер userstr больше доступного пробела, переполнение конкатенации.

Коррекция — подтверждает данные

Одна возможная коррекция должна проверять размер userstr и убедитесь, что строка отключена пустым указателем перед использованием его в strncat. Этот пример использует функцию помощника, sansitize_str, подтверждать строку. Дефекты сконцентрированы в этой функции.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define SIZE128 128
#define MAX 40
extern void print_str(const char*);
int sanitize_str(char* s) {
	int res = 0; 
	if (s && (strlen(s) > 0)) { // TAINTED_STRING only flagged here
		// - string is not null
		// - string has a positive and limited size
		// - TAINTED_STRING on strlen used as a firewall
		res = 1;
	}
	return res; 
}
void warningMsg(void)
{
	char userstr[MAX];
	read(0,userstr,MAX);
	char str[SIZE128] = "Warning: ";
	if (sanitize_str(userstr))	
		strncat(str, userstr, SIZE128-(strlen(str)+1));
	print_str(str);
}
Коррекция — подтверждает данные

Другая возможная коррекция должна вызвать функциональный errorMsg и warningMsg с определенными строками.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define SIZE128 128

extern void print_str(const char*);

void warningMsg(char* userstr)
{
    char str[SIZE128] = "Warning: ";
    strncat(str, userstr, SIZE128-(strlen(str)+1));
    print_str(str);
}

void errorMsg(char* userstr)
{
  char str[SIZE128] = "Error: ";
  strncat(str, userstr, SIZE128-(strlen(str)+1));
  print_str(str);
}

int manageSensorValue(int sensorValue) {
  int ret = sensorValue;
  if ( sensorValue < 0 ) {
    errorMsg("sensor value should be positive");
    exit(1);
  } else if ( sensorValue > 50 ) {
    warningMsg("sensor value greater than 50 (applying threshold)...");
    sensorValue = 50;
  }
  
  return sensorValue;
}

Информация о результате

Группа: испорченные данные
Язык: C | C++
Значение по умолчанию: Off
Синтаксис командной строки: TAINTED_STRING
Удар: низко
ID CWE: 120, 170, 476, 690, 822
Введенный в R2015b