Авторы: Тибериу Борос, Data Scientist и инженер по машинному обучению, и Andrei Cotaie, технический руководитель, Security Intelligence & Engineering

ПРИМЕЧАНИЕ. В этом сообщении обсуждаются технологии, на которые заявлен патент.

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

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

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

Однако, возвращаясь к игре в кошки-мышки — злоумышленники всегда будут пытаться найти следующую нетрадиционную атаку, которая могла бы обойти системы безопасности и мышление. В таком случае, как нам лучше защититься от неизвестности? Здесь могут помочь методы машинного обучения. Машинное обучение можно применять для помощи в распространенном векторе атаки — изменениях и вставках в командной строке. Интерфейсы командной строки часто используются системными администраторами, пользователями и приложениями. Многие программные продукты запускают консольные сценарии для выполнения определенных задач, таких как проверка информации о системе или ресурсов («net», «wmic»), управление правилами брандмауэра, регистрация служб и т. д. Однако не все шаблоны сценариев являются общими для всех приложений. Авторы вредоносных программ и более продвинутые злоумышленники также любят использовать эти собственные системные возможности.

Командные строки являются интересным вектором атаки, потому что они очень похожи на человеческую речь: (а) они используют определенный синтаксис и (б) они обеспечивают «семантику» посредством упорядочения и зависимости между последовательными токенами и их ролью в конечном результате. Учитывая это, в зависимости от токенов и их порядка, одинаковые командные строки могут вести себя по-разному. Например:

tail -f /usr/local/apache/logs/access_log | grep "11.12.13.14" 
tail -f /usr/local/apache/logs/error_log | grep -v "11.12.13.14"

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

Кластеризация на основе TF-IDF (термин частотно-обратная частота документа) также не будет оптимальной. Проблема в том, что «мешок слов» игнорирует семантику (роль) командной строки и ее аргументов. Рассмотрим команды «rm» и «cp». Если вы используете TF-IDF и измеряете расстояние между каждой парой команд, вы получите очень похожие результаты. Однако между «rm» и «cp» есть четкая разница. Это по-прежнему справедливо для случаев, когда замена только одного параметра или токена приведет к совершенно другому поведению.

В отличие от простой реализации TF-IDF и кластеризации, BLEU (Bilingual Evaluation Understudy) может фиксировать и моделировать зависимости между соседними токенами в командной строке. BLEU — это мера, используемая в машинном переводе для определения того, насколько хорошо автоматизированная система перевода работает с данными золотого стандарта. Он работает путем подсчета вхождений не только отдельных токенов («мешок слов»), но и биграмм, триграмм, четырехграмм и т. д. Оценка сходства между двумя последовательностями представляет собой взвешенную и сглаженную интерполяцию между несколькими долями правильно «переведенных» n-грамм. Эта оценка лучше отражает синтаксические ограничения в командных строках.

Далее, вместо того, чтобы обрабатывать каждую командную строку отдельно, мы объединяем их вместе, используя метод кластеризации, отличный от K-средних. Мы предпочитаем пороговую кластеризацию, поскольку она имеет сложность O(n). Это позволяет нам обрабатывать большие объемы данных с меньшей вычислительной мощностью и ресурсами.

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

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

Есть дополнительные подробности об этом проекте, которые для ясности и простоты мы опустили в этом посте. Этот процесс был представлен на рассмотрение патента в соответствии с P8075-US и в настоящее время оценивается. Вы также можете узнать больше об этом проекте в нашей недавней веб-трансляции с Cloud Security Alliance. Мы надеемся, что этот процесс поможет нам лучше обнаруживать возможные сложные угрозы, прежде чем они станут более серьезной проблемой.