exponenta event banner

Источники запотевания в полиспейсном анализе

Как правило, любой элемент кода, который может быть изменен вне кода, считается запятнанными данными. Злоумышленник может передавать значения запятнанным переменным, чтобы вызвать сбой программы, ввести вредоносный код или утечку ресурсов. Результаты операций, использующих запятнанные данные, также считаются запятнанными. Например, если вычислить путь к файлу с помощью переменной с запятнанным цветом, файл также станет запятнанным. Чтобы уменьшить риски, связанные с поврежденными данными, перед их использованием проверьте их содержимое.

Повысьте безопасность кода, используя средства проверки дефекта запятнанных данных Polyspace ® для идентификации источников запятнанных данных и последующей проверки данных из этих источников.

Источники запятнанных данных

Polyspace рассматривает данные из этих источников как запятнанные данные:

  • Волатильные объекты: объекты, объявленные с помощью ключевого слова volatile может быть изменен аппаратным обеспечением во время выполнения программы. Использование изменчивых объектов без проверки их содержимого может привести к ошибкам сегментации, утечке памяти или угрозе безопасности. Полиспейс помечает операции, использующие изменчивые объекты без их проверки.

  • Функции, получающие пользовательский ввод: библиотечные функции, такие как getenv, gets, read, scanf, или fopen возвращают пользовательские входные данные, такие как переменная среды, строка, поток данных, форматированные данные или файл. main() может также принимать входные аргументы непосредственно от пользователя. Вводы, зависящие от пользователя, непредсказуемы. Прежде чем использовать эти входные данные, проверьте их формат, длину или содержимое.

  • Функции, взаимодействующие с оборудованием: Библиотечные функции, такие как RegQueryValueEx взаимодействует с аппаратными средствами, такими как регистры и периферийные устройства. Эти функции возвращают зависящие от оборудования данные, которые могут быть непредсказуемыми. Перед использованием данных, полученных с оборудования, проверьте их формат, длину или содержимое.

  • Функции, возвращающие текущее время: Функции библиотеки, такие как ctime возвращает текущее время системы в виде отформатированной строки. Формат строки зависит от среды. Прежде чем использовать такие строки, проверьте их формат.

  • Функции, возвращающие случайное число: Прежде чем использовать случайные числа, проверьте их, проверив их формат и диапазон.

Чтобы учесть любые данные, не входящие в текущую область анализа Polyspace, как запятнанные, используйте параметр командной строки -consider-analysis-perimeter-as-trust-boundary. См. раздел Изменение поведения по умолчанию для чекеров для поиска ошибок

Влияние дефектов запятнанных данных

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

#include <stdio.h>
#include <stdlib.h>
#define MAX 128
void Echo(char* string, int n) {
	printf("Argument %d is; ",n);
	printf(string); //Tainted operation
}
void SystemCaller(char* string){
	printf("Calling System...");
	char cmd[MAX] = "/usr/bin/cat ";
	strcat(cmd, string);
	system(cmd);//Tainted operation
}

int main(int argc, char** argv) {
	int i = 0;
	for(i = 0;i<argc;++i){
		Echo(argv[i],i);
		SystemCaller(argv[i]);
	}
	return (0);
}
Входные данные пользователя запятнаны. Polyspace помечает два дефекта данных в этом коде.

  • В функции Echo, линия printf(string) печать строки пользовательского ввода без проверки строки. Этот дефект позволяет злоумышленнику раскрыть стек, манипулируя входной строкой. Например, если пользовательский ввод "%d", функция печатает целое число в стеке после n печатается.

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

Чтобы предотвратить такие атаки, проверьте поврежденные данные, проверив их формат, длину или содержимое. Например, в этом коде запятнанные входные данные проверяются перед их использованием.

#include <stdio.h>
#include <stdlib.h>
#define MAX 128
extern char** LIST_OF_COMMANDS;
int isAllowd(char*);
void Echo(char* string, int n) {
	printf("Argument %d is; ",n);
	printf("%s",string); //Validated
}
void SystemCaller(char* string){
	printf("Calling System...");
	char cmd[MAX] = "/usr/bin/cat ";
	if(isallowed(string)==1){
	strcat(cmd, string);
	system(cmd);//Validated
	}
}

int main(int argc, char** argv) {
	int i = 0;
	for(i = 0;i<argc|| i<10;++i){
		Echo(argv[i],i);
		SystemCaller(argv[i]);
	}
	return (0);
}
Путем указания формата как %s в printf, запятнанный вход string проверено. Теперь программа печатает содержимое строки, и стек больше не отображается. В SystemCaller, программа выполняет команду операционной системы только в том случае, если входные данные соответствуют разрешенной команде.

Дополнительные сведения о дефектах запятнанных данных в Polyspace см. в разделе Дефекты запятнанных данных

См. также

|

Связанные темы