![](https://habrastorage.org/files/875/e3a/d60/875e3ad602d54a84ad7ba50379f84e3e.jpg)
Изображение: Daniel Friedman, Flickr
В нашем блоге на Хабре мы много пишем о внедрении практик DevOps в процессы разработки и тестирования создаваемых в компании систем информационной безопасности. Задача инженера-автоматизатора не всегда заключается только в установке и поддержки какого-то сервиса, иногда необходимо решать трудоемкие исследовательские задачи.
Для решения одной из таких задач — разбора уязвимостей в ходе тестов конкурентного анализа, мы разработали собственный универсальный классификатор. О том, как работает этот инструмент, и каких результатов позволяет добиваться, и пойдет речь в нашем сегодняшнем материале.
Немного теории
Для начала разберемся с тем, что такое классификация в общем случае. Под классификацией производного объекта подразумевается отношение этого объекта к одному из двух классов в зависимости от того, насколько он «похож» на эталон, применяемый в предметной области. То есть, для задачи классификации необходимо построить некоторую функцию (классификатор), которая бы указывала на уровень «похожести» нашего объекта на эталонные примеры из разных классов (подробнее по ссылке).
![](https://habrastorage.org/files/cea/ec4/007/ceaec40072e048a895026639009abc30.png)
Диаграмма Эйлера-Венна для задачи классификации уязвимостей
Для решения широкого класса задач классификации предлагается использовать несколько теорий:
- теорию нечетких множеств;
- инструмент для нечеткой оценки свойств объектов: нечеткие шкалы;
- теорию нейронных сетей.
Теория нечетких множеств
Основателем теории нечетких множеств и нечеткой логики еще в 60-х годах прошлого века стал Лотфи Заде. Смысл понятия «нечеткое множество» лучше всего иллюстрирует простой пример объяснения того, что такое «много». Один экземпляр чего-то — не много, два — тоже, а три, четыре или пять — уже может быть много. Для математического описания нечеткой величины используют так называемую функцию принадлежности, которая для каждого объекта рассматриваемой области ставит в соответствие число, характеризующее величину принадлежности к данному нечеткому множеству.
Нечеткие шкалы
Это упорядоченная совокупность нечетких множеств, то есть каждое из них должно нести какую-то смысловую нагрузку. Пример — всем известные уровневые шкалы. Вот так выглядит универсальная нечеткая шкала, состоящая из пяти уровней:
S = {Min, Low, Med, High, Max}
При оперировании уровневыми шкалами мы имеем возможность определять, когда то или иное значение находится на каком-то уровне. Такие нечеткие шкалы позволяют интерпретировать значения конкретных свойств в виде числа (подробнее по ссылке).
Нейронные сети
Известно, что в биологическом нейроне клетки могут накапливать электрические импульсы, которые передаются на синапсы, связывающие между собой несколько нейронов. В зависимости от порога чувствительности клетки электрический сигнал передается или не передается дальше.
Точно также устроены и математические нейронные сети. На вход нейрону могут подаваться какие-либо числа — как четкие, так и нечеткие, они перемножаются с весовыми коэффициентами. Для каждого нейрона устанавливается «порог срабатывания» — сумма произведений входов и весов передается на вход функции активации, которая выдает результат для конкретного нейрона. Такие нейроны, расположенные друг за другом, называют нейронной сетью (подробнее по ссылке).
![](https://habrastorage.org/files/a55/74b/005/a5574b0052c04786b233bfe2fc00bb7a.png)
Для повышения качества разбора уязвимостей нашими продуктами, нам необходимо было научиться определять их принадлежность к одному из двух классов — подтвержденных или неподтвержденных уязвимостей. Для этого было проведено множество экспериментов, которые увенчались созданием оптимальной для решения этой задачи нейронной сети.
Она состоит из четырех слоев, на вход которой подаются числа, а на выходе получаем два четких или нечетких числа, которые характеризуют уровень принадлежности к одному из классов — например, минимальный уровень «похожести» или «максимальный» (подробнее по ссылке).
Автоматизация классификации
Для автоматизации процесса классификации объектов мы разработали специальный инструмент — FuzzyClassificator. Это нечеткий нейроклассификатор, в основе которого лежит нейронная сеть, обрабатывающая четкие и нечеткие величины. Код этого инструмента доступен на GitHub, для его работы требуется Pyzo и PyBrain (подробнее по ссылке).
Сейчас мы используем инструмент FuzzyClassificator для решения конкретной прикладной задачи классификации уязвимостей. Они — отличный пример объектов, имеющих нечеткую природу, и которые не может однозначно классифицировать даже человек.
Существует всего два этапа работы любой системы, в основе которой лежит нейронная сеть — ее обучение и классификация. На первом этапе для решения нашей задачи классификации мы сканируем множество различных CMS множеством сканеров безопасности. На выходе эти сканеры выдают очень много информации об уязвимостях в CMS — на этом этапе невозможно сказать, реальны ли они, либо мы имеем дело с ложными срабатываниями. Полученные данные мы помещаем в базу TFS, откуда их можно получать и кодировать в понятном для нейросети виде.
Затем нейросеть обучается на эталонных данных, после чего ее можно использовать на данных, полученных в ходе тестов сканеров безопасности.
Что в итоге
Ранее нам приходилось заниматься разбором уязвимостей вручную — только так можно было понять, корректно ли сработали наши продукты, существует ли действительно найденная ими уязвимость и настолько ли она серьезна. Нейронная сеть помогает экономить до 70% времени на разбор. В частности, это позволило увеличить число сканируемых CMS и анализируемых сканеров безопасности для конкурентного анализа.
Этот процесс был автоматизирован в использующейся нами системе TeamCity. Тестировщики используют специальный интерфейс для запуска FuzzyClassificator и использования нейросети в режиме обучения и классификации.
![](https://habrastorage.org/files/513/4ae/8ed/5134ae8eda6e445dbcdcd74bca1bb45a.jpg)
Пример отчета системы на этапе обучения выглядит так:
![](https://habrastorage.org/files/348/f11/6fe/348f116fe1a449e4934d51fe62002446.jpg)
Он включает данные по качеству обучаемой нейронной сети — насколько сильно может ошибаться сеть при анализе. Отчет в «боевом» режиме разбора уязвимостей выглядит так:
![](https://habrastorage.org/files/c48/6d5/513/c486d55130684657b38b2a8d5456d315.jpg)
Все уязвимости сведены в таблицу, в которой отражены уровни уверенности нейросети в действительном наличии той или иной уязвимости или ее ложности, а также рекомендации по интерпретации этих данных. Пример — на рисунке выше первую уязвимость нейросеть готова подтвердить с минимальным уровнем уверенности, а отвергнуть ее — с максимальным, поэтому рекомендует эту ошибку отклонить, пометить ее как Rejected, то есть — это false positive для сканера. После того, как нейросеть выдала результат, она отправляет его также в базу TFS.
Ограничения и доработки
Как и любой инструмент, наш FuzzyClassificator имеет свои ограничения. Корректная классификация с его помощью:
- сильно зависит от выбранного метода кодирования входных данных;
- требует хорошего знания предметной области, для которой выполняется классификация;
- требует значительных усилий в подготовке «хороших» входных данных для обучения.
На данный момент для кода инструмента и всех его низкоуровневых методов мы уже провели оптимизацию алгоритмов, но останавливаться на достигнутом не собираемся. В наших ближайших планах:
- перевод инструмента на CPython;
- реализация исполнения кода на GPU.
Материалы по теме:
- Применение нейросетей для решения классических задач линейного и нелинейного разделения элементов множества на классы
- Подходы к автоматизации процесса валидации уязвимостей, найденных автоматическими сканерами безопасности, при помощи нечётких множеств и нейронных сетей
- Сканеры безопасности: автоматическая валидация уязвимостей с помощью нечетких множеств и нейронных сетей
- Сканеры безопасности: автоматическая классификация уязвимостей
P.S. Рассказ о нашем опыте создания нечеткого классификатора был представлен в рамках DevOps-митапа, который состоялся осенью 2016 года в Москве.
Видео:
Слайды:
По ссылке представлены презентации 16 докладов, представленных в ходе мероприятия. Все презентации и видео выступлений добавлены в таблицу в конце этого топика-анонса.
Автор: Тимур Гильмуллин