Изображение: Daniel Friedman, Flickr
В нашем блоге на Хабре мы много пишем о внедрении практик DevOps в процессы разработки и тестирования создаваемых в компании систем информационной безопасности. Задача инженера-автоматизатора не всегда заключается только в установке и поддержки какого-то сервиса, иногда необходимо решать трудоемкие исследовательские задачи.
Для решения одной из таких задач — разбора уязвимостей в ходе тестов конкурентного анализа, мы разработали собственный универсальный классификатор. О том, как работает этот инструмент, и каких результатов позволяет добиваться, и пойдет речь в нашем сегодняшнем материале.
Немного теории
Для начала разберемся с тем, что такое классификация в общем случае. Под классификацией производного объекта подразумевается отношение этого объекта к одному из двух классов в зависимости от того, насколько он «похож» на эталон, применяемый в предметной области. То есть, для задачи классификации необходимо построить некоторую функцию (классификатор), которая бы указывала на уровень «похожести» нашего объекта на эталонные примеры из разных классов (подробнее по ссылке).
Диаграмма Эйлера-Венна для задачи классификации уязвимостей
Для решения широкого класса задач классификации предлагается использовать несколько теорий:
- теорию нечетких множеств;
- инструмент для нечеткой оценки свойств объектов: нечеткие шкалы;
- теорию нейронных сетей.
Теория нечетких множест
в
Основателем теории нечетких множеств и нечеткой логики еще в 60-х годах прошлого века стал Лотфи Заде. Смысл понятия «нечеткое множество» лучше всего иллюстрирует простой пример объяснения того, что такое «много». Один экземпляр чего-то — не много, два — тоже, а три, четыре или пять — уже может быть много. Для математического описания нечеткой величины используют так называемую функцию принадлежности, которая для каждого объекта рассматриваемой области ставит в соответствие число, характеризующее величину принадлежности к данному нечеткому множеству.
Нечеткие шкалы
Это упорядоченная совокупность нечетких множеств, то есть каждое из них должно нести какую-то смысловую нагрузку. Пример — всем известные уровневые шкалы. Вот так выглядит универсальная нечеткая шкала, состоящая из пяти уровней:
S = {Min, Low, Med, High, Max}
При оперировании уровневыми шкалами мы имеем возможность определять, когда то или иное значение находится на каком-то уровне. Такие нечеткие шкалы позволяют интерпретировать значения конкретных свойств в виде числа (подробнее по ссылке).
Нейронные сети
Известно, что в биологическом нейроне клетки могут накапливать электрические импульсы, которые передаются на синапсы, связывающие между собой несколько нейронов. В зависимости от порога чувствительности клетки электрический сигнал передается или не передается дальше.
Точно также устроены и математические нейронные сети. На вход нейрону могут подаваться какие-либо числа — как четкие, так и нечеткие, они перемножаются с весовыми коэффициентами. Для каждого нейрона устанавливается «порог срабатывания» — сумма произведений входов и весов передается на вход функции активации, которая выдает результат для конкретного нейрона. Такие нейроны, расположенные друг за другом, называют нейронной сетью (подробнее по ссылке).
Для повышения качества разбора уязвимостей нашими продуктами, нам необходимо было научиться определять их принадлежность к одному из двух классов — подтвержденных или неподтвержденных уязвимостей. Для этого было проведено множество экспериментов, которые увенчались созданием оптимальной для решения этой задачи нейронной сети.
Она состоит из четырех слоев, на вход которой подаются числа, а на выходе получаем два четких или нечетких числа, которые характеризуют уровень принадлежности к одному из классов — например, минимальный уровень «похожести» или «максимальный» (подробнее по ссылке).
Автоматизация классификации
Для автоматизации процесса классификации объектов мы разработали специальный инструмент — FuzzyClassificator. Это нечеткий нейроклассификатор, в основе которого лежит нейронная сеть, обрабатывающая четкие и нечеткие величины. Код этого инструмента доступен на GitHub, для его работы требуется Pyzo и PyBrain (подробнее по ссылке).
Сейчас мы используем инструмент FuzzyClassificator для решения конкретной прикладной задачи классификации уязвимостей. Они — отличный пример объектов, имеющих нечеткую природу, и которые не может однозначно классифицировать даже человек.
Существует всего два этапа работы любой системы, в основе которой лежит нейронная сеть — ее обучение и классификация. На первом этапе для решения нашей задачи классификации мы сканируем множество различных CMS множеством сканеров безопасности. На выходе эти сканеры выдают очень много информации об уязвимостях в CMS — на этом этапе невозможно сказать, реальны ли они, либо мы имеем дело с ложными срабатываниями. Полученные данные мы помещаем в базу TFS, откуда их можно получать и кодировать в понятном для нейросети виде.
Затем нейросеть обучается на эталонных данных, после чего ее можно использовать на данных, полученных в ходе тестов сканеров безопасности.
Что в итоге
Ранее нам приходилось заниматься разбором уязвимостей вручную — только так можно было понять, корректно ли сработали наши продукты, существует ли действительно найденная ими уязвимость и настолько ли она серьезна. Нейронная сеть помогает экономить до 70% времени на разбор. В частности, это позволило увеличить число сканируемых CMS и анализируемых сканеров безопасности для конкурентного анализа.
Этот процесс был автоматизирован в использующейся нами системе TeamCity. Тестировщики используют специальный интерфейс для запуска FuzzyClassificator и использования нейросети в режиме обучения и классификации.
Пример отчета системы на этапе обучения выглядит так:
Он включает данные по качеству обучаемой нейронной сети — насколько сильно может ошибаться сеть при анализе. Отчет в «боевом» режиме разбора уязвимостей выглядит так:
Все уязвимости сведены в таблицу, в которой отражены уровни уверенности нейросети в действительном наличии той или иной уязвимости или ее ложности, а также рекомендации по интерпретации этих данных. Пример — на рисунке выше первую уязвимость нейросеть готова подтвердить с минимальным уровнем уверенности, а отвергнуть ее — с максимальным, поэтому рекомендует эту ошибку отклонить, пометить ее как Rejected, то есть — это false positive для сканера. После того, как нейросеть выдала результат, она отправляет его также в базу TFS.
Ограничения и доработки
Как и любой инструмент, наш FuzzyClassificator имеет свои ограничения. Корректная классификация с его помощью:
- сильно зависит от выбранного метода кодирования входных данных;
- требует хорошего знания предметной области, для которой выполняется классификация;
- требует значительных усилий в подготовке «хороших» входных данных для обучения.
На данный момент для кода инструмента и всех его низкоуровневых методов мы уже провели оптимизацию алгоритмов, но останавливаться на достигнутом не собираемся. В наших ближайших планах:
- перевод инструмента на CPython;
- реализация исполнения кода на GPU.
Материалы по теме:
- Применение нейросетей для решения классических задач линейного и нелинейного разделения элементов множества на классы
- Подходы к автоматизации процесса валидации уязвимостей, найденных автоматическими сканерами безопасности, при помощи нечётких множеств и нейронных сетей
- Сканеры безопасности: автоматическая валидация уязвимостей с помощью нечетких множеств и нейронных сетей
- Сканеры безопасности: автоматическая классификация уязвимостей
P.S. Рассказ о нашем опыте создания нечеткого классификатора был представлен в рамках DevOps-митапа, который состоялся осенью 2016 года в Москве.
Видео:
Слайды:
По ссылке представлены презентации 16 докладов, представленных в ходе мероприятия. Все презентации и видео выступлений добавлены в таблицу в конце этого топика-анонса.
Автор: Тимур Гильмуллин
Автор: Positive Technologies