О регулярных выражениях

11 апреля 2024

ID 171632

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

О регулярных выражениях

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

Предустановленные регулярные выражения соответствуют формату событий, используемых в проверке работоспособности (Run self-test).

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

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

Об именах регулярных выражений

Для регулярного выражения можно использовать любые имена кроме следующих:

  • SourceId
  • MatchedIndicator
  • RecordContext
  • Category
  • ActionableFields
  • Confidence
  • IndicatorInfo
  • EventReceivedDate
  • Retroscan

Составные значения

Атрибут concatenate используется для определения правила, используемого для формирования составного значения из данных, извлеченных из события. Правило оперирует группами извлеченных данных посредством символов #N, где N — номер группы (начиная с 1). Если перед символом решетки (#) стоит обратная косая черта (\), то символ решетки рассматривается не как часть номера группы, а как собственно символ решетки.

Рассмотрим парсинг на примере следующего события:

url_1=http://domain test_event url_2=/page/mypage test

Используемые регулярные выражения и соответствующие результаты парсинга примера события представлены в таблице ниже.

Примеры применения регулярных выражений

Регулярное выражение

Результат парсинга

<RE_URL concatenate="#1#2">url_1=(.*?)\stest_event\surl_2=(.*?)\stest</RE_URL>

http://domain/page/mypage

<RE_URL concatenate="#2#1">url_1=(.*?)\stest_event\surl_2=(.*?)\stest</RE_URL>

/page/mypagehttp://domain

<RE_URL concatenate="#2_/_#1">url_1=(.*?)\stest_event\surl_2=(.*?)\stest</RE_URL>

/page/mypage_/_http://domain

Если правило конкатенации не задано или в качестве значения атрибута concatenate задана пустая строка, а при этом регулярное выражение содержит более одной группы, значения групп объединяются в том порядке, в котором они встречаются в регулярном выражении.

Если атрибут concatenate содержит больше групп, чем имеется в регулярном выражении, дополнительные группы игнорируются и заменяются соответствующим текстом #N.

Событие для парсинга:

url_1=http://domain test_event url_2=/page/my_page test

Используемое регулярное выражение:

<RE_URL concatenate="#1#2#3">url_1=(.*?)\stest_event\surl_2=(.*?)\stest</RE_URL>

Результат парсинга:

http://domain/page/my_page#3

Множественное сопоставление

При парсинге события с помощью регулярного выражения можно извлечь все значения, сопоставляемые с регулярным выражением. Для этого у атрибута extract должно быть задано значение «all»‎. Если для этого атрибута установлено значение «first»‎ или атрибут не указан, извлекается только первое значение, сопоставленное с регулярным выражением.

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

Событие для парсинга:

ip1=12.12.12.12 ip2=23.23.23.23 hash1=abc hash2=cde user1=N1 user2=N2

Элементы конфигурационного файла:

<RegExps>

<Source id="default">

<RE_IP extract="all">...</RE_IP>

<RE_HASH extract="all">...</RE_HASH>

<RE_USER extract="first">...</RE_USER>

</Source>

</RegExps>

<EventFormat>ip=%RE_IP% hash=%RE_HASH% user=%RE_USER% %FeedContext%</EventFormat>

Доступные записи потоков данных об угрозах:

IP = 12.12.12.12

IP = 23.23.23.23

hash = cde

Сгенерированные события обнаружений киберугроз:

ip=12.12.12.12 hash=- user= N1 <context for 12.12.12.12>

ip=23.23.23.23 hash=- user= N1 <context for 23.23.23.23>

ip=- hash=cde user=N1 <context for cde>

Указание символов по их шестнадцатеричному коду

Kaspersky CyberTrace Service использует регулярные выражения, соответствующие синтаксису PCRE. Этот синтаксис позволяет указывать символ по его коду несколькими способами.

Kaspersky CyberTrace Service не поддерживает указание символов в формате \x{hhh..}. Вместо этого символ указывается по его коду следующим образом: \uhhhh, где hhhh — шестнадцатеричный код символа. Например, вместо недопустимого выражения ([\x{00a1}-\x{ffff}]) следует использовать выражение ([\u00a1-\uffff]).

Оптимизация регулярных выражений

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

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

  • Используйте сверхжадные квантификаторы (++, *+).
  • Если возможно, используйте несопоставляемую группу (?:) с внешними скобками.
  • Старайтесь как можно реже использовать оператор альтернативы и находить совпадения в конце строки. Оператор альтернативы имеет самый низкий приоритет среди всех операторов регулярных выражений.
  • Используйте привязки (^, $), которые соответствуют начальной и конечной позиции в строке.
  • Используйте атомарные группы. Атомарные группы автоматически отбрасывают все позиции поиска с возвратом, запомненные любыми токенами внутри группы. Используется синтаксис (?> ...).
  • В длинных регулярных выражениях старайтесь избегать экспоненциального роста поиска с возвратом. Рекомендуется избегать, например, выражений наподобие (qwerty.*)*.

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