УДК 004.056.53
О. Ф. Немолочнов, Л. Г. Осовецкий
КРИЗИС ПРОМЫШЛЕННОЙ ТЕХНОЛОГИИ ПРОГРАММИРОВАНИЯ, НЕДЕКЛАРИРОВАННЫЕ ВОЗМОЖНОСТИ И DON'T CARE
Рассматриваются вопросы верификации вычислительных процессов по графоаналитическим моделям, управляемых частично-определенными булевыми функциями. Исследуются задачи поиска по булеву графу управления и кубическим покрытиям недекларированных возможностей и мертвого кода как следствия don't care. Приведены примеры построения покрытий для булева графа и верификация don't care в виде покрытия конъюнкции отношений-неравенств, тождественно равных нулю.
Ключевые слова: технология программирования, недекларированные возможности, верификация, мертвый код, угрозы безопасности.
Введение. Определим вычислительный процесс как процесс преобразования информации по формулам и алгоритмам, используемым для вычисления значений некоторого множества переменных. Вычисление значений переменных по разным формулам и алгоритмам осуществляется под управлением заданного множества неравенств-отношений, которые задают условия-предикаты, так как каждое отношение может либо выполняться, либо не выполняться, т.е. принимать два значения: true и false, и, следовательно, образует предикат на множестве значений переменных, входящих в левую и правую части неравенств. Для описания вычислительного процесса, порождаемого логической схемой или программой, необходимо построить модель, которая позволит формализовать его описание и упростить решение различных задач синтеза и анализа с применением аппарата теории множеств и алгебры логики. В качестве такой модели удобно использовать графоаналитическое представление вычислительного процесса [1]. В вершинах графа располагаются итеративные и рекуррентные формулы и условия-предикаты (отношения). Связи между вершинами задаются дугами. В общем случае в вершине может размещаться любой алгоритм преобразования информации. Дуги управления образуют конъюнкции условий-предикатов, их дизъюнкции образуют булевы функции. Основной задачей исследования вычислительного процесса является его верификация в соответствии с декларацией, состоящая в верификации декларированных и недекларированных возможностей процесса и в поиске несуществующих значений, образующих множество don't care.
Таким образом, задача верификации вычислительного процесса может быть сведена к поиску недекларированных возможностей (НДВ) и конъюнкций условий-предикатов, тождественно равных нулю, для которых системы неравенств не имеют решений. НДВ на графе вычислительного процесса образуют множество вершин и дуг, недостижимых через входные последовательности наборов данных, построенных по декларации и don't care, которые порождают частично-определенные булевы функции. Эти функции при их отображении на
n-мерный двоичный куб E2 могут быть заданы покрытиями комплексов K 1(f), где f=1, K0(f), гдеf=0, и Kd(f), где f=d (don't care). Поиск и верификация вершин (конъюнкций)
комплекса K 0( f) и составляет основную задачу анализа вычислительных процессов.
Графоаналитическая модель вычислительного процесса. Информационные потоки в вычислительных процессах управляются некоторым множеством условий-предикатов в виде неравенств-отношений. Неравенства задают отношения между значениями переменных, входящих в их левую и правую части. Неравенства могут выполняться или не выполняться
и порождают, таким образом, предикат P, равный T при выполнении, и равный F — при невыполнении. Под формулой понимается конечная последовательность символов переменных и знаков математических операций между ними, т.е. рассматривается линейная формула fr. Значение, вычисленное по формуле fr, будем обозначать как |fr|.
Под алгоритмом понимается некоторая конечная последовательность элементарных действий, приводящих к однозначному результату — значению переменной. В общем случае обобщением формулы или алгоритма является некоторый оператор S, имеющий одну точку входа (7;п) и одну точку выхода (Tout).
Представление и описание вычислительного процесса в виде графа как множества вершин и связей между ними является некоторой метамоделью, не зависящей от конкретной реализации, например, в виде логической схемы или программы на алгоритмическом языке.
Для описания вычислительного процесса введем три типа вершин [2]: линейные — для формул и операторов; условные — для отношений-неравенств; объединения связей между ними. Связи между вершинами являются однонаправленными и, следовательно, образуют дуги, т. е. всегда имеется источник и приемник передачи управления, и, таким образом, информационные потоки в виде последовательности вершин и дуг являются направленными и детерминированными. Аналитическое описание вершин задается в виде логико-алгебраических выражений, сочетающих в себе логику условий-предикатов и алгебраические формулы вычисления переменных, а также может быть задано в виде кубических покрытий [3].
Далее вычислительный процесс может быть фрагментирован на замкнутые параллельные структуры (sr), реализующие по разным формулам альтернативные вычисления переменных r или различных переменных в зависимости от заданного множества условий-предикатов. Условия-предикаты могут задаваться либо впрямую булевыми переменными, либо косвенно через неравенства-отношения. Некоторое множество вершин и дуг графа вычислительного процесса образует параллельную структуру, если оно содержит одну точку входа Гщ и одну точку выхода Tout. Для структуры sr все разветвления по условиям должны сходиться в одной точке Tout. На алгоритмическом языке высокого уровня им соответствуют условные операторы присвоения.
Любая булева функцияf входящая в параллельную структуру sr, является полностью заданной, т.е. образует комплекс K(f)=K1(f)uKd(f)uK0(f). Другими словами, если в sr содержится n условий, то любая булева функция f из sr может быть отображена на кубе En
множествами вершин K1, где f = 1, K0, где f=0, и Kd, где f=d, таких что K1 u K0 u Kd = еП .
Здесь d (don't care) есть такие вершины куба En, где значение функции не определено
вследствие того, что конъюнкции условий-предикатов дают пустые пересечения множеств значений переменных, входящих в неравенства-отношения, т. е. система неравенств не имеет решения.
Параллельные структуры sr могут находиться между собой в следующих отношениях:
— включение, когда некоторая структура sr7- содержит в себе некоторую структуру sr, (sr з sr,);
— конъюнкция — sr^sri, т.е. последовательная композиция;
— дизъюнкция — sr7- V sr,, т.е. параллельная композиция.
Так как любая структура sr является замкнутой, покрытия входящих в нее булевых функций можно (и нужно) строить независимо друг от друга, полагая, что условия-предикаты локализованы в ней, благодаря чему и достигается компактность покрытий. Таким образом, при построении покрытий для некоторой структуры sr другие структуры графа вычисли-
тельного процесса могут рассматриваться как некоторые нераскрываемые операторы S, что соответствует реализации вычислительного процесса, описанного на языке высокого уровня, в виде блоков и модулей.
На рис. 1 показан пример параллельной структуры, реализующей интервальную формулу (шя), при ^ < ^ \
r = <
ifrj при х < ifr2 при kx < х < k2, ifr3 при х > k2.
Рис. 1
На рисунке отношение x<ki обозначено через a: x<k\, отношение x>k2 — через b: x>k2, и тогда соответственно a : х > ki и b : х < k2; cv — условная вершина, lv — линейная вершина, d — дуга, ud — объединение дуг, Т и F — предикаты.
Выражение для переменной r на языке высокого уровня может быть записано условным оператором присваивания:
r:=if (х<Ь) then <ifr1>
else if (t>k2) then <ifr3> else <ifr2>.
Результаты вычисления покрытий для переменной r сведены в табл. 1; в начале таблицы даны исходные покрытия для всех вершин графа в соответствии с типовыми покрытиями и в терминах обозначений, принятых в работе [2].
Таблица 1
гт а Ь г г' 'Т ' Е Т ' Е ¿2 ¿2 ¿3 ¿4 ¿5 ¿ои Примечание
10 0 1 0 10 1 0 0 11 0 0 0 0 С1 С 2 С 3 С 4. • С (иэб)
X X X Сб} с
X X ЛБЯ/ X 1 0 1 0 С;}С ™
X X лга,/ X 1 0 1 0 С 1 С } С (ЬУ5) С10 }
0 1 X 1 1 0 0 1 1 0 0 0 С11 | С12 1 С (СУ2) С13 }
1 0 1 1 0 X 0 1 1 0 0 0 С14 С15 С16. ■С (СУ1)
В табл. 2 приведены пересечения кубов, имеющих непустое значение. Вычисления проводились от 2'оах к ¿щ и, фактически, свелись к перебору четырех кубов из покрытия С(цоб).
Таблица 2
а Ь г г' Т ' Е 'Т ¿2 ' Е ¿2 ¿3 ¿4 ¿5 2ои1 Примечание
1 1 X X 1 0 0 0 1 0 0 1 СхП С5П С15П С8П Сю
1 0 0 X /ШК2/ 0 1 0 1 0 1 0 1 С2П С7П Сип С6П С10
1 0 1 X /ШК3/ 0 1 1 0 0 0 1 1 С3п С9п С12п С6п С8
0 X X X X 0 0 0 0 0 0 0 0 С4П СбП С8п С10
Удалив из покрытия промежуточные значения получим покрытие С(г) в формате: а Ь г г' ¿о^:
¿т а Ь г г' 2 ои
1 X X 1 1
11 0 0 X | ШК2| 1
1 0 1 X | 1КЯ3| 1
0 X X X X 0
структура которого соответствует структуре покрытий для типовых вершин и описывает режим вычисления по различным итеративным формулам и режим хранения г= х.
Поиск и верификация недекларированных возможностей. Недекларированные возможности — функциональные возможности программного обеспечения (ПО), не описанные или не соответствующие описанным в документации, при использовании которых возможно нарушение конфиденциальности, доступности или целостности обрабатываемой информации. Реализацией недекларированных возможностей, в частности, являются программные закладки.
Программные закладки — преднамеренно внесенные в ПО функциональные объекты, которые при определенных условиях (входных данных) инициируют выполнение не описанных в документации функций ПО, приводящих к нарушению конфиденциальности, доступности или целостности обрабатываемой информации [4].
Определим недекларированные возможности в общем виде как все особенности и возможности вычислительного процесса (ВП), порождаемого программой в ходе ее исполнения, не описанные в декларации. Природа НДВ носит как объективный, так и субъективный ха-
рактер в силу сложности и размерности самого программного продукта (ПП). Однако можно выделить, в общих чертах, основные источники и составляющие части НДВ:
1) наличие в ПП специально предусмотренных закладок для наблюдения за ВП и его отладки в ходе проектирования и реализации;
2) исключение излишне мелких подробностей ВП при составлении декларации из-за стремления к ее компактности;
3) наличие в частично-определенных булевых функциях f управления ВП неопределенных значений d в виде комплекса Kd(f), который объективно существует, но, как правило, не используется и не описывается.
Поиск и верификацию НДВ можно осуществить путем моделирования вычислительного процесса либо в виде программы, либо на более высоком уровне — в виде графоаналитической модели.
Моделирование ВП проводится с использованием испытательных наборов данных из его декларации посредством прямого исполнения программы в ходе тестовых экспериментов. В ходе экспериментов необходимо фиксировать вершины и дуги, которые достижимы на входе Г;п, вычисляются и наблюдаются через выход Tout в исследуемой программе.
Определение. Множество вершин и дуг графоаналитической модели вычислительного процесса образуют множество НДВ, если они недостижимы в результате тестовых экспериментов, построенных по декларации.
Множество задействованных вершин и дуг графа образуют декларированные возможности (ДВ) ВП и соответственно программы его реализующей. Таким образом, все множество вершин и дуг M(v,d) распадается на два подмножества МДВ и МНДВ: M(V,D)=M^u МНДВ. Указанные подмножества можно построить путем моделирования константных неточностей условий-предикатов (ml= 1 (T) и m°= о (F)), непосредственно вводя их либо в программу [5], либо в условные вершины графоаналитической модели ВП, при условии, что такая модель построена. С этой целью в ходе тестовых экспериментов производится сравнение результатов вычислений при отсутствии неточностей и с заданной неточностью m? е M, где M — все множество условий-предикатов. Условие-предикат может полностью не проверяться или проверяться только в одном из значений T или F. В этом смысле множество непроверяемых неточностей и формирует множество вершин и дуг, образующих НДВ.
Поиск и верификация don't care. Для любой булевой функции f от n переменных область определения состоит из 2n их значений, задающих канонические формыf Это множество
значений может быть сопоставлено с вершинами n-мерного двоичного куба Е^; для упрощения
логических выражений можно применять исчисление кубических комплексов путем построения неизбыточных покрытий в виде дизъюнктивных нормальных форм (простых импликант) или в виде скобочных форм (полученных методом функциональной декомпозиции). Первый способ применяется при реализации ВП в виде логических схем, а второй — в виде ПП.
В случае частично-определенных булевых функций область определения из 2n значений
разбивается на два подмножества M1 и Md: M1 u Md= Е2 и M1 п M = 0. Множество M1 состоит из конъюнкций, которые могут быть вычислены в значениях, равных единице, а множество Md состоит из конъюнкций, тождественно равных нулю. Значения функции f на конъюнкциях из Md
принято обозначать как d, образующие значение f в виде don't care, т.е. значение функции f „безразличное" и может быть произвольно присоединено к любой функции управления z, построенной на множестве M1.
В случае если булевы переменные задаются в виде отношений-неравенств, то значениям d соответствуют системы неравенств, для которых отсутствуют решения, и соответственно множество отношений между переменными, входящими в левую и правую части неравенств, дают пустое пересечение.
Итак, определим множество конъюнкций don't care как множество конъюнкций, тождественно равных нулю. Поиск таких конъюнкций может быть осуществлен либо непосредственным решением систем неравенств в аналитической форме, либо методом моделирования отношений на числовой оси в виде линий Ламберта или на плоскости в виде диаграмм Эйлера — Венна непосредственным заданием этих множеств [6].
Верификация don't care состоит в построении покрытий с1для M1 и Cd для Md, которые позволяют производить поиск don't care в сокращенной форме для подмножеств из M и, следовательно, сократить перебор при решении систем неравенств-отношений.
Рассмотрим описанные выше положения на примере. Пусть на числовых осях х и y заданы четыре отношения:
a: х < 4, b : х > 5, c : y < 3, d: y > 6.
Здесь отношения a и b не зависят от значений c и d, поэтому поиск don't care можно произвести раздельно.
Итак, если х<4 и х>5, то эта система неравенств не имеет решения, т.е. на числовой оси х невозможно найти значения х, удовлетворяющие конъюнкции a=b=1, т.е. ab= 0, которое и есть don't care. Аналогично, конъюнкция c=d=1 также не имеет решения и cd= 0 образует don't care для y<3 и y>6.
Покрытие множества Md относительно множества отношений {a,b,c,d} компактно можно записать в виде двух кубов:
a b c d
Сd =■
1 1
X X
X X
1 1
Аналогично можно для верификации don't care построить покрытие для
M1
в виде
трех кубов:
a b c d
С1 =
X
0
X
0
X
X
0
0
X
X
Заметим, что с1 u Cd= Е2 и с1 п Cd= 0
0 0
, что и свидетельствует о рассмотрении всех
конъюнкций для отношений |а,Ь,с,^}.
Указанные решения проиллюстрированы на рис. 2.
а)
б)
cd
1 3 4 5
2 9 6
1 8 7 —►
ab
00 01 11 10
4
5
00 01 11 10
(х<4 или х>5) и (y<3 или y>6)
1 А d ч 1
1 V d >
d d d d
d 1
С1 u Сй= Е2 и С1 П Сй= 0
Рис. 2
Так, на рис. 2, а показаны отношения [а,Ь,с^ в системе координат ху: видно, что число существующих решений для системы неравенств равно 9, а оставшиеся 7 отношений решений
2 1 не имеют. На развертке куба Еп в виде карты Карно (рис. 2, б) вершины множества М обозначены как 1, а множества М — как d.
3
Из рассмотренного примера видно, что задача поиска и верификации don't care состоит в переборе всех вариантов решений. Этот перебор может быть сокращен, если решения искать сразу в кубической форме.
Мертвый код как следствие don't care. Определим понятие мертвого кода (МК) как множество команд программы, которые не могут быть исполнены ни при каких значениях конъюнкций условий-предикатов. Это может быть только в том случае, если данные конъюнкции тождественно равны нулю. Такие конъюнкции и образуют множества don't care и порождают частично-определенные булевы функции. Если они запрограммированы в явном виде, то операторы программы, заданные только через них, никогда не будут исполняться. Иными словами, мертвый код всегда есть следствие don't care.
Такие конъюнкции могут быть заданы на уровне булевых переменных в виде явных тавтологий, например, a v a и aa, или в виде избыточных выражений, например, a v ab, a v ab и т.п. Указанная избыточность может быть следствием ошибок при программировании условий, например при настройке стандартных шаблонов, и если это ошибка, а не умысел, то она должна быть устранена путем минимизации логических выражений. Заметим, что для настраиваемых шаблонов don't care может быть только вычислено и указано, в противном случае теряется сам смысл шаблонов как стандартного и апробированного решения.
Если же don't care запрограммировано сознательно в виде артефакта, то порождаемые операторы образуют закладки. Эти закладки не могут быть обнаружены через тестовые эксперименты по полной декларации, т. е. декларации, содержащей декларированные и недекла-рированные возможности программы. В этом и состоит принципиальное различие между мертвым кодом и НДВ.
Мертвый код может быть в неявном виде задан при программировании отношений-неравенств, в этом случае необходимо осуществлять поиск don't care через решение систем неравенств. Для простоты рассмотрения приведем примеры мертвого кода в виде условных выражений над булевыми переменными. Пусть заданы условные выражения, реализующие операторы £1 и S2, которые могут быть операторами присваивания, перехода, обращения к процедурам или, в общем случае, любыми, в свою очередь, составными операторами, модулями или блоками. Итак, пусть заданы два условных выражения:
if ( aa ) then S1 else S2 и if (a v a ) then S1 else S2. В первом выражении никогда не будет исполняться оператор S1, а во втором — оператор S2. Операторы S1 и S2 в данном контексте могут рассматриваться как специально сделанные закладки. Конъюнкции, тождественно равные нулю, показаны на рис. 3 в виде функций управ-
Рис. 3
Заключение. Наличие в вычислительном процессе, порождаемом программой при интерпретации ее команд процессором, недекларированных возможностей или мертвого кода несет в себе явную (НДВ) или неявную (МК) угрозу безопасности программному продукту.
Эта угроза может быть реализована, например, в виде компьютерного вируса. Поэтому поиск и верификация НДВ и МК является основной задачей в области защиты информации. Решение этой задачи конструктивно может быть найдено путем построения графоаналитической модели или, в частном случае, построения булева графа для функции управления вычислительным процессом. Для сокращения размерности задачи поиска НДВ и МК вычислительный процесс на графоаналитической модели следует разбивать на параллельные структуры БЯ. Такое разбиение позволяет локализовать поиск и верификацию НДВ и МК в рамках отдельно взятой параллельной структуры и не рассматривать все множество реализованных в программе условий-предикатов совместно.
1. Немолочнов О. Ф., Зыков А. Г., Поляков В. И. Комплексные кубические покрытия и графоаналитические модели как средство описания вычислительных процессов программ // Тр. Междунар. науч.-техн. конф. „Интеллектуальные системы" (А1Б'06) и „Интеллектуальные САПР" (САЭ-2006). М.: Физматлит, 2006. Т 2.
2. Модель и примитивы покрытий вершин циклических вычислительных процессов / О. Ф. Немолочнов, А. Г. Зыков, Л. Г.Осовецкий, В. И. Поляков // Изв. вузов. Приборостроение. 2007. Т. 50, № 8. С. 18—23.
3. Немолочнов О. Ф., Зыков А. Г., Поляков В. И. Кубические покрытия логических условий вычислительных процессов программ // Научно-технический вестник СПбГУ ИТМО. 2004. № 14. С. 225—233.
4. Руководящий документ Гостехкомиссии России „Защита от несанкционированного доступа к информации. Часть 1. Программное обеспечение средств защиты информации. Классификация по уровню контроля отсутствия недекларированных возможностей". Введ. 04.06.1999 г.
5. Тестирование логических неисправностей вычислительных процессов в программах / О. Ф. Немолочнов, А. Г. Зыков, Л. Г.Осовецкий, В. И. Поляков, К. В. Петров // Информационные технологии. 2007. № 12. С. 2—5.
6. КондаковН. И. Логический словарь. М.: Наука. 1971. 656 с.
СПИСОК ЛИТЕРАТУРЫ
Сведения об авторах
Олег Фомич Немолочнов
д-р техн. наук, профессор; Санкт-Петербургский национальный исследовательский университет информационных технологий, механики и оптики, кафедра информатики и прикладной математики;
E-mail: [email protected]
Леонид Георгиевич Осовецкий
д-р техн. наук, профессор; Центральный научно-исследовательский институт связи, Санкт-Петербург; E-mail: [email protected]
Рекомендована кафедрой информатики и прикладной математики НИУ ИТМО
Поступила в редакцию 01.07.13 г.