Описание и выполнение тестов политики безопасности решения на базе KasperskyOS

Тестирование политики безопасности решения выполняется, чтобы проверить, разрешает ли политика то, что должна разрешать, и запрещает ли она то, что должна запрещать.

Чтобы описать набор тестов политики безопасности решения, нужно использовать декларацию:

assert "<название набора тестов>" {

// Конструкции на языке PAL (Policy Assertion Language)

[setup {<начальная часть тестов>}]

sequence "<название теста>" {<основная часть теста>}

...

[finally {<конечная часть тестов>}]

}

Можно описать несколько наборов тестов, используя несколько таких деклараций.

Описание набора тестов опционально включает начальную часть тестов и/или конечную часть тестов. Выполнение каждого теста из набора начинается с того, что описано в начальной части, и завершается тем, что описано в конечной части. Это позволяет не описывать повторяющиеся начальные и/или конечные части тестов в каждом тесте.

После выполнения каждого теста все изменения в модуле безопасности Kaspersky Security Module, связанные с выполнением этого теста, "откатываются".

Каждый тест включает один или несколько тестовых примеров.

Тестовые примеры

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

Когда выполняется тест, тестовые примеры выполняются в той последовательности, в которой они описаны. То есть можно проверить, как модуль безопасности обрабатывает последовательность событий безопасности.

Если все тестовые примеры в тесте проходят, тест проходит. Если хотя бы один тестовый пример в тесте не проходит, тест не проходит. Выполнение теста завершается на первом тестовом примере, который не проходит.

Описание тестового примера создается на языке PAL и представляет собой последовательность значений:

[ожидаемое решение модуля безопасности] ["название тестового примера"] <вид события безопасности> <селекторы события безопасности> [{значения параметров интерфейсного метода}]

В качестве ожидаемого решения модуля безопасности можно указать значение grant ("разрешено"), deny ("запрещено") или any ("любое решение"). Если ожидаемое решение модуля безопасности не указано, ожидается решение "разрешено". Если указано значение any, решение модуля безопасности не влияет на то, проходит тестовый пример или нет. В этом случае тестовый пример может не пройти из-за ошибок обработки IPC-сообщения модулем безопасности (например, при некорректной структуре IPC-сообщения).

О видах и селекторах событий безопасности, а также об ограничениях использования селекторов см. "Привязка методов моделей безопасности к событиям безопасности". Селекторы должны обеспечивать, чтобы описанию события безопасности соответствовали IPC-сообщения одного типа. (В привязках методов моделей безопасности к событиям безопасности селекторы могут не обеспечивать это.)

В описаниях событий безопасности вместо имени класса процессов (и ядра KasperskyOS) нужно указывать SID. Исключение составляют события вида execute, при наступлении которых SID запускаемого процесса (или ядра) неизвестен. Чтобы сохранить SID процесса или ядра в переменную, нужно использовать оператор <- в описании тестового примера вида:

<имя переменной> <- execute dst=<имя класса процессов/ядро> ...

Переменной будет присвоено значение SID, даже если запуск процесса заданного класса (или ядра) запрещен тестируемой политикой, но решение "запрещено" является ожидаемым.

В языке PAL поддерживаются сокращенные формы описаний событий безопасности:

Если у интерфейсного метода есть параметры, то их значения задаются разделенными запятой конструкциями:

<имя параметра> : <значение>

Имена и типы параметров должны соответствовать IDL-описанию. Порядок следования параметров не важен.

Пример задания значений параметров

{ param1 : 23, param2 : "bar", param3: { collection : [5,7,12], filehandle : 15 }, param4 : { name : ["foo", "baz" } }

В этом примере через параметр param1 передается число. Через параметр param2 передается строковый буфер. Через параметр param3 передается структура, состоящая из двух полей. Поле collection содержит массив или последовательность из трех числовых элементов. Поле filehandle содержит SID. Через параметр param4 передается объединение или структура с одни полем. Поле name содержит массив или последовательность из двух строковых буферов.

В настоящее время в качестве значения параметра типа Handle можно указывать только SID, а возможности указать SID совместно с маской прав дескриптора нет. Поэтому нельзя тестировать политику безопасности решения в тех случаях, когда маски прав дескрипторов влияют на решения модуля безопасности.

Примеры описаний тестов политик

См. "Примеры описаний тестов политик безопасности решений на базе KasperskyOS".

Тестовая процедура

Описания тестов помещаются в PSL-файлы, включая те, которые содержат описание политики безопасности решения (например, в файл security.psl).

Чтобы выполнить тесты, нужно использовать параметр --tests run при запуске компилятора nk-psl-gen-c:

$ nk-psl-gen-c --tests run <остальные параметры> security.psl

Также компилятору nk-psl-gen-c нужно указать следующие сведения:

Компилятор nk-psl-gen-c генерирует исходный код модуля безопасности и тестов на языке C, сохраняет его в файл, а затем запускает компиляцию этого кода с использованием gcc и выполнение полученной тестовой программы. Тестовая программа запускается в среде, где установлен KasperskyOS SDK, то есть на компьютере под управлением ОС Linux. Ядро KasperskyOS, а также системное и прикладное ПО решения не используются.

Чтобы сгенерировать исходный код модуля безопасности и тестов, но не компилировать его, нужно использовать параметр --tests generate при запуске компилятора nk-psl-gen-c.

По умолчанию результаты тестирования выводятся в консоль. Чтобы вывести результаты тестирования в файл, нужно использовать параметр --test-output <путь к файлу> при запуске компилятора nk-psl-gen-c.

Пример результатов тестирования:

# PAL test run

## Execute (1/2)

* Happy path: FAIL

Step 2/2: ExpectGrant Execute "This should not fail"

component/secure_platform/kss/nk/psl/nk-psl-gen-c/tests/examples/include/router.psl:38:5-40:3

* No rule: PASS

## IPC (2/2)

* Happy path: PASS

* No rule: PASS

## Security (2/2)

* Happy path: PASS

* No rule: PASS

Результаты тестирования содержат сведения о том, прошел или не прошел каждый тест. Если тест не прошел, то указывается, какой тестовый пример из этого теста не прошел, а также сведения о размещении описания непрошедшего тестового примера в PSL-файле.

В начало