Итак
вам нужен парсер
или
Опыт разработки модуля межсетевого
экранирования для
Брославский Олег Колегов Денис
Intro
…
короче говоря,
мы решили парсить MySQL
…
Intro
???
Intro
Совместная работа PT Application Firewall Research Team
Принимали участие:
• Брославский Олег
• Гречнев Сергей
• Колегов Денис
• Кочуркин Иван
• Олексов Никита
• Решетников Сергей
• Худяшов Иван
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');
Impact
Обнаруженные
SQL-инъекции в
CMS WordPress
за 2017 год
WAF
Client WAF Web Server
“That’s not a bug, that’s unintended user behavior“
- some developer
… makes your system 99,96%secure …
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,&
• Подходы, основанные на машинном обучении
Impact
Michael Stepankin. Advanced Web Application Fuzzing
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
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]
Анализ синтаксического дерева
Advanced SQL Analysis
Кроме того, анализ синтаксического дерева позволяет:
Анализ
синтаксиса
Анализ
семантики
построение
«узкоспециализированной»
грамматики веб-приложения
построение «профиля»
SQL-запросов веб-приложения
управление доступом для
пользователей веб-приложения
SQL Parsing
Parser
Syntax analysis Protectors
Protector 1
…
Protector N
Concrete
syntax tree
MySQL
Query
Existing Parsers
• Локальные runtime-specific варианты
Existing Parsers
• Локальные runtime-specific-варианты
• Коммерческие решения
(http://www.sqlparser.com)
Existing Parsers
• Локальные runtime-specific-варианты
• Коммерческие решения
(http://www.sqlparser.com)
• Реализации движков БД на конкретном
языке (e.g. https://github.com/youtube/vitess)
Existing Parsers
• Локальные runtime-specific-варианты
• Коммерческие решения
(http://www.sqlparser.com)
• Реализации движков БД на конкретном
языке (e.g. https://github.com/youtube/vitess)
• Официальная YACC-грамматика MySQL
(https://github.com/twitter/mysql)
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)
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)
ANLTR
MySql parser
AST
TsqlParser
PlqlParser
Syntax analysis Semantic analysis
…
Protector 1
…
Protector N
CST AST
Abstract syntax
analysis
Query
ANTLR Runtimes
Proof Of Concept
Python 2.7
Возраст рантайма ~ 2 года (июль 2015)
Количество разработчиков 12 человек
Количество коммитов 78
Proof Of Concept
Python 2.7
• Возраст рантайма ~ 2 года
476,33
0
100
200
300
400
500
600
Q/Sec
Python 2.7
Минимальный
приемлемый результат
• 10 000 запросов/секунду
Proof Of Concept
С++
Возраст рантайма ~ 1 год (март 2016)
Количество разработчиков 33 человека
Количество коммитов 336
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 запросов/секунду
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 года
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 года
Positive Grammar
(!) Не зависит от рантайма
https://habrahabr.ru/company/pt/blog/339336/
https://github.com/antlr/grammars-v4/tree/master/mysql
Release Fail!
• У нас нет свободных С++
разработчиков
Release Fail!
• У нас нет свободных С++
разработчиков
• С++11 не поддерживается у нас в
стеке
Release Fail!
• У нас нет свободных С++
разработчиков
• С++11 не поддерживается у нас в
стеке
• Кажется, C++11 не получится
втянуть на Debian Wheezy
Test Them All
Python 3.5
Возраст рантайма ~ 2 года
Количество разработчиков 12 человек
Количество коммитов 77
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
Test Them All
PyPy
Возраст рантайма Официально не поддерживается
Количество разработчиков -
Количество коммитов -
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
• Официально не поддерживается
Time To Go
Время добавить Go!
Time To Go
Golang
Возраст рантайма ~ 2 года (декабрь 2015)
Количество разработчиков 15 человек
Количество коммитов 213
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
Test Them All
С#
Возраст рантайма ~ 2 года (июнь 2015)
Количество разработчиков 13 человек
Количество коммитов 83
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#
Remaining Runtimes
Remaining Runtimes
Remaining Runtimes
Remaining Runtimes
Remaining Runtimes
Remaining Runtimes
Remaining Runtimes
The Last One
Java
Возраст рантайма ~ 7 лет (январь 2010)
Количество разработчиков 28 человек
Количество коммитов 1600
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 лет
God Please Not Java
The Chosen One
Kotlin
Возраст рантайма Официально не поддерживается
Количество разработчиков -
Количество коммитов -
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
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
Desired State
MySql parser
AST
TsqlParser
PlqlParser
Syntax analysis Semantic analysis
…
Protector 1
…
Protector N
CST AST
Abstract syntax
analysis
Query
MySql parser
AST
TsqlParser
PlqlParser
Syntax analysis Semantic analysis
…
Protector 1
…
Protector N
CST AST
Abstract syntax
analysis
Query
Desired State
Universal Syntax Tree
MySql parser
AST
TsqlParser
PlqlParser
Syntax analysis
…
CST AST
Abstract syntax
analysis
Query
Universal Syntax Tree
MySql parser
MySQL
visitor
TsqlParser
PlqlParser
…
CST USTQuery
TsqlSQL
visitor
PlqlSQL
visitor
Usage Unification
MySql parser
MySQL
visitor
TsqlParser
PlqlParser
…
CST USTQuery
TsqlSQL
visitor
PlqlSQL
visitor
Backend 1
Backend 1
Backend n
Usage Unification
MySql parser
MySQL
visitor
TsqlParser
PlqlParser
…
CST USTQuery
TsqlSQL
visitor
PlqlSQL
visitor
Backend 1
Backend 1
Backend n
IDL Codegenerator Runtime
Artifacts
We Need More Artifacts!
IDL CodeGenerator Runtime
Artifacts
We Need More Artifacts!
IDL CodeGenerator Runtime
Artifacts
Positive
IDL
Aule
Вдохновлён
Web IDL
We Need More Artifacts!
IDL CodeGenerator Runtime
Artifacts
Positive
IDL
Aule
Вдохновлён
Web IDL
We Need More Artifacts!
IDL CodeGenerator Runtime
Artifacts
Positive
IDL
Aule
Вдохновлён
Web IDL
We Need More Artifacts!
IDL CodeGenerator Runtime
Artifacts
Positive
IDL
Aule
Вдохновлён
Web IDL
We Need More Artifacts!
IDL CodeGenerator Runtime
Artifacts
Positive
IDL
Aule
Вдохновлён
Web IDL
We Need More Artifacts!
IDL CodeGenerator Runtime
Artifacts
Positive
IDL
Aule
Вдохновлён
Web IDL
We Need More Artifacts!
IDL CodeGenerator Runtime
Artifacts
Positive
IDL
Aule
Вдохновлён
Web IDL
/PositiveTechnologies/aule
Art Of Architecture
Parser
Art Of Architecture
Parser
Protector 1
…
Protector N
Art Of Architecture
Parser
Protector 1
…
Protector N
Aule
Art Of Architecture
Parser
Protector 1
…
Protector N
Interceptor
Aule
Art Of Architecture
As a Conclusion
• ANTLR может выдавать достаточную производительность
As a Conclusion
• ANTLR может выдавать достаточную производительность
• Производительность конкретного рантайма не всегда очевидна
As a Conclusion
• ANTLR может выдавать достаточную производительность
• Производительность конкретного рантайма не всегда очевидна
• Парсер – ничто, инфраструктура – всё
As a Conclusion
• ANTLR может выдавать достаточную производительность
• Производительность конкретного рантайма не всегда очевидна
• Парсер – ничто, инфраструктура – всё
• ANTLR4-грамматика для MySQL – open source (MIT)
https://github.com/antlr/grammars-v4/tree/master/mysql
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
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
Thank you!
ptsecurity.com

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

  • 1.
    Итак вам нужен парсер или Опытразработки модуля межсетевого экранирования для Брославский Олег Колегов Денис
  • 2.
  • 3.
  • 4.
    Intro Совместная работа PTApplication Firewall Research Team Принимали участие: • Брославский Олег • Гречнев Сергей • Колегов Денис • Кочуркин Иван • Олексов Никита • Решетников Сергей • Худяшов Иван
  • 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.
  • 7.
    WAF Client WAF WebServer “That’s not a bug, that’s unintended user behavior“ - some developer … makes your system 99,96%secure …
  • 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.
    Impact Michael Stepankin. AdvancedWeb Application Fuzzing
  • 10.
    WAF + DBFW ClientWAF 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.
    SELECT * FROMusers 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.
    Advanced SQL Analysis Крометого, анализ синтаксического дерева позволяет: Анализ синтаксиса Анализ семантики построение «узкоспециализированной» грамматики веб-приложения построение «профиля» SQL-запросов веб-приложения управление доступом для пользователей веб-приложения
  • 13.
    SQL Parsing Parser Syntax analysisProtectors Protector 1 … Protector N Concrete syntax tree MySQL Query
  • 14.
    Existing Parsers • Локальныеruntime-specific варианты
  • 15.
    Existing Parsers • Локальныеruntime-specific-варианты • Коммерческие решения (http://www.sqlparser.com)
  • 16.
    Existing Parsers • Локальныеruntime-specific-варианты • Коммерческие решения (http://www.sqlparser.com) • Реализации движков БД на конкретном языке (e.g. https://github.com/youtube/vitess)
  • 17.
    Existing Parsers • Локальныеruntime-specific-варианты • Коммерческие решения (http://www.sqlparser.com) • Реализации движков БД на конкретном языке (e.g. https://github.com/youtube/vitess) • Официальная YACC-грамматика MySQL (https://github.com/twitter/mysql)
  • 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.
    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.
    ANLTR MySql parser AST TsqlParser PlqlParser Syntax analysisSemantic analysis … Protector 1 … Protector N CST AST Abstract syntax analysis Query
  • 21.
  • 22.
    Proof Of Concept Python2.7 Возраст рантайма ~ 2 года (июль 2015) Количество разработчиков 12 человек Количество коммитов 78
  • 23.
    Proof Of Concept Python2.7 • Возраст рантайма ~ 2 года 476,33 0 100 200 300 400 500 600 Q/Sec Python 2.7 Минимальный приемлемый результат • 10 000 запросов/секунду
  • 24.
    Proof Of Concept С++ Возрастрантайма ~ 1 год (март 2016) Количество разработчиков 33 человека Количество коммитов 336
  • 25.
    Proof Of Concept Python2.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.
    Proof Of Concept 476,33 11052,3 0 2000 4000 6000 8000 10000 12000 Q/Sec Python2.7 C++11 Минимальный приемлемый результат • 10 000 запросов/секунду Python 2.7 • Возраст рантайма ~ 2 года C++11 • Возраст рантайма ~ 1 года
  • 27.
    Proof Of Concept 476,33 11052,3 0 2000 4000 6000 8000 10000 12000 Q/Sec Python2.7 C++11 Минимальный приемлемый результат • 10 000 запросов/секунду Python 2.7 • Возраст рантайма ~ 2 года C++11 • Возраст рантайма ~ 1 года
  • 28.
    Positive Grammar (!) Независит от рантайма https://habrahabr.ru/company/pt/blog/339336/ https://github.com/antlr/grammars-v4/tree/master/mysql
  • 29.
    Release Fail! • Унас нет свободных С++ разработчиков
  • 30.
    Release Fail! • Унас нет свободных С++ разработчиков • С++11 не поддерживается у нас в стеке
  • 31.
    Release Fail! • Унас нет свободных С++ разработчиков • С++11 не поддерживается у нас в стеке • Кажется, C++11 не получится втянуть на Debian Wheezy
  • 32.
    Test Them All Python3.5 Возраст рантайма ~ 2 года Количество разработчиков 12 человек Количество коммитов 77
  • 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.
    Test Them All PyPy Возрастрантайма Официально не поддерживается Количество разработчиков - Количество коммитов -
  • 35.
    476,33 11052,3 449,95 996,26 0 2000 4000 6000 8000 10000 12000 Q/Sec Python 2.7 C++11Python 3.5 PyPy Test Them All Минимальный приемлемый результат • 10 000 запросов/секунду PyPy • Официально не поддерживается
  • 36.
    Time To Go Времядобавить Go!
  • 37.
    Time To Go Golang Возрастрантайма ~ 2 года (декабрь 2015) Количество разработчиков 15 человек Количество коммитов 213
  • 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.
    Test Them All С# Возрастрантайма ~ 2 года (июнь 2015) Количество разработчиков 13 человек Количество коммитов 83
  • 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.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
    The Last One Java Возрастрантайма ~ 7 лет (январь 2010) Количество разработчиков 28 человек Количество коммитов 1600
  • 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 Python2.7 C++11 Python 3.5 PyPy Golang C# Java Java Comeback Минимальный приемлемый результат • 10 000 запросов/секунду Java • Возраст рантайма ~ 7 лет
  • 50.
  • 51.
    The Chosen One Kotlin Возрастрантайма Официально не поддерживается Количество разработчиков - Количество коммитов -
  • 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 Python2.7 C++11 Python 3.5 PyPy Golang C# Java Kotlin Kotlin Performance Минимальный приемлемый результат • 10 000 запросов/секунду Kotlin • Полностью совместим с Java
  • 53.
    Final Results ANTLR RuntimeQuery 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.
    Desired State MySql parser AST TsqlParser PlqlParser Syntaxanalysis Semantic analysis … Protector 1 … Protector N CST AST Abstract syntax analysis Query
  • 55.
    MySql parser AST TsqlParser PlqlParser Syntax analysisSemantic analysis … Protector 1 … Protector N CST AST Abstract syntax analysis Query Desired State
  • 56.
    Universal Syntax Tree MySqlparser AST TsqlParser PlqlParser Syntax analysis … CST AST Abstract syntax analysis Query
  • 57.
    Universal Syntax Tree MySqlparser MySQL visitor TsqlParser PlqlParser … CST USTQuery TsqlSQL visitor PlqlSQL visitor
  • 58.
    Usage Unification MySql parser MySQL visitor TsqlParser PlqlParser … CSTUSTQuery TsqlSQL visitor PlqlSQL visitor Backend 1 Backend 1 Backend n
  • 59.
    Usage Unification MySql parser MySQL visitor TsqlParser PlqlParser … CSTUSTQuery TsqlSQL visitor PlqlSQL visitor Backend 1 Backend 1 Backend n IDL Codegenerator Runtime Artifacts
  • 60.
    We Need MoreArtifacts! IDL CodeGenerator Runtime Artifacts
  • 61.
    We Need MoreArtifacts! IDL CodeGenerator Runtime Artifacts Positive IDL Aule Вдохновлён Web IDL
  • 62.
    We Need MoreArtifacts! IDL CodeGenerator Runtime Artifacts Positive IDL Aule Вдохновлён Web IDL
  • 63.
    We Need MoreArtifacts! IDL CodeGenerator Runtime Artifacts Positive IDL Aule Вдохновлён Web IDL
  • 64.
    We Need MoreArtifacts! IDL CodeGenerator Runtime Artifacts Positive IDL Aule Вдохновлён Web IDL
  • 65.
    We Need MoreArtifacts! IDL CodeGenerator Runtime Artifacts Positive IDL Aule Вдохновлён Web IDL
  • 66.
    We Need MoreArtifacts! IDL CodeGenerator Runtime Artifacts Positive IDL Aule Вдохновлён Web IDL
  • 67.
    We Need MoreArtifacts! IDL CodeGenerator Runtime Artifacts Positive IDL Aule Вдохновлён Web IDL /PositiveTechnologies/aule
  • 68.
  • 69.
  • 70.
  • 71.
    Art Of Architecture Parser Protector1 … Protector N Interceptor Aule
  • 72.
  • 73.
    As a Conclusion •ANTLR может выдавать достаточную производительность
  • 74.
    As a Conclusion •ANTLR может выдавать достаточную производительность • Производительность конкретного рантайма не всегда очевидна
  • 75.
    As a Conclusion •ANTLR может выдавать достаточную производительность • Производительность конкретного рантайма не всегда очевидна • Парсер – ничто, инфраструктура – всё
  • 76.
    As a Conclusion •ANTLR может выдавать достаточную производительность • Производительность конкретного рантайма не всегда очевидна • Парсер – ничто, инфраструктура – всё • ANTLR4-грамматика для MySQL – open source (MIT) https://github.com/antlr/grammars-v4/tree/master/mysql
  • 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.
    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.