Сканери безпеки: автоматична валідація вразливостей за допомогою нечітких множин і нейронних мереж

image

Зараз у світі існує велика кількість сканерів інформаційної безпеки різних компаній (у тому числі — MaxPatrol, XSpider і аналізатор коду Application Inspector виробництва Positive Technologies). Подібні інструменти різняться ціною, якістю сканування, типами визначаються вразливостей, методами пошуку та ще десятками параметрів.

При створенні сканерів важливу роль відіграють методики тестування їх роботи, особливе місце в яких займає конкурентний аналіз подібних продуктів.

Як правило, результатом роботи будь-якого сканера безпеки є список виявлених вразливостей, отриманий у процесі аналізу веб-додатки. Той факт, що в сканерах використовуються евристичні алгоритми, призводить до проблеми наявності помилкових спрацьовувань і заповнення списку неіснуючими в реальності уразливими (false positives). А це, в свою чергу, призводить до необхідності виділити ІБ-експерта для перевірки роботи сканера.

Для підтвердження наявності уразливості пропонується використовувати «еталонні» списки вразливостей, що містяться в схожих веб-додатках. Аналітик може використовувати такі списки для виявлення найбільш імовірних місць тестованого продукту і відсіювати очевидні false positives.

Постановка задачі нечіткої класифікації вразливостей

Отже, проблему підтвердження вразливостей зі списку, виданого сканером, на практиці пропонуємо вирішити задачу порівняння їх з деякими еталонами. Якщо всі об'єкти — і еталони, та кандидати у уразливості можуть бути параметризовані, представлені у вигляді вектора, то проблема може бути зведена до задачі класифікації елементів множини.

Вхідні дані:

  1. Задано безліч Vulners всіх вразливостей веб-додатків, які можуть бути задані своїми векторами ознаками vі. У Vulners є безліч Candidates — кандидатів у вразливості, знайдених сканером.
  2. Кожну вразливість-кандидат допускається віднести до двох класів:
  3. I — підтверджених (Ver) і II — непідтверджених (NVer) вразливостей.
  4. Існує безліч Eth — еталонних вразливостей, які входять в I клас.
  5. Задано безліч Scales — вимірювальних шкал для оцінки властивостей вразливостей, як чітких, так і нечітких.
Вимагається:

  1. Побудувати функції, що зв'язують чіткі та нечіткі шкали, для можливості різної інтерпретації результатів класифікації.
  2. Побудувати функцію Classificator, яка для кожної уразливості вказує оцінку її належності до класів підтверджених і непідтверджених вразливостей.
В якості вимірювальних шкал для оцінки властивостей інформаційних систем можуть бути використані:

  • Чітка шкала — безліч дійсних чисел відрізка [0, 1], яке легко може бути перетворено в будь-які інші види чітких числових множин — дискретних, неперервних, необмежених — за допомогою різних функцій конвертування.
  • Ytx — нечітка шкала F-безлічі упорядкованих нечітких змінних виду FP = {fpі}, де fpі — лінгвістичні змінні, що описують значення властивостей об'єкта.
image

Чітка і нечітка універсальні вимірювальні шкали

Кодування вхідних даних

Для будь-якого способу класифікації уразливості повинні бути попередньо закодовані, тобто представлені вектором v = {vі} із Vulners. Для цього потрібно задати формальне правило кодування, згідно з яким окремі властивості реальних вразливостей можливо оцінити на чіткій шкалою Sp.

Задамо матрицю кодування ознак вразливостей MVulners, рядки якої являють собою окремі властивості вразливостей (vulner property), стовпці вказують на числовий код (code) деякого властивості, а в клітинках матриці вказуються можливі значення властивостей. Для побудови такої матриці повинні бути виділені лише значимі властивості, однозначно відрізняють одну автоматично знайдену уразливість від іншої. Зрозуміло, що для кожного сканера інформаційної безпеки класифікація вразливостей може бути своєю. Тим не менше, більшість з них містять такі властивості, як, наприклад, тип вразливості, протокол, за яким вона може бути эксплуатирована, канал реалізації всередині цього протоколу, тип уразливого об'єкта, шлях до об'єкта на сервері, мережевий запит з вектором атаки. Всі можливі значення кожної властивості кодуються неотрицательными цілими числами, де нуль виділено в якості невизначеного значення властивості, що дозволить враховувати, серед іншого, відсутні, нові або поки не передбачені значення властивості.

Матриця MVulners може бути представлено у табличному вигляді. Значеннями властивостей можуть бути також нечіткі величини і для використання в подальших розрахунках їх потрібно дефазифицировать.

image

Побудова нейронної мережі, її навчання і представлення результатів

Будемо задавати конфігурацію нейронної мережі трійкою значень:

Config = <inputs, {layerl}, outputs>

де inputs — кількість вхідних параметрів, {layerl} — множина невід'ємних цілих чисел, що вказують на кількість нейронів у прихованому шарі номер l, і outputs — кількість вихідних параметрів.

Вектор (sІ, sII) зі значеннями параметрів на чіткій шкалою Sp може інтерпретуватися таким чином:

  1. Значення параметрів вказують на ступінь впевненості від 0 до 1 в належності вектора ознак вразливості кожному класу.
  2. Значення параметрів, будучи помноженої на 100%, вказують на ймовірність належності вектора ознак вразливості кожному класу від 0 до 100%.
  3. Значення параметрів, фазифицированные за допомогою спеціальної функції Fuzzy(x, Sf), вказують на лінгвістичну оцінку рівня належності вектора ознак вразливості кожному з класів на нечіткої шкалою Sf = {Min, Low, Med, High, Max}.
image

Програмна реалізація класифікатора

Для практичного використання нейронних мереж при вирішенні задач нечіткої класифікації у разі різного числа класів і структури мереж були розроблені програмні модулі FuzzyClassificator, що розповсюджуються під ліцензією GNU GPL v3. Завантажити актуальну версію FuzzyClassificator можна на GitHub.

Для зручності використання модулів в системах автоматизації конфігурація програми здійснюється через інтерфейс командного рядка. У розділі опису програми на GitHub наведена детальна технічна інформація про команди інтерфейсу, роботі модулів і вхідних даних. Для роботи модулів FuzzyClassificator потрібно Pyzo — безкоштовний і відкритий інструмент розробки, заснований на Python 3.3.2 і включає в себе безліч підпрограм для реалізації наукових обчислень, зокрема PyBrain library — підпрограми для роботи з нейронними мережами.

Основні програмні модулі, що реалізують запропоновані в статті підходи і математичний апарат:

  1. FuzzyClassificator — реалізує користувальницький інтерфейс командного рядка, отримує і обробляє вхідні дані, встановлює режими навчання та класифікації, надає результати.
  2. PyBrainLearning — визначає методи для роботи з нечіткими нейронними мережами, об'єднуючи можливості бібліотеки PyBrain та авторської бібліотеки FuzzyRoutines.
  3. FuzzyRoutines — містить підпрограми для роботи з нечіткими множинами і нечіткими шкалами.
image

Верхній A-0-рівень функціональної IDEF0-моделі роботи програми FuzzyClassificator

image

Рівень A0 IDEF0-моделі. Основні етапи роботи FuzzyClassificator

image

Рівень A1 IDEF0-моделі. Підпроцеси етапів роботи FuzzyClassificator

Етап навчання (learning mode) складається з наступних кроків:

1. Ініціалізація об'єктів програми одними значеннями.

2. Обробка вхідних даних і підготовка нейронної мережі до навчання:

  • обробка файла з даними про вектори ознак еталонів;
  • підготовка даних для навчання у форматі PyBrain;
  • ініціалізація параметрів нової нейронної мережі PyBrain або її завантаження з вказаного файлу.
3. Навчання нейронної мережі на заданих еталонах:

  • ініціалізація модуля PyBrain-тренера;
  • навчання мережі за допомогою тренера та збереження її конфігурації в файл формату PyBrain.
Етап класифікації (classifying mode) складається з наступних кроків:

1. Ініціалізація об'єктів програми одними значеннями.

2. Обробка вхідних даних і підготовка нейронної мережі до аналізу даних:

  • обробка файла з даними про вектори ознак кандидатів;
  • завантаження конфігурації навченої нейронної мережі PyBrain з вказаного файлу.
3. Аналіз нейронною мережею векторів ознак кандидатів:

  • активація нейронної мережі та обчислення рівнів належності векторів до різних класів;
  • інтерпретація отриманих результатів на нечітких шкалах та формування файлу звіту.
Вхідні дані з векторами ознак еталонів і кандидатів задаються у вигляді звичайних текстових файлів з табуляцією в якості роздільника значень. Наприклад, щоб задати дані для навчання, можна підготувати файл ethalons.dat, містить рядок заголовка і далі рядки зі значеннями еталонних векторів ознак і їх приналежності до того або іншого класу.

Значення можуть бути задані як на чіткій, так і на нечіткої шкалах.

Файл ethalons.datinput1 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 0
А в якості даних для аналізу може бути підготовлений файл candidates.dat, також містить рядок заголовка і рядки зі значеннями векторів ознак кандидатів:

Файл candidates.datinput1 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, видав би аналогічні результати класифікації.

Висновок

Отже, нам вдалося поєднати математичні апарати теорій нечітких систем і нейронних мереж для рішення практичної задачі класифікації вразливостей. З виконаної роботи можна зробити кілька висновків:

  1. Математичні методи поділу на класи на базі нейронних мереж застосовуються і у разі класифікації дефектів.
  2. Для отримання адекватних результатів необхідно коректно побудувати матрицю кодування і підібрати найкращі властивості для моделювання вразливостей.
  3. Для задачі класифікації вразливостей рекомендується використовувати нейронну мережу перцептронів з двома прихованими шарами і в конфігурації, яка залежить від числа вхідних параметрів: в першому число нейронів дорівнює числу вхідних параметрів, а в другому — в два рази менше.
  4. Перевагою запропонованих підходів є використання універсальних нечітких шкал лінгвістичних змінних, які застосовні як для оцінки значень векторів ознак, так і для інтерпретації підсумкових рівнів належності класами.
  5. Запропонований метод нечіткої класифікації і реалізують його програмні модулі FuzzyClassificator є універсальними, легко адаптуються і змінюються під конкретні об'єкти класифікації.
Будемо раді відповісти на ваші питання в коментарях. Додаткові подробиці, як і опис матаппарата, див. за адресою: math-n-algo.blogspot.ua/2014/08/FuzzyClassificator.html.

Автор: Тимур Гильмуллин, Positive Technologies.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.