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