KasperskyOS Community Edition 1.1

Содержание

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

Описание политики безопасности решения на базе KasperskyOS (далее также описание политики безопасности решения, описание политики) представляет собой набор связанных между собой текстовых файлов с расширением psl, которые содержат декларации на языке PSL. Одни файлы ссылаются на другие через декларацию включения, в результате чего образуется иерархия файлов с одним файлом верхнего уровня. Файл верхнего уровня специфичен для решения. Файлы нижнего и промежуточных уровней содержат части описания политики безопасности решения, которые могут быть специфичными для решения или могут быть повторно использованы в других решениях.

Часть файлов нижнего и промежуточных уровней поставляется в составе SDK KasperskyOS. Эти файлы содержат определения базовых типов данных и формальные описания моделей безопасности KasperskyOS. Модели безопасности KasperskyOS (далее модели безопасности) – это фреймворк для реализации политик безопасности решений на базе KasperskyOS. Файлы с формальными описаниями моделей безопасности ссылаются на файл с определениями базовых типов данных, которые используются в описаниях моделей.

Другая часть файлов нижнего и промежуточных уровней создается разработчиком описания политики, если какие-либо части описания политики требуется повторно использовать в других решениях. Также разработчик описания политики может помещать части описания политики в отдельные файлы для удобства редактирования.

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

Файл верхнего уровня, как правило, называется security.psl, но может иметь любое другое имя вида *.psl.

В этом разделе

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

Синтаксис языка PSL

Модели безопасности KasperskyOS

В начало
[Topic ssp_descr]

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

В упрощенном представлении описание политики безопасности решения на базе KasperskyOS состоит из привязок, которые ассоциируют описания событий безопасности с вызовами методов, предоставляемых объектами моделей безопасности. Объект модели безопасности – это экземпляр класса, определение которого является формальным описанием модели безопасности (в PSL-файле). Формальные описания моделей безопасности содержат сигнатуры методов моделей безопасности, которые определяют допустимость взаимодействий процессов между собой и с ядром KasperskyOS. Эти методы делятся на два вида:

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

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

События безопасности – это сигналы об инициации взаимодействий процессов между собой и с ядром KasperskyOS. К событиям безопасности относятся следующие события:

  • отправка IPC-запросов клиентами;
  • отправка IPC-ответов серверами или ядром;
  • инициация запусков процессов ядром или процессами;
  • запуск ядра;
  • обращения процессов к модулю безопасности Kaspersky Security Module через интерфейс безопасности.

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

Модели безопасности

В составе KasperskyOS SDK поставляются PSL-файлы, которые описывают следующие модели безопасности:

  • Base – методы, реализующие простейшую логику;
  • Pred – методы, реализующие операции сравнения;
  • Bool – методы, реализующие логические операции;
  • Math – методы, реализующие операции целочисленной арифметики;
  • Struct – методы, обеспечивающие доступ к структурным элементам данных (например, доступ к параметрам интерфейсных методов, передаваемых в IPC-сообщениях);
  • Regex – методы для валидации текстовых данных по регулярным выражениям;
  • HashSet – методы для работы с одномерными таблицами, ассоциированными с ресурсами;
  • StaticMap – методы для работы с двумерными таблицами типа "ключ–значение", ассоциированными с ресурсами;
  • Flow – методы для работы с конечными автоматами, ассоциированными с ресурсами;
  • Mic – методы для реализации мандатного контроля целостности (англ. Mandatory Integrity Control, MIC).

Обработка событий безопасности модулем безопасности Kaspersky Security Module

Модуль безопасности Kaspersky Security Module вызывает все методы (правила и выражения) моделей безопасности, связанные с произошедшим событием безопасности. Если все правила вернули результат "разрешено", модуль безопасности возвращает решение "разрешено". Если хотя бы одно правило вернуло результат "запрещено", модуль безопасности возвращает решение "запрещено".

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

Если с произошедшим событием безопасности не связано ни одно правило, модуль безопасности возвращает решение "запрещено". То есть все взаимодействия компонентов решения между собой и с ядром KasperskyOS, которые явно не разрешены политикой безопасности решения, запрещены (принцип Default Deny).

Аудит безопасности

Аудит безопасности (далее также аудит) представляет собой следующую последовательность действий. Модуль безопасности Kaspersky Security Module сообщает ядру KasperskyOS сведения о решениях, принятых этим модулем. Затем ядро передает эти данные системной программе Klog, которая декодирует их и передает системной программе KlogStorage (передача данных осуществляется через IPC). Последняя выводит полученные данные через стандартный вывод или сохраняет в файл.

Данные аудита безопасности (далее данные аудита) – это сведения о решениях модуля безопасности Kaspersky Security Module, которые включают сами решения ("разрешено" или "запрещено"), описания событий безопасности, результаты вызовов методов моделей безопасности, а также данные о некорректности IPC-сообщений. Данные о вызовах выражений моделей безопасности входят в данные аудита так же, как и данные о вызовах правил моделей безопасности.

В начало
[Topic ssp_descr_general_inf]

Синтаксис языка PSL

Базовые правила

  1. Декларации могут располагаться в файле в любом порядке.
  2. Одна декларация может быть записана в одну или несколько строк. Вторая и последующие строки декларации должны быть записаны с отступами относительно первой строки. Закрывающая фигурная скобка, которая завершает декларацию, может быть записана на уровне первой строки.
  3. В многострочной декларации используются отступы разных размеров, чтобы отразить вложенность конструкций, составляющих эту декларацию. Вторая и последующие строки многострочной конструкции, заключенные в фигурные скобки, должны быть записаны с отступом относительно первой строки этой конструкции. Закрывающая фигурная скобка многострочной конструкции может быть записана с отступом или на уровне первой строки конструкции.
  4. Язык PSL чувствителен к регистру символов.
  5. Поддерживаются однострочные и многострочные комментарии:

    /* Это комментарий

    * И это тоже */

    // Ещё один комментарий

Типы деклараций

В языке PSL есть следующие типы деклараций:

  • описание глобальных параметров политики безопасности решения;
  • включение PSL-файлов;
  • включение EDL-файлов;
  • создание объектов моделей безопасности;
  • привязка методов моделей безопасности к событиям безопасности;
  • описание профилей аудита безопасности;
  • описание тестов политики безопасности решения.

В этом разделе

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

Включение PSL-файлов

Включение EDL-файлов

Создание объектов моделей безопасности

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

Описание профилей аудита безопасности

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

Типы данных в языке PSL

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

Примеры описаний простейших политик безопасности решений на базе KasperskyOS

Примеры описаний профилей аудита безопасности

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

В начало
[Topic ssp_descr_psl_syntax_intro]

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

Глобальными являются следующие параметры политики безопасности решения:

  • Execute-интерфейс, через который ядро KasperskyOS обращается к модулю безопасности Kaspersky Security Module, чтобы сообщить о запуске ядра или об инициации запуска процесса ядром или другими процессами. Чтобы задать этот интерфейс, нужно использовать декларацию:

    execute: kl.core.Execute

    В настоящее время в KasperskyOS поддерживается только один execute-интерфейс Execute, определенный в файле kl/core/Execute.idl. (Этот интерфейс состоит из одного метода main, который не имеет параметров и не выполняет никаких действий. Метод main зарезервирован для возможного использования в будущем.)

  • [Опционально] Глобальный профиль аудита безопасности и начальный уровень аудита безопасности. Чтобы задать эти параметры, нужно использовать декларацию:

    audit default = <имя профиля аудита безопасности> <уровень аудита безопасности>

    Пример:

    audit default = global 0

    По умолчанию в качестве глобального используется пустой профиль аудита безопасности empty, описанный в файле toolchain/include/nk/base.psl из состава KasperskyOS SDK, и уровень аудита безопасности 0.

В начало
[Topic ssp_descr_psl_syntax_global_params]

Включение PSL-файлов

Для включения PSL-файла нужно использовать декларацию:

use <ссылка на PSL-файл._>

Ссылка на PSL-файл представляет собой путь к PSL-файлу (без расширения и точки перед ним) относительно директории, которая включена в набор директорий, где компилятор nk-psl-gen-c ищет PSL-, IDL-, CDL-, EDL-файлы. (Этот набор директорий задается параметрами -I <путь к файлам> при запуске скрипта makekss или компилятора nk-psl-gen-c.) В качестве разделителя в описании пути используется точка. Декларация завершается последовательностью символов ._.

Пример:

use policy_parts.flow_part._

Эта декларация включает файл flow_part.psl, который находится в директории policy_parts. Директория policy_parts должна находиться в одной из директорий, где компилятор nk-psl-gen-c выполняет поиск PSL-, IDL-, CDL-, EDL-файлов. Например, директория policy_parts может располагаться в одной директории с PSL-файлом, содержащим эту декларацию.

Включение PSL-файла с формальным описанием модели безопасности

Чтобы использовать методы требуемой модели безопасности, нужно включить PSL-файл с формальным описанием этой модели. PSL-файлы с формальными описаниями моделей безопасности находятся в KasperskyOS SDK по пути:

toolchain/include/nk

Пример:

/* Включение файла base.psl с формальным описанием модели

* безопасности Base */

use nk.base._

/* Включение файла flow.psl с формальным описанием модели

* безопасности Flow */

use nk.flow._

/* Компилятор nk-psl-gen-c должен быть настроен на поиск

* PSL-, IDL-, CDL-, EDL-файлов в директории toolchain/include. */

В начало
[Topic ssp_descr_psl_syntax_include_psl]

Включение EDL-файлов

Чтобы включить EDL-файл для ядра KasperskyOS, нужно использовать декларацию:

use EDL kl.core.Core

Чтобы включить EDL-файл для программы (например, для драйвера или прикладной программы), нужно использовать декларацию:

use EDL <ссылка на EDL-файл>

Ссылка на EDL-файл представляет собой путь к EDL-файлу (без расширения и точки перед ним) относительно директории, которая включена в набор директорий, где компилятор nk-psl-gen-c ищет PSL-IDL-, CDL-, EDL-файлы. (Этот набор директорий задается параметрами -I <путь к файлам> при запуске скрипта makekss или компилятора nk-psl-gen-c.) В качестве разделителя в описании пути используется точка.

Пример:

/* Включение файла UART.edl, который находится

* в KasperskyOS SDK по пути sysroot-*-kos/include/kl/drivers. */

use EDL kl.drivers.UART

/* Компилятор nk-psl-gen-c должен быть настроен на поиск

* PSL-, IDL-, CDL-, EDL-файлов в директории sysroot-*-kos/include. */

Компилятор nk-psl-gen-c находит IDL-, CDL-файлы через EDL-файлы, так как EDL-файлы содержат ссылки на соответствующие CDL-файлы, а CDL-файлы содержат ссылки на соответствующие CDL-, IDL-файлы.

В начало
[Topic ssp_descr_psl_syntax_include_edl]

Создание объектов моделей безопасности

Для вызова методов требуемой модели безопасности, нужно создать объект этой модели безопасности.

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

policy object <имя объекта модели безопасности : название модели безопасности> {

[параметры объекта модели безопасности]

}

Параметры объекта модели безопасности специфичны для модели безопасности. Описание параметров и примеры создания объектов разных моделей безопасности приведены в разделе "Модели безопасности KasperskyOS".

В начало
[Topic ssp_descr_psl_syntax_create_objects]

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

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

<вид события безопасности> [селекторы события безопасности] {

[профиль аудита безопасности]

<вызываемые правила моделей безопасности>

}

Вид события безопасности

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

  • request – отправка IPC-запросов;
  • response – отправка IPC-ответов;
  • error – отправка IPC-ответов, содержащих сведения об ошибках;
  • security – обращения процессов к модулю безопасности Kaspersky Security Module через интерфейс безопасности;
  • execute – инициация запусков процессов или запуск ядра KasperskyOS.

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

Для запуска процессов не используется механизм IPC. Но когда инициируется запуск процесса, ядро обращается к модулю безопасности, сообщая сведения об инициаторе запуска и запускаемом процессе. Поэтому с точки зрения разработчика описания политики можно считать, что запуск процесса – это передача IPC-сообщения от инициатора запуска к запускаемому процессу. Также при запуске ядра можно считать, что ядро отправляет IPC-сообщение самому себе.

Селекторы события безопасности

Селекторы события безопасности позволяют уточнить описание события безопасности заданного вида. Используются следующие селекторы:

  • src=<имя класса процессов/ядро> – процессы заданного класса или ядро KasperskyOS являются источниками IPC-сообщений;
  • dst=<имя класса процессов/ядро> – процессы заданного класса или ядро являются приемниками IPC-сообщений;
  • interface=<имя интерфейса> – описывает следующие события безопасности:
    • клиенты пытаются использовать службы серверов или ядра с заданным интерфейсом;
    • процессы обращаются к модулю безопасности Kaspersky Security Module через заданный интерфейс безопасности;
    • серверы или ядро отправляют клиентам результаты использования служб с заданным интерфейсом;
  • component=<имя компонента> – описывает следующие события безопасности:
    • клиенты пытаются использовать службы серверов или ядра, предоставляемые заданным компонентом;
    • серверы или ядро отправляют клиентам результаты использования служб, предоставляемых заданным компонентом;
  • endpoint=<квалифицированное имя службы> – описывает следующие события безопасности:
    • клиенты пытаются использовать заданную службу серверов или ядра;
    • серверы или ядро отправляют клиентам результаты использования заданной службы;
  • method=<имя метода> – описывает следующие события безопасности:
    • клиенты пытаются обратиться к серверам или ядру, вызывая заданный метод службы;
    • процессы обращаются к модулю безопасности, вызывая заданный метод интерфейса безопасности;
    • серверы или ядро отправляют клиентам результаты вызова заданного метода службы;
    • ядро сообщает о своем запуске модулю безопасности, вызывая заданный метод execute-интерфейса;
    • ядро инициирует запуски процессов, вызывая заданный метод execute-интерфейса;
    • процессы инициируют запуски других процессов, в результате чего ядро вызывает заданный метод execute-интерфейса.

Классы процессов, компоненты, экземпляры компонентов, интерфейсы, службы, методы должны называться так, как они называются в IDL-, CDL-, EDL-описаниях. Ядро должно называться kl.core.Core.

Квалифицированное имя службы является конструкцией вида <путь к службе.имя службы>. Путь к службе представляет собой последовательность разделенных точкой имен экземпляров компонентов, среди которых каждый последующий экземпляр компонента вложен в предыдущий, а последний предоставляет службу с заданным именем.

Для событий вида security нужно указывать квалифицированное имя метода интерфейса безопасности, если требуется использовать интерфейс безопасности, заданный в CDL-описании. (Если требуется использовать интерфейс безопасности, заданный в EDL-описании, указывать квалифицированное имя метода не нужно.) Квалифицированное имя метода интерфейса безопасности является конструкцией вида <путь к интерфейсу безопасности.имя метода>. Путь к интерфейсу безопасности представляет собой последовательность разделенных точкой имен экземпляров компонентов, среди которых каждый последующий экземпляр компонента вложен в предыдущий, а последний поддерживает интерфейс безопасности, который включает метод с заданным именем.

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

Можно использовать комбинации селекторов. При этом селекторы можно разделять запятыми.

На использование селекторов есть ограничения. Для событий безопасности вида execute нельзя использовать селекторы interface, component и endpoint. Для событий безопасности вида security нельзя использовать селекторы dst, component, endpoint.

Также есть ограничения на комбинации селекторов. Для событий безопасности видов request, response и error селектор method можно использовать только совместно с одним из селекторов endpoint, interface, component или их комбинацией. (Селекторы method, endpoint, interface и component должны быть согласованы, то есть метод, служба, интерфейс и компонент должны быть связаны между собой.) Для событий безопасности вида request селектор endpoint можно использовать только совместно с селектором dst. Для событий безопасности видов response и error селектор endpoint можно использовать только совместно с селектором src.

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

Чтобы описанию события безопасности соответствовали IPC-сообщения одного типа, для этого описания должно выполняться одно из следующих условий:

  • Для событий безопасности вида request, response и error однозначно определена цепочка "интерфейсный метод-служба-класс сервера или ядро". Например, описанию события безопасности request dst=Server endpoint=net.Net method=Send соответствуют IPC-сообщения одного типа, а описанию события безопасности request dst=Server соответствуют любые IPC-сообщения, отправляемые серверу Server.
  • Для событий вида security указан метод интерфейса безопасности.
  • Для событий вида execute указан метод execute-интерфейса.

    В настоящее время поддерживается только один фиктивный метод execute-интерфейса main. Этот метод используется по умолчанию, поэтому его можно не задавать через селектор method. Таким образом, любому описанию события безопасности вида execute соответствуют IPC-сообщения одного типа.

Профиль аудита безопасности

Профиль аудита безопасности задается конструкцией audit <имя профиля аудита безопасности>. Если профиль аудита безопасности не задан, используется глобальный профиль аудита безопасности.

Вызываемые правила моделей безопасности

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

[имя объекта модели безопасности.]<имя правила модели безопасности> <параметр>

Входными данными для правил моделей безопасности могут быть значения, возвращаемые выражениями моделей безопасности. Для вызова выражения модели безопасности используется конструкция:

[имя объекта модели безопасности.]<имя выражения модели безопасности> <параметр>

Также в качестве входных данных для методов моделей безопасности (правил и выражений) могут использоваться параметры интерфейсных методов. (О получении доступа к параметрам интерфейсных методов см. "Модель безопасности Struct"). Кроме этого, входными данными для методов моделей безопасности могут быть значения SID процессов и ядра KasperskyOS, которые задаются ключевыми словами src_sid и dst_sid. Первое означает SID процесса (или ядра), который является источником IPC-сообщения. Второе означает SID процесса (или ядра), который является приемником IPC-сообщения (при обращениях к модулю безопасности Kaspersky Security Module dst_sid использовать нельзя).

Для вызовов некоторых правил и выражений моделей безопасности можно не указывать имя объекта модели безопасности, а также можно использовать операторы. Подробнее о методах моделей безопасности см. "Модели безопасности KasperskyOS".

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

В одной декларации можно создать привязку методов моделей безопасности к разным событиям безопасности одного вида. Для этого нужно использовать match-секции, которые представляют собой конструкции вида:

match <селекторы события безопасности> {

[профиль аудита безопасности]

<вызываемые правила моделей безопасности>

}

Match-секции могут быть вложены в другую match-секцию. Match-секция использует одновременно свои селекторы события безопасности и селекторы события безопасности уровня декларации и всех match-секций, которые "оборачивают" эту match-секцию. Также match-секция применяет по умолчанию профиль аудита безопасности своего контейнера (match-секции предыдущего уровня или уровня декларации), но можно задать отдельный профиль аудита безопасности для match-секции.

Также в одной декларации можно задать различные варианты обработки события безопасности в зависимости от условий, при которых это событие наступило (например, от состояния конечного автомата, ассоциированного с ресурсом). Для этого нужно использовать условные секции, которые являются элементами конструкции:

choice <вызов выражения модели безопасности, проверяющего выполнение условий> {

"<условие 1>" : [{] // Условная секция 1

[профиль аудита безопасности]

<вызываемые правила моделей безопасности>

[}]

"<условие 2>" : ... // Условная секция 2

...

_ : ... // Условная секция, если ни одно условие не выполняется.

}

Конструкцию choice можно использовать внутри match-секции. Условная секция использует селекторы события безопасности и профиль аудита безопасности своего контейнера, но можно задать отдельный профиль аудита безопасности для условной секции.

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

В качестве выражения, проверяющего выполнение условий в конструкции choice, можно использовать только те выражения, которые предназначены специально для этого. Некоторые модели безопасности содержат такие выражения (подробнее см. "Модели безопасности KasperskyOS").

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

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

В начало
[Topic ssp_descr_psl_syntax_binding]

Описание профилей аудита безопасности

Для выполнения аудита безопасности нужно ассоциировать объекты моделей безопасности с профилем (профилями) аудита безопасности. Профиль аудита безопасности (далее также профиль аудита) объединяет в себе конфигурации аудита безопасности (далее также конфигурации аудита), каждая из которых задает объекты моделей безопасности, покрываемые аудитом, а также условия выполнения аудита. Можно задать глобальный профиль аудита (подробнее см. "Описание глобальных параметров политики безопасности решения на базе KasperskyOS") и/или назначить профиль (профили) аудита на уровне привязок методов моделей безопасности к событиям безопасности, и/или назначить профиль (профили) аудита на уровне match-секций или choice-секций (подробнее см. "Привязка методов моделей безопасности к событиям безопасности").

Независимо от того, используются профили аудита или нет, данные аудита содержат сведения о решениях "запрещено", которые приняты модулем безопасности Kaspersky Security Module при некорректности IPC-сообщений и обработке событий безопасности, не связанных ни с одним правилом моделей безопасности.

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

audit profile <имя профиля аудита безопасности> =

{ <уровень аудита безопасности> :

// Описание конфигурации аудита безопасности

{ <имя объекта модели безопасности> :

{ kss : <условия выполнения аудита безопасности, связанные с результатами

вызовов правил модели безопасности>

[, условия выполнения аудита безопасности, специфичные для модели безопасности]

}

[,]...

...

}

[,]...

...

}

Уровень аудита безопасности

Уровень аудита безопасности (далее уровень аудита) является глобальным параметром политики безопасности решения и представляет собой беззнаковое целое число, которое задает активную конфигурацию аудита безопасности. (Слово "уровень" здесь означает вариант конфигурации и не предполагает обязательной иерархии.) Уровень аудита можно изменять в процессе работы модуля безопасности Kaspersky Security Module. Для этого используется специальный метод модели безопасности Base, вызываемый при обращении процессов к модулю безопасности через интерфейс безопасности (подробнее см. "Модель безопасности Base"). Начальный уровень аудита задается совместно c глобальным профилем аудита (подробнее см. "Описание глобальных параметров политики безопасности решения на базе KasperskyOS"). В качестве глобального можно явно назначить пустой профиль аудита empty.

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

Уровни аудита можно использовать, например, чтобы регулировать детализацию аудита. Чем выше уровень аудита, тем выше детализация. Чем выше детализация, тем больше объектов моделей безопасности покрывается аудитом и/или меньше ограничений применяется в условиях выполнения аудита.

Другим примером применения уровней аудита является возможность переключать аудит с одной подсистемы на другую (например, переключить аудит, связанный с драйверами, на аудит, связанный с прикладными программами, или аудит, связанный с сетевой подсистемой, на аудит, связанный с графической подсистемой).

Имя объекта модели безопасности

Имя объекта модели безопасности указывается, чтобы методы, которые предоставляются этим объектом, могли быть покрыты аудитом. Эти методы будут покрыты аудитом при их вызовах, если условия выполнения аудита будут соблюдены.

Сведения о решениях модуля безопасности Kaspersky Security Module, содержащиеся в данных аудита, включают как общее решение модуля безопасности, так и результаты вызовов отдельных методов моделей безопасности, покрытых аудитом. Чтобы сведения о решении модуля безопасности попали в данные аудита, нужно, чтобы по крайней мере один метод, вызванный при обработке события безопасности, был покрыт аудитом.

Имена объектов моделей безопасности, как и имена методов, предоставляемых этими объектами, попадают в данные аудита.

Условия выполнения аудита безопасности

Условия выполнения аудита безопасности задаются отдельно для каждого объекта модели безопасности.

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

  • ["granted"] – аудит выполняется, если правила возвращают результат "разрешено";
  • ["denied"] – аудит выполняется, если правила возвращают результат "запрещено";
  • ["granted", "denied"] – аудит выполняется, если правила возвращают результат "разрешено" или "запрещено";
  • [] – аудит не выполняется независимо от того, какой результат возвращают правила.

Условия выполнения аудита, связанные с результатами вызовов правил, не применяются к выражениям. Эти условия должны быть заданы (любой возможной конструкцией), даже если модель безопасности содержит только выражения, поскольку этого требует синтаксис языка PSL.

Условия выполнения аудита, специфичные для моделей безопасности, задаются конструкциями, специфичными для этих моделей (подробнее см. "Модели безопасности KasperskyOS"). Эти условия применяются как к правилам, так и к выражениям. Например, таким условием может быть состояние конечного автомата.

Профиль аудита безопасности для тракта аудита безопасности

Тракт аудита безопасности включает ядро, а также процессы Klog и KlogStorage, которые соединены IPC-каналами по схеме "ядро – Klog – KlogStorage". Методы моделей безопасности, которые связаны с передачей данных аудита через этот тракт, не должны покрываться аудитом. В противном случае это приведет к лавинообразному росту данных аудита, так как передача данных будет порождать новые данные.

Чтобы "подавить" аудит, заданный профилем более широкой области действия (например, глобальным или профилем на уровне привязки методов моделей безопасности к события безопасности), нужно назначить пустой профиль аудита empty на уровне привязки методов моделей безопасности к событиям безопасности или на уровне match-секции либо choice-секции.

Примеры описаний профилей аудита

См. "Примеры описаний профилей аудита безопасности".

В начало
[Topic ssp_descr_psl_syntax_audit]

Описание и выполнение тестов политики безопасности решения на базе 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 поддерживаются сокращенные формы описаний событий безопасности:

  • security: <SID процесса> ! <квалифицированно имя метода интерфейса безопасности> соответствует security src=<SID процесса> method=<квалифицированное имя метода интерфейса безопасности>.
  • request: <SID клиента> ~> <SID сервера/ядра> : <квалифицированное имя службы.имя метода> соответствует request src=<SID клиента> dst=<SID сервера/ядра> endpoint=<квалифицированное имя службы> method=<имя метода>.
  • response: <SID клиента> <~ <SID сервера/ядра> : <квалифицированное имя службы.имя метода> соответствует response src=<SID сервера/ядра> dst=<SID клиента> endpoint=<квалифицированное имя службы> method=<имя метода>.

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

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

Имена и типы параметров должны соответствовать 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 нужно указать следующие сведения:

  • Директории, которые содержат вспомогательные файлы из состава KasperskyOS SDK (common, sysroot-*-kos/include, toolchain/include). Этот набор директорий задается параметрами -I, -include-dir <путь к файлам>.
  • Директории, которые содержат PSL-, IDL-, CDL-, EDL-файлы, относящиеся к решению. Этот набор директорий задается параметрами -I, --include-dir <путь к файлам>.
  • Путь к файлу, в который будет сохранен исходный код модуля безопасности Kaspersky Security Module и тестов. Этот путь задается параметром -o, --output <путь к файлу>.

Компилятор 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-файле.

В начало
[Topic ssp_descr_psl_syntax_testing]

Типы данных в языке PSL

Типы данных, поддерживаемые в языке PSL, приведены в таблице ниже.

Типы данных в языке PSL

Обозначения типов

Описание типов

UInt8, UInt16, UInt32, UInt64

Беззнаковое целое число

SInt8, SInt16, SInt32, SInt64

Знаковое целое число

Boolean

Логический тип

Логический тип включает два значения: true и false.

Text

Текстовый тип

()

Тип Unit

Тип Unit включает одно неизменяемое значение. Используется как заглушка в случаях, когда синтаксис языка PSL требует указать какие-либо данные, но фактически эти данные не требуются. Например, тип Unit можно использовать, чтобы объявить метод, который не имеет параметров (аналогично тому, как тип void используется в C/C++).

"[тип]"

Текстовый литерал

Текстовый литерал включает одно неизменяемое текстовое значение.

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

""

"granted"

<тип>

Целочисленный литерал

Целочисленный литерал включает одно неизменяемое целочисленное значение.

Примеры определений числовых литералов:

12

-5

0xFFFF

<тип 1 | тип 2> [|]...

Вариантный тип

Вариантный тип объединяет два и более типов и может выступать в роли любого из них.

Примеры определений вариантных типов:

Boolean | ()

UInt8 | UInt16 | UInt32 | UInt64

"granted" | "denied"

{ [имя поля : тип поля]

[,] ...

...

}

Словарь

Словарь состоит из полей одного или нескольких типов. Словарь может быть пустым.

Примеры определений словарей:

{}

{ handle : Handle

, rights : UInt32

}

[[тип] [,] ...]

Кортеж

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

Примеры определений кортежей:

[]

["granted"]

[Boolean, Boolean]

Set<<тип элементов>>

Множество

Множество включает ноль и более уникальных элементов одного типа.

Примеры определений множеств:

Set<"granted" | "denied">

Set<Text>

List<<тип элементов>>

Список

Список включает ноль и более элементов одного типа.

Примеры определений списков:

List<Boolean>

List<Text | ()>

Map<<тип ключа, тип значения>>

Ассоциативный массив

Ассоциативный массив включает ноль и более записей типа "ключ-значение" с уникальными ключами.

Пример определения ассоциативного массива:

Map<UInt32, UInt32>

Array<<тип элементов, число элементов>>

Массив

Массив включает заданное число элементов одного типа.

Пример определения массива:

Array<UInt8, 42>

Sequence<<тип элементов, число элементов>>

Последовательность

Последовательность включает от ноля до заданного числа элементов одного типа.

Пример определения последовательности:

Sequence<SInt64, 58>

Псевдонимы некоторых типов PSL

В файле nk/base.psl из состава KasperskyOS SDK определены типы данных, которые используются как типы параметров (или структурных элементов параметров) и возвращаемых значений для методов разных моделей безопасности. Псевдонимы и определения этих типов приведены в таблице ниже.

Псевдонимы и определения некоторых типов данных в языке PSL

Псевдоним типа

Определение типа

Unsigned

Беззнаковое целое число

UInt8 | UInt16 | UInt32 | UInt64

Signed

Знаковое целое число

SInt8 | SInt16 | SInt32 | SInt64

Number

Целое число

Unsigned | Signed

ScalarLiteral

Скалярный литерал

() | Boolean | Number

Literal

Литерал

ScalarLiteral | Text

Sid

Тип идентификатора безопасности SID

UInt32

Handle

Тип идентификатора безопасности SID

Sid

HandleDesc

Словарь, содержащий поля для SID и маски прав дескриптора

{ handle : Handle

, rights : UInt32

}

Cases

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

List<Text | ()>

KSSAudit

Тип данных, задающих условия выполнения аудита безопасности

Set<"granted" | "denied">

Отображение типов IDL на типы PSL

Для описания параметров интерфейсных методов используются типы данных языка IDL. Входные данные для методов моделей безопасности имеют типы из языка PSL. Набор типов данных в языке IDL отличается от набора типов данных в языке PSL. Поскольку параметры интерфейсных методов, передаваемые в IPC-сообщениях, могут использоваться как входные данные для методов моделей безопасности, разработчику описания политики нужно понимать, как типы IDL отображаются на типы PSL.

Целочисленные типы IDL отображаются на целочисленные типы PSL, а также на вариантные типы PSL, объединяющие эти целочисленные типы (в том числе с другими типами). Например, знаковые целочисленные типы IDL отображаются на тип Signed в PSL, целочисленные типы IDL отображаются на тип ScalarLiteral в PSL.

Тип Handle в IDL отображается на тип HandleDesc в PSL.

Объединения и структуры IDL отображаются на словари PSL.

Массивы и последовательности IDL отображаются на массивы и последовательности PSL соответственно.

Строковые буферы в IDL отображаются на текстовый тип PSL.

В настоящее время байтовые буферы в IDL не отображаются на типы PSL. Соответственно, данные, содержащиеся в байтовых буферах, не могут использоваться как входы для методов моделей безопасности.

В начало
[Topic ssp_descr_psl_syntax_data_types]

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

Перед тем как рассматривать примеры, нужно ознакомиться со сведениями о модели безопасности Base.

Обработка инициации запусков процессов

/* Ядру KasperskyOS и любому процессу

* в решении разрешено запускать любой

* процесс. */

execute { grant () }

/* Ядру разрешено запускать процесс

* класса Einit. */

execute src=kl.core.Core, dst=Einit { grant () }

/* Процессу класса Einit разрешено

* запускать любой процесс в решении. */

execute src=Einit { grant () }

Обработка запуска ядра KasperskyOS

/* Ядру KasperskyOS разрешено запускаться.

* (Эта привязка нужна, чтобы сообщить модулю

* безопасности SID ядра. Ядро запускается независимо

* от того, разрешено ли это политикой безопасности решения

* или нет. Если политика безопасности решения запрещает

* запуск ядра, после запуска ядро прекратит свое

* исполнение.) */

execute src=kl.core.Core, dst=kl.core.Core { grant () }

Обработка отправки IPC-запросов

/* Любому клиенту в решении разрешено обращаться к

* любому серверу и ядру KasperskyOS. */

request { grant () }

/* Клиенту класса Client разрешено обращаться

* к любому серверу в решении и ядру. */

request src=Client { grant () }

/* Любому клиенту в решении разрешено обращаться

* к серверу класса Server. */

request dst=Server { grant () }

/* Клиенту класса Client запрещено

* обращаться к серверу класса Server. */

request src=Client dst=Server { deny () }

/* Клиенту класса Client разрешено

* обращаться к серверу класса Server,

* вызывая метод Ping службы net.Net. */

request src=Client dst=Server endpoint=net.Net method=Ping {

grant ()

}

/* Любому клиенту в решении разрешено обращаться

* к серверу класса Server, вызывая метод Send

* службы с интерфейсом MessExch. */

request dst=Server interface=MessExch method=Send {

grant ()

}

Обработка отправки IPC-ответов

/* Серверу класса Server разрешено отвечать на

* обращения клиента класса Client, который

* вызывает метод Ping службы net.Net. */

response src=Server, dst=Client, endpoint=net.Net, method=Ping {

grant ()

}

/* Серверу, который содержит компонент kl.drivers.KIDF,

* предоставляющий службы с интерфейсом monitor, разрешено

* отвечать на обращения клиента класса DriverManager,

* который использует эти службы. */

response dst=DriverManager component=kl.drivers.KIDF interface=monitor {

grant ()

}

Обработка отправки IPC-ответов, содержащих сведения об ошибках

/* Серверу класса Server запрещено сообщать клиенту

* класса Client об ошибках, которые возникают,

* когда клиент обращается к серверу, вызывая метод

* Ping службы net.Net. */

error src=Server, dst=Client, endpoint=net.Net, method=Ping {

deny ()

}

Обработка обращений процессов к модулю безопасности Kaspersky Security Module

/* Процесс класса Sdcard получит решение

* "разрешено" от модуля безопасности Kaspersky Security Module,

* вызывая метод Register интерфейса безопасности.

* (Используется интерфейс безопасности, заданный

* в EDL-описании.) */

security src=Sdcard, method=Register {

grant ()

}

/* Процесс класса Sdcard получит решение "запрещено"

* от модуля безопасности, вызывая метод Comp.Register

* интерфейса безопасности. (Используется интерфейс

* безопасности, заданный в CDL-описании.) */

security src=Sdcard, method=Comp.Register {

deny ()

}

Использование match-секций

/* Клиенту класса Client разрешено обращаться к

* серверу класса Server, вызывая методы Send

* и Receive службы net. */

request src=Client, dst=Server, endpoint=net {

match method=Send { grant () }

match method=Receive { grant () }

}

/* Клиенту класса Client разрешено обращаться к

* серверу класса Server, вызывая методы Send

* и Receive службы sn.Net и методы Write и

* Read службы sn.Storage. */

request src=Client, dst=Server {

match endpoint=sn.Net {

match method=Send { grant () }

match method=Receive { grant () }

}

match endpoint=sn.Storage {

match method=Write { grant () }

match method=Read { grant () }

}

}

Задание профилей аудита

/* Задание глобального профиля аудита default

* и начального уровня аудита 0 */

audit default = global 0

request src=Client, dst=Server {

/* Задание профиля аудита parent на уровне

* привязки методов моделей безопасности к

* событиям безопасности */

audit parent

match endpoint=net.Net, method=Send {

/* Задание профиля аудита child на

* на уровне match-секции */

audit child

grant ()

}

/* В этой match-секции применяется профиль

* аудита parent. */

match endpoint=net.Net, method=Receive {

grant ()

}

}

/* В этой привязке метода модели безопасности

* к событию безопасности применяется профиль

* аудита global. */

response src=Client, dst=Server {

grant ()

}

В начало
[Topic ssp_descr_psl_syntax_binding_examples]

Примеры описаний простейших политик безопасности решений на базе KasperskyOS

Перед тем как рассматривать примеры, нужно ознакомиться со сведениями о моделях безопасности Struct, Base и Flow.

Пример 1

Политика безопасности решения в этом примере разрешает любые взаимодействия процессов классов Client, Server и Einit между собой и с ядром KasperskyOS. При обращении процессов к модулю безопасности Kaspersky Security Module всегда будет получено решение "разрешено". Эту политику можно использовать только в качестве заглушки на ранних стадиях разработки решения на базе KasperskyOS, чтобы модуль безопасности Kaspersky Security Module "не мешал" взаимодействиям. В реальном решении на базе KasperskyOS применять такую политику недопустимо.

security.psl

execute: kl.core.Execute

use nk.base._

use EDL Einit

use EDL Client

use EDL Server

use EDL kl.core.Core

execute { grant () }

request { grant () }

response { grant () }

error { grant () }

security { grant () }

Пример 2

Политика безопасности решения в этом примере накладывает ограничения на обращения клиентов класса FsClient к серверам класса FsDriver. Когда клиент открывает ресурс, управляемый сервером класса FsDriver, с этим ресурсом ассоциируется конечный автомат в состоянии unverified. Клиенту класса FsClient разрешено читать данные из ресурса, управляемого сервером класса FsDriver, только если конечный автомат, ассоциированный с этим ресурсом, находится в состоянии verified. Чтобы перевести конечный автомат, ассоциированный с ресурсом, из состояния unverified в состояние verified, процессу класса FsVerifier нужно обратиться к модулю безопасности Kaspersky Security Module.

В реальном решении на базе KasperskyOS эту политику применять нельзя, поскольку разрешено избыточное множество взаимодействий процессов между собой и с ядром KasperskyOS.

security.psl

execute: kl.core.Execute

use nk.base._

use nk.flow._

use nk.basic._

policy object file_state : Flow {

type States = "unverified" | "verified"

config = {

states : ["unverified" , "verified"],

initial : "unverified",

transitions : {

"unverified" : ["verified"],

"verified" : []

}

}

}

execute { grant () }

request { grant () }

response { grant () }

use EDL kl.core.Core

use EDL Einit

use EDL FsClient

use EDL FsDriver

use EDL FsVerifier

response src=FsDriver, endpoint=operationsComp.operationsImpl, method=Open {

file_state.init {sid: message.handle.handle}

}

request src=FsClient, dst=FsDriver, endpoint=operationsComp.operationsImpl, method=Read {

file_state.allow {sid: message.handle.handle, states: ["verified"]}

}

security src=FsVerifier, method=Approve {

file_state.enter {sid: message.handle.handle, state: "verified"}

}

В начало
[Topic ssp_descr_psl_syntax_simpssp_examples]

Примеры описаний профилей аудита безопасности

Перед тем как рассматривать примеры, нужно ознакомиться со сведениями о моделях безопасности Base, Regex и Flow.

Пример 1

// Описание профиля аудита безопасности trace

// base – объект модели безопасности Base

// session – объект модели безопасности Flow

audit profile trace =

/* Если уровень аудита равен 0, аудитом покрываются

* правила объекта base, когда эти правила возвращают

* результат "запрещено". */

{ 0 :

{ base :

{ kss : ["denied"]

}

}

/* Если уровень аудита равен 1, аудитом покрываются методы

* объекта session в следующих случаях:

* 1. Правила объекта session возвращают результат "разрешено"

* или "запрещено", и конечный автомат находится в состоянии,

* отличном от closed.

* 2. Выражение query объекта session вызывается, и конечный

* автомат находится в состоянии, отличном от closed. */

, 1 :

{ session :

{ kss : ["granted", "denied"]

, omit : ["closed"]

}

}

/* Если уровень аудита равен 2, аудитом покрываются методы

* объекта session в следующих случаях:

* 1. Правила объекта session возвращают результат "разрешено"

* или "запрещено".

* 2. Выражение query объекта session вызывается. */

, 2 :

{ session :

{ kss : ["granted", "denied"]

}

}

}

Пример 2

// Описание профиля аудита безопасности test

// base – объект модели безопасности Base

// re – объект модели безопасности Regex

audit profile test =

/* Если уровень аудита равен 0, правила объекта base

* и выражения объекта re не покрываются аудитом. */

{ 0 :

{ base :

{ kss : []

}

, re :

{ kss : []

, emit : []

}

}

/* Если уровень аудита равен 1, правила объекта

* base не покрываются аудитом, выражения объекта

* re покрываются аудитом.*/

, 1 :

{ base :

{ kss : []

}

, re :

{ kss : []

, emit : ["match", "select"]

}

}

/* Если уровень аудита равен 2, правила объекта base

* и выражения объекта re покрываются аудитом. Правила

* объекта base покрываются аудитом независимо от

* результата, который они возвращают.*/

, 2 :

{ base :

{ kss : ["granted", "denied"]

}

, re :

{ kss : []

, emit : ["match", "select"]

}

}

}

В начало
[Topic ssp_descr_psl_syntax_audit_profile_examples]

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

Пример 1

/* Описание набора тестов, который включает один тест. */

assert "some tests" {

/* Описание теста, который включает четыре тестовых примера. */

sequence "first sequence" {

/* Ожидается, что запуск процесса класс Server разрешен.

* Если это так, переменной s будет присвоено значение SID

* запущенного процесса класса Server. */

s <- execute dst=Server

/* Ожидается, что запуск процесса класс Client разрешен.

* Если это так, переменной c будет присвоено значение SID

* запущенного процесса класса Client. */

c <- execute dst=Client

/* Ожидается, что клиенту класса Client разрешено обращаться к

* серверу класса Server, вызывая метод Ping службы pingComp.pingImpl

* с параметром value, равным 100. */

grant "Client calls Ping" request src=c dst=s endpoint=pingComp.pingImpl

method=Ping { value : 100 }

/* Ожидается, что серверу класса Server запрещено отвечать клиенту

* класса Client, если клиент вызывает метод Ping службы pingComp.pingImpl.

* (IPC-ответ не содержит параметров, так как интерфейсный метод Ping

* не имеет выходных параметров.) */

deny "Server cannot respond" response src=s dst=c endpoint=pingComp.pingImpl

method=Ping {}

}

}

Пример 2

/* Описание набора тестов, который включает два теста. */

assert "ping tests"{

/* Начальная часть каждого из двух тестов */

setup {

s <- execute dst=Server

c <- execute dst=Client

}

/* Описание теста, который включает два тестовых примера. */

sequence "ping-ping is denied" {

/* Ожидается, что клиенту класса Client разрешено обращаться к

* серверу класса Server, вызывая метод Ping службы pingComp.pingImpl

* с параметром value, равным 100. */

c ~> s : pingComp.pingImpl.Ping { value : 100 }

/* Ожидается, что клиенту класса Client запрещено обращаться к

* серверу класса Server, повторно вызывая метод Ping службы pingComp.pingImpl

* с параметром value, равным 100. */

deny c ~> s : pingComp.pingImpl.Ping { value : 100 }

}

/* Описание теста, который включает два тестовых примера. */

sequence "ping-pong is granted" {

/* Ожидается, что клиенту класса Client разрешено обращаться к

* серверу класса Server, вызывая метод Ping службы pingComp.pingImpl

* с параметром value, равным 100. */

c ~> s : pingComp.pingImpl.Ping { value: 100 }

/* Ожидается, что клиенту класса Client разрешено обращаться к

* серверу класса Server, вызывая метод Pong службы pingComp.pingImpl

* с параметром value, равным 100. */

c ~> s : pingComp.pingImpl.Pong { value: 100 }

}

}

Пример 3

/* Описание набора тестов, который включает один тест. */

assert {

/* Описание теста, который включает восемь тестовых примеров. */

sequence {

storage <− execute dst=test.kl.UpdateStorage

manager <− execute dst=test.kl.UpdateManager

deployer <− execute dst=test.kl.UpdateDeployer

downloader <− execute dst=test.kl.UpdateDownloader

grant manager ~>

downloader:UpdateDownloader.Downloader.LoadPackage { url : ”url012345678” }

grant response src=downloader dst=manager endpoint=UpdateDownloader.Downloader

method=LoadPackage { handle : 29, result : 1 }

deny manager ~> deployer:UpdateDeployer.Deployer.Start { handle : 29 }

deny request src=manager dst=deployer endpoint=UpdateDeployer.Deployer

method=Start { handle : 29 }

}

}

В начало
[Topic ssp_descr_psl_syntax_testing_examples][Topic ssp_descr_security_models_intro]

Модель безопасности Pred

Модель безопасности Pred позволяет выполнять операции сравнения.

PSL-файл с описанием модели безопасности Pred находится в KasperskyOS SDK по пути:

toolchain/include/nk/basic.psl

Объект модели безопасности Pred

В файле basic.psl содержится декларация, которая создает объект модели безопасности Pred с именем pred. Соответственно, включение файла basic.psl в описание политики безопасности решения обеспечивает создание объекта модели безопасности Pred по умолчанию.

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

Создавать дополнительные объекты модели безопасности Pred не требуется.

Методы модели безопасности Pred

Модель безопасности Pred содержит выражения, которые выполняют операции сравнения и возвращают значения типа Boolean. Для вызова этих выражений нужно использовать операторы сравнения:

  • <ScalarLiteral> == <ScalarLiteral> – "равно";
  • <ScalarLiteral> != <ScalarLiteral> – "не равно";
  • <Number> < <Number> – "меньше";
  • <Number> <= <Number> – "меньше или равно";
  • <Number> > <Number> – "больше";
  • <Number> >= <Number> – "больше или равно".

Также модель безопасности Pred содержит выражение empty, которое позволяет определить, содержат ли данные свои структурные элементы. Выражение возвращает значения типа Boolean. Если данные не содержат своих структурных элементов (например, множество является пустым), выражение возвращает true, иначе возвращает false. Чтобы вызвать выражение, нужно использовать конструкцию:

pred.empty <Text | Set | List | Map | ()>

В начало
[Topic ssp_descr_security_models_pred]

Модель безопасности Bool

Модель безопасности Bool позволяет выполнять логические операции.

PSL-файл с описанием модели безопасности Bool находится в KasperskyOS SDK по пути:

toolchain/include/nk/basic.psl

Объект модели безопасности Bool

В файле basic.psl содержится декларация, которая создает объект модели безопасности Bool с именем bool. Соответственно, включение файла basic.psl в описание политики безопасности решения обеспечивает создание объекта модели безопасности Bool по умолчанию.

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

Создавать дополнительные объекты модели безопасности Bool не требуется.

Методы модели безопасности Bool

Модель безопасности Bool содержит выражения, которые выполняют логические операции и возвращают значения типа Boolean. Для вызова этих выражений нужно использовать логические операторы:

  • ! <Boolean> – "логическое НЕ";
  • <Boolean> && <Boolean> – "логическое И";
  • <Boolean> || <Boolean> – "логическое ИЛИ";
  • <Boolean> ==> <Boolean> – "импликация" (! <Boolean> || <Boolean>).

Также модель безопасности Bool содержит выражения all, any и cond.

Выражение all выполняет "логическое И" для произвольного числа значений типа Boolean. Возвращает значения типа Boolean. Если передать через параметр пустой список значений ([]), возвращает true. Чтобы вызвать выражение, нужно использовать конструкцию:

bool.all <List<Boolean>>

Выражение any выполняет "логическое ИЛИ" для произвольного числа значений типа Boolean. Возвращает значения типа Boolean. Если передать через параметр пустой список значений ([]), возвращает false. Чтобы вызвать выражение, нужно использовать конструкцию:

bool.any <List<Boolean>>

Выражение cond выполняет тернарную условную операцию. Возвращает значения типа ScalarLiteral. Чтобы вызвать выражение, нужно использовать конструкцию:

bool.cond

{ if : <Boolean> // Условие

, then : <ScalarLiteral> // Значение, возвращаемое при истинности условия

, else : <ScalarLiteral> // Значение, возвращаемое при ложности условия

}

Помимо выражений модель безопасности Bool включает правило assert, которое работает так же, как одноименное правило модели безопасности Base.

В начало
[Topic ssp_descr_security_models_bool]

Модель безопасности Math

Модель безопасности Math позволяет выполнять операции целочисленной арифметики.

PSL-файл с описанием модели безопасности Math находится в KasperskyOS SDK по пути:

toolchain/include/nk/basic.psl

Объект модели безопасности Math

В файле basic.psl содержится декларация, которая создает объект модели безопасности Math с именем math. Соответственно, включение файла basic.psl в описание политики безопасности решения обеспечивает создание объекта модели безопасности Math по умолчанию.

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

Создавать дополнительные объекты модели безопасности Math не требуется.

Методы модели безопасности Math

Модель безопасности Math содержит выражения, которые выполняют операции целочисленной арифметики. Для вызова части этих выражений нужно использовать арифметические операторы:

  • <Number> + <Number> – "сложение". Возвращает значения типа Number.
  • <Number> - <Number> – "вычитание". Возвращает значения типа Number.
  • <Number> * <Number> – "умножение". Возвращает значения типа Number.

Другая часть включает следующие выражения:

  • neg <Signed> – "изменение знака числа". Возвращает значения типа Signed.
  • abs <Signed> – "получение модуля числа". Возвращает значения типа Signed.
  • sum <List<Number>> – "сложение чисел из списка". Возвращает значения типа Number. Если передать через параметр пустой список значений ([]), возвращает 0.
  • product <List<Number>> – "перемножение чисел из списка". Возвращает значения типа Number. Если передать через параметр пустой список значений ([]), возвращает 1.

Для вызова этих выражений нужно использовать конструкцию:

math.<имя выражения> <параметр>

В начало
[Topic ssp_descr_security_models_math]

Модель безопасности Struct

Модель безопасности Struct позволяет получать доступ к структурным элементам данных.

PSL-файл с описанием модели безопасности Struct находится в KasperskyOS SDK по пути:

toolchain/include/nk/basic.psl

Объект модели безопасности Struct

В файле basic.psl содержится декларация, которая создает объект модели безопасности Struct с именем struct. Соответственно, включение файла basic.psl в описание политики безопасности решения обеспечивает создание объекта модели безопасности Struct по умолчанию.

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

Создавать дополнительные объекты модели безопасности Struct не требуется.

Методы модели безопасности Struct

Модель безопасности Struct содержит выражения, которые обеспечивают доступ к структурным элементам данных. Для вызова этих выражений нужно использовать следующие конструкции:

  • <{...}>.<имя поля> – "получение доступа к полю словаря". Тип возвращаемых данных соответствует типу поля словаря.
  • <List | Set | Sequence | Array>.[<номер элемента>] – "получение доступа к элементу данных". Тип возвращаемых данных соответствует типу элементов. Нумерация элементов начинается с нуля. При выходе за границы набора данных выражение завершается некорректно, и модуль безопасности Kaspersky Security Module возвращает решение "запрещено".
  • <HandleDesc>.handle – "получение SID". Возвращает значения типа Handle. (О взаимосвязи между дескрипторами и значениями SID см. "Управление доступом к ресурсам").
  • <HandleDesc>.rights – "получение маски прав дескриптора". Возвращает значения типа UInt32.

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

message.<имя параметра интерфейсного метода>

Имя параметра нужно указать в соответствии с IDL-описанием.

Чтобы получить доступ к структурным элементам параметров, нужно использовать конструкции, соответствующие выражениям модели безопасности Struct.

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

В начало
[Topic ssp_descr_security_models_struct]

Модель безопасности Base

Модель безопасности Base позволяет реализовать простейшую логику.

PSL-файл с описанием модели безопасности Base находится в KasperskyOS SDK по пути:

toolchain/include/nk/base.psl

Объект модели безопасности Base

В файле base.psl содержится декларация, которая создает объект модели безопасности Base с именем base. Соответственно, включение файла base.psl в описание политики безопасности решения обеспечивает создание объекта модели безопасности Base по умолчанию. Методы этого объекта можно вызывать без указания имени объекта.

Объект модели безопасности Base не имеет параметров.

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

Необходимость создавать дополнительные объекты модели безопасности Base возникает в следующих случаях:

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

Методы модели безопасности Base

Модель безопасности Base содержит следующие правила:

  • grant ()

    Имеет параметр типа (). Возвращает результат "разрешено".

    Пример:

    /* Клиенту класса foo разрешено

    * обращаться к серверу класса bar. */

    request src=foo dst=bar { grant () }

  • assert <Boolean>

    Возвращает результат "разрешено", если через параметр передать значение true. Иначе возвращает результат "запрещено".

    Пример:

    /* Любому клиенту в решении будет разрешено обращаться к серверу класса

    * foo, вызывая метод Send службы net.Net, если через параметр port

    * метода Send будет передаваться значение больше 80. Иначе любому

    * клиенту в решении будет запрещено обращаться к серверу класса

    * foo, вызывая метод Send службы net.Net. */

    request dst=foo endpoint=net.Net method=Send { assert (message.port > 80) }

  • deny <Boolean | ()>

    Возвращает результат "запрещено", если через параметр передать значение true или (). Иначе возвращает результат "разрешено".

    Пример:

    /* Серверу класса foo запрещено

    * отвечать клиенту класса bar. */

    response src=foo dst=bar { deny () }

  • set_level <UInt8>

    Устанавливает уровень аудита безопасности равным значению, переданному через параметр. Возвращает результат "разрешено". (Подробнее об уровне аудита безопасности см. "Описание профилей аудита безопасности".)

    Пример:

    /* Процесс класса foo получит решение "разрешено" от модуля

    * безопасности Kaspersky Security Module, если вызовет метод интерфейса безопасности

    * SetAuditLevel, чтобы изменить уровень аудита безопасности. */

    security src=foo method=SetAuditLevel { set_level (message.audit_level) }

В начало
[Topic ssp_descr_security_models_base]

Модель безопасности Regex

Модель безопасности Regex позволяет реализовать валидацию текстовых данных по статически заданным регулярным выражениям.

PSL-файл с описанием модели безопасности Regex находится в KasperskyOS SDK по пути:

toolchain/include/nk/regex.psl

Объект модели безопасности Regex

В файле regex.psl содержится декларация, которая создает объект модели безопасности Regex с именем re. Соответственно, включение файла regex.psl в описание политики безопасности решения обеспечивает создание объекта модели безопасности Regex по умолчанию.

Объект модели безопасности Regex не имеет параметров.

Объект модели безопасности Regex может быть покрыт аудитом безопасности. При этом нужно задать условия выполнения аудита, специфичные для модели безопасности Regex. Для этого в описании конфигурации аудита нужно использовать следующие конструкции:

  • emit : ["match"] – аудит выполняется, если вызван метод match;
  • emit : ["select"] – аудит выполняется, если вызван метод select;
  • emit : ["match", "select"] – аудит выполняется, если вызван метод match или select;
  • emit : [] – аудит не выполняется.

Необходимость создавать дополнительные объекты модели безопасности Regex возникает в следующих случаях:

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

Методы модели безопасности Regex

Модель безопасности Regex содержит следующие выражения:

  • match {text : <Text>, pattern : <Text>}

    Возвращает значение типа Boolen. Если текст text соответствует регулярному выражению pattern, возвращает true. Иначе возвращает false.

    Пример:

    assert (re.match {text : message.text, pattern : "[0-9]*"})

  • select {text : <Text>}

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

    Пример:

    choice (re.select {text : "hello world"}) {

    "hello\ .*": grant ()

    ".*world" : grant ()

    _ : deny ()

    }

Синтаксис регулярных выражений модели безопасности Regex

Регулярное выражение для метода match модели безопасности Regex можно записать двумя способами: внутри многострочного блока regex или как текстовый литерал.

При записи регулярного выражения как текстового литерала все вхождения обратного слеша необходимо удвоить.

Например, два регулярных выражения идентичны:

// Регулярное выражение внутри многострочного блока regex

{ pattern:

```regex

Hello\ world\!

```

, text: "Hello world!"

}

// Регулярное выражение как текстовый литерал (обратный слеш удвоен)

{ pattern: "Hello\\ world\\!"

, text: "Hello world!"

}

Регулярные выражения для метода select модели безопасности Regex записываются как текстовые литералы с удвоением обратного слеша.

Регулярное выражение задается в виде строки-шаблона и может содержать:

  • литералы (обычные символы);
  • метасимволы (символы со специальными значениями);
  • пробельные символы;
  • наборы символов;
  • группы символов;
  • операторы для работы с символами.

Регулярные выражения чувствительны к регистру.

Литералы и метасимволы в регулярных выражениях

  • Литералом является любой ASCII-символ, за исключением метасимволов .()*&|!?+[]\ и знака пробела. (Символы Unicode не поддерживаются.)

    Например, регулярному выражению KasperskyOS соответствует текст KasperskyOS.

  • Метасимволы имеют специальные значения, которые приведены в таблице ниже.

    Специальные значения метасимволов

    Метасимвол

    Специальное значение

    []

    Квадратные скобки обозначают начало и конец набора символов.

    ()

    Круглые скобки обозначают начало и конец группы символов.

    *

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

    +

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

    ?

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

    !

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

    |

    Вертикальная черта обозначает оператор выбора между символами (близок по смыслу к союзу "ИЛИ").

    &

    Амперсанд обозначает оператор пересечения нескольких условий (близок по смыслу к союзу "И").

    .

    Точка обозначает соответствие любому символу.

    Например, регулярному выражению K.S соответствуют последовательности символов: KОS, KoS, KES и множество других последовательностей из трех символов, которые начинаются на K и заканчиваются на S, и где второй символ может быть любым: литералом, метасимволом или самой точкой.

    \

    \<metaSymbol>

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

    Например, регулярному выражению, которое состоит из метасимвола точки ., соответствует любой символ, а регулярному выражению, которое состоит из обратного слеша с точкой \., соответствует только сам символ точки.

    Аналогично обратный слеш действует и на самого себя. Регулярному выражению С:\\Users соответствует последовательность символов C:\Users.

  • Символы ^ и $ как обозначения начала и конца строки не используются.

Пробельные символы в регулярных выражениях

  • Знак пробела имеет ASCII-код, равный 20, в шестнадцатеричной системе счисления и ASCII-код, равный 40, в восьмеричной системе счисления. Знак пробела не имеет специального значения, но во избежание неоднозначной трактовки данного символа интерпретатором регулярных выражений, пробел необходимо экранировать.

    Например, регулярному выражению Hello\ world соответствует последовательность символов Hello world.

  • \r

    Символ возврата каретки.

  • \n

    Символ переноса строки.

  • \t

    Символ горизонтальной табуляции.

Определение символа по его восьмеричному или шестнадцатеричному коду в регулярных выражениях

  • \x{<hex>}

    Определение символа его шестнадцатеричным кодом hex из таблицы ASCII-символов. Код символа должен быть меньше, чем 0x100.

    Например, регулярному выражению Hello\x{20}world соответствует последовательность символов Hello world.

  • \o{<octal>}

    Определение символа его восьмеричным кодом octal из таблицы ASCII-символов. Код символа должен быть меньше, чем 0o400.

    Например, регулярному выражению \o{75} соответствует символ =.

Наборы символов в регулярных выражениях

Набор символов задается внутри квадратных скобок [] перечислением или диапазоном символов. Набор символов указывает интерпретатору регулярных выражений, что на этом месте в последовательности символов может стоять только один из перечисленных в наборе или диапазоне символов. Набор символов не может быть пустым.

  • [<BracketSpec>] – набор символов.

    Один символ соответствует любому символу из набора символов BracketSpec.

    Например, регулярному выражению K[OE]S соответствуют последовательности символов KOS и KES.

  • [^<BracketSpec>] – набор символов с инверсией.

    Один символ соответствует любому символу, не входящему в набор символов BracketSpec.

    Например, регулярному выражению K[^OE]S соответствуют последовательности символов KAS, K8S и любые другие последовательности из трех символов, которые начинаются на K и заканчиваются на S, кроме KОS и KES.

Набор символов BracketSpec может быть перечислен явно или определен как диапазон символов. Чтобы определить диапазон символов, первый и последний символ в наборе разделяют дефисом.

  • [<Digit1>-<DigitN>]

    Любая цифра из диапазона Digit1, Digit2, ... ,DigitN.

    Например, регулярному выражению [0-9] соответствует любая цифра. Записи регулярных выражений [0-9] и [0123456789] идентичны.

    Обратите внимание, что диапазон определяется одним символом до и одним символом после дефиса. Регулярному выражению [1-35] соответствуют символы 1, 2, 3 и 5, а не диапазон чисел от 1 до 35.

  • [<Letter1>-<LetterN>]

    Любая латинская буква из диапазона Letter1, Letter2, ... , LetterN (буквы должны быть в одинаковых регистрах).

    Например, регулярному выражению [a-zA-Z] соответствуют все буквы в нижнем и верхнем регистре из таблицы ASCII-символов.

ASCII-код символа верхней границы диапазона должен быть больше ASCII-кода символа нижней границы диапазона.

Например, регулярные выражения типа [5-2] или [z-a] недопустимы.

Знак дефиса (минуса) - рассматривается как специальный символ только внутри набора символов. Вне набора символов дефис является литералом, поэтому дефису не обязан предшествовать метасимвол \. Для использования дефиса как литерала внутри набора символов необходимо указывать его первым или последним в наборе.

Примеры:

Регулярным выражениям [-az] и [az-] соответствуют символы a, z и -.

Регулярному выражению [a-z] соответствует любая из 26 латинских букв от a до z в нижнем регистре.

Регулярному выражению [-a-z] соответствует любая из 26 латинских букв от a до z в нижнем регистре и -.

Циркумфлекс (символ вставки) ^ рассматривается как специальный символ только внутри набора символов, когда он расположен сразу после открывающей квадратной скобки. Вне набора символов циркумфлекс является литералом, поэтому циркумфлексу не обязан предшествовать метасимвол \. Для использования циркумфлекса как литерала внутри набора символов необходимо указывать его не первым в наборе.

Примеры:

Регулярному выражению [0^9] соответствуют символы 0, 9 и ^.

Регулярному выражению [^09] соответствует любой символ, кроме 0 и 9.

Внутри набора символов метасимволы *.&|!?+ теряют свое специальное значение и интерпретируются как литералы, поэтому предварять их метасимволом \ не обязательно. Обратный слеш \ сохраняет свое специальное значение внутри набора символов.

Например, регулярные выражения [a.] и [a\.] идентичны, и им соответствуют символ a и точка как литерал.

Группы символов и операторы в регулярных выражениях

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

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

В синтаксисе определены следующие операторы (перечислены в порядке убывания приоритета):

  • !<Expression>, где Expression может быть символом, набором или группой символов.

    Оператор означает исключение выражения Expression из списка допустимых выражений.

    Примеры:

    Регулярному выражению K!OS соответствуют последовательности символов KoS, KES и множество других последовательностей, которые состоят из трех символов, начинаются на K и заканчиваются на S, кроме KОS.

    Регулярному выражению K!(OS) соответствуют последовательности символов Kos, KES, KOT и множество других последовательностей, которые состоят из трех символов и начинаются на K, кроме KОS.

    Регулярному выражению K![OE]S соответствуют последовательности символов KoS, KeS, K;S и множество других последовательностей, которые состоят из трех символов, начинаются на K и заканчиваются на S, кроме KОS и KES.

  • <Expression>*, где Expression может быть символом, набором или группой символов.

    Оператор означает, что выражение Expression может встретиться в этой позиции ноль или больше раз.

    Примеры:

    Регулярному выражению 0-9* соответствуют последовательности символов 0-, 0-9, 0-99, ... .

    Регулярному выражению (0-9)* соответствуют пустая последовательность "" и последовательности символов 0-9, 0-90-9, ... .

    Регулярному выражению [0-9]* соответствуют пустая последовательность "" и любая непустая последовательность цифр.

  • <Expression>+, где Expression может быть символом, набором или группой символов.

    Оператор означает, что выражение Expression может встретиться в этой позиции один или больше раз.

    Примеры:

    Регулярному выражению 0-9+ соответствуют последовательности символов 0-9, 0-99, 0-999, ... .

    Регулярному выражению (0-9)+ соответствуют последовательности символов 0-9, 0-90-9, ... .

    Регулярному выражению [0-9]+ соответствует любая непустая последовательность цифр.

  • <Expression>?, где Expression может быть символом, набором или группой символов.

    Оператор означает, что выражение Expression может встретиться в данной позиции ноль или один раз.

    Примеры:

    Регулярному выражению https?:// соответствуют последовательности символов http:// и https://.

    Регулярному выражению K(aspersky)?OS соответствуют последовательности символов KOS и KasperskyOS.

  • <Expression1><Expression2> – конкатенация. Expression1 и Expression2 могут быть символами, наборами или группами символов.

    Оператор не имеет обозначения. В результирующем выражении за выражением Expression1 следует выражение Expression2.

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

  • <Expression1>|<Expression2> – дизъюнкция. Expression1 и Expression2 могут быть символами, наборами или группами символов.

    Оператор означает выбор выражения Expression1 или выражения Expression2.

    Примеры:

    Регулярному выражению KO|ES соответствуют последовательности символов KO и ES, но не KОS и не KES, так как оператор конкатенации имеет приоритет выше, чем оператор дизъюнкции.

    Регулярному выражению Press (OK|Cancel) соответствуют последовательности символов Press OK или Press Cancel.

    Регулярному выражению [0-9]|() соответствуют цифры от 0 до 9 или пустая строка.

  • <Expression1>&<Expression2> – конъюнкция. Expression1 и Expression2 могут быть символами, наборами или группами символов.

    Оператор означает пересечение результата выражения Expression1 с результатом выражения Expression2.

    Примеры:

    Регулярному выражению [0-9]&[^3] соответствуют цифры от 0 до 9, кроме 3.

    Регулярному выражению [a-zA-Z]&() соответствуют все латинские буквы и пустая строка.

В начало
[Topic ssp_descr_security_models_regex]

Модель безопасности HashSet

Модель безопасности HashSet позволяет ассоциировать с ресурсами одномерные таблицы уникальных значений одного типа, добавлять и удалять эти значения, а также проверять, входит ли заданное значение в таблицу. Например, можно ассоциировать процесс, в контексте которого выполняется сетевой сервер, с набором портов, который разрешено открывать этому серверу. Эту ассоциацию можно использовать, чтобы проверить, допустимо ли открытие порта, инициированное сервером.

PSL-файл с описанием модели безопасности HashSet находится в KasperskyOS SDK по пути:

toolchain/include/nk/hashmap.psl

В этом разделе

Объект модели безопасности HashSet

Правило init модели безопасности HashSet

Правило fini модели безопасности HashSet

Правило add модели безопасности HashSet

Правило remove модели безопасности HashSet

Выражение contains модели безопасности HashSet

В начало
[Topic ssp_descr_security_models_hashset]

Объект модели безопасности HashSet

Чтобы использовать модель безопасности HashSet, нужно создать объект (объекты) этой модели.

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

Объект модели безопасности HashSet имеет следующие параметры:

  • type Entry – тип значений в таблицах (поддерживаются целочисленные типы, тип Boolean, а также словари и кортежи на базе целочисленных типов и типа Boolean);
  • config – конфигурация пула таблиц:
    • set_size – размер таблицы;
    • pool_size – число таблиц в пуле.

Все параметры объекта модели безопасности HashSet являются обязательными.

Пример:

policy object S : HashSet {

type Entry = UInt32

config =

{ set_size : 5

, pool_size : 2

}

}

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

Необходимость создавать несколько объектов модели безопасности HashSet возникает в следующих случаях:

  • Если нужно по-разному настроить аудит безопасности для разных объектов модели безопасности HashSet (например, для разных объектов можно применять разные профили аудита или разные конфигурации аудита одного профиля).
  • Если нужно различать вызовы методов, предоставляемых разными объектами модели безопасности HashSet (поскольку в данные аудита включается как имя метода модели безопасности, так и имя объекта, предоставляющего этот метод, можно понять, что был вызван метод конкретного объекта).
  • Если нужно использовать таблицы разных размеров и/или с разными типами значений.
В начало
[Topic ssp_descr_security_models_hashset_object]

Правило init модели безопасности HashSet

init {sid : <Sid>}

Ассоциирует свободную таблицу из пула таблиц с ресурсом sid. Если свободная таблица содержит значения после предыдущего использования, то эти значения удаляются.

Возвращает результат "разрешено", если создало ассоциацию таблицы с ресурсом sid.

Возвращает результат "запрещено" в следующих случаях:

  • В пуле нет свободных таблиц.
  • Ресурс sid уже ассоциирован с таблицей из пула таблиц используемого объекта модели безопасности HashSet.
  • Значение sid вне допустимого диапазона.

Пример:

/* Запуск процесса класса Server будет разрешен, если

* при инициации запуска будет создана ассоциация этого

* процесса с таблицей. Иначе запуск процесса класса

* Server будет запрещен. */

execute dst=Server {

S.init {sid : dst_sid}

}

В начало
[Topic ssp_descr_security_models_hashset_init]

Правило fini модели безопасности HashSet

fini {sid : <Sid>}

Удаляет ассоциацию таблицы с ресурсом sid (таблица становится свободной).

Возвращает результат "разрешено", если удалило ассоциацию таблицы с ресурсом sid.

Возвращает результат "запрещено" в следующих случаях:

  • Ресурс sid не ассоциирован с таблицей из пула таблиц используемого объекта модели безопасности HashSet.
  • Значение sid вне допустимого диапазона.
В начало
[Topic ssp_descr_security_models_hashset_fini]

Правило add модели безопасности HashSet

add {sid : <Sid>, entry : <Entry>}

Добавляет значение entry в таблицу, ассоциированную с ресурсом sid.

Возвращает результат "разрешено" в следующих случаях:

  • Правило добавило значение entry в таблицу, ассоциированную с ресурсом sid.
  • В таблице, ассоциированной с ресурсом sid, уже содержится значение entry.

Возвращает результат "запрещено" в следующих случаях:

  • Таблица, ассоциированная с ресурсом sid, полностью заполнена.
  • Ресурс sid не ассоциирован с таблицей из пула таблиц используемого объекта модели безопасности HashSet.
  • Значение sid вне допустимого диапазона.

Пример:

/* Процесс класса Server получит решение "разрешено" от

* модуля безопасности Kaspersky Security Module, вызывая метод интерфейса

* безопасности Add, если при вызове этого метода значение

* 5 будет добавлено в таблицу, ассоциированную с этим

* процессом, или уже содержится в этой таблице. Иначе

* процесс класса Server получит решение "запрещено" от

* модуля безопасности, вызывая метод интерфейса

* безопасности Add. */

security src=Server, method=Add {

S.add {sid : src_sid, entry : 5}

}

В начало
[Topic ssp_descr_security_models_hashset_add]

Правило remove модели безопасности HashSet

remove {sid : <Sid>, entry : <Entry>}

Удаляет значение entry из таблицы, ассоциированной с ресурсом sid.

Возвращает результат "разрешено" в следующих случаях:

  • Правило удалило значение entry из таблицы, ассоциированной с ресурсом sid.
  • В таблице, ассоциированной с ресурсом sid, нет значения entry.

Возвращает результат "запрещено" в следующих случаях:

  • Ресурс sid не ассоциирован с таблицей из пула таблиц используемого объекта модели безопасности HashSet.
  • Значение sid вне допустимого диапазона.
В начало
[Topic ssp_descr_security_models_hashset_remove]

Выражение contains модели безопасности HashSet

contains {sid : <Sid>, entry : <Entry>}

Проверяет, содержится ли значение entry в таблице, ассоциированной с ресурсом sid.

Возвращает значение типа Boolean. Если значение entry содержится в таблице, ассоциированной с ресурсом sid, возвращает true. Иначе возвращает false.

Выполняется некорректно в следующих случаях:

  • Ресурс sid не ассоциирован с таблицей из пула таблиц используемого объекта модели безопасности HashSet.
  • Значение sid вне допустимого диапазона.

Когда выражение выполняется некорректно, модуль безопасности Kaspersky Security Module возвращает решение "запрещено".

Пример:

/* Процесс класса Server получит решение "разрешено" от

* модуля безопасности Kaspersky Security Module, вызывая метод интерфейса

* безопасности Check, если значение 42 содержится в таблице,

* ассоциированной с этим процессом. Иначе процесс класса

* Server получит решение "запрещено" от модуля безопасности,

* вызывая метод интерфейса безопасности Check. */

security src=Server, method=Check {

assert(S.contains {sid : src_sid, entry : 42})

}

В начало
[Topic ssp_descr_security_models_hashset_contains]

Модель безопасности StaticMap

Модель безопасности StaticMap позволяет ассоциировать с ресурсами двумерные таблицы типа "ключ–значение", читать и изменять значения ключей. Например, можно ассоциировать процесс, в контексте которого выполняется драйвер, с регионом памяти MMIO, который разрешено использовать этому драйверу. Для этого потребуется два ключа, значения которых задают начальный адрес и размер региона памяти MMIO. Эту ассоциацию можно использовать, чтобы проверить, может ли драйвер обращаться к региону памяти MMIO, к которому он пытается получить доступ.

Ключи в таблице имеют одинаковый тип и является уникальными и неизменяемыми. Значения ключей в таблице имеют одинаковый тип.

Одновременно существует два экземпляра таблицы: базовый и рабочий. Оба экземпляра инициализируются одинаковыми данными. Изменения заносятся сначала в рабочий экземпляр, а затем могут быть добавлены в базовый экземпляр или, наоборот, заменены прежними значениями из базового экземпляра. Значения ключей могут быть прочитаны как из базового, так и из рабочего экземпляра таблицы.

PSL-файл с описанием модели безопасности StaticMap находится в KasperskyOS SDK по пути:

toolchain/include/nk/staticmap.psl

В этом разделе

Объект модели безопасности StaticMap

Правило init модели безопасности StaticMap

Правило fini модели безопасности StaticMap

Правило set модели безопасности StaticMap

Правило commit модели безопасности StaticMap

Правило rollback модели безопасности StaticMap

Выражение get модели безопасности StaticMap

Выражение get_uncommited модели безопасности StaticMap

В начало
[Topic ssp_descr_security_models_staticmap]

Объект модели безопасности StaticMap

Чтобы использовать модель безопасности StaticMap, нужно создать объект (объекты) этой модели.

Объект модели безопасности StaticMap содержит пул двумерных таблиц типа "ключ–значение", которые имеют одинаковый размер. Ресурс может быть ассоциирован только с одной таблицей из пула таблиц каждого объекта модели безопасности StaticMap.

Объект модели безопасности StaticMap имеет следующие параметры:

  • type Value – тип значений ключей в таблицах (поддерживаются целочисленные типы);
  • config – конфигурация пула таблиц:
    • keys – таблица, содержащая ключи и их значения по умолчанию (ключи имеют тип Key = Text | List<UInt8>);
    • pool_size – число таблиц в пуле.

Все параметры объекта модели безопасности StaticMap являются обязательными.

Пример:

policy object M : StaticMap {

type Value = UInt16

config =

{ keys:

{ "k1" : 0

, "k2" : 1

}

, pool_size : 2

}

}

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

Необходимость создавать несколько объектов модели безопасности StaticMap возникает в следующих случаях:

  • Если нужно по-разному настроить аудит безопасности для разных объектов модели безопасности StaticMap (например, для разных объектов можно применять разные профили аудита или разные конфигурации аудита одного профиля).
  • Если нужно различать вызовы методов, предоставляемых разными объектами модели безопасности StaticMap (поскольку в данные аудита включается как имя метода модели безопасности, так и имя объекта, предоставляющего этот метод, можно понять, что был вызван метод конкретного объекта).
  • Если нужно использовать таблицы с разными наборами ключей и/или разными типами значений ключей.
В начало
[Topic ssp_descr_security_models_staticmap_object]

Правило init модели безопасности StaticMap

init {sid : <Sid>}

Ассоциирует свободную таблицу из пула таблиц с ресурсом sid. Ключи инициализируются значениями по умолчанию.

Возвращает результат "разрешено", если создало ассоциацию таблицы с ресурсом sid.

Возвращает результат "запрещено" в следующих случаях:

  • В пуле нет свободных таблиц.
  • Ресурс sid уже ассоциирован с таблицей из пула таблиц используемого объекта модели безопасности StaticMap.
  • Значение sid вне допустимого диапазона.

Пример:

/* Запуск процесса класса Server будет разрешен, если

* при инициации запуска будет создана ассоциация этого

* процесса с таблицей. Иначе запуск процесса класса

* Server будет запрещен. */

execute dst=Server {

M.init {sid : dst_sid}

}

В начало
[Topic ssp_descr_security_models_staticmap_init]

Правило fini модели безопасности StaticMap

fini {sid : <Sid>}

Удаляет ассоциацию таблицы с ресурсом sid (таблица становится свободной).

Возвращает результат "разрешено", если удалило ассоциацию таблицы с ресурсом sid.

Возвращает результат "запрещено" в следующих случаях:

  • Ресурс sid не ассоциирован с таблицей из пула таблиц используемого объекта модели безопасности StaticMap.
  • Значение sid вне допустимого диапазона.
В начало
[Topic ssp_descr_security_models_staticmap_fini]

Правило set модели безопасности StaticMap

set {sid : <Sid>, key : <Key>, value : <Value>}

Задает значение value ключу key в рабочем экземпляре таблицы, ассоциированной с ресурсом sid.

Возвращает результат "разрешено", если задало значение value ключу key в рабочем экземпляре таблицы, ассоциированной с ресурсом sid. (Текущее значение ключа будет перезаписано, даже если оно равно новому.)

Возвращает результат "запрещено" в следующих случаях:

  • Ключ key не содержится в таблице, ассоциированной с ресурсом sid.
  • Ресурс sid не ассоциирован с таблицей из пула таблиц используемого объекта модели безопасности StaticMap.
  • Значение sid вне допустимого диапазона.

Пример:

/* Процесс класса Server получит решение "разрешено" от

* модуля безопасности Kaspersky Security Module, вызывая метод интерфейса

* безопасности Set, если при вызове этого метода значение 2

* будет задано ключу k1 в рабочем экземпляре таблицы,

* ассоциированной с этим процессом. Иначе процесс класса

* Server получит решение "запрещено" от модуля безопасности,

* вызывая метод интерфейса безопасности Set. */

security src=Server, method=Set {

M.set {sid : src_sid, key : "k1", value : 2}

}

В начало
[Topic ssp_descr_security_models_staticmap_set]

Правило commit модели безопасности StaticMap

commit {sid : <Sid>}

Копирует значения ключей из рабочего в базовый экземпляр таблицы, ассоциированной с ресурсом sid.

Возвращает результат "разрешено", если скопировало значения ключей из рабочего в базовый экземпляр таблицы, ассоциированной с ресурсом sid.

Возвращает результат "запрещено" в следующих случаях:

  • Ресурс sid не ассоциирован с таблицей из пула таблиц используемого объекта модели безопасности StaticMap.
  • Значение sid вне допустимого диапазона.
В начало
[Topic ssp_descr_security_models_staticmap_commit]

Правило rollback модели безопасности StaticMap

rollback {sid : <Sid>}

Копирует значения ключей из базового в рабочий экземпляр таблицы, ассоциированной с ресурсом sid.

Возвращает результат "разрешено", если скопировало значения ключей из базового в рабочий экземпляр таблицы, ассоциированной с ресурсом sid.

Возвращает результат "запрещено" в следующих случаях:

  • Ресурс sid не ассоциирован с таблицей из пула таблиц используемого объекта модели безопасности StaticMap.
  • Значение sid вне допустимого диапазона.
В начало
[Topic ssp_descr_security_models_staticmap_rollback]

Выражение get модели безопасности StaticMap

get {sid : <Sid>, key : <Key>}

Возвращает значение ключа key из базового экземпляра таблицы, ассоциированной с ресурсом sid.

Возвращает значение типа Value.

Выполняется некорректно в следующих случаях:

  • Ключ key не содержится в таблице, ассоциированной с ресурсом sid.
  • Ресурс sid не ассоциирован с таблицей из пула таблиц используемого объекта модели безопасности StaticMap.
  • Значение sid вне допустимого диапазона.

Когда выражение выполняется некорректно, модуль безопасности Kaspersky Security Module возвращает решение "запрещено".

Пример:

/* Процесс класса Server получит решение "разрешено" от

* модуля безопасности Kaspersky Security Module, вызывая метод интерфейса

* безопасности Get, если значение ключа k1 в базовом

* экземпляре таблицы, ассоциированной с этим процессом,

* отлично от нуля. Иначе процесс класса Server получит

* решение "запрещено" от модуля безопасности, вызывая

* метод интерфейса безопасности Get. */

security src=Server, method=Get {

assert(M.get {sid : src_sid, key : "k1"} != 0)

}

В начало
[Topic ssp_descr_security_models_staticmap_get]

Выражение get_uncommited модели безопасности StaticMap

get_uncommited {sid: <Sid>, key: <Key>}

Возвращает значение ключа key из рабочего экземпляра таблицы, ассоциированной с ресурсом sid.

Возвращает значение типа Value.

Выполняется некорректно в следующих случаях:

  • Ключ key не содержится в таблице, ассоциированной с ресурсом sid.
  • Ресурс sid не ассоциирован с таблицей из пула таблиц используемого объекта модели безопасности StaticMap.
  • Значение sid вне допустимого диапазона.

Когда выражение выполняется некорректно, модуль безопасности Kaspersky Security Module возвращает решение "запрещено".

В начало
[Topic ssp_descr_security_models_staticmap_get_u]

Модель безопасности Flow

Модель безопасности Flow позволяет ассоциировать с ресурсами конечные автоматы, получать и изменять состояния конечных автоматов, а также проверять, что состояние конечного автомата входит в заданный набор состояний. Например, можно ассоциировать процесс с конечным автоматом, чтобы разрешать и запрещать этому процессу использовать накопители и/или сеть в зависимости от состояния конечного автомата.

PSL-файл с описанием модели безопасности Flow находится в KasperskyOS SDK по пути:

toolchain/include/nk/flow.psl

В этом разделе

Объект модели безопасности Flow

Правило init модели безопасности Flow

Правило fini модели безопасности Flow

Правило enter модели безопасности Flow

Правило allow модели безопасности Flow

Выражение query модели безопасности Flow

В начало
[Topic ssp_descr_security_models_flow]

Объект модели безопасности Flow

Чтобы использовать модель безопасности Flow, нужно создать объект (объекты) этой модели.

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

Объект модели безопасности Flow имеет следующие параметры:

  • type State – тип, определяющий множество состояний конечного автомата (вариантный тип, объединяющий текстовые литералы);
  • config – конфигурация конечного автомата:
    • states – множество состояний конечного автомата (должно совпадать со множеством состояний, заданных типом State);
    • initial – начальное состояние конечного автомата;
    • transitions – описание допустимых переходов между состояниями конечного автомата.

Все параметры объекта модели безопасности Flow являются обязательными.

Пример:

policy object service_flow : Flow {

type State = "sleep" | "started" | "stopped" | "finished"

config = { states : ["sleep", "started", "stopped", "finished"]

, initial : "sleep"

, transitions : { "sleep" : ["started"]

, "started" : ["stopped", "finished"]

, "stopped" : ["started", "finished"]

}

}

}

finite_state_machine_example

Диаграмма состояний конечного автомата в примере

Объект модели безопасности Flow может быть покрыт аудитом безопасности. При этом можно задать условия выполнения аудита, специфичные для модели безопасности Flow. Для этого в описании конфигурации аудита нужно использовать следующую конструкцию:

omit : [<"состояние 1">[,] ...] – аудит не выполняется, если конечный автомат находится в одном из перечисленных состояний.

Необходимость создавать несколько объектов модели безопасности Flow возникает в следующих случаях:

  • Если нужно по-разному настроить аудит безопасности для разных объектов модели безопасности Flow (например, для разных объектов можно применять разные профили аудита или разные конфигурации аудита одного профиля).
  • Если нужно различать вызовы методов, предоставляемых разными объектами модели безопасности Flow (поскольку в данные аудита включается как имя метода модели безопасности, так и имя объекта, предоставляющего этот метод, можно понять, что был вызван метод конкретного объекта).
  • Если нужно использовать конечные автоматы с разными конфигурациями.
В начало
[Topic ssp_descr_security_models_flow_object]

Правило init модели безопасности Flow

init {sid : <Sid>}

Создает конечный автомат и ассоциирует его с ресурсом sid. Созданный конечный автомат имеет конфигурацию, заданную в параметрах используемого объекта модели безопасности Flow.

Возвращает результат "разрешено", если создало ассоциацию конечного автомата с ресурсом sid.

Возвращает результат "запрещено" в следующих случаях:

  • Ресурс sid уже ассоциирован с конечным автоматом используемого объекта модели безопасности Flow.
  • Значение sid вне допустимого диапазона.

Пример:

/* Запуск процесса класса Server будет разрешен,

* если при инициации запуска будет создана

* ассоциация этого процесса с конечным автоматом.

* Иначе запуск процесса класса Server будет запрещен. */

execute dst=Server {

service_flow.init {sid : dst_sid}

}

В начало
[Topic ssp_descr_security_models_flow_init]

Правило fini модели безопасности Flow

fini {sid : <Sid>}

Удаляет ассоциацию конечного автомата ресурсом sid. Конечный автомат, который более не ассоциирован с ресурсом, уничтожается.

Возвращает результат "разрешено", если удалило ассоциацию конечного автомата с ресурсом sid.

Возвращает результат "запрещено" в следующих случаях:

  • Ресурс sid не ассоциирован с конечным автоматом используемого объекта модели безопасности Flow.
  • Значение sid вне допустимого диапазона.
В начало
[Topic ssp_descr_security_models_flow_fini]

Правило enter модели безопасности Flow

enter {sid : <Sid>, state : <State>}

Переводит конечный автомат, ассоциированный с ресурсом sid, в состояние state.

Возвращает результат "разрешено", если перевело конечный автомат, ассоциированный с ресурсом sid, в состояние state.

Возвращает результат "запрещено" в следующих случаях:

  • Переход в состояние state из текущего состояния не допускается конфигурацией конечного автомата, ассоциированного с ресурсом sid.
  • Ресурс sid не ассоциирован с конечным автоматом используемого объекта модели безопасности Flow.
  • Значение sid вне допустимого диапазона.

Пример:

/* Любому клиенту в решении будет разрешено обращаться

* к серверу класса Server, если конечный автомат,

* ассоциированный с этим сервером, будет переведен в

* состояние started при инициации обращения. Иначе

* любому клиенту в решении будет запрещено обращаться

* к серверу класса Server. */

request dst=Server {

service_flow.enter {sid : dst_sid, state : "started"}

}

В начало
[Topic ssp_descr_security_models_flow_enter]

Правило allow модели безопасности Flow

allow {sid : <Sid>, states : <Set<State>>}

Проверяет, что состояние конечного автомата, ассоциированного с ресурсом sid, входит в набор состояний states.

Возвращает результат "разрешено", если состояние конечного автомата, ассоциированного с ресурсом sid, входит в набор состояний states.

Возвращает результат "запрещено" в следующих случаях:

  • Состояние конечного автомата, ассоциированного с ресурсом sid, не входит в набор состояний states.
  • Ресурс sid не ассоциирован с конечным автоматом используемого объекта модели безопасности Flow.
  • Значение sid вне допустимого диапазона.

Пример:

/* Любому клиенту в решении разрешено обращаться к серверу класса

* Server, если конечный автомат, ассоциированный с этим сервером,

* находится в состоянии started или stopped. Иначе любому клиенту

* в решении запрещено обращаться к серверу класса Server. */

request dst=Server {

service_flow.allow {sid : dst_sid, states : ["started", "stopped"]}

}

В начало
[Topic ssp_descr_security_models_flow_allow]

Выражение query модели безопасности Flow

query {sid : <Sid>}

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

Выполняется некорректно в следующих случаях:

  • Ресурс sid не ассоциирован с конечным автоматом используемого объекта модели безопасности Flow.
  • Значение sid вне допустимого диапазона.

Когда выражение выполняется некорректно, модуль безопасности Kaspersky Security Module возвращает решение "запрещено".

Пример:

/* Любому клиенту в решении разрешено обращаться к

* серверу класса ResourceDriver, если конечный автомат,

* ассоциированный с этим сервером, находится в состоянии

* started или stopped. Иначе любому клиенту в решении

* запрещено обращаться к серверу класса ResourceDriver. */

request dst=ResourceDriver {

choice (service_flow.query {sid : dst_sid}) {

"started" : grant ()

"stopped" : grant ()

_ : deny ()

}

}

В начало
[Topic ssp_descr_security_models_flow_query]

Модель безопасности Mic

Модель безопасности Mic позволяет реализовать мандатный контроль целостности. То есть эта модель безопасности дает возможность управлять информационными потоками между процессами, а также между процессами и ядром KasperskyOS, контролируя уровни целостности процессов, ядра и ресурсов, используемых через IPC.

В терминах модели безопасности Mic процессы и ядро называются субъектами, а ресурсы называются объектами. Однако сведения в этом разделе приведены с отступлением от терминологии модели безопасности Mic. Это отступление заключается в том, что термин "объект" не используется в значении "ресурс".

Информационные потоки между субъектами возникают, когда субъекты взаимодействуют через IPC.

Уровень целостности субъекта/ресурса – это степень доверия к субъекту/ресурсу. Степень доверия к субъекту определяется, например, исходя из того, взаимодействует ли субъект с недоверенными внешними программно-аппаратными системами, или имеет ли субъект доказанный уровень качества. (Ядро имеет высокий уровень целостности.) Степень доверия к ресурсу определяется, например, с учетом того, был ли этот ресурс создан доверенным субъектом внутри программно-аппаратной системы под управлением KasperskyOS или получен из недоверенной внешней программно-аппаратной системы.

Модель безопасности Mic характеризуют следующие положения:

  • По умолчанию информационные потоки от менее целостных к более целостным субъектам запрещены. Опционально такие информационные потоки могут быть разрешены. При этом нужно гарантировать, что более целостные субъекты не будут компрометированы.
  • Потребителю ресурсов запрещено записывать данные в ресурс, если уровень целостности ресурса выше уровня целостности потребителя ресурсов.
  • По умолчанию потребителю ресурсов запрещено читать данные из ресурса, если уровень целостности ресурса ниже уровня целостности потребителя ресурсов. Опционально потребителю ресурсов может быть разрешена такая операция. При этом нужно гарантировать, что потребитель ресурсов не будет компрометирован.

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

PSL-файл с описанием модели безопасности Mic находится в KasperskyOS SDK по пути:

toolchain/include/nk/mic.psl

В качестве примера использования модели безопасности Mic можно рассмотреть безопасное обновление ПО программно-аппаратной системы под управлением KasperskyOS. В обновлении участвуют четыре процесса:

  • Downloader – низкоцелостный процесс, который загружает низкоцелостный образ обновления с удаленного сервера в интернете.
  • Verifier – высокоцелостный процесс, который проверяет цифровую подпись низкоцелостного образа обновления (высокоцелостный процесс, который может читать данные из низкоцелостного ресурса).
  • FileSystem – высокоцелостный процесс, который управляет файловой системой.
  • Updater – высокоцелостный процесс, который применяет обновление.

Обновление ПО выполняется по следующему сценарию:

  1. Downloader загружает образ обновления и сохраняет его в файл, передав содержимое образа в FileSystem. Этому файлу назначается низкий уровень целостности.
  2. Verifier получает образ обновления у FileSystem, прочитав низкоцелостный файл, и проверяет его цифровую подпись. Если подпись корректна, Verifier обращается к FileSystem, чтобы FileSystem создал копию файла с образом обновления. Новому файлу назначается высокий уровень целостности.
  3. Updater получает образ обновления у FileSystem, прочитав высокоцелостный файл, и применяет обновление.

В этом примере модель безопасности Mic обеспечивает то, что высокоцелостный процесс Updater может читать данные только из высокоцелостного образа обновления. Вследствие этого обновление может быть применено только после проверки цифровой подписи образа обновления.

В этом разделе

Объект модели безопасности Mic

Правило create модели безопасности Mic

Правило execute модели безопасности Mic

Правило upgrade модели безопасности Mic

Правило call модели безопасности Mic

Правило invoke модели безопасности Mic

Правило read модели безопасности Mic

Правило write модели безопасности Mic

Выражение query_level модели безопасности Mic

В начало
[Topic ssp_descr_security_models_mic]

Объект модели безопасности Mic

Чтобы использовать модель безопасности Mic, нужно создать объект (объекты) этой модели. При этом нужно задать множество уровней целостности субъектов/ресурсов.

Объект модели безопасности Mic имеет следующие параметры:

  • config – множество уровней целостности или конфигурация множества уровней целостности:
    • degrees – множество градаций для формирования множества уровней целостности;
    • categories – множество категорий для формирования множества уровней целостности.

Примеры:

policy object mic : Mic {

config = ["LOW", "MEDIUM", "HIGH"]

}

policy object mic_po : Mic {

config =

{ degrees : ["low", "high"]

, categories : ["net", "log"]

}

}

Множество уровней целостности представляет собой частично упорядоченное множество, которое является линейно упорядоченным или содержит несравнимые элементы. Множество {LOW, MEDIUM, HIGH} является линейно упорядоченным, так как все его элементы сравнимы между собой. Несравнимые элементы появляются, когда множество уровней целостности задается через множество градаций и множество категорий. В этом случае множество уровней целостности L представляет собой декартово произведение булеана множества категорий C на множество градаций D:

set_of_integrity_levels

Параметры degrees и categories в примере задают следующее множество:

{

{}/low, {}/high,

{net}/low, {net}/high,

{log}/low, {log}/high,

{net,log}/low, {net,log}/high

}

В этом множестве {} означает пустое множество.

Отношение порядка между элементами множества уровней целостности L задается следующим образом:

order_of_integrity_levels

Согласно этому отношению порядка j-й элемент превышает i-й элемент, если подмножество категорий E включает подмножество категорий A, и градация F больше градации A либо равна ей. Примеры сравнения элементов множества уровней целостности L:

  • Элемент {net,log}/high превышает элемент {log}/low, так как градация high больше градации low, и подмножество категорий {net,log} включает подмножество категорий {log}.
  • Элемент {net,log}/low превышает элемент {log}/low, так как уровни градаций для этих элементов равны между собой, и подмножество категорий {net,log} включает подмножество категорий {log}.
  • Элемент {net,log}/high является наибольшим, так как превышает все остальные элементы.
  • Элемент {}/low является наименьшим, так как все остальные элементы превышают этот элемент.
  • Элементы {net}/low и {log}/high являются несравнимыми, так как градация high больше градации low, но подмножество категорий {log} не включает подмножество категорий {net}.
  • Элементы {net,log}/low и {log}/high являются несравнимыми, так как градация high больше градации low, но подмножество категорий {log} не включает подмножество категорий {net,log}.

Для субъектов и ресурсов с несравнимыми уровнями целостности модель безопасности Mic предусматривает условия, аналогичные тем, которые эта модель безопасности предусматривает для субъектов и ресурсов со сравнимыми уровнями целостности.

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

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

Необходимость создавать несколько объектов модели безопасности Mic возникает в следующих случаях:

  • Если нужно по-разному настроить аудит безопасности для разных объектов модели безопасности Mic (например, для разных объектов можно применять разные профили аудита или разные конфигурации аудита одного профиля).
  • Если нужно различать вызовы методов, предоставляемых разными объектами модели безопасности Mic (поскольку в данные аудита включается как имя метода модели безопасности, так и имя объекта, предоставляющего этот метод, можно понять, что был вызван метод конкретного объекта).
  • Если нужно использовать несколько вариантов мандатного контроля целостности, например, с разными множествами уровней целостности субъектов/ресурсов.
В начало
[Topic ssp_descr_security_models_mic_object]

Правило create модели безопасности Mic

create { source : <Sid>

, target : <Sid>

, container : <Sid | ()>

, driver : <Sid>

, level : <Level | ... | ()>

}

Назначает ресурсу target уровень целостности level в следующей ситуации:

  • Процесс source инициирует создание ресурса target.
  • Ресурсом target управляет субъект driver, который является поставщиком ресурсов или ядром KasperskyOS.
  • Ресурс container является контейнером для ресурса target (например, директория является контейнером для файлов и/или других директорий).

Если значение container не задано (container : ()), ресурс target рассматривается как корневой, то есть не имеющий контейнера.

Чтобы задать уровень целостности level, используются значения типа Level:

type Level = LevelFull | LevelNoCategory

type LevelFull =

{ degree : Text | ()

, categories : List<Text> | ()

}

type LevelNoCategory = Text

Правило возвращает результат "разрешено", если назначило ресурсу target уровень целостности level.

Правило возвращает результат "запрещено" в следующих случаях:

  • Значение level превышает уровень целостности процесса source, субъекта driver или ресурса container.
  • Значение level несравнимо с уровнем целостности процесса source, субъекта driver или ресурса container.
  • Процессу source, субъекту driver или ресурсу container не назначен уровень целостности.
  • Значение source, target, container или driver вне допустимого диапазона.

Пример:

/* Серверу класса updater.Realmserv будет разрешено отвечать на

* обращения любого клиента в решении, вызывающего метод resolve

* службы realm.Reader, если ресурсу, создание которого запрашивает

* клиент, при инициации ответа будет назначен уровень целостности LOW.

* Иначе серверу класса updater.Realmserv будет запрещено отвечать на

* обращения любого клиента, вызывающего метод resolve службы realm.Reader. */

response src=updater.Realmserv,

endpoint=realm.Reader {

match method=resolve {

mic.create { source : dst_sid

, target : message.handle.handle

, container : ()

, driver : src_sid

, level : "LOW"

}

}

}

В начало
[Topic ssp_descr_security_models_mic_create]

Правило execute модели безопасности Mic

execute <ExecuteImage | ExecuteLevel>

type ExecuteImage =

{ image : Sid

, target : Sid

, level : Level | ... | ()

, levelR : Level | ... | ()

}

type ExecuteLevel =

{ image : Sid | ()

, target : Sid

, level : Level | ...

, levelR : Level | ... | ()

}

Назначает субъекту target уровень целостности level и задает минимальный уровень целостности субъектов и ресурсов, из которых этот субъект может принимать данные (levelR). Код субъекта target содержится в исполняемом файле image.

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

Если значение levelR не задано (levelR : ()), то значение levelR равно level.

Чтобы задать уровни целостности level и levelR, используются значения типа Level. Определение типа Level см. в "Правило create модели безопасности Mic".

Правило возвращает результат "разрешено", если назначило субъекту target уровень целостности level и задало минимальный уровень целостности субъектов и ресурсов, из которых этот субъект может принимать данные (levelR).

Правило возвращает результат "запрещено" в следующих случаях:

  • Значение level превышает уровень целостности исполняемого файла image.
  • Значение level несравнимо с уровнем целостности исполняемого файла image.
  • Значение levelR превышает значение level.
  • Значения level и levelR несравнимы.
  • Исполняемому файлу image не назначен уровень целостности.
  • Значение image или target вне допустимого диапазона.

Пример:

/* Запуск процесса класса updater.Manager будет разрешен,

* если при инициации запуска этому процессу будет назначен

* уровень целостности LOW, а также будет задан минимальный

* уровень целостности процессов и ресурсов, из которых этот

* процесс может принимать данные (LOW). Иначе запуск процесса

* класса updater.Manager будет запрещен. */

execute src=Einit, dst=updater.Manager, method=main {

mic.execute { target : dst_sid

, image : ()

, level : "LOW"

, levelR : "LOW"

}

}

В начало
[Topic ssp_descr_security_models_mic_execute]

Правило upgrade модели безопасности Mic

upgrade { source : <Sid>

, target : <Sid>

, container : <Sid | ()>

, driver : <Sid>

, level : <Level | ...>

}

Повышает назначенный ранее уровень целостности ресурса target до значения level в следующей ситуации:

  • Процесс source инициирует повышение уровня целостности ресурса target.
  • Ресурсом target управляет субъект driver, который является поставщиком ресурсов или ядром KasperskyOS.
  • Ресурс container является контейнером для ресурса target (например, директория является контейнером для файлов и/или других директорий).

Если значение container не задано (container : ()), ресурс target рассматривается как корневой, то есть не имеющий контейнера.

Чтобы задать уровень целостности level, используются значения типа Level. Определение типа Level см. в "Правило create модели безопасности Mic".

Правило возвращает результат "разрешено", если повысило назначенный ранее уровень целостности ресурса target до значения level.

Правило возвращает результат "запрещено" в следующих случаях:

  • Значение level не превышает уровень целостности ресурса target.
  • Значение level превышает уровень целостности процесса source, субъекта driver или ресурса container.
  • Уровень целостности ресурса target превышает уровень целостности процесса source.
  • Процессу source, субъекту driver или ресурсу container не назначен уровень целостности.
  • Значение source, target, container или driver вне допустимого диапазона.
В начало
[Topic ssp_descr_security_models_mic_upgrade]

Правило call модели безопасности Mic

call {source : <Sid>, target : <Sid>}

Проверяет допустимость информационных потоков от субъекта target к субъекту source.

Возвращает результат "разрешено" в следующих случаях:

  • Уровень целостности субъекта source не превышает уровень целостности субъекта target.
  • Уровень целостности субъекта source превышает уровень целостности субъекта target, но минимальный уровень целостности субъектов и ресурсов, из которых субъект source может принимать данные, не превышает уровень целостности субъекта target.
  • Уровень целостности субъекта source несравним с уровнем целостности субъекта target, но минимальный уровень целостности субъектов и ресурсов, из которых субъект source может принимать данные, не превышает уровень целостности субъекта target.

Возвращает результат "запрещено" в следующих случаях:

  • Уровень целостности субъекта source превышает уровень целостности субъекта target, и минимальный уровень целостности субъектов и ресурсов, из которых субъект source может принимать данные, превышает уровень целостности субъекта target.
  • Уровень целостности субъекта source превышает уровень целостности субъекта target, и минимальный уровень целостности субъектов и ресурсов, из которых субъект source может читать данные, несравним с уровнем целостности субъекта target.
  • Уровень целостности субъекта source несравним с уровнем целостности субъекта target, и минимальный уровень целостности субъектов и ресурсов, из которых субъект source может принимать данные, превышает уровень целостности субъекта target.
  • Уровень целостности субъекта source несравним с уровнем целостности субъекта target, и минимальный уровень целостности субъектов и ресурсов, из которых субъект source может принимать данные, несравним с уровнем целостности субъекта target.
  • Субъекту source или субъекту target не назначен уровень целостности.
  • Значение source или target вне допустимого диапазона.

Пример:

/* Любому клиенту в решении разрешено обращаться к

* любому серверу (ядру), если информационные потоки от

* сервера (ядра) к клиенту допускаются моделью

* безопасности Mic. Иначе любому клиенту в решении

* запрещено обращаться к любому серверу (ядру). */

request {

mic.call { source : src_sid

, target : dst_sid

}

}

В начало
[Topic ssp_descr_security_models_mic_call]

Правило invoke модели безопасности Mic

invoke {source : <Sid>, target : <Sid>}

Проверяет допустимость информационных потоков от субъекта source к субъекту target.

Возвращает результат "разрешено", если уровень целостности субъекта target не превышает уровень целостности субъекта source.

Возвращает результат "запрещено" в следующих случаях:

  • Уровень целостности субъекта target превышает уровень целостности субъекта source.
  • Уровень целостности субъекта target несравним с уровнем целостности субъекта source.
  • Субъекту source или субъекту target не назначен уровень целостности.
  • Значение source или target вне допустимого диапазона.
В начало
[Topic ssp_descr_security_models_mic_invoke]

Правило read модели безопасности Mic

read {source : <Sid>, target : <Sid>}

Проверяет допустимость чтения данных из ресурса target потребителем ресурсов source.

Возвращает результат "разрешено" в следующих случаях:

  • Уровень целостности потребителя ресурсов source не превышает уровень целостности ресурса target.
  • Уровень целостности потребителя ресурсов source превышает уровень целостности ресурса target, но минимальный уровень целостности субъектов и ресурсов, из которых потребитель ресурсов source может принимать данные, не превышает уровень целостности ресурса target.
  • Уровень целостности потребителя ресурсов source несравним с уровнем целостности ресурса target, но минимальный уровень целостности субъектов и ресурсов, из которых потребитель ресурсов source может принимать данные, не превышает уровень целостности ресурса target.

Возвращает результат "запрещено" в следующих случаях:

  • Уровень целостности потребителя ресурсов source превышает уровень целостности ресурса target, и минимальный уровень целостности субъектов и ресурсов, из которых потребитель ресурсов source может принимать данные, превышает уровень целостности ресурса target.
  • Уровень целостности потребителя ресурсов source превышает уровень целостности ресурса target, и минимальный уровень целостности субъектов и ресурсов, из которых потребитель ресурсов source может принимать данные, несравним с уровнем целостности ресурса target.
  • Уровень целостности потребителя ресурсов source несравним с уровнем целостности ресурса target, и минимальный уровень целостности субъектов и ресурсов, из которых потребитель ресурсов source может принимать данные, превышает уровень целостности ресурса target.
  • Уровень целостности потребителя ресурсов source несравним с уровнем целостности ресурса target, и минимальный уровень целостности субъектов и ресурсов, из которых потребитель ресурсов source может принимать данные, несравним с уровнем целостности ресурса target.
  • Потребителю ресурсов source или ресурсу target не назначен уровень целостности.
  • Значение source или target вне допустимого диапазона.

Пример:

/* Любому клиенту в решении разрешено обращаться к серверу

* класса updater.Realmserv, вызывая метод read службы

* realm.Reader, если модель безопасности Mic допускает

* чтение данных этим клиентом из ресурса, который требуется

* этому клиенту. Иначе любому клиенту в решении запрещено

* обращаться к серверу класса updater.Realmserv, вызывая

* метод read службы realm.Reader. */

request dst=updater.Realmserv,

endpoint=realm.Reader {

match method=read {

mic.read { source : src_sid,

, target : message.handle.handle

}

}

}

В начало
[Topic ssp_descr_security_models_mic_read]

Правило write модели безопасности Mic

write {source : <Sid>, target : <Sid>}

Проверяет допустимость записи данных в ресурс target потребителем ресурсов source.

Возвращает результат "разрешено", если уровень целостности ресурса target не превышает уровень целостности потребителя ресурсов source.

Возвращает результат "запрещено" в следующих случаях:

  • Уровень целостности ресурса target превышает уровень целостности потребителя ресурсов source.
  • Уровень целостности ресурса target несравним с уровнем целостности потребителя ресурсов source.
  • Потребителю ресурсов source или ресурсу target не назначен уровень целостности.
  • Значение source или target вне допустимого диапазона.
В начало
[Topic ssp_descr_security_models_mic_write]

Выражение query_level модели безопасности Mic

query_level {source : <Sid>}

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

Выполняется некорректно в следующих случаях:

  • Субъекту или ресурсу source не назначен уровень целостности.
  • Значение source вне допустимого диапазона.

Когда выражение выполняется некорректно, модуль безопасности Kaspersky Security Module возвращает решение "запрещено".

В начало
[Topic ssp_descr_security_models_mic_query_level]