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

02 августа 2023

ID ssp_descr_security_models_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]&() соответствуют все латинские буквы и пустая строка.

Вам помогла эта статья?
Что нам нужно улучшить?
Спасибо за ваш отзыв, вы помогаете нам становиться лучше!
Спасибо за ваш отзыв, вы помогаете нам становиться лучше!