- PVSM.RU - https://www.pvsm.ru -

Как мы анализируем уязвимости с помощью нейронных сетей и нечеткой логики

Как мы анализируем уязвимости с помощью нейронных сетей и нечеткой логики - 1 [1]

Изображение: Daniel Friedman [2], Flickr

В нашем блоге на Хабре мы много пишем о внедрении практик DevOps в процессы разработки и тестирования создаваемых в компании систем информационной безопасности. Задача инженера-автоматизатора не всегда заключается только в установке и поддержки какого-то сервиса, иногда необходимо решать трудоемкие исследовательские задачи.

Для решения одной из таких задач — разбора уязвимостей в ходе тестов конкурентного анализа [3], мы разработали собственный универсальный классификатор [4]. О том, как работает этот инструмент, и каких результатов позволяет добиваться, и пойдет речь в нашем сегодняшнем материале.

Немного теории

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

Как мы анализируем уязвимости с помощью нейронных сетей и нечеткой логики - 2

Диаграмма Эйлера-Венна для задачи классификации уязвимостей

Для решения широкого класса задач классификации предлагается использовать несколько теорий:

  • теорию нечетких множеств;
  • инструмент для нечеткой оценки свойств объектов: нечеткие шкалы;
  • теорию нейронных сетей.

Теория нечетких множест

в
Основателем теории нечетких множеств и нечеткой логики еще в 60-х годах прошлого века стал Лотфи Заде [6]. Смысл понятия «нечеткое множество» лучше всего иллюстрирует простой пример объяснения того, что такое «много». Один экземпляр чего-то — не много, два — тоже, а три, четыре или пять — уже может быть много. Для математического описания нечеткой величины используют так называемую функцию принадлежности, которая для каждого объекта рассматриваемой области ставит в соответствие число, характеризующее величину принадлежности к данному нечеткому множеству.

Нечеткие шкалы

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

S = {Min, Low, Med, High, Max}

При оперировании уровневыми шкалами мы имеем возможность определять, когда то или иное значение находится на каком-то уровне. Такие нечеткие шкалы позволяют интерпретировать значения конкретных свойств в виде числа (подробнее по ссылке [7]).

Нейронные сети

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

Точно также устроены и математические нейронные сети. На вход нейрону могут подаваться какие-либо числа — как четкие, так и нечеткие, они перемножаются с весовыми коэффициентами. Для каждого нейрона устанавливается «порог срабатывания» — сумма произведений входов и весов передается на вход функции активации, которая выдает результат для конкретного нейрона. Такие нейроны, расположенные друг за другом, называют нейронной сетью (подробнее по ссылке [8]).

Как мы анализируем уязвимости с помощью нейронных сетей и нечеткой логики - 3

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

Она состоит из четырех слоев, на вход которой подаются числа, а на выходе получаем два четких или нечетких числа, которые характеризуют уровень принадлежности к одному из классов — например, минимальный уровень «похожести» или «максимальный» (подробнее по ссылке [9]).

Автоматизация классификации

Для автоматизации процесса классификации объектов мы разработали специальный инструмент — FuzzyClassificator. Это нечеткий нейроклассификатор, в основе которого лежит нейронная сеть, обрабатывающая четкие и нечеткие величины. Код этого инструмента доступен на GitHub [10], для его работы требуется Pyzo [11] и PyBrain [12] (подробнее по ссылке [13]).

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

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

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

Что в итоге

Ранее нам приходилось заниматься разбором уязвимостей вручную — только так можно было понять, корректно ли сработали наши продукты, существует ли действительно найденная ими уязвимость и настолько ли она серьезна. Нейронная сеть помогает экономить до 70% времени на разбор. В частности, это позволило увеличить число сканируемых CMS и анализируемых сканеров безопасности для конкурентного анализа.

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

Как мы анализируем уязвимости с помощью нейронных сетей и нечеткой логики - 4

Пример отчета системы на этапе обучения выглядит так:

Как мы анализируем уязвимости с помощью нейронных сетей и нечеткой логики - 5

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

Как мы анализируем уязвимости с помощью нейронных сетей и нечеткой логики - 6

Все уязвимости сведены в таблицу, в которой отражены уровни уверенности нейросети в действительном наличии той или иной уязвимости или ее ложности, а также рекомендации по интерпретации этих данных. Пример — на рисунке выше первую уязвимость нейросеть готова подтвердить с минимальным уровнем уверенности, а отвергнуть ее — с максимальным, поэтому рекомендует эту ошибку отклонить, пометить ее как Rejected, то есть — это false positive для сканера. После того, как нейросеть выдала результат, она отправляет его также в базу TFS.

Ограничения и доработки

Как и любой инструмент, наш FuzzyClassificator имеет свои ограничения. Корректная классификация с его помощью:

  • сильно зависит от выбранного метода кодирования входных данных;
  • требует хорошего знания предметной области, для которой выполняется классификация;
  • требует значительных усилий в подготовке «хороших» входных данных для обучения.

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

  • перевод инструмента на CPython;
  • реализация исполнения кода на GPU.

Материалы по теме:

P.S. Рассказ о нашем опыте создания нечеткого классификатора был представлен в рамках DevOps-митапа, который состоялся осенью 2016 года в Москве.

Видео:

Слайды:

По ссылке [17] представлены презентации 16 докладов, представленных в ходе мероприятия. Все презентации и видео выступлений добавлены в таблицу в конце этого топика-анонса [18].

Автор: Тимур Гильмуллин [19]

Автор: Positive Technologies

Источник [20]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/matematika/248337

Ссылки в тексте:

[1] Image: https://habrahabr.ru/company/pt/blog/323436/

[2] Daniel Friedman: https://www.flickr.com/photos/daniel_friedman/

[3] тестов конкурентного анализа: https://habrahabr.ru/company/pt/blog/321354/

[4] универсальный классификатор: https://habrahabr.ru/company/pt/blog/246197/

[5] по ссылке: http://math-n-algo.blogspot.ru/2014/08/FuzzyClassificator.html#chapter_2

[6] Лотфи Заде: https://ru.wikipedia.org/wiki/%D0%9B%D0%BE%D1%82%D1%84%D0%B8_%D0%97%D0%B0%D0%B4%D0%B5

[7] по ссылке: http://math-n-algo.blogspot.ru/2014/08/FuzzyClassificator.html#chapter_3

[8] по ссылке: http://math-n-algo.blogspot.ru/2013/04/blog-post.html#id_1

[9] по ссылке: http://math-n-algo.blogspot.ru/2014/08/FuzzyClassificator.html#chapter_6

[10] GitHub: https://github.com/Tim55667757/FuzzyClassificator/tree/master

[11] Pyzo: http://www.pyzo.org/

[12] PyBrain: http://pybrain.org/

[13] по ссылке: http://math-n-algo.blogspot.ru/2014/08/FuzzyClassificator.html#chapter_7

[14] Применение нейросетей для решения классических задач линейного и нелинейного разделения элементов множества на классы: http://math-n-algo.blogspot.ru/2013/04/blog-post.html

[15] Подходы к автоматизации процесса валидации уязвимостей, найденных автоматическими сканерами безопасности, при помощи нечётких множеств и нейронных сетей: http://math-n-algo.blogspot.ru/2014/08/FuzzyClassificator.html

[16] Сканеры безопасности: автоматическая классификация уязвимостей: https://habrahabr.ru/company/pt/blog/274241/

[17] ссылке: http://www.slideshare.net/phdays

[18] топика-анонса: https://habrahabr.ru/company/pt/blog/310584/

[19] Тимур Гильмуллин: https://www.linkedin.com/in/tgilmullin

[20] Источник: https://habrahabr.ru/post/323436/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best