Lexical analysis of dynamically formed string expressions
Marina Polubelova, Semyon Grigorev, Saint Petersburg State University, Saint Petersburg
12 - 14 November 2015
Tools and Methods of Program Analysis in St. Petersburg
BDD. The Outer Limits. Iosif Itkin at Youcon (in Russian)
TMPA-2015: Lexical analysis of dynamically formed string expressions
1. Третья международная научно-
практическая конференция:
Инструменты и методы анализа
программ, ТМPА-2015
12–14 ноября, Санкт-Петербург
Лексический анализ динамически формируемых
строковых выражений
Автор: Полубелова Марина
Санкт-Петербургский государственный университет
12 ноября 2015г.
Полубелова Марина (СПбГУ) 12 ноября 2015г. 1 / 24
3. Мотивация
Использование динамически формируемых строковых выражений
Уменьшает надежность
Нет статического поиска ошибок
Увеличивает уязвимость
SQL инъекции
Межсайтовый скриптинг
Полубелова Марина (СПбГУ) 12 ноября 2015г. 3 / 24
4. Статический анализ программ
Статический анализ позволяет получать знания о коде без его запуска
Лексический анализ
Синтаксический анализ
Семантический анализ
Полубелова Марина (СПбГУ) 12 ноября 2015г. 4 / 24
5. Обзор существующих инструментов
Проверка выражения на соответствие описанию некоторой
эталонной грамматики
Java String Analyzer
PHP String Analyzer
Alvor
Статический анализ программы на уязвимость
Pixy
Stranger
SAFELI
Полубелова Марина (СПбГУ) 12 ноября 2015г. 5 / 24
6. Разработка инструментов
Возможны два подхода
Создание универсального инструмента
Создание набора генераторов и библиотек стандартных функций
По описанию языка генерируются анализаторы (Lex, Yacc, ANTLR
и т.д.)
Для создания конечных решений можно использовать стандартные
функции
Полубелова Марина (СПбГУ) 12 ноября 2015г. 6 / 24
7. Проект YaccConstructor
YaccConstructor — модульный инструмент, предназначенный для
проведения лексического и синтаксического анализа
YaccConstructor — платформа для поддержки встроенных языков
В лексическом анализе не поддерживаются циклы и строковые
операции
Полубелова Марина (СПбГУ) 12 ноября 2015г. 7 / 24
8. Постановка задачи
Цель: разработать автоматизированный подход создания
лексического анализатора для динамически формируемого кода
Разработать алгоритм лексического анализа выражений,
формируемых с помощью строковых операций и циклов
Сохранить привязку лексических единиц к исходному коду
Реализовать генератор лексических анализаторов
Полубелова Марина (СПбГУ) 12 ноября 2015г. 8 / 24
9. Аппроксимация
private void Go (int cond){
string columnName = cond > 3 ? "X":(cond < 0 ? "Y":"Z");
string query =
"SELECT name" + columnName + " FROM table";
Program.ExecuteImmediate(query);
}
Множество значений
{ "SELECT nameX FROM table"; "SELECT nameY FROM table";
"SELECT nameZ FROM table"}
Результат аппроксимации
0 1
"SELECT name"
32
"X"
"Y"
"Z"
" FROM table"
Полубелова Марина (СПбГУ) 12 ноября 2015г. 9 / 24
10. Строковые операции
string s = "SELECT nameX FROM tableY";
s = s.Replace("SELECT nameX", "b");
Многие строковые операции могут быть выражены с помощью
конечных автоматов
Для построения аппроксимации множества значений выражения
использовался алгоритм, описанный в статье Fang Yu
“Automata-based symbolic string analysis for vulnerability detection”
Полубелова Марина (СПбГУ) 12 ноября 2015г. 10 / 24
11. Пример
M = replace(M1, M2, M3)
0 1
b
5
3
e
2
c
4
l
6
d
m
kf
0 2
e
1
d kf
M1 M2
0 1
n
m
0 1
b 5
3
n
2
c
m
4l
6
n
m
m
m
M3 M
Полубелова Марина (СПбГУ) 12 ноября 2015г. 11 / 24
12. Лексический анализ строковых выражений
На вход анализатору подается конечный автомат, полученный в
результате аппроксимации множества значений строкового
выражения
На выходе получаем либо конечный автомат над токенами, либо
список лексических ошибок. Токен содержит в себе:
идентификатор токена
конечный автомат, описывающий все возможные
последовательности символов для данного токена
Задача лексического анализа: получение конечного автомата над
алфавитом токенов эталонной грамматики из конечного автомата над
алфавитом символов обрабатываемого языка
Полубелова Марина (СПбГУ) 12 ноября 2015г. 12 / 24
13. Пример
private void Go (int cond){
string columnName = cond > 3 ? "X":(cond < 0 ? "Y":"Z");
string query =
"SELECT name" + columnName + " FROM table";
Program.ExecuteImmediate(query);
}
Результат аппроксимации
0 1
"SELECT name"
32
"X"
"Y"
"Z"
" FROM table"
Результат лексического анализа
0 1
SELECT
52
IDENT
3
FROM
4
IDENT EOF
Полубелова Марина (СПбГУ) 12 ноября 2015г. 13 / 24
14. Пример
Результат лексического анализа
0 1
SELECT
52
IDENT
3
FROM
4
IDENT EOF
Конечный автомат первого токена IDENT
n: "SELECT name"
(7,8)
a: "SELECT name"
(8,9)
m: "SELECT name"
(9,10)
e: "SELECT name"
(10,11)
Z: "Z"
(0,1)
Y: "Y"
(0,1)
X: "X"
(0,1)
Конечный автомат второго токена IDENT
t: " FROM table"
(6,7)
a: " FROM table"
(7,8)
b: " FROM table"
(8,9)
l: " FROM table"
(9,10)
e: " FROM table"
(10,11)
Полубелова Марина (СПбГУ) 12 ноября 2015г. 14 / 24
15. Конечный преобразователь
Конечный преобразователь — это конечный автомат, который
может выводить конечное число символов для каждого входного
символа
Композиция конечных преобразователей — это два
последовательно взаимодействующих конечных преобразователя:
выход первого конечного преобразователя является входом для
второго конечного преобразователя
Полубелова Марина (СПбГУ) 12 ноября 2015г. 15 / 24
17. Алгоритм лексического анализа
Этап 0
Вход: конечный автомат, полученный в результате построения
аппроксимации
Выход: конечный преобразователь, построенный из входного
конечного автомата
0 1
+
2
*
*
0 1
+ : +
32
* : * eof : eof
* : *
Полубелова Марина (СПбГУ) 12 ноября 2015г. 17 / 24
18. Алгоритм лексического анализа
Этап 1
Вход:
Конечный преобразователь, полученный на Этапе 0
Конечный преобразователь, полученный из описания,
построенного генератором лексических анализаторов
Выход: конечный преобразователь и набор лексических ошибок
0 1
+ : ε
4
2
* : PLUS
eof : MULT
3
* : ε
* : POW
Полубелова Марина (СПбГУ) 12 ноября 2015г. 18 / 24
19. Алгоритм лексического анализа
Этап 2. Интерпретация конечного преобразователя
Вход: конечный преобразователь, полученный на Этапе 1
Выход: конечный автомат над алфавитом токенов эталонной
грамматики
0 1
+ : ε
4
2
* : PLUS
eof : MULT
3
* : ε
* : POW
0 1
PLUS
4
3POW
2MULT
POW
MULT
EOF
Полубелова Марина (СПбГУ) 12 ноября 2015г. 19 / 24
20. Пример 1
private void Go (int number){
string query =
"SELECT nameX FROM tableY WHERE x < ";
while(query.Length < number){ query += "+ 1 ";}
Program.ExecuteImmediate(query);
}
Результат аппроксимации
0 1
"SELECT nameX FROM tableY WHERE x < "
"+ 1 "
Результат лексического анализа
0 1
SELECT
92
IDENT
3
FROM
4
IDENT
5
WHERE
6
IDENT
7
LESS
EOF
8
PLUS
10
NUM
EOF
PLUS
Полубелова Марина (СПбГУ) 12 ноября 2015г. 20 / 24
21. Пример 2
string query = "SELECT name";
for(int i = 0; i < 10; i++){ query += "X";}
query += " FROM tableY";
Program.ExecuteImmediate(query);
Результат лексического анализа
0 1
SELECT
52
IDENT
3
FROM
4
IDENT EOF
Конечный автомат первого токена IDENT
n: "SELECT name"
(7,8)
X: "X"
(0,1)
a: "SELECT name"
(8,9)
m: "SELECT name"
(9,10)
e: "SELECT name"
(10,11)
Полубелова Марина (СПбГУ) 12 ноября 2015г. 21 / 24
23. Результаты
В рамках данной работы были получены следующие результаты
Разработан алгоритм лексического анализа выражений,
формируемых с помощью строковых операций и циклов
Реализован генератор лексических анализаторов на основе
предложенного алгоритма
Полубелова Марина (СПбГУ) 12 ноября 2015г. 23 / 24
24. Контактная информация
Полубелова Марина: polubelovam@gmail.com
Григорьев Семён: Semen.Grigorev@jetbrains.com
Исходный код YaccConstructor:
https://github.com/YaccConstructor
Полубелова Марина (СПбГУ) 12 ноября 2015г. 24 / 24