Аннотация: В статье рассмотрены и формально решены проблемы автоматической классификации уязвимостей информационных систем. Поставлена задача нечёткой классификации уязвимостей. Проанализированы возможные способы решения данной задачи. Выбраны и построены измерительные шкалы для чёткой и нечёткой оценки свойств уязвимостей и степеней их принадлежности классам. Для различных интерпретаций результатов указаны функции связи между шкалами. Предложена матрица кодирования свойств уязвимостей. Предложена архитектура нейронной сети для классификации уязвимостей. Разработаны программные модули для нечёткой классификации произвольных объектов, представленных векторами признаков для различного числа классов и структуры нейронной сети.
Опубликовано:
1. Гильмуллин Т.М., Гильмуллин М.Ф. Подходы к автоматизации процесса валидации уязвимостей, найденных автоматическими сканерами безопасности, при помощи нечётких множеств и нейронных сетей // Фундаментальные исследования. – 2014. – № 11 (часть 2). – стр. 266-279;
URL: http://www.fundamental-research.ru/ru/article/view?id=35511, см. PDF-вариант.
2. Гильмуллин Т.М. Сканеры безопасности: автоматическая валидация уязвимостей с помощью нечетких множеств и нейронных сетей // Positive Research 2015: Сборник исследований по практической безопасности. – 2015. – стр. 55-57;
URL: http://www.ptsecurity.ru/download/PT_Positive_Research_2015_RU_web.pdf (С. 57-59)
Внимание! Полное или частичное использование материалов данной статьи, а также программы, реализованной в рамках исследований и опубликованной под MIT-лицензией, допускается в любых целях со ссылкой на автора и этот первоисточник.
Содержание:
1. Введение в проблему
2. Постановка задачи нечёткой классификации уязвимостей
3. Измерительные шкалы и связь между ними
4. Кодирование входных данных
5. Анализ способов решения задачи классификации уязвимостей
6. Построение нейронной сети, её обучение и представление результатов
7. Программная реализация классификатора
8. Заключение
В настоящее время существует огромное количество различных сканеров информационной безопасности (далее – сканеры), применяемых для анализа защищенности веб-приложений: Acunetix WVS, IBM AppScan, BurpSuite, NMap, HP Fortify, Positive Technologies – MaxPatrol, XSpider, Application Inspector и других, различающихся ценой, качеством сканирования, поддерживаемыми технологиями, типами обнаруживаемых уязвимостей, методиками поиска – белый или черный ящик, и десятками других параметров. Некоторое представление о возможностях сканеров и сравнение их характеристик можно получить, например, из периодического отчета «The Web Application Vulnerability Scanners Benchmark (by Shay Chen, Information Security Researcher).» [1].
При разработке сканеров информационной безопасности важную роль играют методики тестирования их работы, о которых мы упоминали в статье «Тестирование сканеров безопасности веб-приложений: подходы и критерии» [2]. В этих методиках особое место занимает конкурентный анализ сканеров и их сравнение с другими.
Основным ожидаемым результатом работы любого сканера безопасности является список кандидатов в уязвимости, полученный в процессе анализа веб-приложения. Использование в сканерах сложных эвристических алгоритмов часто приводит к большому числу ложных срабатываний и заполнению такого списка несуществующими в реальном веб-приложении уязвимостями (false positives). В связи с чем требуется длительная работа экспертов-аналитиков в области информационной безопасности, чтобы перепроверить, подтвердить или опровергнуть найденные автоматическим сканером кандидаты в уязвимости. При этом они используют как различные инструментальные средства для попыток эксплуатации уязвимостей, так и делают выводы, опираясь на собственный опыт.
На практике, как один из способов подтверждения уязвимости, может использоваться сравнение с некоторыми аналогичными уязвимостями, о которых заранее известно, что они имеются в похожем веб-приложении или в том же веб-приложении, но более ранней версии. Для этого может быть сформирована база данных «эталонных» уязвимостей, содержащая характеристики и описание реальных, ранее найденных уязвимостей. Тогда эксперт-аналитик сможет сделать дополнительные выводы и подтвердить, или опровергнуть, новые кандидаты в уязвимости, опираясь на их сравнение с эталонами по некоторым правилам. Однако, подобная рутинная работа также нуждается в дополнительных инструментах и процедурах, позволяющих выполнить такой анализ: сравнивать кандидаты с эталонными уязвимостями и отсеивать очевидные false positives.
Как отмечено выше, проблема подтверждения уязвимостей из списка кандидатов на практике может решаться как задача сравнения их с некоторыми эталонами. В случае если все объекты – и эталоны, и кандидаты в уязвимости – могут быть однозначно параметризованы, представлены в виде вектора признаков объекта, то проблема может быть сведена к классической задаче классификации элементов множества [3, п. 3].
Входные данные
1. Задано n-мерное векторное пространство Vulners – всех уязвимостей (vulnerabilities) веб-приложений, которые могут быть заданы векторами признаками vi:
где v1, ... vn – чёткие, либо дефазифицированные из нечётких, числовые характеристики отдельных признаков уязвимости.
Из Vulners выделено непустое конечное подмножество Candidates – кандидатов в уязвимости для некоторого веб-приложения:
Элементы из Candidates являются объектами классификации.
2. Каждую уязвимость из Candidates допускается отнести к двум классам:
I класс подтвержденных (verified) уязвимостей:
II класс неподтвержденных (non-verified) уязвимостей:
3. Существует Eth – непустое подмножество «эталонных» (ethalon) уязвимостей, входящих в I класс:
Используя элементы Eth, допускается делать предположения о принадлежности других элементов из Candidates классам Ver и NVer в виде некоторого «правила» – функции f от двух переменных, определенной на множестве Ver × Eth со значениями в Ver, то есть выполняется условие:
4. Задано множество измерительных шкал Scales для оценки чётких и нечётких характеристик уязвимостей:
где Sp – чёткая (precise) числовая шкала,
Sf – нечёткая (fuzzy) шкала лингвистических переменных.
Схематично условия задачи можно изобразить, как представлено на Рис. 1.
Требуется
1. Построить отображения Fuzzy и Defuz для задачи интерпретации результатов классификации и оценок:
определяющие способы представления чётких оценок в виде нечёткого значения некоторой лингвистической переменной и наоборот.
2. Построить отображение Classificator для задачи классификации:
ставящее в соответствие каждой уязвимости из Candidates оценки принадлежности уязвимости каждому классу, учитывая при этом имеющиеся эталоны. Иначе говоря, нужно построить функцию:
Среди исследований, выполненных в работе [4], приведены примеры, показывающие, что в качестве универсальных измерительных шкал для оценки свойств информационных систем могут быть использованы:
– множество действительных чисел из отрезка [0, 1] [4, С. 62-64], которое легко может быть преобразовано в любые другие виды чётких числовых множеств: дискретных, непрерывных, неограниченных, при помощи различных функций конвертирования [4, С. 66-67];
– F-множества упорядоченных нечётких переменных [4, С. 59-60] вида FP ={fpi}, где fpi – лингвистические переменные, описывающие значения свойств объекта.
Дадим некоторые определения из теории нечётких систем, связанные с данным исследованием.
Нечёткое множество A в полном пространстве X определяется через функцию принадлежности (membership function):
Величина µA(x), x ∈ X интерпретируется как субъективная оценка степени принадлежности элемента x к нечёткому множеству A.
Носителем нечёткого множества или несущим множеством А называется чёткое подмножество полного пространства X, на котором значение µA (x) положительно:
Нечёткими F-множествами называют совокупность всех нечётких подмножеств F(X) произвольного базового множества X, а их функции принадлежности – F-функциями. Как правило, под µA понимают сужение функции принадлежности со всего X на σ(A), поэтому F-множества обычно задают функцией принадлежности и несущим множеством:
Нечёткая переменная – это объект предметной области, характеризуемый тройкой {N, X, R(N, x)}, где N – название переменной, X – универсальное множество (полное пространство наблюдений) с базовой переменной x, R(N, x) ∈ F(X) – нечёткое F-множество, задающее ограничения на значения переменной x, обусловленные её названием N [5].
Лингвистическая переменная – это нечёткая переменная, значениями которой являются другие нечёткие переменные: слова или предложения естественного или формального языка [5].
Нечёткая шкала (fuzzy scale) – это упорядоченная совокупность S нечётких переменных Ai, определенных своими F-функциями, значения из которой может принимать некоторая лингвистическая переменная s:
Фиксация значения s = Ai для некоторого свойства означает, что оно оценивается лингвистической переменной s на нечёткой шкале S и имеет значение Ai. Для задания шкалы S необходимо определить каждую нечёткую переменную Ai с указанием её функции принадлежности и несущего множества [4, С. 128].
Фактически, нечёткая шкала является обобщением известного типа порядковых шкал, в которых элементы ранжированы и отражают качественную оценку некоторого свойства объекта. Количество уровней нечёткой шкалы и несущие множества для неё рекомендуется выбирать, опираясь на исследования функции и шкалы желательности Харрингтона [4, С. 125-126].
Функция желательности Харрингтона (desirable function) – это функция, которая отображает результаты оценок экспертов на отрезок [0, 1] и характеризует уровень «желательности» той или иной оценки [6]:
или, в другой записи:
Эта функция возникла в результате наблюдений за решениями экспертов о предпочтениях соотнесения результатов эксперимента со значениями на отрезке [0, 1]. Функция позволяет оценивать предпочтение оценок для объектов различной размерности и природы. Кроме того, в областях, близких к 0 и 1, её «чувствительность» существенно ниже, чем в средней зоне (см. Рис. 2). Выбор значений 0.37 и 0.63 обусловлен удобством вычислений, так как 0.37 = e-1, a 0.63 = 1 – e-1. За начало отсчёта обычно выбирают значение в точке перегиба: d(0) = 0.37. Допускаются отклонения границ уровней шкалы желательности на ±0.03 [4, С. 100-101].
Шкала желательности (desirability scale) – это психофизическая шкала, которая устанавливает соответствие между физическими параметрами, такими как свойства исследуемого объекта, и психологическими, субъективными оценками экспертов о «желательности» того или иного значения этих свойств [6].
Рис. 2. Шкала желательности и функция желательности Харрингтона.
Специальные функции принадлежности, используемые для построения нечётких шкал, задаются формулами [4, С. 198-202] и изображены на Рис. 3:
– гиперболическая:
– параболическая:
– колоколообразная:
Кроме аналитического способа, функции принадлежности также могут быть заданы таблично, либо используя метод согласования мнений экспертов [4, С. 131-132].
Обобщая всё сказанное выше и опираясь на примеры шкал, приведенных в работе [4, С. 94-101], для задачи классификации уязвимостей предлагается использовать следующие шкалы из множества Scale (см. Рис. 4):
1. Для четкой шкалы Sp выберем множество действительных чисел из отрезка [0, 1]:
2. Для нечёткой шкалы Sf выберем универсальную шкалу лингвистических переменных:
где лингвистические переменные задаются своими нечёткими множествами:
В работе [4, С. 133-135] были определены и исследованы различные функции дефазификации и фазификации для решения практических задач.
Функцией дефазификации (defuzzyfication function) для нечёткого множества A ∈ F(X), X = [0, 1], заданного своей функцией принадлежности µA(x), называется любая функция Defuz(µA(x)), возвращающая чёткое значение x ∈ X, «характерное» для A.
Функцией фазификации (fuzzyfication function) для чёткого значения переменной x ∈ X и нечёткой шкалы S = {Ai}, называется любая функция Fuzzy(x, S), возвращающая «наиболее подходящую» для x нечёткую переменную Ai.
Так как в нашем случае шкала Sp является множеством действительных чисел, а все функции принадлежности лингвистической переменной для шкалы Sf заданы аналитически, то в качестве функций связи между шкалами множества Scales выберем следующие:
Это означает, что для отображения Defuz чёткое значение нечёткого уровня Ai вычисляется по методу центра тяжести. A для отображения Fuzzy из двух смежных уровней Ai нечёткой шкалы Sf выбирается та лингвистическая переменная, у которой значение функции принадлежности µAi(x) наибольшее.
Для любого способа классификации уязвимостей они должны быть предварительно закодированы, то есть представлены вектором v = {vi} ∈ Vulners. Для этого нужно задать формальное правило кодирования, согласно которому отдельные свойства реальных уязвимостей возможно оценить на шкале Sp.
Зададим матрицу кодирования признаков уязвимостей:
где строки матрицы MVulners представляют собой отдельные свойства уязвимостей (vulner property), столбцы указывают на числовой код (code) некоторого свойства, а в ячейках pij матрицы указываются возможные значения свойств.
Для построения такой матрицы должны быть выделены только значимые свойства, однозначно отличающие одну автоматически найденную уязвимость от другой. Понятно, что для каждого сканера информационной безопасности классификация уязвимостей может быть своей. Тем не менее, большинство из них содержат такие свойства как, например, тип уязвимости, протокол, по которому она может быть эксплуатирована, канал реализации внутри этого протокола, тип уязвимого объекта, путь до объекта на сервере, сетевой запрос с вектором атаки и т. д. Все возможные значения каждого свойства кодируются неотрицательными целыми числами, где ноль выделен в качестве неопределённого значения свойства, что позволит учитывать, в том числе, отсутствующие, новые или пока не предусмотренные его значения.
Матрица MVulners может быть представлена в табличном виде (см. Рис. 5). Значениями свойств могут быть также нечёткие величины и для использования в дальнейших расчётах их нужно дефазифицировать при помощи функции Defuz. После кодирования уязвимостей для отображения значений из множества неотрицательных целых чисел на шкалу Sp можно использовать функцию конвертирования Convertor [4, С. 67]:
Таким образом, формальное правило кодирования свойств vi уязвимости v ∈ Vulners можно записать следующим образом:
Предложенный способ кодирования вполне подходит для решения поставленных задач. Поиск наилучшего способа числового кодирования свойств уязвимостей не является целью данного исследования.
Пусть c = {ci} ∈ Candidates – вектор признаков некоторой уязвимости, которую требуется отнести к I или II классам. Будем считать, что все значения параметров ci – чёткие, закодированные при помощи функции Coding и представленные на шкале Sp = [0, 1]. Если вектор признаков c задан нечёткими параметрами, то значения ci должны быть предварительно дефазифицированы при помощи функции Defuz(ci). Пусть также заданы ek ∈ Eth – векторы признаков эталонных уязвимостей из I класса, с которыми будут сравниваться остальные векторы.
Первый способ классификации уязвимости c может заключаться в построении решающего правила Classificator на основе сравнения расстояния ρ между вектором c и всеми векторами ek с некоторым пороговым значением delta:
В качестве расстояния ρ может использоваться любая подходящая метрика для векторного n-мерного пространства Vulners, например, евклидова:
Очевидные положительные стороны такого подхода – это понятный алгоритм и простота его реализации. Подобные алгоритмы успешно используются при решении множества практических задач. Однако недостатком такого подхода для решения задачи классификации уязвимостей является то, что на практике множество векторов признаков даже одного типа не будут образовывать непрерывного и ограниченного подпространства пространства Vulners (в смысле подпространства для Rn). Это связано с тем, что автоматические сканеры не всегда могут однозначно определить некоторые свойства уязвимостей при сканировании веб-приложений. То есть, при использовании матрицы кодирования MVulners даже для однотипных уязвимостей нам придется иногда ставить нули для значений некоторых свойств, либо они могут сильно отличаться от аналогичных эталонных значений. А так как метрика расстояния ρ довольно чувствительна к изменениям параметров, то при сравнении векторов признаков уязвимостей с эталонами расстояние между ними может сильно отличаться от delta.
Вторым способом классификации уязвимостей может стать построение цепочки решающих правил вида ЕСЛИ ..., ТО ..., в которых возможно учесть любые изменения значений параметров. Рассуждения эксперта при этом выглядят следующим образом. Если среди эталонных уязвимостей существует вектор ek со значениями параметров αi, и при этом вектор признаков уязвимости c имеет значения параметров ci, то этот вектор принадлежит к I классу подтверждённых уязвимостей:
Положительные стороны такого подхода заключаются в том, что правила позволяют более гибко описать процесс принятия решения для классификатора. Однако на практике количество правил может оказаться слишком велико. Даже если совместить оба описанных способа в один: использовать в классификаторе цепочку правил, в которых выполняется сравнение значений свойств уязвимости и эталонов с некоторыми пороговыми значениями, то всё равно реализация такого алгоритма будет затруднительна как при разработке, так и при поддержке правил в актуальном состоянии.
Недостатки указанных выше решающих правил можно попытаться устранить при помощи современного математического аппарата нейронных сетей, которые хорошо себя зарекомендовали при решении множества сложных практических задач: распознавания образов, прогнозирования, классификации и других [3].
Для решения нашей задачи необходимо определить нейронную сеть NeuronetEth(Config, c), с указанием конфигурации Config, обученную на векторах признаках эталонных уязвимостей из Eth, а в качестве решающего правила использовать значения выходов нейронной сети для уязвимости-кандидата:
Такой классификатор позволит более точно определить значения уровней принадлежности уязвимостей I или II классу, так как решающие правила фактически будут построены при обучении нейронной сети – она «запомнит» эталонные образцы, даже если значения отдельных признаков в них будут сильно отличаться. На вход нейронной сети должны подаваться значения векторов признаков уязвимостей, закодированных при помощи функции Coding. Построим далее нейронную сеть Neuronet с подходящей для наших целей конфигурацией Config.
Пусть нам задано конечное число M векторов признаков уязвимостей-кандидатов, каждый из которых обладает N свойствами:
Также нам задано конечное число K векторов признаков эталонных уязвимостей, каждый из которых также обладает N свойствами:
Будем задавать конфигурацию нейронной сети тройкой значений:
где inputs – количество входных параметров,
{layerl} – множество неотрицательных целых чисел, указывающих на количество нейронов в скрытом слое номер l,
L – число слоёв,
outputs – количество выходных параметров.
Будем считать, что используется полносвязная многослойная сеть персептронов: выход каждого нейрона в каждом слое связан со входами всех нейронов следующего слоя.
Для решения нашей задачи была использована следующая конфигурация (см. Рис. 6):
где inputs = N – по количеству свойств уязвимостей,
L = 2 – установленное эмпирическим путем достаточное значение слоёв нейронной сети для классификации уязвимостей,
{layer1,2} = {N, [N/2]} – установленное эмпирическим путем число нейронов в первом скрытом слое должно совпадать с количеством входных параметров, а во втором – быть целой частью от половины этого количества,
outputs = 2 – по количеству классов уязвимостей, так как на выходе мы должны получить вектор (sI, sII) с оценками принадлежности уязвимости классам Ver и NVer.
Известный алгоритм обучения нейронной сети с учителем заключается в итеративном подборе весовых коэффициентов wi для каждого нейрона сети таким образом, чтобы значение вектора (sI, sII) на её выходе совпадало с требуемым значением для каждого входного вектора признаков из Eth [3, п.п. 2.1]. Подбор весов повторяется до тех пор, пока не устраняются противоречия для всех эталонов, либо ошибка такого обучения становится минимальной.
Вектор (sI, sII) со значениями параметров на шкале Sp может интерпретироваться следующим образом:
1. Значения параметров указывают на степень уверенности от 0 до 1 в принадлежности вектора признаков уязвимости каждому классу.
2. Значения параметров, будучи умноженными на 100%, указывают на вероятность принадлежности вектора признаков уязвимости каждому классу от 0 до 100%.
3. Значения параметров, фазифицированные при помощи функции Fuzzy(x, Sf), указывают на лингвистическую оценку уровня принадлежности вектора признаков уязвимости каждому из классов на шкале Sf = {Min, Low, Med, High, Max}.
На практике может использоваться любая из этих интерпретаций, удобная эксперту-аналитику.
Для практического использования нейронных сетей при решении задач нечёткой классификации в случае различного числа классов и структуры сетей, были разработаны программные модули FuzzyClassificator, распространяемые под MIT-лицензией. Скачать актуальную версию FuzzyClassificator можно в сообществе DevOpsHQ по ссылке: https://github.com/devopshq/FuzzyClassificator. Либо установить из PyPI-репозитория: https://pypi.python.org/pypi/FuzzyClassificator.
Для удобства использования модулей в системах автоматизации, конфигурация программы осуществляется через интерфейс командной строки. В разделе описания программы на GitHub приведена подробная техническая информация по командам интерфейса, работе модулей и заданию входных данных. Самый простой способ использовать FuzzyClassificator – это установить Pyzo и интерпретатор Anaconda. Pyzo – это кросс-платформенная среда разработки на Python, ориентированная на интерактивность и интроспекцию, что делает ее очень подходящей для реализации научных вычислений. Anaconda – это открытая научная платформа, основанная на Python. Версия Anaconda с открытым исходным кодом представляет собой высокопроизводительный Python-интерпретатор и включает в себя большинство популярных пакетов Python для научных вычислений, в частности, PyBrain library – подпрограммы для работы с нейронными сетями.
Основные программные модули, реализующие предложенные в статье подходы и математический аппарат:
1. FuzzyClassificator – реализует пользовательский интерфейс командной строки, получает и обрабатывает входные данные, устанавливает режимы обучения и классификации, предоставляет результаты.
2. PyBrainLearning – определяет методы для работы с нечёткими нейронными сетями, объединяя возможности библиотеки PyBrain и авторской библиотеки FuzzyRoutines.
3. FuzzyRoutines – содержит подпрограммы для работы с нечёткими множествами и нечёткими шкалами.
Процесс работы программы представлен функциональной IDEF0-моделью на Рис. 7-9.
Рис. 7. Верхний A-0 уровень функциональной IDEF0-модели процесса работы программы FuzzyClassificator.
Рис. 8. Уровень A0 IDEF0-модели. Основные этапы работы программы FuzzyClassificator.
Рис. 9. Уровень A1 IDEF0-модели. Разбиение этапов работы программы FuzzyClassificator на подпроцессы.
1. Этап обучения (Learning mode) состоит из следующих шагов:
1.1. Инициализация объектов программы пользовательскими значениями.
1.2. Обработка входных данных и подготовка нейронной сети к обучению:
– обработка файла с данными о векторах признаков эталонов;
– подготовка данных для обучения в формате PyBrain;
– инициализация параметров новой нейронной сети PyBrain или её загрузка из указанного файла.
1.3. Обучение нейронной сети на заданных эталонах:
– инициализация модуля PyBrain-тренера;
– обучение сети при помощи тренера и сохранение её конфигурации в файл формата PyBrain.
2. Этап классификации (Classifying mode) состоит из следующих шагов:
2.1. Инициализация объектов программы пользовательскими значениями.
2.2. Обработка входных данных и подготовка нейронной сети к анализу данных:
– обработка файла с данными о векторах признаков кандидатов;
– загрузка конфигурации обученной нейронной сети PyBrain из указанного файла.
2.3. Анализ нейронной сетью векторов признаков кандидатов:
– активация нейронной сети и вычисление уровней принадлежности векторов к различным классам;
– интерпретация полученных результатов на нечётких шкалах и формирование файла отчёта.
Входные данные с векторами признаков эталонов и кандидатов задаются в виде обычных текстовых файлов с табуляцией в качестве разделителя значений. Например, чтобы задать данные для обучения, можно подготовить файл ethalons.dat, содержащий первую строку заголовка и далее строки со значениями эталонных векторов признаков и их принадлежности тому или иному классу. Значения могут быть заданы как на чёткой так и на нечёткой шкалах:
input1 input2 input3 1st_class_output 2nd_class_output
0.1 0.2 Min 0 Max
0.2 0.3 Low 0 Max
0.3 0.4 Med 0 Max
0.4 0.5 Med Max 0
0.5 0.6 High Max 0
0.6 0.7 Max Max 0
А в качестве данных для анализа может быть подготовлен файл candidates.dat, также содержащий строку заголовка и строки со значениями векторов признаков кандидатов:
input1 input2 input3
0.12 0.32 Med
0.32 0.35 Low
0.54 0.57 Med
0.65 0.68 High
0.76 0.79 Min
По итогам работы программы создаётся файл с отчётом, содержащим информацию о конфигурации нейронной сети и результаты классификации для каждого вектора признаков из множества кандидатов.
После обучения нейронной сети на указанных выше примерах, с параметрами, заданными командной строкой:
python FuzzyClassificator.py --learn config=3,3,2,2 epochs=1000 rate=0.1 momentum=0.05
и затем, в режиме классификации с параметрами командной строки:
python FuzzyClassificator.py --classify config=3,3,2,2
на выходе был получен следующий репорт-файл:
Neuronet: C:\work\projects\FuzzyClassificator\network.xml
FuzzyScale = {Min, Low, Med, High, Max}
Min = <Hyperbolic(x, {'a': 8, 'c': 0, 'b': 20}), [0.0, 0.23]>
Low = <Bell(x, {'a': 0.17, 'c': 0.34, 'b': 0.23}), [0.17, 0.4]>
Med = <Bell(x, {'a': 0.34, 'c': 0.6, 'b': 0.4}), [0.34, 0.66]>
High = <Bell(x, {'a': 0.6, 'c': 0.77, 'b': 0.66}), [0.6, 0.83]>
Max = <Parabolic(x, {'a': 0.77, 'b': 0.95}), [0.77, 1.0]>
Classification results for candidates vectors:
Input: ['0.12', '0.32', 'Min'] Output: ['Min', 'Max']
Input: ['0.32', '0.35', 'Low'] Output: ['Low', 'High']
Input: ['0.54', '0.57', 'Med'] Output: ['Max', 'Min']
Input: ['0.65', '0.68', 'High'] Output: ['Max', 'Min']
Input: ['0.76', '0.79', 'Max'] Output: ['Max', 'Min']
Если проанализировать данные из файла candidates.dat, то можно с высокой степенью уверенности утверждать, что человек-эксперт, опираясь только на данные из файла ethalons.dat выдал бы аналогичные результаты классификации.
Итак, благодаря проведённому исследованию удалось совместить математические аппараты теорий нечётких систем и нейронных сетей для решения практической задачи классификации уязвимостей. В данной статье предлагается универсальный способ представления входных данных в виде вектора признаков уязвимостей v = {vi}. Для его кодирования вводится матрица MVulners. Значения свойств уязвимостей оцениваются как на чёткой Sp = [0, 1], так и на универсальной нечёткой шкале Sf = {Min, Low, Med, High, Max}. Вводятся функции связи между шкалами: Fuzzy(x, Sf) и Defuz(Ai). Классификатор уязвимостей определяется через построение нейронной сети NeuronetEth(Config, c) с конфигурацией Config = <inputs, {layerl}, outputs> и непустым множеством эталонов Eth. Для практического использования классификатора разработаны универсальные программные модули FuzzyClassificator, позволяющие выполнять нечёткую классификацию произвольных объектов с неограниченным числом свойств, классов и произвольной конфигурацией многослойной нейронной сети на базе персептронов. Для разработчиков доступны подробно документированные api-функции, позволяющие использовать механизмы обучения и результаты классификации в своих проектах.
Основные выводы:
1. Математические методы разделения на классы на базе нейронных сетей применимы и в случае классификации уязвимостей.
2. Для получения адекватных результатов необходимо корректно построить матрицу кодирования и подобрать наилучшие свойства для моделирования уязвимостей.
3. Для задачи классификации уязвимостей рекомендуется использовать нейронную сеть персептронов с двумя скрытыми слоями и в конфигурации, зависящей от числа входных параметров: в первом число нейронов равно числу входных параметров, а во втором – в два раза меньше.
4. Преимуществом предложенных подходов является использование универсальных нечётких шкал лингвистических переменных, которые применимы как для оценки значений векторов признаков, так и для интерпретации итоговых уровней принадлежности классам.
5. Предложенный метод нечёткой классификации и реализующие его программные модули FuzzyClassificator являются универсальными, легко адаптируются и настраиваются под конкретные объекты классификации.
Список источников:
1. Shay C. WAVSEP Web Application Scanner Benchmark 2014 // WAVSEP 2013/2014 Score Chart: The Web Application Vulnerability Scanners Benchmark. Commercial, SAAS & Open Source Scanners. An Accuracy, Coverage, Versatility, Adaptability, Feature and Price Comparison of 63 Black Box Web Application Vulnerability Scanners and SAAS Services. – 2014. – [URL] http://sectooladdict.blogspot.ru/2014/02/wavsep-web-application-scanner.html
2. Гильмуллин Т.М. Тестирование сканеров безопасности веб-приложений: подходы и критерии // habrahabr.ru. – 2013. – [URL] http://habrahabr.ru/company/pt/blog/187636/
3. Гильмуллин Т.М. Применение нейросетей для решения классических задач линейного и нелинейного разделения элементов множества на классы // Лабораторные работы для дисциплины «Нейрокомпьютерные системы. – 2008», КГТУ им. А.Н. Туполева (КАИ). – 2013. – [URL] http://math-n-algo.blogspot.ru/2013/04/blog-post.html
4. Гильмуллин Т.М. Модели и комплекс программ процесса управления рисками информационной безопасности: дис. ... канд. технич. наук. – Казанский государственный технический университет. – Казань, 2010. – 225 с. – [URL] https://drive.google.com/file/d/0B-1rf8K04ZS5WjJyWFFBeW91YTQ/edit?usp=sharing
5. Алтунин А.Е., Семухин М.В. Модели и алгоритмы принятия решений в нечётких условиях: Монография. – Тюмень: Изд-во Тюменского гос. ун-та, 2000. – 352 с.
6. Адлер Ю.П., Маркова Е.В., Грановский Ю.В. Планирование эксперимента при поиске оптимальных условий. – М.: Наука, 1976. – 280 с.
Опубликовано:
1. Гильмуллин Т.М., Гильмуллин М.Ф. Подходы к автоматизации процесса валидации уязвимостей, найденных автоматическими сканерами безопасности, при помощи нечётких множеств и нейронных сетей // Фундаментальные исследования. – 2014. – № 11 (часть 2). – стр. 266-279;
URL: http://www.fundamental-research.ru/ru/article/view?id=35511, см. PDF-вариант.
2. Гильмуллин Т.М. Сканеры безопасности: автоматическая валидация уязвимостей с помощью нечетких множеств и нейронных сетей // Positive Research 2015: Сборник исследований по практической безопасности. – 2015. – стр. 55-57;
URL: http://www.ptsecurity.ru/download/PT_Positive_Research_2015_RU_web.pdf (С. 57-59)
Внимание! Полное или частичное использование материалов данной статьи, а также программы, реализованной в рамках исследований и опубликованной под MIT-лицензией, допускается в любых целях со ссылкой на автора и этот первоисточник.
Содержание:
1. Введение в проблему
2. Постановка задачи нечёткой классификации уязвимостей
3. Измерительные шкалы и связь между ними
4. Кодирование входных данных
5. Анализ способов решения задачи классификации уязвимостей
6. Построение нейронной сети, её обучение и представление результатов
7. Программная реализация классификатора
8. Заключение
1. Введение в проблему
В настоящее время существует огромное количество различных сканеров информационной безопасности (далее – сканеры), применяемых для анализа защищенности веб-приложений: Acunetix WVS, IBM AppScan, BurpSuite, NMap, HP Fortify, Positive Technologies – MaxPatrol, XSpider, Application Inspector и других, различающихся ценой, качеством сканирования, поддерживаемыми технологиями, типами обнаруживаемых уязвимостей, методиками поиска – белый или черный ящик, и десятками других параметров. Некоторое представление о возможностях сканеров и сравнение их характеристик можно получить, например, из периодического отчета «The Web Application Vulnerability Scanners Benchmark (by Shay Chen, Information Security Researcher).» [1].
При разработке сканеров информационной безопасности важную роль играют методики тестирования их работы, о которых мы упоминали в статье «Тестирование сканеров безопасности веб-приложений: подходы и критерии» [2]. В этих методиках особое место занимает конкурентный анализ сканеров и их сравнение с другими.
Основным ожидаемым результатом работы любого сканера безопасности является список кандидатов в уязвимости, полученный в процессе анализа веб-приложения. Использование в сканерах сложных эвристических алгоритмов часто приводит к большому числу ложных срабатываний и заполнению такого списка несуществующими в реальном веб-приложении уязвимостями (false positives). В связи с чем требуется длительная работа экспертов-аналитиков в области информационной безопасности, чтобы перепроверить, подтвердить или опровергнуть найденные автоматическим сканером кандидаты в уязвимости. При этом они используют как различные инструментальные средства для попыток эксплуатации уязвимостей, так и делают выводы, опираясь на собственный опыт.
На практике, как один из способов подтверждения уязвимости, может использоваться сравнение с некоторыми аналогичными уязвимостями, о которых заранее известно, что они имеются в похожем веб-приложении или в том же веб-приложении, но более ранней версии. Для этого может быть сформирована база данных «эталонных» уязвимостей, содержащая характеристики и описание реальных, ранее найденных уязвимостей. Тогда эксперт-аналитик сможет сделать дополнительные выводы и подтвердить, или опровергнуть, новые кандидаты в уязвимости, опираясь на их сравнение с эталонами по некоторым правилам. Однако, подобная рутинная работа также нуждается в дополнительных инструментах и процедурах, позволяющих выполнить такой анализ: сравнивать кандидаты с эталонными уязвимостями и отсеивать очевидные false positives.
2. Постановка задачи нечёткой классификации уязвимостей
Как отмечено выше, проблема подтверждения уязвимостей из списка кандидатов на практике может решаться как задача сравнения их с некоторыми эталонами. В случае если все объекты – и эталоны, и кандидаты в уязвимости – могут быть однозначно параметризованы, представлены в виде вектора признаков объекта, то проблема может быть сведена к классической задаче классификации элементов множества [3, п. 3].
Входные данные
1. Задано n-мерное векторное пространство Vulners – всех уязвимостей (vulnerabilities) веб-приложений, которые могут быть заданы векторами признаками vi:
где v1, ... vn – чёткие, либо дефазифицированные из нечётких, числовые характеристики отдельных признаков уязвимости.
Из Vulners выделено непустое конечное подмножество Candidates – кандидатов в уязвимости для некоторого веб-приложения:
Элементы из Candidates являются объектами классификации.
2. Каждую уязвимость из Candidates допускается отнести к двум классам:
I класс подтвержденных (verified) уязвимостей:
II класс неподтвержденных (non-verified) уязвимостей:
3. Существует Eth – непустое подмножество «эталонных» (ethalon) уязвимостей, входящих в I класс:
Используя элементы Eth, допускается делать предположения о принадлежности других элементов из Candidates классам Ver и NVer в виде некоторого «правила» – функции f от двух переменных, определенной на множестве Ver × Eth со значениями в Ver, то есть выполняется условие:
4. Задано множество измерительных шкал Scales для оценки чётких и нечётких характеристик уязвимостей:
где Sp – чёткая (precise) числовая шкала,
Sf – нечёткая (fuzzy) шкала лингвистических переменных.
Схематично условия задачи можно изобразить, как представлено на Рис. 1.
Требуется
1. Построить отображения Fuzzy и Defuz для задачи интерпретации результатов классификации и оценок:
определяющие способы представления чётких оценок в виде нечёткого значения некоторой лингвистической переменной и наоборот.
2. Построить отображение Classificator для задачи классификации:
ставящее в соответствие каждой уязвимости из Candidates оценки принадлежности уязвимости каждому классу, учитывая при этом имеющиеся эталоны. Иначе говоря, нужно построить функцию:
3. Измерительные шкалы и связь между ними
Среди исследований, выполненных в работе [4], приведены примеры, показывающие, что в качестве универсальных измерительных шкал для оценки свойств информационных систем могут быть использованы:
– множество действительных чисел из отрезка [0, 1] [4, С. 62-64], которое легко может быть преобразовано в любые другие виды чётких числовых множеств: дискретных, непрерывных, неограниченных, при помощи различных функций конвертирования [4, С. 66-67];
– F-множества упорядоченных нечётких переменных [4, С. 59-60] вида FP ={fpi}, где fpi – лингвистические переменные, описывающие значения свойств объекта.
Дадим некоторые определения из теории нечётких систем, связанные с данным исследованием.
Нечёткое множество A в полном пространстве X определяется через функцию принадлежности (membership function):
Величина µA(x), x ∈ X интерпретируется как субъективная оценка степени принадлежности элемента x к нечёткому множеству A.
Носителем нечёткого множества или несущим множеством А называется чёткое подмножество полного пространства X, на котором значение µA (x) положительно:
Нечёткими F-множествами называют совокупность всех нечётких подмножеств F(X) произвольного базового множества X, а их функции принадлежности – F-функциями. Как правило, под µA понимают сужение функции принадлежности со всего X на σ(A), поэтому F-множества обычно задают функцией принадлежности и несущим множеством:
Нечёткая переменная – это объект предметной области, характеризуемый тройкой {N, X, R(N, x)}, где N – название переменной, X – универсальное множество (полное пространство наблюдений) с базовой переменной x, R(N, x) ∈ F(X) – нечёткое F-множество, задающее ограничения на значения переменной x, обусловленные её названием N [5].
Лингвистическая переменная – это нечёткая переменная, значениями которой являются другие нечёткие переменные: слова или предложения естественного или формального языка [5].
Нечёткая шкала (fuzzy scale) – это упорядоченная совокупность S нечётких переменных Ai, определенных своими F-функциями, значения из которой может принимать некоторая лингвистическая переменная s:
Фиксация значения s = Ai для некоторого свойства означает, что оно оценивается лингвистической переменной s на нечёткой шкале S и имеет значение Ai. Для задания шкалы S необходимо определить каждую нечёткую переменную Ai с указанием её функции принадлежности и несущего множества [4, С. 128].
Фактически, нечёткая шкала является обобщением известного типа порядковых шкал, в которых элементы ранжированы и отражают качественную оценку некоторого свойства объекта. Количество уровней нечёткой шкалы и несущие множества для неё рекомендуется выбирать, опираясь на исследования функции и шкалы желательности Харрингтона [4, С. 125-126].
Функция желательности Харрингтона (desirable function) – это функция, которая отображает результаты оценок экспертов на отрезок [0, 1] и характеризует уровень «желательности» той или иной оценки [6]:
или, в другой записи:
Эта функция возникла в результате наблюдений за решениями экспертов о предпочтениях соотнесения результатов эксперимента со значениями на отрезке [0, 1]. Функция позволяет оценивать предпочтение оценок для объектов различной размерности и природы. Кроме того, в областях, близких к 0 и 1, её «чувствительность» существенно ниже, чем в средней зоне (см. Рис. 2). Выбор значений 0.37 и 0.63 обусловлен удобством вычислений, так как 0.37 = e-1, a 0.63 = 1 – e-1. За начало отсчёта обычно выбирают значение в точке перегиба: d(0) = 0.37. Допускаются отклонения границ уровней шкалы желательности на ±0.03 [4, С. 100-101].
Шкала желательности (desirability scale) – это психофизическая шкала, которая устанавливает соответствие между физическими параметрами, такими как свойства исследуемого объекта, и психологическими, субъективными оценками экспертов о «желательности» того или иного значения этих свойств [6].
Рис. 2. Шкала желательности и функция желательности Харрингтона.
Специальные функции принадлежности, используемые для построения нечётких шкал, задаются формулами [4, С. 198-202] и изображены на Рис. 3:
– гиперболическая:
– параболическая:
– колоколообразная:
Рис. 3. Примеры специальных функций принадлежности, заданных своими параметрами:
1) гиперболическая: µhyperbolic(x, 3, 5, 0.1),
2) параболическая: µparabolic(x, 0, 1),
3) колоколообразная: µbell(x, 0, 0.3, 0.4).
1) гиперболическая: µhyperbolic(x, 3, 5, 0.1),
2) параболическая: µparabolic(x, 0, 1),
3) колоколообразная: µbell(x, 0, 0.3, 0.4).
Кроме аналитического способа, функции принадлежности также могут быть заданы таблично, либо используя метод согласования мнений экспертов [4, С. 131-132].
Обобщая всё сказанное выше и опираясь на примеры шкал, приведенных в работе [4, С. 94-101], для задачи классификации уязвимостей предлагается использовать следующие шкалы из множества Scale (см. Рис. 4):
1. Для четкой шкалы Sp выберем множество действительных чисел из отрезка [0, 1]:
2. Для нечёткой шкалы Sf выберем универсальную шкалу лингвистических переменных:
где лингвистические переменные задаются своими нечёткими множествами:
В работе [4, С. 133-135] были определены и исследованы различные функции дефазификации и фазификации для решения практических задач.
Функцией дефазификации (defuzzyfication function) для нечёткого множества A ∈ F(X), X = [0, 1], заданного своей функцией принадлежности µA(x), называется любая функция Defuz(µA(x)), возвращающая чёткое значение x ∈ X, «характерное» для A.
Функцией фазификации (fuzzyfication function) для чёткого значения переменной x ∈ X и нечёткой шкалы S = {Ai}, называется любая функция Fuzzy(x, S), возвращающая «наиболее подходящую» для x нечёткую переменную Ai.
Так как в нашем случае шкала Sp является множеством действительных чисел, а все функции принадлежности лингвистической переменной для шкалы Sf заданы аналитически, то в качестве функций связи между шкалами множества Scales выберем следующие:
Это означает, что для отображения Defuz чёткое значение нечёткого уровня Ai вычисляется по методу центра тяжести. A для отображения Fuzzy из двух смежных уровней Ai нечёткой шкалы Sf выбирается та лингвистическая переменная, у которой значение функции принадлежности µAi(x) наибольшее.
4. Кодирование входных данных
Для любого способа классификации уязвимостей они должны быть предварительно закодированы, то есть представлены вектором v = {vi} ∈ Vulners. Для этого нужно задать формальное правило кодирования, согласно которому отдельные свойства реальных уязвимостей возможно оценить на шкале Sp.
Зададим матрицу кодирования признаков уязвимостей:
где строки матрицы MVulners представляют собой отдельные свойства уязвимостей (vulner property), столбцы указывают на числовой код (code) некоторого свойства, а в ячейках pij матрицы указываются возможные значения свойств.
Для построения такой матрицы должны быть выделены только значимые свойства, однозначно отличающие одну автоматически найденную уязвимость от другой. Понятно, что для каждого сканера информационной безопасности классификация уязвимостей может быть своей. Тем не менее, большинство из них содержат такие свойства как, например, тип уязвимости, протокол, по которому она может быть эксплуатирована, канал реализации внутри этого протокола, тип уязвимого объекта, путь до объекта на сервере, сетевой запрос с вектором атаки и т. д. Все возможные значения каждого свойства кодируются неотрицательными целыми числами, где ноль выделен в качестве неопределённого значения свойства, что позволит учитывать, в том числе, отсутствующие, новые или пока не предусмотренные его значения.
Матрица MVulners может быть представлена в табличном виде (см. Рис. 5). Значениями свойств могут быть также нечёткие величины и для использования в дальнейших расчётах их нужно дефазифицировать при помощи функции Defuz. После кодирования уязвимостей для отображения значений из множества неотрицательных целых чисел на шкалу Sp можно использовать функцию конвертирования Convertor [4, С. 67]:
Таким образом, формальное правило кодирования свойств vi уязвимости v ∈ Vulners можно записать следующим образом:
Предложенный способ кодирования вполне подходит для решения поставленных задач. Поиск наилучшего способа числового кодирования свойств уязвимостей не является целью данного исследования.
5. Анализ способов решения задачи классификации уязвимостей
Пусть c = {ci} ∈ Candidates – вектор признаков некоторой уязвимости, которую требуется отнести к I или II классам. Будем считать, что все значения параметров ci – чёткие, закодированные при помощи функции Coding и представленные на шкале Sp = [0, 1]. Если вектор признаков c задан нечёткими параметрами, то значения ci должны быть предварительно дефазифицированы при помощи функции Defuz(ci). Пусть также заданы ek ∈ Eth – векторы признаков эталонных уязвимостей из I класса, с которыми будут сравниваться остальные векторы.
Первый способ классификации уязвимости c может заключаться в построении решающего правила Classificator на основе сравнения расстояния ρ между вектором c и всеми векторами ek с некоторым пороговым значением delta:
В качестве расстояния ρ может использоваться любая подходящая метрика для векторного n-мерного пространства Vulners, например, евклидова:
Очевидные положительные стороны такого подхода – это понятный алгоритм и простота его реализации. Подобные алгоритмы успешно используются при решении множества практических задач. Однако недостатком такого подхода для решения задачи классификации уязвимостей является то, что на практике множество векторов признаков даже одного типа не будут образовывать непрерывного и ограниченного подпространства пространства Vulners (в смысле подпространства для Rn). Это связано с тем, что автоматические сканеры не всегда могут однозначно определить некоторые свойства уязвимостей при сканировании веб-приложений. То есть, при использовании матрицы кодирования MVulners даже для однотипных уязвимостей нам придется иногда ставить нули для значений некоторых свойств, либо они могут сильно отличаться от аналогичных эталонных значений. А так как метрика расстояния ρ довольно чувствительна к изменениям параметров, то при сравнении векторов признаков уязвимостей с эталонами расстояние между ними может сильно отличаться от delta.
Вторым способом классификации уязвимостей может стать построение цепочки решающих правил вида ЕСЛИ ..., ТО ..., в которых возможно учесть любые изменения значений параметров. Рассуждения эксперта при этом выглядят следующим образом. Если среди эталонных уязвимостей существует вектор ek со значениями параметров αi, и при этом вектор признаков уязвимости c имеет значения параметров ci, то этот вектор принадлежит к I классу подтверждённых уязвимостей:
Положительные стороны такого подхода заключаются в том, что правила позволяют более гибко описать процесс принятия решения для классификатора. Однако на практике количество правил может оказаться слишком велико. Даже если совместить оба описанных способа в один: использовать в классификаторе цепочку правил, в которых выполняется сравнение значений свойств уязвимости и эталонов с некоторыми пороговыми значениями, то всё равно реализация такого алгоритма будет затруднительна как при разработке, так и при поддержке правил в актуальном состоянии.
Недостатки указанных выше решающих правил можно попытаться устранить при помощи современного математического аппарата нейронных сетей, которые хорошо себя зарекомендовали при решении множества сложных практических задач: распознавания образов, прогнозирования, классификации и других [3].
Для решения нашей задачи необходимо определить нейронную сеть NeuronetEth(Config, c), с указанием конфигурации Config, обученную на векторах признаках эталонных уязвимостей из Eth, а в качестве решающего правила использовать значения выходов нейронной сети для уязвимости-кандидата:
Такой классификатор позволит более точно определить значения уровней принадлежности уязвимостей I или II классу, так как решающие правила фактически будут построены при обучении нейронной сети – она «запомнит» эталонные образцы, даже если значения отдельных признаков в них будут сильно отличаться. На вход нейронной сети должны подаваться значения векторов признаков уязвимостей, закодированных при помощи функции Coding. Построим далее нейронную сеть Neuronet с подходящей для наших целей конфигурацией Config.
6. Построение нейронной сети, её обучение и представление результатов
Пусть нам задано конечное число M векторов признаков уязвимостей-кандидатов, каждый из которых обладает N свойствами:
Также нам задано конечное число K векторов признаков эталонных уязвимостей, каждый из которых также обладает N свойствами:
Будем задавать конфигурацию нейронной сети тройкой значений:
где inputs – количество входных параметров,
{layerl} – множество неотрицательных целых чисел, указывающих на количество нейронов в скрытом слое номер l,
L – число слоёв,
outputs – количество выходных параметров.
Будем считать, что используется полносвязная многослойная сеть персептронов: выход каждого нейрона в каждом слое связан со входами всех нейронов следующего слоя.
Для решения нашей задачи была использована следующая конфигурация (см. Рис. 6):
где inputs = N – по количеству свойств уязвимостей,
L = 2 – установленное эмпирическим путем достаточное значение слоёв нейронной сети для классификации уязвимостей,
{layer1,2} = {N, [N/2]} – установленное эмпирическим путем число нейронов в первом скрытом слое должно совпадать с количеством входных параметров, а во втором – быть целой частью от половины этого количества,
outputs = 2 – по количеству классов уязвимостей, так как на выходе мы должны получить вектор (sI, sII) с оценками принадлежности уязвимости классам Ver и NVer.
Рис. 6. Схематичное изображение структуры нейронной сети NeuronetEth(Config, c) для задачи классификации.
Известный алгоритм обучения нейронной сети с учителем заключается в итеративном подборе весовых коэффициентов wi для каждого нейрона сети таким образом, чтобы значение вектора (sI, sII) на её выходе совпадало с требуемым значением для каждого входного вектора признаков из Eth [3, п.п. 2.1]. Подбор весов повторяется до тех пор, пока не устраняются противоречия для всех эталонов, либо ошибка такого обучения становится минимальной.
Вектор (sI, sII) со значениями параметров на шкале Sp может интерпретироваться следующим образом:
1. Значения параметров указывают на степень уверенности от 0 до 1 в принадлежности вектора признаков уязвимости каждому классу.
2. Значения параметров, будучи умноженными на 100%, указывают на вероятность принадлежности вектора признаков уязвимости каждому классу от 0 до 100%.
3. Значения параметров, фазифицированные при помощи функции Fuzzy(x, Sf), указывают на лингвистическую оценку уровня принадлежности вектора признаков уязвимости каждому из классов на шкале Sf = {Min, Low, Med, High, Max}.
На практике может использоваться любая из этих интерпретаций, удобная эксперту-аналитику.
7. Программная реализация классификатора
Для практического использования нейронных сетей при решении задач нечёткой классификации в случае различного числа классов и структуры сетей, были разработаны программные модули FuzzyClassificator, распространяемые под MIT-лицензией. Скачать актуальную версию FuzzyClassificator можно в сообществе DevOpsHQ по ссылке: https://github.com/devopshq/FuzzyClassificator. Либо установить из PyPI-репозитория: https://pypi.python.org/pypi/FuzzyClassificator.
Для удобства использования модулей в системах автоматизации, конфигурация программы осуществляется через интерфейс командной строки. В разделе описания программы на GitHub приведена подробная техническая информация по командам интерфейса, работе модулей и заданию входных данных. Самый простой способ использовать FuzzyClassificator – это установить Pyzo и интерпретатор Anaconda. Pyzo – это кросс-платформенная среда разработки на Python, ориентированная на интерактивность и интроспекцию, что делает ее очень подходящей для реализации научных вычислений. Anaconda – это открытая научная платформа, основанная на Python. Версия Anaconda с открытым исходным кодом представляет собой высокопроизводительный Python-интерпретатор и включает в себя большинство популярных пакетов Python для научных вычислений, в частности, PyBrain library – подпрограммы для работы с нейронными сетями.
Основные программные модули, реализующие предложенные в статье подходы и математический аппарат:
1. FuzzyClassificator – реализует пользовательский интерфейс командной строки, получает и обрабатывает входные данные, устанавливает режимы обучения и классификации, предоставляет результаты.
2. PyBrainLearning – определяет методы для работы с нечёткими нейронными сетями, объединяя возможности библиотеки PyBrain и авторской библиотеки FuzzyRoutines.
3. FuzzyRoutines – содержит подпрограммы для работы с нечёткими множествами и нечёткими шкалами.
Процесс работы программы представлен функциональной IDEF0-моделью на Рис. 7-9.
Рис. 7. Верхний A-0 уровень функциональной IDEF0-модели процесса работы программы FuzzyClassificator.
Рис. 8. Уровень A0 IDEF0-модели. Основные этапы работы программы FuzzyClassificator.
Рис. 9. Уровень A1 IDEF0-модели. Разбиение этапов работы программы FuzzyClassificator на подпроцессы.
1. Этап обучения (Learning mode) состоит из следующих шагов:
1.1. Инициализация объектов программы пользовательскими значениями.
1.2. Обработка входных данных и подготовка нейронной сети к обучению:
– обработка файла с данными о векторах признаков эталонов;
– подготовка данных для обучения в формате PyBrain;
– инициализация параметров новой нейронной сети PyBrain или её загрузка из указанного файла.
1.3. Обучение нейронной сети на заданных эталонах:
– инициализация модуля PyBrain-тренера;
– обучение сети при помощи тренера и сохранение её конфигурации в файл формата PyBrain.
2. Этап классификации (Classifying mode) состоит из следующих шагов:
2.1. Инициализация объектов программы пользовательскими значениями.
2.2. Обработка входных данных и подготовка нейронной сети к анализу данных:
– обработка файла с данными о векторах признаков кандидатов;
– загрузка конфигурации обученной нейронной сети PyBrain из указанного файла.
2.3. Анализ нейронной сетью векторов признаков кандидатов:
– активация нейронной сети и вычисление уровней принадлежности векторов к различным классам;
– интерпретация полученных результатов на нечётких шкалах и формирование файла отчёта.
Входные данные с векторами признаков эталонов и кандидатов задаются в виде обычных текстовых файлов с табуляцией в качестве разделителя значений. Например, чтобы задать данные для обучения, можно подготовить файл ethalons.dat, содержащий первую строку заголовка и далее строки со значениями эталонных векторов признаков и их принадлежности тому или иному классу. Значения могут быть заданы как на чёткой так и на нечёткой шкалах:
input1 input2 input3 1st_class_output 2nd_class_output
0.1 0.2 Min 0 Max
0.2 0.3 Low 0 Max
0.3 0.4 Med 0 Max
0.4 0.5 Med Max 0
0.5 0.6 High Max 0
0.6 0.7 Max Max 0
А в качестве данных для анализа может быть подготовлен файл candidates.dat, также содержащий строку заголовка и строки со значениями векторов признаков кандидатов:
input1 input2 input3
0.12 0.32 Med
0.32 0.35 Low
0.54 0.57 Med
0.65 0.68 High
0.76 0.79 Min
По итогам работы программы создаётся файл с отчётом, содержащим информацию о конфигурации нейронной сети и результаты классификации для каждого вектора признаков из множества кандидатов.
После обучения нейронной сети на указанных выше примерах, с параметрами, заданными командной строкой:
python FuzzyClassificator.py --learn config=3,3,2,2 epochs=1000 rate=0.1 momentum=0.05
и затем, в режиме классификации с параметрами командной строки:
python FuzzyClassificator.py --classify config=3,3,2,2
на выходе был получен следующий репорт-файл:
Neuronet: C:\work\projects\FuzzyClassificator\network.xml
FuzzyScale = {Min, Low, Med, High, Max}
Min = <Hyperbolic(x, {'a': 8, 'c': 0, 'b': 20}), [0.0, 0.23]>
Low = <Bell(x, {'a': 0.17, 'c': 0.34, 'b': 0.23}), [0.17, 0.4]>
Med = <Bell(x, {'a': 0.34, 'c': 0.6, 'b': 0.4}), [0.34, 0.66]>
High = <Bell(x, {'a': 0.6, 'c': 0.77, 'b': 0.66}), [0.6, 0.83]>
Max = <Parabolic(x, {'a': 0.77, 'b': 0.95}), [0.77, 1.0]>
Classification results for candidates vectors:
Input: ['0.12', '0.32', 'Min'] Output: ['Min', 'Max']
Input: ['0.32', '0.35', 'Low'] Output: ['Low', 'High']
Input: ['0.54', '0.57', 'Med'] Output: ['Max', 'Min']
Input: ['0.65', '0.68', 'High'] Output: ['Max', 'Min']
Input: ['0.76', '0.79', 'Max'] Output: ['Max', 'Min']
Если проанализировать данные из файла candidates.dat, то можно с высокой степенью уверенности утверждать, что человек-эксперт, опираясь только на данные из файла ethalons.dat выдал бы аналогичные результаты классификации.
8. Заключение
Итак, благодаря проведённому исследованию удалось совместить математические аппараты теорий нечётких систем и нейронных сетей для решения практической задачи классификации уязвимостей. В данной статье предлагается универсальный способ представления входных данных в виде вектора признаков уязвимостей v = {vi}. Для его кодирования вводится матрица MVulners. Значения свойств уязвимостей оцениваются как на чёткой Sp = [0, 1], так и на универсальной нечёткой шкале Sf = {Min, Low, Med, High, Max}. Вводятся функции связи между шкалами: Fuzzy(x, Sf) и Defuz(Ai). Классификатор уязвимостей определяется через построение нейронной сети NeuronetEth(Config, c) с конфигурацией Config = <inputs, {layerl}, outputs> и непустым множеством эталонов Eth. Для практического использования классификатора разработаны универсальные программные модули FuzzyClassificator, позволяющие выполнять нечёткую классификацию произвольных объектов с неограниченным числом свойств, классов и произвольной конфигурацией многослойной нейронной сети на базе персептронов. Для разработчиков доступны подробно документированные api-функции, позволяющие использовать механизмы обучения и результаты классификации в своих проектах.
Основные выводы:
1. Математические методы разделения на классы на базе нейронных сетей применимы и в случае классификации уязвимостей.
2. Для получения адекватных результатов необходимо корректно построить матрицу кодирования и подобрать наилучшие свойства для моделирования уязвимостей.
3. Для задачи классификации уязвимостей рекомендуется использовать нейронную сеть персептронов с двумя скрытыми слоями и в конфигурации, зависящей от числа входных параметров: в первом число нейронов равно числу входных параметров, а во втором – в два раза меньше.
4. Преимуществом предложенных подходов является использование универсальных нечётких шкал лингвистических переменных, которые применимы как для оценки значений векторов признаков, так и для интерпретации итоговых уровней принадлежности классам.
5. Предложенный метод нечёткой классификации и реализующие его программные модули FuzzyClassificator являются универсальными, легко адаптируются и настраиваются под конкретные объекты классификации.
Список источников:
1. Shay C. WAVSEP Web Application Scanner Benchmark 2014 // WAVSEP 2013/2014 Score Chart: The Web Application Vulnerability Scanners Benchmark. Commercial, SAAS & Open Source Scanners. An Accuracy, Coverage, Versatility, Adaptability, Feature and Price Comparison of 63 Black Box Web Application Vulnerability Scanners and SAAS Services. – 2014. – [URL] http://sectooladdict.blogspot.ru/2014/02/wavsep-web-application-scanner.html
2. Гильмуллин Т.М. Тестирование сканеров безопасности веб-приложений: подходы и критерии // habrahabr.ru. – 2013. – [URL] http://habrahabr.ru/company/pt/blog/187636/
3. Гильмуллин Т.М. Применение нейросетей для решения классических задач линейного и нелинейного разделения элементов множества на классы // Лабораторные работы для дисциплины «Нейрокомпьютерные системы. – 2008», КГТУ им. А.Н. Туполева (КАИ). – 2013. – [URL] http://math-n-algo.blogspot.ru/2013/04/blog-post.html
4. Гильмуллин Т.М. Модели и комплекс программ процесса управления рисками информационной безопасности: дис. ... канд. технич. наук. – Казанский государственный технический университет. – Казань, 2010. – 225 с. – [URL] https://drive.google.com/file/d/0B-1rf8K04ZS5WjJyWFFBeW91YTQ/edit?usp=sharing
5. Алтунин А.Е., Семухин М.В. Модели и алгоритмы принятия решений в нечётких условиях: Монография. – Тюмень: Изд-во Тюменского гос. ун-та, 2000. – 352 с.
6. Адлер Ю.П., Маркова Е.В., Грановский Ю.В. Планирование эксперимента при поиске оптимальных условий. – М.: Наука, 1976. – 280 с.