Successfully reported this slideshow.
Your SlideShare is downloading. ×

Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский, Денис Колегов (Позитив Текнолоджис)

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad

Check these out next

1 of 79 Ad

Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский, Денис Колегов (Позитив Текнолоджис)

Download to read offline

HighLoad++ 2017

Зал «Кейптаун», 8 ноября, 15:00

Тезисы:
http://www.highload.ru/2017/abstracts/2957.html

Расскажем о нашем опыте разработки модуля межсетевого экрана для MySQL с использованием генератора парсеров ANTLR и языка Kotlin.

Подробно рассмотрим следующие вопросы:
— когда и почему целесообразно использовать ANTLR;
— особенности разработки ANTLR-грамматики для MySQL;
— сравнение производительности рантаймов для ANTLR в рамках задачи синтаксического анализа MySQL (C#, Java, Kotlin, Go, Python, PyPy, C++);
— вспомогательные DSL;
— микросервисная архитектура модуля экранирования SQL;
— полученные результаты.

HighLoad++ 2017

Зал «Кейптаун», 8 ноября, 15:00

Тезисы:
http://www.highload.ru/2017/abstracts/2957.html

Расскажем о нашем опыте разработки модуля межсетевого экрана для MySQL с использованием генератора парсеров ANTLR и языка Kotlin.

Подробно рассмотрим следующие вопросы:
— когда и почему целесообразно использовать ANTLR;
— особенности разработки ANTLR-грамматики для MySQL;
— сравнение производительности рантаймов для ANTLR в рамках задачи синтаксического анализа MySQL (C#, Java, Kotlin, Go, Python, PyPy, C++);
— вспомогательные DSL;
— микросервисная архитектура модуля экранирования SQL;
— полученные результаты.

Advertisement
Advertisement

More Related Content

Slideshows for you (20)

Similar to Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский, Денис Колегов (Позитив Текнолоджис) (20)

Advertisement

More from Ontico (20)

Recently uploaded (20)

Advertisement

Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский, Денис Колегов (Позитив Текнолоджис)

  1. 1. Итак вам нужен парсер или Опыт разработки модуля межсетевого экранирования для Брославский Олег Колегов Денис
  2. 2. Intro … короче говоря, мы решили парсить MySQL …
  3. 3. Intro ???
  4. 4. Intro Совместная работа PT Application Firewall Research Team Принимали участие: • Брославский Олег • Гречнев Сергей • Колегов Денис • Кочуркин Иван • Олексов Никита • Решетников Сергей • Худяшов Иван
  5. 5. SQL Injections SELECT * FROM users WHERE email = '$email' AND password = md5('$password'); “Did you really name your son Robert'); DROP TABLE Students; -- ?” © Exploits of a Mom (xkcd #327) SELECT * FROM users WHERE email = 'xxx' AND password = md5('xxx') OR 1=1; -- 1');
  6. 6. Impact Обнаруженные SQL-инъекции в CMS WordPress за 2017 год
  7. 7. WAF Client WAF Web Server “That’s not a bug, that’s unintended user behavior“ - some developer … makes your system 99,96%secure …
  8. 8. WAF SQLi detection • Лексический подход (регулярные выражения) (?i:b(?:(?:s(?:t(?:d(?:dev(_pop|_samp)?)?|r(?:_to_date|cmp))|u(?:b(?:str(?:ing(_index)?)?|(?:dat|tim)e)|m)|e(?:c(?:_to_time|ond)|ssion_user )|ys(?:tem_user|date)|ha(1|2)?|oundex|chema|ig?n|pace|qrt)|i(?:s(null|_(free_lock|ipv4_compat|ipv4_mapped|ipv4|ipv6|not_null|not|null|used_l ock))?|n(?:et6?_(aton|ntoa)|s(?:ert|tr)|terval)?|f(null)?)|u(?:n(?:compress(?:ed_length)?|ix_timestamp|hex)|tc_(date|time|timestamp)|p(?:dat exml|per)|uid(_short)?|case|ser)|l(?:o(?:ca(?:l(timestamp)?|te)|g(2|10)?|ad_file|wer)|ast(_day|_insert_id)?|e(?:(?:as|f)t|ngth)|case|trim|pa d|n)|t(?:ime(stamp|stampadd|stampdiff|diff|_format|_to_sec)?|o_(base64|days|seconds|n?char)|r(?:uncate|im)|an)|m(?:a(?:ke(?:_set|date)|ster_ pos_wait|x)|i(?:(?:crosecon)?d|n(?:ute)?)|o(?:nth(name)?|d)|d5)|r(?:e(?:p(?:lace|eat)|lease_lock|verse)|o(?:w_count|und)|a(?:dians|nd)|ight| trim|pad)|f(?:i(?:eld(_in_set)?|nd_in_set)|rom_(base64|days|unixtime)|o(?:und_rows|rmat)|loor)|a(?:es_(?:de|en)crypt|s(?:cii(str)?|in)|dd(?: dat|tim)e|(?:co|b)s|tan2?|vg)|p(?:o(?:sition|w(er)?)|eriod_(add|diff)|rocedure_analyse|assword|i)|b(?:i(?:t_(?:length|count|x?or|and)|n(_to_ num)?)|enchmark)|e(?:x(?:p(?:ort_set)?|tract(value)?)|nc(?:rypt|ode)|lt)|v(?:a(?:r(?:_(?:sam|po)p|iance)|lues)|ersion)|g(?:r(?:oup_conca|eat es)t|et_(format|lock))|o(?:(?:ld_passwo)?rd|ct(et_length)?)|we(?:ek(day|ofyear)… <Еще несколько тысяч символов> • Лексико-сигнатурный подход (libinjection) -6270" UNION ALL SELECT 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594# AND "JWWQ"="JWWQ sUk1,1,1,1,1,1,1,1,& • Подходы, основанные на машинном обучении
  9. 9. Impact Michael Stepankin. Advanced Web Application Fuzzing
  10. 10. WAF + DBFW Client WAF Web Server DBFW Database SELECT * FROM users WHERE email = 'xxx' AND password = md5('xxx') OR 1=1; -- 1'); ?name=xxx&password=xxx')+OR+1=1;+--+1
  11. 11. SELECT * FROM users WHERE email = 'xxx' AND password = md5('xxx') OR 1=1; -- 1'); Advanced SQL Analysis select and * password from = users md5 where ( email “HI” = ) “xxx“ ; select md5 * ( from “xxx” users ) where OR email 1 = = “xxx” 1 and ; password <COMMENT> 16 ≠ 20 SELECT * FROM users WHERE email = 'xxx' AND password = md5('xxx') OR 1=1; -- 1'); SELECT * FROM users WHERE email = 'xxx' AND password = md5(‘HI'); Подсчёт токенов [expression] [expression] or [expression] email = xxx [expression] password = and [expression] 1 = 1 email password whereusers [expression] md5 xxx [where][fields] [from]select [select] Анализ синтаксического дерева
  12. 12. Advanced SQL Analysis Кроме того, анализ синтаксического дерева позволяет: Анализ синтаксиса Анализ семантики построение «узкоспециализированной» грамматики веб-приложения построение «профиля» SQL-запросов веб-приложения управление доступом для пользователей веб-приложения
  13. 13. SQL Parsing Parser Syntax analysis Protectors Protector 1 … Protector N Concrete syntax tree MySQL Query
  14. 14. Existing Parsers • Локальные runtime-specific варианты
  15. 15. Existing Parsers • Локальные runtime-specific-варианты • Коммерческие решения (http://www.sqlparser.com)
  16. 16. Existing Parsers • Локальные runtime-specific-варианты • Коммерческие решения (http://www.sqlparser.com) • Реализации движков БД на конкретном языке (e.g. https://github.com/youtube/vitess)
  17. 17. Existing Parsers • Локальные runtime-specific-варианты • Коммерческие решения (http://www.sqlparser.com) • Реализации движков БД на конкретном языке (e.g. https://github.com/youtube/vitess) • Официальная YACC-грамматика MySQL (https://github.com/twitter/mysql)
  18. 18. Existing Parsers • Локальные runtime-specific-варианты • Коммерческие решения (http://www.sqlparser.com) • Реализации движков БД на конкретном языке (e.g. https://github.com/youtube/vitess) • Официальная YACC-грамматика MySQL (https://github.com/twitter/mysql) • ANTLR3-грамматика для MySQL Workbench (https://github.com/mysql/mysql-workbench)
  19. 19. Existing Parsers • Локальные runtime-specific-варианты • Коммерческие решения (http://www.sqlparser.com) • Реализации движков БД на конкретном языке (e.g. https://github.com/youtube/vitess) • Официальная YACC-грамматика MySQL (https://github.com/twitter/mysql) • ANTLR3-грамматика для MySQL Workbench (https://github.com/mysql/mysql-workbench) © Standards (xkcd #927)
  20. 20. ANLTR MySql parser AST TsqlParser PlqlParser Syntax analysis Semantic analysis … Protector 1 … Protector N CST AST Abstract syntax analysis Query
  21. 21. ANTLR Runtimes
  22. 22. Proof Of Concept Python 2.7 Возраст рантайма ~ 2 года (июль 2015) Количество разработчиков 12 человек Количество коммитов 78
  23. 23. Proof Of Concept Python 2.7 • Возраст рантайма ~ 2 года 476,33 0 100 200 300 400 500 600 Q/Sec Python 2.7 Минимальный приемлемый результат • 10 000 запросов/секунду
  24. 24. Proof Of Concept С++ Возраст рантайма ~ 1 год (март 2016) Количество разработчиков 33 человека Количество коммитов 336
  25. 25. Proof Of Concept Python 2.7 • Возраст рантайма ~ 2 года C++11 • Возраст рантайма ~ 1 года 476,33 11052,3 0 2000 4000 6000 8000 10000 12000 Q/Sec Python 2.7 C++11 Минимальный приемлемый результат • 10 000 запросов/секунду
  26. 26. Proof Of Concept 476,33 11052,3 0 2000 4000 6000 8000 10000 12000 Q/Sec Python 2.7 C++11 Минимальный приемлемый результат • 10 000 запросов/секунду Python 2.7 • Возраст рантайма ~ 2 года C++11 • Возраст рантайма ~ 1 года
  27. 27. Proof Of Concept 476,33 11052,3 0 2000 4000 6000 8000 10000 12000 Q/Sec Python 2.7 C++11 Минимальный приемлемый результат • 10 000 запросов/секунду Python 2.7 • Возраст рантайма ~ 2 года C++11 • Возраст рантайма ~ 1 года
  28. 28. Positive Grammar (!) Не зависит от рантайма https://habrahabr.ru/company/pt/blog/339336/ https://github.com/antlr/grammars-v4/tree/master/mysql
  29. 29. Release Fail! • У нас нет свободных С++ разработчиков
  30. 30. Release Fail! • У нас нет свободных С++ разработчиков • С++11 не поддерживается у нас в стеке
  31. 31. Release Fail! • У нас нет свободных С++ разработчиков • С++11 не поддерживается у нас в стеке • Кажется, C++11 не получится втянуть на Debian Wheezy
  32. 32. Test Them All Python 3.5 Возраст рантайма ~ 2 года Количество разработчиков 12 человек Количество коммитов 77
  33. 33. Test Them All Минимальный приемлемый результат • 10 000 запросов/секунду Python 3.5 • Возраст рантайма ~ 2 года ¯_(ツ)_/¯ 476,33 11052,3 449,95 0 2000 4000 6000 8000 10000 12000 Q/Sec Python 2.7 C++11 Python 3.5
  34. 34. Test Them All PyPy Возраст рантайма Официально не поддерживается Количество разработчиков - Количество коммитов -
  35. 35. 476,33 11052,3 449,95 996,26 0 2000 4000 6000 8000 10000 12000 Q/Sec Python 2.7 C++11 Python 3.5 PyPy Test Them All Минимальный приемлемый результат • 10 000 запросов/секунду PyPy • Официально не поддерживается
  36. 36. Time To Go Время добавить Go!
  37. 37. Time To Go Golang Возраст рантайма ~ 2 года (декабрь 2015) Количество разработчиков 15 человек Количество коммитов 213
  38. 38. Time To Go Минимальный приемлемый результат • 10 000 запросов/секунду Golang • Возраст рантайма ~ 2 года 476,33 11052,3 449,95 996,26 372,6 0 2000 4000 6000 8000 10000 12000 Q/Sec Python 2.7 C++11 Python 3.5 PyPy Golang
  39. 39. Test Them All С# Возраст рантайма ~ 2 года (июнь 2015) Количество разработчиков 13 человек Количество коммитов 83
  40. 40. Test Them All Минимальный приемлемый результат • 10 000 запросов/секунду C# • Возраст рантайма ~ 11 месяцев 476,33 11052,3 449,95 996,26 372,6 35543,7 0 5000 10000 15000 20000 25000 30000 35000 40000 Q/Sec Python 2.7 C++11 Python 3.5 PyPy Golang C#
  41. 41. Remaining Runtimes
  42. 42. Remaining Runtimes
  43. 43. Remaining Runtimes
  44. 44. Remaining Runtimes
  45. 45. Remaining Runtimes
  46. 46. Remaining Runtimes
  47. 47. Remaining Runtimes
  48. 48. The Last One Java Возраст рантайма ~ 7 лет (январь 2010) Количество разработчиков 28 человек Количество коммитов 1600
  49. 49. 476,33 11052,3 449,95 996,26 372,6 35543,7 72446,72 0 10000 20000 30000 40000 50000 60000 70000 80000 Q/Sec Python 2.7 C++11 Python 3.5 PyPy Golang C# Java Java Comeback Минимальный приемлемый результат • 10 000 запросов/секунду Java • Возраст рантайма ~ 7 лет
  50. 50. God Please Not Java
  51. 51. The Chosen One Kotlin Возраст рантайма Официально не поддерживается Количество разработчиков - Количество коммитов -
  52. 52. 476,33 11052,3 449,95 996,26 372,6 35543,7 72446,72 60946,21 0 10000 20000 30000 40000 50000 60000 70000 80000 Q/Sec Python 2.7 C++11 Python 3.5 PyPy Golang C# Java Kotlin Kotlin Performance Минимальный приемлемый результат • 10 000 запросов/секунду Kotlin • Полностью совместим с Java
  53. 53. Final Results ANTLR Runtime Query Mode (q/sec) File Mode (MiB/sec) Python 2.7 466.28 13.4 Python 3.5 449.95 19.3 Python 3.6 419.17 16.5 PyPy 996.26 22.02 Golang 372.60 x CPP 11052.30 11.0 C# 35543.7 3.09 Java 72446.72 51.04 Kotlin 60946.21 35.59
  54. 54. Desired State MySql parser AST TsqlParser PlqlParser Syntax analysis Semantic analysis … Protector 1 … Protector N CST AST Abstract syntax analysis Query
  55. 55. MySql parser AST TsqlParser PlqlParser Syntax analysis Semantic analysis … Protector 1 … Protector N CST AST Abstract syntax analysis Query Desired State
  56. 56. Universal Syntax Tree MySql parser AST TsqlParser PlqlParser Syntax analysis … CST AST Abstract syntax analysis Query
  57. 57. Universal Syntax Tree MySql parser MySQL visitor TsqlParser PlqlParser … CST USTQuery TsqlSQL visitor PlqlSQL visitor
  58. 58. Usage Unification MySql parser MySQL visitor TsqlParser PlqlParser … CST USTQuery TsqlSQL visitor PlqlSQL visitor Backend 1 Backend 1 Backend n
  59. 59. Usage Unification MySql parser MySQL visitor TsqlParser PlqlParser … CST USTQuery TsqlSQL visitor PlqlSQL visitor Backend 1 Backend 1 Backend n IDL Codegenerator Runtime Artifacts
  60. 60. We Need More Artifacts! IDL CodeGenerator Runtime Artifacts
  61. 61. We Need More Artifacts! IDL CodeGenerator Runtime Artifacts Positive IDL Aule Вдохновлён Web IDL
  62. 62. We Need More Artifacts! IDL CodeGenerator Runtime Artifacts Positive IDL Aule Вдохновлён Web IDL
  63. 63. We Need More Artifacts! IDL CodeGenerator Runtime Artifacts Positive IDL Aule Вдохновлён Web IDL
  64. 64. We Need More Artifacts! IDL CodeGenerator Runtime Artifacts Positive IDL Aule Вдохновлён Web IDL
  65. 65. We Need More Artifacts! IDL CodeGenerator Runtime Artifacts Positive IDL Aule Вдохновлён Web IDL
  66. 66. We Need More Artifacts! IDL CodeGenerator Runtime Artifacts Positive IDL Aule Вдохновлён Web IDL
  67. 67. We Need More Artifacts! IDL CodeGenerator Runtime Artifacts Positive IDL Aule Вдохновлён Web IDL /PositiveTechnologies/aule
  68. 68. Art Of Architecture Parser
  69. 69. Art Of Architecture Parser Protector 1 … Protector N
  70. 70. Art Of Architecture Parser Protector 1 … Protector N Aule
  71. 71. Art Of Architecture Parser Protector 1 … Protector N Interceptor Aule
  72. 72. Art Of Architecture
  73. 73. As a Conclusion • ANTLR может выдавать достаточную производительность
  74. 74. As a Conclusion • ANTLR может выдавать достаточную производительность • Производительность конкретного рантайма не всегда очевидна
  75. 75. As a Conclusion • ANTLR может выдавать достаточную производительность • Производительность конкретного рантайма не всегда очевидна • Парсер – ничто, инфраструктура – всё
  76. 76. As a Conclusion • ANTLR может выдавать достаточную производительность • Производительность конкретного рантайма не всегда очевидна • Парсер – ничто, инфраструктура – всё • ANTLR4-грамматика для MySQL – open source (MIT) https://github.com/antlr/grammars-v4/tree/master/mysql
  77. 77. As a Conclusion • ANTLR может выдавать достаточную производительность • Производительность конкретного рантайма не всегда очевидна • Парсер – ничто, инфраструктура – всё • ANTLR4-грамматика для MySQL – open source (MIT) https://github.com/antlr/grammars-v4/tree/master/mysql • Aule – open source (GPL) https://github.com/PositiveTechnologies/aule
  78. 78. As a Conclusion • ANTLR может выдавать достаточную производительность • Производительность конкретного рантайма не всегда очевидна • Парсер – ничто, инфраструктура – всё • ANTLR4-грамматика для MySQL – open source (MIT) https://github.com/antlr/grammars-v4/tree/master/mysql • Aule – open source (GPL) https://github.com/PositiveTechnologies/aule
  79. 79. Thank you! ptsecurity.com

×