Невозможно отучить людей изучать самые ненужные предметы.
Введение в CSS
Преимущества стилей
Добавления стилей
Типы носителей
Базовый синтаксис
Значения стилевых свойств
Селекторы тегов
Классы
CSS3
Надо знать обо всем понемножку, но все о немногом.
Идентификаторы
Контекстные селекторы
Соседние селекторы
Дочерние селекторы
Селекторы атрибутов
Универсальный селектор
Псевдоклассы
Псевдоэлементы
Кто умеет, тот делает. Кто не умеет, тот учит. Кто не умеет учить - становится деканом. (Т. Мартин)
Группирование
Наследование
Каскадирование
Валидация
Идентификаторы и классы
Написание эффективного кода
Вёрстка
Изображения
Текст
Цвет
Линии и рамки
Углы
Списки
Ссылки
Дизайны сайтов
Формы
Таблицы
CSS3
HTML5
Блог для вебмастеров
Новости мира Интернет
Сайтостроение
Ремонт и советы
Все новости
Справочник от А до Я
HTML, CSS, JavaScript
Афоризмы о учёбе
Статьи об афоризмах
Все Афоризмы
Помогли мы вам |
Yara. Пишем правила, чтобы искать малварь и не только».
Как писать быстрые правила? Давай заглянем под капот YARA и посмотрим, как работает сканер. Каждое сканирование можно разложить на последовательность из четырех тактов. В качестве примера возьмем следующее правило YARА:
import "math"rule example_php_webshell_rule{
// Метаданные
meta:description = "Example php webshell rule"
// Строки
strings:$php_tag = "<?php"$input1
= "GET"$input2
= "POST"$payload = /assert[t ]{0,100}(/
// Условия
condition:filesize < 20KB and$php_tag and$payload andany of ( $input* ) andmath.entropy(500, filesize-500) = 5}
Ну а теперь разберем каждый «такт» в деталях.
Это действие аналитик выполняет самостоятельно, вручную. Для поиска подстрок YARA использует алгоритм Ахо — Корасик. Сами подстроки носят название «атомы» (atoms). Максимальная длина атома достигает четырех байт.
Разберем атомы на примерах:
/abc.*cde/
В этой регулярке есть два атома: abc
и cde
. Каждый атом уникален и не содержит повторяющихся символов. Так как они имеют одинаковую длину в 3 байта, YARA будет использовать первый атом abc
.
/(one|two)three/
Тут доступны следующие атомы: one
, two
, thre
и hree
. По идее, мы можем искать thre
или hree
отдельно или для one
и two
. А как поведет себя YARA?
Она возьмет самый уникальный атом thre
, он приведет к меньшему количеству совпадений, чем one
и two
(они короче). Кроме того, он не содержит повторяющиеся символы e
, как в hree
. YARA оптимизирована так, чтобы выбрать лучшие атомы из каждой строки. Взглянем на опкоды:
{ 00 00 00 00 [1-4] 01 02 03 04 }
В этом случае YARA будет использовать атом 01
, потому что 00
встречается слишком часто.
{ 01 02 [1-4] 01 02 03 04 }
Атом 01
предпочтительнее атома 01
, потому что первый длиннее.
Важно, чтобы строки содержали «хорошие» атомы. Ниже показаны «плохие» строки: они содержат либо слишком короткие, либо неуникальные атомы:
{00 00 00 00 [1-2] FF FF [1-2] 00 00 00 00}
{AB [1-2] 03 21 [1-2] 01 02}
/a.*b/
/a(c|d)/
Худшие строки — это те, которые вообще не содержат атомов, например вот такие регулярки:
/[0-9]+n/
Использование регулярных выражений без явных атомов порождает плохие детектирующие правила, так как влечет за собой большие нагрузки на процессор при сканировании всей системы.
Атомы из нашего правила:
<?ph
;GET
;POST
;sser
(из assert
).Атомы извлекаются из строк в правиле, затем YARA ищет их в процессе сканирования файлов. Если атом найден, то проверяется полностью вся строка.
При запуске правила происходит поиск подстроки. Такты 2–4 будут выполняться для всех файлов. YARA ищет в каждом файле четыре атома из нашего правила, используя дерево префиксов, называемое автоматом Ахо — Корасик. Тот же принцип используется в grep. Любые совпадения передаются дальше в движок байт‑кода.
Предположим, что во время сканирования появилось совпадение с sser
. В этом случае на следующем шаге YARA проверит, был ли перед sser
префикс a
и постфикс t
. Дальше начнется проверка регулярки [t ]{0,100}(
. Благодаря такой оптимизации YARA избегает сложных вычислений (в нашем случае регулярных выражений) и сначала выбирает уникальные подстроки для их детального изучения.
После выполнения всех сравнений с образцом в дело вступают условия. За проверку условия отвечают вычисления по короткой схеме, также известные как вычисления Маккарти.
Вычисления Маккарти — это принцип оптимизации вычислений, при котором второй логический оператор вычисляется только в том случае, если первого логического оператора недостаточно для определения значения выражения.
Рассмотрим простой пример.
condition:filesize < 20KB and$php_tag and$payload andany of ( $input* ) andmath.entropy(500, filesize-500) = 5
|
|