Заметки о применении математических методов к обработке данных DFIR

  • #DFIR

О чем материал

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

 

TLP: RED

Сжечь до прочтения

Эбстракт, мать его

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

Суть вопроса

В большинстве случаев выявление признаков нелегитимной активности в ходе расследования сводится к обработке данных известной структуры для выявления аномалий. Это позволяет сформулировать и впоследствии подтвердить гипотезы вида «в момент/период времени Х на хосте У происходило нечто нелегитимное». Цепь подобных гипотез помогает определить хронологическую последовательность действий злоумышленника вплоть до выявления точки входа (то есть изначальный вектор), а также его modus operandi.

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

Природа рассматриваемых объектов

Предполагается, что речь идет о данных, которые допускают шаблонизацию (то есть могут быть разделены на подмножества по некоторым признакам) и содержат конечное количество параметров в пределах одного подмножества. Например: тип лога, тип или код сообщения, «параметр 1» — метка времени, «параметр 2» — строка, «параметр 3» — число и т. д. 

Очевидно, что в подмножестве сообщений одного типа набор параметров, по сути, представляет собой набор координат в пространстве, размерность которого соответствует количеству параметров и может существенно превышать доступные для человеческого восприятия 2, 3 и т. д. При этом в таком N-мерном пространстве могут существовать структуры, выявить которые при анализе будет затруднительно в силу упомянутой ограниченности восприятия. Собственно, это соображение и подтолкнуло нас к экспериментам, которые изначально были направлены на сокращение размерности пространства с N до 2–3 для изучения топологии множеств событий.

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

В простейшем случае для каждой из N координат достаточно посчитать количество уникальных состояний в пределах рассматриваемого набора событий, а затем сопоставить состояние конкретного события E с номером уникального состояния. С целью нормализации (то есть приведения в диапазон от 0 до 1) этот номер можно поделить на общее количество состояний в наборе событий — в итоге все события будут иметь значения данной координаты в указанном диапазоне.

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

В случае с временными метками проблема решается довольно просто: достаточно определить максимальный диапазон времен, описываемых набором событий, и ввести кодирование номера суток от первого описываемого события. А также, к примеру, кодирование времени суток на тригонометрическом круге как функцию «количество минут от начала суток». Можно кодировать час суток, день недели и т. п. — здесь важно обеспечить уникальность кодов состояний и соблюдение описанного выше требования для сходства событий.

Кодирование строковых параметров — задача более нетривиальная. В ряде случаев строки — это просто строки, для которых можно определить только частоту появления в наборе событий или сходство с другими строками, соответствующими координате. Опыт показывает, что IP-адреса, например, можно кодировать именно последним способом. В строковом представлении внутренние адреса одной сети схожи, что позволяет посчитать средний по набору уникальных адресов коэффициент попарного сходства строк (за исключением самого кодируемого состояния). Значения для внутренних адресов сгруппируются в одной области диапазона «0–1», а редко возникающие внешние адреса, IPv6 и другая экзотика будут удалены от этого диапазона. При проверке может оказаться, что различным адресам (скорее всего, именно внутренним) соответствуют одинаковые значения координаты — это маловероятно, но возможно. В таком случае достаточно минимально скорректировать одну из совпадающих координат до получения набора уникальных кодов состояний-адресов.

В свою очередь, параметры, имеющие «околофизический» смысл (длительность интервала времени, количество событий и т. п.) вполне можно кодировать с учетом этого смысла. То есть определить динамический диапазон (разницу минимального и максимального значений) и привести все его значения к отрезку [0;1].

Возможность сокращения размерности пространства

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

Изначально интересовавшие нас вопросы топологии пространств событий можно решить стохастическими методами — tSNE, упругих карт и т. п. Сложность в том, что при подобном сокращении размерности неизбежны искажения топологии — как в силу природы самих методов (tSNE, к примеру, сохраняет характер топологии, но не сохраняет расстояния между точками и кластерами, поэтому при анализе кластеров необходимо возвращаться к метрике исходного пространства), так и в силу накопления вычислительных погрешностей. 

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

Кластеризация кодированных событий

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

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

Однако на примере алгоритма DBSCAN видно, что количество параметров может быть относительно невелико. Для состояний, кодированных в евклидово пространство размерности N (метрика в данном случае очевидна), остаются всего два параметра — минимальный размер кластера и величина «эпсилон», по смыслу близкая к характерному размеру кластера (при очень малых значениях будут преобладать мелкие кластеры, при больших все точки множества объединятся в один кластер). Очевидно, что поиск аномальных точек допускает сверхмалые размеры кластера: две точки уже кластер, а одна точка, не принадлежащая к конфигурации выделенных кластеров, тоже весьма аномальна. Фактически при использовании этого алгоритма достаточно варьировать всего один параметр (пресловутый «эпсилон»), чтобы перебрать все возможные конфигурации кластеров событий. 

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

Множество стабильных кластеров

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

Это означает, что для упрощения выявления аномальных точек и кластеров в первом приближении достаточно провести поиск в рамках множества стабильных конфигураций (логичным образом их можно выявить по изменению первой-второй производных функции количества кластеров в зависимости от варьируемых параметров). Именно эти конфигурации в первую очередь соответствуют некоторым «осмысленным» картинам. Чтобы убедиться в неизменности конфигурации, возможно, стоило бы применить сравнение множеств полученных кластеров как наборов точек, но пока эта проверка остается за рамками обзора.

С точки зрения алгоритмики определение стабильности конфигурации сводится к вычислению производных методами численного дифференцирования — по трем предыдущим точкам и значению функции в данной точке, например. Это означает, что при сохранении постоянного количества кластеров для четырех последовательных значений варьируемого параметра произойдет «зануление» производных, конфигурация будет считаться стабильной и до следующего изменения количества кластеров нет смысла проводить анализ конфигурации.

Анализ стабильных кластерных конфигураций

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

Что в итоге получилось

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

  1. Кодирование состояний с учетом специфики параметров артефакта и нормализации.
  2. Определение диапазона вариации параметра кластеризации (от 0 до 1 общего кластера).
  3. Определение множества стабильных конфигураций кластеров.
  4. Последовательный анализ множества стабильных конфигураций с накоплением весов по каждой конфигурации для точек, вошедших в аномально расположенные кластеры либо не вошедших в кластеры вовсе.
  5. Анализ полученного решения (то есть набора аномальных точек с накопленными весами) с точки зрения динамического диапазона полученного множества весов, возможная фильтрация решения по времени либо переход к агрегации решений для различных каналов.

Веселые картинки

Рисунок 1. Применение алгоритма tSNE к множеству точек RDP-событий (89 точек, 7D, один «меченый» кластер — к одной известной УЗ добавляется вторая, изначально неизвестная (кейс «X»))
Рисунок 2. Применение алгоритма DBSCAN к двумерным результатам алгоритма tSNE по множеству точек RDP-событий (1416 точек, 6D, одна из промежуточных точек анализа кластерных конфигураций — кейс «Y»)
Рисунок 3. Сходимость алгоритма tSNE (по кейсу на рис. 2 — точка «minimal divergence» в пределах 100 итераций, стабильное состояние — итерация 329, «переходный процесс» подавлен за счет применения эмпирически определенного соотношения LearningRate/Perplexity и количества точек)
Рисунок 4. Характерное изменение количества кластеров при вариации параметра «эпсилон» (кейс «Y»)
Рисунок 5. Одна из кластерных конфигураций, проекция на плоскость времени (кейс «Y»)
Рисунок 6. Результаты работы по одной из машин кейса «Y», события RDP (1416 точек, 6D, DBSCAN — обнаружение скомпрометированных УЗ и IP-адресов)
Рисунок 7. Результаты работы по 6 машинам кейса «Y», события RDP (4222 точки, 7D, DBSCAN — обнаружение скомпрометированных УЗ и IP-адресов)
Рисунок 8. Результаты работы по машине кейса «X», события RDP (78 точек, 6D, DBSCAN — обнаружение скомпрометированных УЗ и IP-адреса)
Рисунок 9. Результаты работы по логу Apache, кейс «Z» (фильтр по 2024 г. — 34 точки, 7D, DBSCAN, обнаружение запроса с UserAgent = CURL)
Рисунок 10. Результаты работы по SUM, кейс «X» (БД current, 13 точек, 6D, выявление скомпрометированной УЗ, причем в диапазоне решений с низким откликом по времени и УЗ обнаруживается исходный IP-адрес и вторая скомпрометированная УЗ)
Рисунок 11. Результаты работы по логу WTMP, кейс «Z» (628 точек, 5D, обнаружение скомпрометированной УЗ и адреса атакующего — третья строка)
Рисунок 12. Результаты работы по логу auth.log машины кейса «Z» (60 757 точек, 5D, обнаружение адреса С2)
Рисунок 13. Идентично предыдущему (60 757 точек, 5D, обнаружение адреса С2)

Необходимые замечания

  1. Строго говоря, предлагаемый алгоритм может быть применен не только к типизированным или строго структурированным логам, но и к наборам данных, которые допускают выделение подмножеств за счет группировки и шаблонизации. Например, при обработке папки var/log linux-подобной системы возможна группировка файлов логов сходного/идентичного назначения с использованием алгоритмов оценки сходства строк. Мы использовали для этого алгоритм Джаро — Винклера с эмпирически определенным пороговым значением коэффициента сходства относительных путей файлов 0,88, что позволило сгруппировать в том числе архивированные логи различных подсистем (впрочем, мы не беремся утверждать, что этот способ оптимален).
  2. Шаблонизация нетипизированных логов подразумевает возможность выделения в файле конечного набора шаблонов, исключающих из исходного текста сообщения быстро меняющиеся параметры: метки времени, IP-адреса, идентификаторы процессов, имена УЗ и т. п. Это означает, что можно кодировать сообщение по принципу «тип лога + тип сообщения + набор параметров». Например, в случае с auth.log часть сообщений может быть кодирована шаблонами вида:

«TS host-%LN% sshd[%LN%]: Accepted (password|publickey) for %UN% from %IP% port %LN% ssh%SN%»,

где TS — метка времени; LN — десятичное число от трех знаков длиной; SN — десятичное число до двух знаков длиной включительно; IP — IP-адрес; UN — имя УЗ. Далее можно обрабатывать только этот конкретный набор. 

А для лога обращений apache единственный шаблон (то есть все сообщения имеют одинаковый формат) примет следующий вид: 

«%IP%:%SN% %IP% - - [%TS%] %QF% %LN% %LN% %QF% %QF%»,

где QF — закавыченный текст, в трех различных позициях представляющий собой адрес страницы, исходный текст запроса и поле UserAgent. 

  1. Для выделения меток времени (особенно это актуально для linux-подобных систем) можно дополнять содержимое данных, имеющихся в файле, данными метки создания самого файла (в случаях, когда это необходимо). Например, когда сочетание месяца-дня-времени в файле есть, но год не указан (часто встречается в логах типа auth.log).
  2. Для сокращения времени расчета или отбрасывания заведомо не подлежащих анализу данных (например, логов с давностью в несколько лет, по каким-то причинам сохранившихся в var/log linux-подобной системы) можно применить «входную» фильтрацию по диапазону дат. Ровно так же к массиву решений можно применить аналогичную «выходную» фильтрацию для сокращения вывода при известном периоде рассматриваемого инцидента.
  3. Эксперименты показали, что решения с относительно малыми накопленными весами могут содержать данные о скомпрометированных УЗ и адресах. Однако в ряде случаев эти данные также могут быть учтены за счет наличия одного из признаков со значимым накопленным весом. При этом на данный момент затруднительно оценить влияние накопления данных (когда в рамках кейса совместно обрабатываются однотипные логи с различных машин) на динамический диапазон решений.
  4. Функция кодирования адресов источников в нынешней реализации неидеальна. При поступлении на вход комбинации адресов IPv4, IPv6 и текстовых строк (имен хостов) возможны различные варианты кодирования, и унификация пока под вопросом. Идея заключается в проецировании всех возможных адресов в диапазон координат от 0 до 1 при условии сохранения сходства внутри множеств внутренних и внешних адресов, а также различия между данными множествами и всяческими экзотическими значениями вида «::1».
  5. О производительности. Интуитивно вычислительную сложность алгоритма можно оценить как О(N^2), поэтому сверхбольшие массивы обрабатывать будет неприятно. Возможны некоторые оптимизации основного алгоритма (см. следующий раздел), но наиболее перспективным представляется распараллеливание процесса выращивания кластеров, так как связи между стадиями процесса практически нет. В итоге все сводится к вопросу выделения вычислительных ресурсов и написанию процедуры типа «CrazyGrower», которая формирует решение на основе набора точек и значений нескольких параметров.
  6. Реальные данные пользователей и имена доменов в приведенных кейсах заменены на ассоциативно или фонетически близкие за крайне редким исключением. 

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

При здравом размышлении очевидно: поскольку вариация параметра «эпсилон» применяется для поиска стабильных кластерных конфигураций, можно ускорить этот процесс. Пришедшие в голову способы перечислены далее — все они приводят к существенно более быстрому получению решения (в разы или в отдельных случаях на порядки) при некотором снижении динамического диапазона итогового решения.

Метод прыгающего мячика (МПМ)

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

Метод усекновения главы (МУГ)

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

Метод пружины (МП)

Суть данного подхода заключается в поиске характерного расстояния до начальной координаты в системе «количество кластеров относительно максимально допустимого значения эпсилон». При быстром уменьшении числа кластеров и незначительном отклонении от точки максимального значения это расстояние стремительно сокращается и в определенный момент достигает минимального значения, что соответствует области первых устойчивых крупных кластеров. После прохождения этой области расстояние вновь начинает постепенно возрастать, поскольку при дальнейшей вариации параметра эпсилон структура кластеров изменяется значительно медленнее. Практический опыт показывает, что рост кластеров после прохождения указанной точки сопровождается заметным увеличением вычислительных затрат. В связи с этим возможна остановка алгоритма не только при обнаружении единственного доминирующего кластера, но и при достижении заранее заданного предела «сжатия пружины» относительно минимального найденного значения. На практике это позволяет избежать перехода системы в состояние чрезмерного объединения объектов, при котором значительная часть локальной структуры данных теряется. Теоретически также допускается выполнение дополнительной кластеризации в окрестности точки «максимального сжатия пружины» для уточнения распределения элементов внутри крупных кластеров.

Иллюстрация сути предложенных методов ускорения расчета приведена на рис. 14.

Рисунок 14. Иллюстрация методов оптимизации на примере решения задачи на рис. 8: а — МПМ «осторожный», T = 104 мс, ДД = 23,4; б — МПМ «лютый», T = 107 мс, ДД = 11,7; в — МУГ, T = 97 мс, ДД = 76,8; г — МНВ, T = 250 мс, ДД = 192,3. Значения до оптимизаций: T = 65,4 c, ДД = 243,4. Смысловая нагрузка полученных решений во всех случаях идентична: из 78 событий выделяются 4 «криминальных»

По аналогии с рис. 14 время решения задачи для случая, приведенного на рис. 12–13 (один канал auth.log, 60 757 точек в 5-мерном пространстве), при идентичных вычислительных ресурсах с исходных 262 минут может быть сокращено:

  • с использованием МПМ c «осторожной» стратегией — до 53 минут, то есть в 4,9 раза;
  • с использованием МПМ с «лютой» стратегией — до 10,5 минуты, то есть примерно в 25 раз;
  • с использованием МУГ — до 24 минут, то есть в 10,9 раза, при допустимой доле суммарной длины «нестабильных» участков в 30% или до 43 минут (примерно в 6 раз) при доле в 10%;
  • с использованием МНВ — до 15 минут, то есть в 17,5 раза, при значении «коэффициента упругости веревки» 3,0 (с приемлемым качеством решения).

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

Таким образом, эксперимент показывает, что предложенные «наивно-интуитивные» методы способны существенно сократить время расчета. Выбор конкретной тактики оптимизации обусловлен только и исключительно волей экспериментатора к победе и его готовностью к компромиссам. Но справедливости ради следует отметить, что в случаях, когда количество исходных точек не превышает 5–10 К, подобная экономия времени не вполне оправданна: полный поиск, как правило, занимает не более 5 минут, но обеспечивает максимальные динамический диапазон и точность решения.

Поиск корреляций и агрегация аномалий различных каналов

Для решения этой задачи можно применить достаточно простой механизм наподобие «скользящего окна». Суть в том, что весь анализируемый временной интервал разбивается на промежутки равной длины, в рамках которых производится суммирование нормированных значений весов точек решений из различных каналов, попадающих в данный временной интервал с определением впоследствии «наиболее весомых» интервалов. Естественно, на данном этапе возможны как введение коэффициентов для весов из различных каналов (в том числе с учетом динамического диапазона полученного решения), так и сканирование временного диапазона со сдвигом на некоторую долю заданного интервала — таким образом решаются задачи вида «найти самые странные сутки/час из жизни машины». После сортировки взвешенных интервалов мы получим набор искомых решений с учетом аномалий всех участвующих каналов.

Рисунок 15. «Самый странный день в году одного ПК». Кейс «A», информация из решений по данным за 9 месяцев из каналов MFT (mft_analyzer, 44 точки — выборка по _name|frequency_anomaly), RDP (706 точек из 722, «плохое» решение), ApplicationLog (профилирование в плоскости EventID/Provider, из множества в 12,3 К точек получено решение в 34 точки). Обнаружено нелегитимное ПО, исходные IP-адрес и УЗ. Время совместного анализа трех решений — менее секунды

Для оценки качества получаемых данных возможно ввести отношение «сигнал-шум» (SNR) как отношение максимального детектируемого веса временного интервала к среднему значению для всех анализируемых интервалов. Входные данные во всех случаях идентичны данным на рис. 15.

Рисунок 16. Временная плотность аномалий трех различных типов и суммарная временная плотность при «скользящем окне» размером в 72 часа и величиной сдвига 1/240 от данного периода. Частные SNR = 14/40/18, итоговый SNR = 16
Рисунок 17. Временная плотность аномалий трех различных типов и суммарная временная плотность при «скользящем окне» размером в 24 часа и величиной сдвига 1/240 от данного периода. Частные SNR = 21/54/40, итоговый SNR = 23
Рисунок 18. Временная плотность аномалий трех различных типов и суммарная временная плотность при «скользящем окне» размером в 3 часа и величиной сдвига 1/10 от данного периода. Частные SNR = 89/264/212, итоговый SNR = 115

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

***

Изложенная выше идея предельно проста. Кодирование переменных подразумевает получение набора нормированных и независимых координат, позволяющих сохранить интуитивно понятные свойства анализируемых событий (время, длительность, уникальность УЗ или адреса и т. п.). Далее только «семь озорных шагов за горизонт», дело техники, вопрос достаточной вычислительной мощности, треш, угар и в отдельных случаях — бездна отчаяния...

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

Мы дěлаем Positive Research → для ИБ-экспертов, бизнеса и всех, кто интересуется ✽ {кибербезопасностью}