Обычно любой элемент кода, который может быть изменен извне кода, рассматривается как испорченные данные. Атакующий может передать значения испорченным переменным, чтобы вызвать отказ программы, инъекцию вредоносного кода или утечку ресурсов. Результаты операций, которые используют испорченные данные, также считаются испорченными. Например, если вы вычисляете путь к файлу с помощью испорченной переменной, файл также становится испорченным. Чтобы уменьшить риски, связанные с испорченными данными, проверьте содержимое данных перед использованием.
Повысьте безопасность своего кода с помощью Polyspace® проверяющие дефекты данных для идентификации источников испорченных данных и последующей проверки данных из этих источников.
Polyspace рассматривает данные из этих источников как испорченные данные:
Волатильные объекты: Объекты, объявленные с помощью ключевого слова volatile
может быть изменено оборудованием во время выполнения программы. Использование энергозависимых объектов без проверки их содержимого может привести к ошибкам сегментации, утечке памяти или угрозе безопасности. Polyspace помечает операции, которые используют летучие объекты, не проверяя их.
Функции, которые получают пользовательский вход: Функции библиотеки, такие как getenv
, gets
, read
, scanf
, или fopen
возвращает пользовательские входы, такие как переменная окружения, строка, поток данных, форматированные данные или файл. The main()
могут также принимать входные параметры непосредственно от пользователя. Зависимые от пользователя входы непредсказуемы. Прежде чем использовать эти входные параметры, проверьте их формат, длину или содержимое.
Функции, которые взаимодействуют с оборудованием: Функции библиотеки, такие как RegQueryValueEx
взаимодействует с оборудованием, как регистры и периферийные устройства. Эти функции возвращают зависящие от оборудования данные, которые могут быть непредсказуемыми. Перед использованием данных, полученных с оборудования, проверьте их формат, длину или содержимое.
Функции, которые возвращают текущее время: Функции библиотеки, такие как ctime
возвращает текущее время системы в виде форматированной строки. Формат строки зависит от окружения. Прежде чем использовать такие строки, проверьте их, проверив их формат.
Функции, которые возвращают случайное число: Перед использованием случайных чисел проверьте их, проверив их формат и область значений.
Чтобы учесть любые данные, которые не берутся из текущих возможностей анализа Polyspace, как испорченные, используйте опцию командной строки -consider-analysis-perimeter-as-trust-boundary
. См. Изменение поведения Bug Finder Checkers по умолчанию
Атакующий может использовать испорченные дефекты данных путем намеренной подачи неожиданного входа в программу, чтобы раскрыть стек или выполнить команды, которые получают доступ или удаляют конфиденциальные данные. Рассмотрим этот код, который использует вход пользователя для изменения системы.
#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); }
В функциональном 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, см. «Испорченные дефекты данных»
-consider-analysis-perimeter-as-trust-boundary
| Find defects (-checkers)