tmpa-2015: lexical analysis of dynamically formed string expressions
TRANSCRIPT
Третья международная научно-практическая конференция:Инструменты и методы анализапрограмм, ТМPА-201512–14 ноября, Санкт-Петербург
Лексический анализ динамически формируемыхстроковых выражений
Автор: Полубелова Марина
Санкт-Петербургский государственный университет
12 ноября 2015г.
Полубелова Марина (СПбГУ) 12 ноября 2015г. 1 / 24
Примеры
Встроенный SQL в С#private void Go (int cond){
string columnName = cond > 3 ? "X":(cond < 0 ? "Y":"Z");string query =
"SELECT name" + columnName + " FROM table";Program.ExecuteImmediate(query);
}
Динамически генерируемый HTML в PHP-программах<?php
$name = ’your name’;echo ’<table>
<tr><th>Name</th></tr><tr><td>’.$name.’</td></tr></table>’;
?>
Полубелова Марина (СПбГУ) 12 ноября 2015г. 2 / 24
Мотивация
Использование динамически формируемых строковых выраженийУменьшает надежность
I Нет статического поиска ошибокУвеличивает уязвимость
I SQL инъекцииI Межсайтовый скриптинг
Полубелова Марина (СПбГУ) 12 ноября 2015г. 3 / 24
Статический анализ программ
Статический анализ позволяет получать знания о коде без его запускаЛексический анализСинтаксический анализСемантический анализ
Полубелова Марина (СПбГУ) 12 ноября 2015г. 4 / 24
Обзор существующих инструментов
Проверка выражения на соответствие описанию некоторойэталонной грамматики
I Java String AnalyzerI PHP String AnalyzerI Alvor
Статический анализ программы на уязвимостьI PixyI StrangerI SAFELI
Полубелова Марина (СПбГУ) 12 ноября 2015г. 5 / 24
Разработка инструментов
Возможны два подходаСоздание универсального инструментаСоздание набора генераторов и библиотек стандартных функций
I По описанию языка генерируются анализаторы (Lex, Yacc, ANTLRи т.д.)
I Для создания конечных решений можно использовать стандартныефункции
Полубелова Марина (СПбГУ) 12 ноября 2015г. 6 / 24
Проект YaccConstructor
YaccConstructor — модульный инструмент, предназначенный дляпроведения лексического и синтаксического анализаYaccConstructor — платформа для поддержки встроенных языков
В лексическом анализе не поддерживаются циклы и строковыеоперации
Полубелова Марина (СПбГУ) 12 ноября 2015г. 7 / 24
Постановка задачи
Цель: разработать автоматизированный подход созданиялексического анализатора для динамически формируемого кода
Разработать алгоритм лексического анализа выражений,формируемых с помощью строковых операций и цикловСохранить привязку лексических единиц к исходному кодуРеализовать генератор лексических анализаторов
Полубелова Марина (СПбГУ) 12 ноября 2015г. 8 / 24
Аппроксимация
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
Строковые операции
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
Пример
M = replace(M1,M2,M3)
0 1b 5
3e
2
c4
l
6d
m
kf
0 2e
1
d kf
M1 M2
0 1n
m
0 1b 5
3n
2
c
m
4l
6n
m
mm
M3 M
Полубелова Марина (СПбГУ) 12 ноября 2015г. 11 / 24
Лексический анализ строковых выражений
На вход анализатору подается конечный автомат, полученный врезультате аппроксимации множества значений строковоговыраженияНа выходе получаем либо конечный автомат над токенами, либосписок лексических ошибок. Токен содержит в себе:
I идентификатор токенаI конечный автомат, описывающий все возможные
последовательности символов для данного токена
Задача лексического анализа: получение конечного автомата надалфавитом токенов эталонной грамматики из конечного автомата надалфавитом символов обрабатываемого языка
Полубелова Марина (СПбГУ) 12 ноября 2015г. 12 / 24
Пример
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 1SELECT 52IDENT 3FROM 4IDENT EOF
Полубелова Марина (СПбГУ) 12 ноября 2015г. 13 / 24
Пример
Результат лексического анализа
0 1SELECT 52IDENT 3FROM 4IDENT 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)
Конечный автомат второго токена IDENTt: " 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
Конечный преобразователь
Конечный преобразователь — это конечный автомат, которыйможет выводить конечное число символов для каждого входногосимволаКомпозиция конечных преобразователей — это двапоследовательно взаимодействующих конечных преобразователя:выход первого конечного преобразователя является входом длявторого конечного преобразователя
Полубелова Марина (СПбГУ) 12 ноября 2015г. 15 / 24
Генератор лексических анализаторов
Вход:
Лексическая спецификация языкаlet digit = [’0’-’9’]let whitespace = [’ ’ ’\t’ ’\r’ ’\n’]let num = [’-’]? digit+ (’.’digit+)? ([’e’ ’E’] digit+)?rule token = parse| whitespace token lb| num { NUMBER(lexeme lb) }| ’-’ { MINUS(lexeme lb) }| ’/’ { DIV(lexeme lb) }| ’+’ { PLUS(lexeme lb) }| "**" { POW(lexeme lb) }| ’*’ { MULT(lexeme lb) }
rule token = parse| whitespace { None }| num { Some(NUMBER(gr)) }| ’-’ { Some(MINUS(gr)) }| ’/’ { Some(DIV(gr)) }| ’+’ { Some(PLUS(gr)) }| "**" { Some(POW(gr)) }| ’*’ { Some(MULT(gr)) }
FsLex YaccConstructor
Описание токенов
Выход: Описание конечного преобразователя и вспомогательныефункцииПолубелова Марина (СПбГУ) 12 ноября 2015г. 16 / 24
Алгоритм лексического анализа
Этап 0Вход: конечный автомат, полученный в результате построенияаппроксимацииВыход: конечный преобразователь, построенный из входногоконечного автомата
0 1+ 2**
0 1+ : + 32* : * eof : eof* : *
Полубелова Марина (СПбГУ) 12 ноября 2015г. 17 / 24
Алгоритм лексического анализа
Этап 1Вход:
I Конечный преобразователь, полученный на Этапе 0I Конечный преобразователь, полученный из описания,
построенного генератором лексических анализаторов
Выход: конечный преобразователь и набор лексических ошибок
0 1+ : ε
4
2* : PLUS
eof : MULT
3
* : ε
* : POW
Полубелова Марина (СПбГУ) 12 ноября 2015г. 18 / 24
Алгоритм лексического анализа
Этап 2. Интерпретация конечного преобразователяВход: конечный преобразователь, полученный на Этапе 1Выход: конечный автомат над алфавитом токенов эталоннойграмматики
0 1+ : ε
4
2* : PLUS
eof : MULT
3
* : ε
* : POW
0 1PLUS 4
3POW
2MULT
POW
MULTEOF
Полубелова Марина (СПбГУ) 12 ноября 2015г. 19 / 24
Пример 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 1SELECT 92IDENT 3FROM 4IDENT 5WHERE 6IDENT 7LESSEOF
8
PLUS
10NUM
EOF
PLUS
Полубелова Марина (СПбГУ) 12 ноября 2015г. 20 / 24
Пример 2
string query = "SELECT name";for(int i = 0; i < 10; i++){ query += "X";}query += " FROM tableY";Program.ExecuteImmediate(query);
Результат лексического анализа
0 1SELECT 52IDENT 3FROM 4IDENT 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
Архитектура инструмента
Полубелова Марина (СПбГУ) 12 ноября 2015г. 22 / 24
Результаты
В рамках данной работы были получены следующие результатыРазработан алгоритм лексического анализа выражений,формируемых с помощью строковых операций и цикловРеализован генератор лексических анализаторов на основепредложенного алгоритма
Полубелова Марина (СПбГУ) 12 ноября 2015г. 23 / 24
Контактная информация
Полубелова Марина: [email protected]Григорьев Семён: [email protected]Исходный код YaccConstructor:https://github.com/YaccConstructor
Полубелова Марина (СПбГУ) 12 ноября 2015г. 24 / 24