Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Введение в теоретические основы компьютерной безопасности (Прокофьев И.В., Шрамков И.Г., Щербаков А.Ю.).pdf
Скачиваний:
237
Добавлен:
28.06.2014
Размер:
2.36 Mб
Скачать

- 73 -

одновременное наличие потока к промежуточному объекту заведомо порождает некорректный вызов или возврат результата.

Итак, содержательному анализу подвергнем ситуации 4-11. Ситуация 4 описывает поток с искажением промежуточного объекта.

Ситуация 5 кроме искажения промежуточного объекта содержит еще и поток к постороннему объекту.

Ситуация 6 описывает полностью корректную передачу к промежуточному объекту.

Ситуация 7 описывает передачу параметров без изменения, но с организацией потока к другому объекту.

Ситуации 8 и 9 описывают функционально аналогичные ситуациям 4 и 5, но относительно другого инициирующего поток субъекта.

Аналогично рассматриваются и ситуации 10 и 11.

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

1.В субъекте Sl должно быть реализовано только тождественное отображение объекта Op.

2.Субъект Sl не должен инициировать потоки, отображающие промежуточный объект на другие объекты.

Данные свойства должны быть предметом содержательного анализа при проектировании защиты в КС, где существуют субъекты - участники составных потоков.

2.9.Методика проверки попарной корректности субъектов при проектировании механизмов обеспечения безопасности с учетом передачи параметров

Рассмотренная выше модель передачи параметров между субъектами позволяет уточнить понятие попарной корректности, изложенное в части 1. Общие подходы к изучению субъектного наполнения КС изложены в [1,2].

Под некорректным программным субъектом понимается процедура (в

терминах языка высокого уровня), выполняющая хотя бы одну из операций:

-выделение в теле процедуры динамической памяти и неосвобождение ее при выходе из процедуры;

-обращение по чтению/записи к динамически выделенной памяти после

ееосвобождения;

-обращение по чтению/записи за границы как динамически, так и статически (стек, глобальные переменные) выделенной памяти;

-запись в сегмент кода программного модуля;

-запись в область переменных, задающих порядок возврата управления при выходе из процедуры.

Под контекстуально некорректным программным субъектом

понимается некорректный в некотором (хотя бы одном) контексте вызова программный субъект.

- 74 -

Под контекстом вызова программного субъекта понимается совокупность объектов данных известной размерности (или их адресов), передающихся ему в качестве параметров вызова.

Контекстуальная некорректность проявляется при вызове одних программных субъектов другими и заключается в некорректных операциях с объектами, адреса которых передаются в качестве параметров в процедуру. Выявить такого рода некорректность можно только в контексте вызова одной процедуры другой, поскольку передача в качестве параметра указателя на некоторый объект (например, типа массив) не дает информации, достаточной для осуществления контроля за правильностью операций над данным объектом.

Таким образом, данная классификация отражает предмет статического анализа программного кода по исходным текстам на языке высокого уровня.

Под программным субъектом понимается выделенная процедура: фрагмент кода на языке высокого уровня, ограниченный точкой входа (и, возможно, передачи параметров) и точкой (точками) возврата управления (выходом из процедуры).

Попарная корректность процедур P1 и P2 понимается как отсутствие

операций

-по записи в области памяти, содержащие код как процедуры P1, так и процедуры P2 из процедур P1 и P2;

-по записи в область данных процедуры P1 из процедуры P2 и наоборот (кроме передачи параметров при взаимном вызове);

-по записи в область передачи параметров при вызове процедуры P2 из процедуры P1 (или наоборот), превышающую размерность объекта для передачи параметров;

-по записи в область переменных, задающих порядок возврата управления

ипередачи параметров (стека).

Динамические методы анализа направлены на выявление некорректных ситуаций в динамике выполнения программного кода, реализующего целевую функцию ПО. К динамическим методам анализа относятся:

-исполнение ПО (фрагментов ПО) под управлением отладчика. При этом имеется возможность использования условных точек останова (breakpoints) для различных классов событий (обращение к участкам памяти по чтению/записи, обращение к портам ввода/вывода, возникновение исключений (exceptions) в работе ПО), а также пошаговое исполнение наиболее критичных участков программного кода.

-написание тестовых макросов, которые вносятся в исходные тексты ПО перед его компиляцией в исполняемые модули, выполняющих динамическую проверку некоторых условий на этапе исполнения программного кода (например, на входе процедуры тестовый макрос сохраняет сегмент стека (stack frame) на некоторую глубину и проверяет его неизменность на выходе из процедуры, или тестовый макрос на входе процедуры вычисляет контрольную сумму программного кода и проверяет его неизменность на выходе процедуры

ит.д.) и сигнализирующих в случае их невыполнения.

-75 -

-написание и исполнение тестовых программ, создающих стрессовые или нештатные условия эксплуатации ПО и дальнейший анализ реакции ПО на данные ситуации.

Статическими являются методы анализа по исходным текстам на языке высокого уровня.

Анализ одиночной процедуры

1. Выявление прямых операционных конструкций:

1.1.Вызовов других процедур.

1.2.Циклов for, do while, do until.

2.Выявление косвенных операционных конструкций

2.1.Изменение объектов стека.

2.2.Косвенные циклы через if-else.

2.3.Процедур типа longjump.

3. Анализ выявленных конструкций:

3.1.Происходит ли перемещение данных внутри процедуры, каковы параметры операций, возможно ли повреждение (запись) в области собственного кода или кода другой процедуры.

3.2.Происходит ли перемещение данных непосредственно во вне процедуры (в глобальные переменные), каковы параметры этих операций и возможно ли повреждение кода других процедур.

3.3.Происходит ли перемещение данных в область стека данной процедуры или других процедур.

3.4.Происходит ли сквозная передача параметров для вызовов из данной процедуры, существует ли возможность повреждения кода и данных данной процедуры при возврате управления.

Пример сквозного вызова: int fun1 (char *buf, int len)

{

...

fun2(buf,15);

}

Пример повреждения при возврате: int fun1 (...)

{

char buf[32];

...

fun2(buf);

}

void fun2(char *p)

{

...

for(i=0;i<64;i++) p[i]=i;

}

- 76 -

Целесообразно выделить процедуры по прямому перемещению объектов типа memcpy, strcpy и т.д.

Для каждой процедуры составляется формуляр, в котором указываются все вызываемые процедуры с указанием результатов анализа по пп.3.1 - 3.4, указывается интегральный вывод по свойствам операционных конструкций (типа «перемещение данных в области памяти других процедур не найдено (или найдено)»; при нахождении указывается конкретная локализация в процедуре с указанием параметров, при которых реализуется то или иное негативное свойство.

Должны быть проанализированы все процедуры, принадлежащие к полному множеству.

Множество процедур ПО называется полным, если во всех принадлежащих этому множеству процедурах все вызываемые процедуры также принадлежат данному множеству.

Далее будет рассмотрена конкретизированная в виде алгоритма методика анализа ПО на предмет наличия (отсутствия) как некорректных, так и контекстуально некорректных программных субъектов. Под ошибкой типа buffer overflow понимается потенциально возможная ситуация, связанная с записью в область памяти за объявленной границей объекта.

Описание алгоритма.

1.Фиксируется список {F} всех процедур комплекса ПО. Для каждой процедуры описываются ее параметры (с указанием размерности) и возвращаемое значение. В том случае, когда размерность объекта данных (либо непосредственно выступающего в качестве параметра, либо опосредованно через указатель на него) не может быть определена без контекста вызова данной процедуры, указывается "размерность не определена" (unknown). Такие функции заносятся также в список {Fc} процедур, являющихся объектом анализа на предмет контекстуальной корректности. Также создается список {P} глобальных переменных. Для каждой переменной указывается ее размерность.

2.Для любой глобальной переменной P из списка {P} производится ее поиск во всех файлах с исходными текстами на языке С:

-переменную P слева от оператора присваивания (включая

вхождения в операционные конструкции типа for(), while(),..); при этом размерность присваиваемого значения не должна превышать размерность переменной P,

-переменную P в качестве первого параметра в вызове функции strcpy(char *dest, char *src); при этом размерность присваиваемого значения не должна превышать размерность переменной P,

-переменную P в качестве второго параметра в вызове функции bcopy(char *src, char *dest, size_t n); при этом значение n не должно превышать размерности переменной P,