Математика и математическое моделирование. 2020. №2. С. 1-24.
DOI: 10.24108/mathm.0220.0000218
© Пономаренко Г. С., Ключарёв П. Г., 2020.
Математика U Математическое
моделирование
Сетевое научное издание http://mathmelpub.ru ISSN 2412-5911
УДК 004.42+004.056+004.852
Определение обфускации ^уа8спр1>программ с помощью раскрасок на абстрактных синтаксических деревьях
Пономаренко Г. С.1'*, Ключарёв П. Г.1
1МГТУ им. Н.Э. Баумана, Москва, Россия * gs.ponomarenko@yandex.ru
В работе анализируется способ определения обфускации и вида используемого обфускатора методами машинного обучения при помощи данных о раскраске по типу вершин абстрактного синтаксического дерева (АСД) программы на языке JavaScript. Цвета вершин и рёбер назначаются в соответствии с типами вершин АСД, которые в свою очередь определяются лексической и синтаксической структурой программы и стандартом языка программирования. Исследование состояло из нескольких этапов. В начале был собран набор необфусцированных программ. После это создан набор обфусцированных программ при помощи восьми программ-обфускаторов с открытым исходным кодом. Классификаторы строились на основе алгоритма градиентного бу-стинга на решающих деревьях. Были построены модели, которые классифицировали программы по типу используемого обфускатора и по признаку обфусцированности. Модели, классифицирующие по признаку обфусцированности, детектировали образцы, обфусцированные в т.ч. теми обфускаторами, образцы для которых не входили в обучающую выборку. Качество полученных моделей находится на одном уровне с известными в литературе результатами. Предлагаемый в работе метод выделения признаков, подаваемых на вход классификатору, не требует предварительного анализа самих обфускаторов и знания обфусцирующих преобразований. В конце работы приводится анализ качества полученных моделей и рассматриваются некоторые статистические свойства полученного набора образцов обфусцированного кода.
Ключевые слова: обфускация; обнаружение обфускации; детектирование обфускации; обфус-кация JavaScript; АСД; раскраска АСД
Представлена в редакцию: 24.04.2020, исправлена: 07.05.2020.
Введение
Обфускация широко используется в информационной безопасности: как для защиты интеллектуальной собственности при распространении легального проприетарного ПО, так и для сокрытия компьютерных атак, усложнения обнаружения и обратной разработки вредоносного ПО, однако на сегодняшний день нет единого общепринятого и достаточно строгого
подхода к определению обфускацпп. Первую попытку формализовать понятие обфускации сделали Коллберг, Томборсон и Лоу [1]. Согласно их определению, обфусцирующее преобразование — это такое преобразование программы p в p', что «наблюдаемое поведение» программ p и p' неразличимо, при этом:
• в тех случаях, когда программа p не останавливается или останавливается с ошибкой, программа p' может или останавливаться, или нет;
• в иных случаях программа p' должна останавливаться и иметь вывод аналогично p.
Код программы p' формируется таким образом, чтобы препятствовать обратной разработке.
Обфусцированная программа — программа, полученная из другой путём применения обфускации. Исходная программа называется необфусцированной. Проблема различения обфусцированных и необфусцированных программ является задачей бинарной классификации исходных текстов программ по признаку обфусцированности.
Сильвео Сезар и Янг Ксьянг [2] определяют обфусцированные программы следующим образом. Программа p представляется в виде конечной строки, элементами которой являются символы некоторого алфавита (обычно, латинского) и служебные символы (скобки, знаки препинания и т.д.), причём текст программы может быть предварительно нормализован (убраны пробелы, отступы, комментарии). Признак r программы p называется стойким, если r остаётся неизменным при всех возможных способах исполнения программы p. Программа q называется копией программы p, если q является результатом преобразований, сохраняющих семантику (смысл) алгоритмов и структур данных. Обфусцированная копия программы p получается путём применения обфусцирующих преобразований.
В работе исследуется применимость данных о раскраске абстрактного синтаксического дерева (АСД) программы на языке JavaScript для определения обфускации и модели используемого обфускатора методами машинного обучения. Цвет вершины соответствует типу вершины, определяемому синтаксическими правилами языка. В начале работы формулируется задача классификации обфусцированных и необфусцированных программ, рассматривается накопленный на сегодняшний день опыт применения алгоритмов машинного обучения к задаче классификации обфусцированного кода. Затем излагается практическая часть исследования: детально объясняется процесс создания базы обфусцированного кода, выделения специальных признаков, подаваемых на вход модели, выбор алгоритма машинного обучения для создания классификаторов, обучение моделей и анализ результатов.
1. Обзор исследований
При изучении вредоносного кода или анализе обфусцированного кода на языке JavaScript исследователи обычно обращаются к синтаксической структуре программ. АСД — удобный инструмент для работы с такой структурой. АСД используются в различных исследователь-
ских проектах, посвященных детектированию вредоносных программ методом машинного обучения, детектированию обфускации, анализу обфусцированного кода. Авторы проекта Zozzle использовали информацию о том, на какой глубине по АСД находятся исследуемые текстовые строки, идентификаторы и т.п., улучшив таким образом качество работы классификатора по сравнению с обычными методами анализа текстовой информации [3]. Создатели проекта Revolver использовали подсчет вершин различных типов на АСД. Для полученных таким образом последовательностей искались похожие по метрике редакторского расстояния. Для упрощения вычислений так же рассмотрен вариант с подсчетом вершин различного типа в последовательностях и последующим поиском похожих векторов при помощи евклидовой метрики [4]. Авторы проекта JaSt задействовали АСД для представления программ в виде последовательностей, элементы которых — типы вершины на АСД из сокращённого набора. Для полученных последовательностей строились n-граммы, использовавшиеся в дальнейшем для классификации [5]. Группа исследователей в рамках проекта по изучению гибридного подхода к детектированию и классификации вредоносного JavaScript-кода JSDC использовала следующие свойства АСД: глубину дерева, разницы между глубинами различных поддеревьев, максимальную ширину и др. [6]. Исследователи Бланк и др. использовали механизм цифровых отпечатков на АСД для кластеризации и выделения похожих обфусцирующих преобразований в JavaScript-коде. Кроме того, ими был предложен метод детектирования заранее известных обфусцирующих преобразований на основе автомата с магазинной памятью [7].
В работе Телленбаха и др. 2017 г. рассматривалось применение различных алгоритмов машинного обучения для классификации обфусцированных программ. Модель на основе алгоритма градиентного бустинга на решающих деревьях показала лучшее качество классификации программ на JavaScript по признаку обфусцированности по сравнению с другими типами моделей. Модель имела следующие характеристики качества на тестовой выборке при условии, что в тестовую и валидационную выборки вошли скрипты, обработанные одинаковым набором обфускаторов: точность — 99.65%, полнота — 99.68%, F1 — 99.67%. На вход модели подавались заранее подсчитанные признаки по каждой программе (в основном, частоты вхождений отобранных ключевых слов, количество строк, пробелов и т.д.) [8].
В работе Ндичу и др., опубликованной в ноябре 2019 г., исследовались методы классификации программ на JavaScript по признаку принадлежности к классу вредоносных с использованием нейросети и машины опорных векторов, на вход которой подавались кодовые вектора, рассчитанные нейросетью на основе автокодировщика. Отмечено, что обфуска-ция характерна в первую очередь для вредоносных программ. Метод на основе выделения признаков из АСД имел следующие характеристики полноты, точности и F1: 94%, 92% и 93% [9].
2.Задача детектирования обфускации и определения используемого обфускатора
Пусть S — множество исходных текстов программ, A — множество различных АСД, где каждое дерево — ориентированный граф G = (V, E). Входящая степень каждой вершины (кроме корня) равна 1, т.е. в каждую вершину, за исключением корня, ведёт только одно ребро. Ребро всегда направлено в нижележащую по дереву вершину. Каждой вершине v G V поставлена в соответствие метка (цвет) b из множества всех типов вершин B (|B| = m) согласно грамматике языка, которая в свою очередь определяется стандартом. Последняя версия стандарта — ECMAScript 2019 [10]. Чтобы построить АСД, последовательно применяют лексический и синтаксический анализаторы. Например, вершина АСД может иметь метку (цвет) IfStatement, TryStatement и др.
После того, как все вершины раскрашены, можно дополнительно раскрасить рёбра по следующем правилу: каждому ребру сопоставлена пара меток (цвет) (bi, b2) G B x B, первой в паре записывается цвет исходящей вершины. Таким образом, и вершины, и рёбра на дереве оказываются раскрашенными.
Функция fast: S ^ A ставит в соответствие исходному тексту программы АСД с раскрашенными вершинами и рёбрами. На практике роль данной функции выполняют лексический и синтаксический анализаторы программного кода на языке JavaScript.
Функции /¿: А ^ М, г = 1, т, подсчитывают доли вершин определённого цвета г среди всех вершин. Так как число различных цветов вершин в АСД равно т, то определено т различных функций /1, . .., /т.
Функции /¿: А ^ М, г = т+1, т+т2, выполняют подсчёт доли рёбер определённого цвета г среди всех рёбер. Цвет ребра определяется цветом вершин, которые ребро соединяет. Так как число различных цветов рёбер в АСД равно т2, то определено т2 различных функций
/т+1, . . . , /т+т2 .
Функция /т+т2+1: А ^ М подсчитывает число цветов, использованных для раскраски всех вершин АСД. Функция /т+т2+2: А ^ М подсчитывает число цветов, использованных для раскраски всех рёбер АСД.
Пусть X € Мт+т2+2 — вектор признаков для скрипта, каждая координата которого получена путём последовательного применения функций:
= /¿(/), г € 1,т+т2+2, (1)
где а = /¡^(з) — АСД скрипта 5.
Для построения детектора обфусцированного кода требуется найти такое отображение и: мт+т2+2 ^ [о, 1], что среднее значение функции потерь стремится к минимуму. Функция д: Мт+т2 +2 ^ {о, 1} определена для векторов признаков программ из сгенерированного набора образцов обфусцированного и необфусцированного кода. Она принимает значение 1, если скрипт з принадлежит набору обфусцированных программ, иначе она принимает
значение 0. Предлагается для построения отображения и применить метод градиентного бустинга, создающего ансамбль решающих деревьев, а в качестве функции потерь взять функцию бинарной кросс-энтропии
Н(д, и, х8) = -д(х8) • )) - (1 - Я(X)) • log(1 - и(х8)).
(2)
Градиентный бустинг (от англ. «Ьоо8Й^>> — усиление) — это алгоритм машинного обучения, разработанный в конце 90-х и начале 2000-х гг. [11], по сей день успешно применяемый как в коммерческих, так и в исследовательских проектах. Общая схема предлагаемого решения приведена на рис. 1.
Рис. 1. Общая схема алгоритма детектора обфускации
Классы (ci, ..., ck} соответствуют k различным обфускаторам. Необфусцированные скрипты считаются обфусцированными вырожденным обфускатором, не применяющим никаких модификаций к программному коду. Для построения классификатора кода по признаку используемого обфускатора необходимо получить отображение v: Rm+m2+2 х (c1, ..., ck} ^ ^ [0, 1], такое, что среднее значение функции потерь стремится к минимуму. Функция t: Rm+m2+2 х (c1, ..., ck} ^ (0, 1} определена для векторов признаков программ из сгенерированного набора образцов обфусцированного и необфусцированного кода. Она принимает значение 1, если известно, что скрипт s действительно принадлежит классу q, иначе она принимает значение 0. Для построения отображения v предлагается использовать алгоритм градиентного бустинга на решающих деревьях, в качестве функции потерь задействовать функцию кросс-энтропии
k
H (t,v,xs) = - ^ (t(£s,ci) ■ log(v(fs,ci)) + (1 - t(xe,ci)) ■ log(1 - v(x ,q))). (3) i=1
3. Сбор и предобработка данных
Для создания набора данных для исследования использовался репозиторий программ github.com [12]. Были выгружены 200 самых популярных проектов на языке JavaScript. Для получения списка самых популярных проектов использовалось специальное поисковое API, предоставляемое сервисом. Все проекты из полученного списка были загружены на локальную машину. Для создания образцов обфусцированного кода были взяты специальные программы с github.com [12], которые реализуют обфускацию кода на JavaScript. Из первой сотни самых популярных проектов были выделены функции (126262 функций из 51825 файлов с расширением <<.js>>, исключая файлы c расширением «.min.js»), далее эти функции пропускались через обфускаторы. Чтобы итоговый набор данных был сбалансированным относительно числа обфусцированных и необфусцированных скриптов, для каждого обфус-катора случайным образом выбирались 23000 необфусцированных образцов. Небольшую часть (не более 10% для каждого обфускатора) из случайно выбранных скриптов не удалось успешно обфусцировать. Это объясняется обилием стандартов и расширений, используемых при программировании на JavaScript (в том числе при создании обфускаторов), не все из которых совместимы между собой.
Для выделения специальных признаков из исходных кодов JavaScript-программ использовалась следующая методика. Было посчитано количество вершин разных цветов на АСД, а так же количество рёбер разных цветов. Для построения АСД использовался лексический и синтаксический анализатор acorn [13].
Всего на всех АСД для всех обфусцированных и необфусцированных скриптов было выделено 66 уникальных цветов вершин (например, CallExpression, VariableDeclaration, BinaryExpression, BreakStatement и др.) и 724 уникальных цвета рёбер, в том числе рёбра IfStatement ^ AssignmentExpression, DoWhileStatement ^ Identifier, IfStatement ^ TryStatement и др.
На этапе выделения признаков для каждого скрипта составлялись два вектора: вектор Vv € Z66, каждой координате которого соответствует количество вершин определённого
цвета на АСД, и вектор Ve € Z724, каждой координате которого соответствует количество
66
рёбер фиксированного цвета на АСД. Образцы с Е vvi < 25 исключались из исследуемого
i=1
набора обфусцированных и необфусцированных скриптов, так как при небольшом размере исследуемого скрипта и, следовательно, небольшом размере АСД проверка на обфусциро-ванность или необфусцированность теряет смысл. Эта процедура уменьшила объём конечного набора данных для исследования, особенно долю образцов, обфусцированных closure и uglifyjs2.
Далее каждый вектор нормировался. Каждая координата вектора Vv делилась на мощность множества вершин АСД:
_ Vvi
Vnvi = ~66 •
Е Vvi
i=1
Каждая координата вектора Ve делилась на мощность множества рёбер АСД:
Vei
V,
nei 724
Е Vei
i=1
Таким образом, сумма по всем координатам для каждого вектора равна 1:
66
'У ] Vnvi 1)
i=1
724
'У ] vnei 1 •
i=1
При помощи индикаторной функции hindic(x) подсчитывается, сколько различных цветов используется для раскраски вершин (4) и рёбер (5) АСД конкретного скрипта:
, , ч . 1, x = 0)
hindic (x) = {
0, иначе)
66
Vv, colors ^ ] hindic(vvi); (4)
i=1 724
ve, colors ^ ] hindic(vei). (5)
i=1
На последнем этапе векторы vnv, Vne и Vcolors = (vv,colors, ve,colors) конкатенировались в итоговый вектор Vns € R792, который использовался в экотерименте с классификацией. Ненормированные векторы vv и Ve конкатенировались в итоговый вектор Vs € Z790, который использовался в анализе результатов экспериментов с классификаторами. Состав получившегося набора данных приводится в табл. 1.
Т а б л и ц а 1
Полученный набор данных
Класс Количество образцов
Необфусцированные функции из сотни самых популярных проектов 84615
Необфусцированные файлы из второй сотни самых популярных проектов 14822
Функции, обфусцированные Defendjs [14] 22982
Функции, обфусцированные Gnirts [15] 22942
Функции, обфусцированные Jscrewit [18] 22170
Функции, обфусцированные Javascript-obfuscator [16] 21322
Функции, обфусцированные Jsobfu [17] 22429
Функции, обфусцированные Jfogs [17] 21406
Функции, обфусцированные Uglifyjs2 [19] 12920
Функции, обфусцированные Closure [20] 14308
4. Обучение и анализ классификаторов
В качестве алгоритма машинного обучения для обучения классификатора программ на языке JavaScript по признаку обфусцированности и по признаку используемого обфуска-тора использовалось построение решающих деревьев при помощи градиентного бустинга. Данный алгоритм достаточно часто используется для решения задачи классификации программного кода. Он показал неплохие результаты при решении задачи статического детектирования вредоносных программ для ОС Windows [21], задачи детектирования вредоносных приложений для ОС Android путём динамического анализа поведения программ [22], задачи обнаружения лазеек на серверах путём статического анализа PHP-файлов и производного набора низкоуровневых команд, исполняемых виртуальной машиной PHP [23], задачи детектирования обфусцированного кода скриптов на языке PowerShell [24] и др.
Градиентный бустинг позволяет сформировать ансамбль из менее точных классификаторов (например, деревьев решений) таким образом, что качество классификации значительно улучшается. Дерево решений — классификатор, в основе которого лежит сравнительно несложный механизм: пространство признаков разделяется при помощи разбиений, образующих древовидную структуру. Деревья строятся по жадному алгоритму, начиная с корня: для каждого листа выбирается такое разбиение, чтобы минимизировать функцию потерь на текущем шаге. Жадный алгоритм позволяет строить деревья довольно быстро, но полученные деревья не являются оптимальными. Построение оптимального бинарного решающего дерева является NP-полной задачей [25].
Для построения классификаторов использовалась реализация CatBoost алгоритма градиентного бустинга на решающих деревьях от компании Яндекс [26, 27]. Обучение модели проводилось на компьютере с двухядерным процессором Intel Core i5-6360U (базовая ча-
стота — 2.0 ГГц, возможно кратковременное повышение до 3.1 ГГц), 16 ГБ оперативной памяти, ББО-диском на 512 ГБ.
Для обучения моделей составлялись обучающая, тестовая и валидационная выборки. Обучающая выборка использовалась целиком на каждой итерации для обучения модели, валидационная выборка использовалась для оценки модели в конце каждой итерации, а тестовая выборка использовалась для оценки модели после окончания обучения.
Классификация по признаку используемого обфускатора. Модель, классифицирующая образцы по признаку используемого обфускатора, была построена следующим образом. Тестовая выборка состояла из 15% случайно выбранных образцов из всех, валидационная выборка состояла из 15% случайно выбранных образцов из всех, в обучающую выборку входили оставшиеся 70% образцов. Модель обучалась на 50 эпохах с максимальной глубиной дерева, равной 5. В качестве функции потерь использовалась функция кросс-энтропии (3). Оценки качества полученной модели приводятся в табл. 2. Полученная модель показала хорошие результаты в решении задачи классификации скриптов по признаку используемого обфускатора.
Т а б л и ц а 2
Оценки качества полученной модели
Класс Точность Полнота F1-score Образцов в тестовой выборке
Необфусцированные скрипты и файлы 0.958 0.982 0.970 14853
Defendjs 1.000 1.000 1.000 3458
Gnirts 1.000 1.000 1.000 3487
Jscrewit 1.000 1.000 1.000 3376
Javascript-obfuscator 0.999 0.989 0.994 3153
Jsobfu 0.991 0.978 0.985 3425
Jfogs 0.999 0.999 0.999 3212
Uglifyjs2 0.848 0.712 0.774 1851
Closure 0.997 1.000 0.998 2172
Качество полученной модели согласуется с результатами, полученными Телленбахом и др. при решении данной задачи с помощью алгоритма градиентного бустинга на решающих деревьях [8]. Основное отличие их эксперимента от представленного в данной работе состоит в том, что они использовали несколько иной набор скриптов для создания образцов обфусцированного кода, и при выделении признаков использовали подсчёт ключевых слов, строк, пробелов и т.д. Они тоже использовали обфускаторы closure, javascript-obfuscator, jfogs и jsobfu. Помимо них, они ещё рассматривали javascript-obfuscator.com standart и javascript-obfuscator.com advanced. Эти обфускаторы не рассматривались в данной работе, потому что обфускация с их помощью возможна только платно в облачном сервисе с ограничением по количеству обфусцируемых образцов, что затрудняло создание большого набора данных для проведения исследования.
Классификация по признаку обфусцированности. Далее рассматривается обучение модели, решающей задачу бинарной классификации по признаку обфусцированности. Предстояло проанализировать, как поведут себя модели в случае, когда образцы для конкретного обфускатора входят только в тестовую выборку и не используются при обучении. Каждая тестовая выборка состояла из образцов, обфусцированных одним обфускатором, а так же из 10% образцов необфусцированного кода, выбранных случайно из всех необфусцированных образцов. Оставшиеся образцы шли в обучающую выборку. В данном эксперименте тестовая выборка использовалась в качестве валидационной. Модель обучалась на одной эпохе с максимальной глубиной дерева, равной 8. Обучение на большем количестве эпох приводило к ухудшению способности модели детектировать скрипты, обфусцированные неизвестным обфускатором. Каждому образцу из обучающей выборке ставился в соответствие вес: 1.0 для обфусцированных образцов и 0.35 для необфусцированных. Это позволило повысить полноту классификации обфусцированных образцов из тестовой выборки за счёт некоторого снижения полноты классификации необфусцированных образцов. В качестве функции потерь использовалась функция бинарной кросс-энтропии (2). В табл. 3 приводятся оценки качества полученных моделей для обфусцированных скриптов в тестовой выборке. В табл. 4 приводятся оценки качества для необфусцированных скриптов в тестовой выборке. По аналогии с работой Телленбаха и др. [8], качество на тестовой выборке проверялось раздельно для набора обфусцированных и набора необфусцированных скриптов, поэтому точность всегда равна 100%.
Т а б л и ц а 3
Оценки качества полученных моделей для обфусцированных скриптов
в тестовой выборке
Обфускатор в тестовой выборке Количество обфусцированных тестовых образцов Точность Полнота F1-score
defendjs 22982 1.000 0.998 0.999
gnirts 22942 1.000 1.000 1.000
javascript-obfuscator 21322 1.000 0.843 0.915
jscrewit 22170 1.000 1.000 1.000
jfogs 21406 1.000 0.070 0.130
uglifyjs2 12920 1.000 0.072 0.134
jsobfu 22429 1.000 0.020 0.040
closure 14308 1.000 0.360 0.530
Оценки качества моделей, в целом, схожи с теми, что были продемонстрированы в эксперименте Телленбаха и др. [8]. Полученная ими модель, в обучающей выборке которой отсутствовали образцы, обфусцированные javascript-obfuscator, имела следующие оценки: полнота — 93.48% и F1-score — 96.63%. Помимо этого, только модель, в тестовую выборку которой были вынесены образцы, обфусцированные javascript-obfuscator.com advanced, показала схожее по уровню качество классификации. Полученные в данной работе модели
Таблица 4
Оценки качества полученных моделей для необфусцированных скриптов
в тестовой выборке
Обфускатор в тестовой выборке Количество обфусцированных тестовых образцов Точность Полнота F1-score
defendjs 9944 1.000 0.915 0.955
gnirts 9944 1.000 0.840 0.913
javascript-obfuscator 9944 1.000 0.899 0.947
jscrewit 9944 1.000 0.905 0.950
jfogs 9944 1.000 0.886 0.940
uglifyjs2 9944 1.000 0.951 0.975
jsobfu 9944 1.000 0.937 0.967
closure 9944 1.000 0.920 0.958
имеют оценку полноты не ниже 99% на тестовых данных для скриптов, обфусцированных defendjs, gnirts, jscrewit. По сравнению с [8], улучшено качество детектирования closure (полнота выросла с 2.6% до 36%) и jfogs (полнота выросла с 0.2% до 7%), но ухудшилось качество классификации jsobfu (полнота упала с 39% (с 46% для эксперимента с 20 наиболее содержательными признаками) до 2%). Полнота классификации скриптов, обфусцированных javascript-obfuscator, равна 84% и сравнима с наблюдавшимися в [8] 77% (93% для эксперимента с 20 наиболее содержательными признаками). Полнота классификации необфусцированных скриптов для пяти из восьми моделей больше 90%, для двух моделей — больше 88.5%, для одной — равна 84%, в то время как в [8] этот показатель не ниже 96%. В целом, качество полученных в данной работе моделей сравнимо с моделями [8], при этом используемый в данной работе метод выделения признаков для обучения проще, лаконичнее, не требует знания специальных ключевых слов и выражений, характерных для обфускации программ на JavaScript, и может быть использован для детектирования обфускации программ на других языках программирования. Далее даётся некоторый анализ свойств векторов признаков, сгруппированных по обфускаторам, раскрывающий природу полученных результатов.
Пусть X С Z790 — пространство ненормированных векторов-контекстов размерности 790 для необфусцированных скриптов, Y С Z790 — соответствующее пространство векторов-контекстов для скриптов, обфусцированных некоторым фиксированным обфускатором, и мощность |Y | = m. Каждой координате вектора-контекста соответствует целое число вершин или рёбер определённого цвета на АСД. Согласно процедуре формирования набора обфусцированных скриптов (см. разд. 3), в процессе подготовки к исследованию необфус-цированные скрипты были подвергнуты обфускации. Значит, у каждого обфусцированного скрипта известен необфусцированный «родитель», т.е. каждому обфусцированному скрипту у G Y можно поставить в соответствие исходный необфусцированный скрипт x е X.
Индикаторная функция Л,0 (жг, уг, ^) равна 1, когда значения векторов хг и уг в ^'-й координате совпадают, иначе она равна 0:
ho(xi,yi, j)
1, xij yij; 0, иначе.
(6)
Функция /о (£) позволяет определить, какая доля скриптов имеет к > £ покоординатных совпадений относительно всех обфусцированных скриптов для заданного фиксированного обфускатора:
fo(t) = -m
г _ 790 ч
j (xi, yi): (i G 1, m) Л ho(xi,yi,j) > П L j=i J
(7)
На рис. 2 приводятся результаты экспериментальных вычислений f0(t) для 8 различных обфускаторов.
1.0
0.9
0.8
£ о
- о- 0.7 со О
0 II- го с *
S go.6
X о
01 £ и
CQ
0
1
JJ
с; 0)
I 0.5
=1
го
X I п; ей
0.4
о
Cl
05
с;
5 J 0.3
-ею о
0.2
0.1
0.0
defendjs jscrewit
g п i rts javascrip jsobfu tobfuscator
jfogs closure ugl¡fyjs2 К
500
550 600 650 700
Минимальное число покоординатных совпадений в векторе признаков, t
750
Рис. 2. Доля скриптов с минимальным числом покоординатных совпадений в векторе признаков
Для анализа был взят набор сгенерированных обфусцированных скриптов и их исходные необфусцированные версии. График показывает, что обфускаторы uglifyjs2 и closure работают в большей степени как минификаторы (изменяют и укорачивают названия функций, классов, свойств), оказывая меньшее воздействие на синтаксическую структуру программы. Видно, что у приблизительно 10% скриптов, обфусцированных uglifyjs2 и closure, вектор-контекст фактически совпадает с вектором-контекстом исходного необфусцированного скрипта. Для 7 из 8 обфускаторов характерно то, что 100% скриптов имеют покоординатные совпадения для векторов-контекстов в 650 координатах. Для скриптов, обфусцированных closure, доля в 100% наблюдается при t < 550. Предположительно, такое большое число совпадений объясняется большим числом нулей в векторах-контекстах, т.е. разнообразие используемых на каждом отдельном АСД цветов для раскраски невелико. Для проверки данной гипотезы построен график функции /, являющейся немного более строгой версией функции /0.
Чтобы исключить из подсчёта покоординатных совпадений нули (т.е. случаи, когда вершины и рёбра одного цвета отсутствуют в обфусцированной и необфусцированной программе), определим функции
на основе соответствующих функций ^(ж^у^') (6) и /0(£) (7). Полученные результаты построения /1 (¿) для различных обфускаторов представлены на рис. 3.
По графику на рис. 3 видно, что четыре кривые, больше других смещённые влево, соответствуют обфускаторам jscrewit, gnirts, defendjs и javascript-obfuscator. Это те самые обфускаторы, образцы для которых лучше всего распознавались классификаторами по признаку обфусцированности (см. табл. 3) при условии, что образцы для этих обфускаторов не входили в тренировочную выборку.
Рассмотрим, каково отношение числа покоординатных совпадений к числу отличных от нуля значений в векторах признаков для различных классов обфусцированных образцов. Для этого вводится индикаторная функция Л,2, равная 1, если хотя бы у одного из векторов Ж или у ]-я координата ненулевая, и равная 0 иначе:
Функция /12 осуществляет подсчёт доли скриптов с отношением к > £ числа покоординатных совпадений в векторах признаков к числу отличных от нуля значений хотя бы в
(8)
(9)
1, = 0 V yj = 0; 0, иначе.
Рис. 3. Доля скриптов с минимальным числом покоординатных совпадений, отличных от 0, в векторе признаков
одном из векторов:
/12(£) = -
—
(жг, Уг): г е 1, — Л
790
Е (жг, Уг, ,7)
.7=1_
790
Е ^2(Жг,Уг, ^) .7=1
> £
Полученные результаты построения /12(£) для различных обфускаторов представлены на рис. 4. Из графика на рис. 4 следует, что наименьшее отношение числа покоординатных совпадений к числу отличных от нуля значений характерно для скриптов, обфусцированных при помощи программ jscrewit, gnirts, defendjs и javascript-obfuscator, тех самых, обфусци-рованные образцы для которых успешнее всего детектировались при отсутствии в тестовой выборке (см. табл. 3).
Рис. 4. Доля скриптов с минимальным отношением числа ненулевых покоординатных совпадений к числу отличных от нуля значений в векторе признаков
Рассмотрим, каково отношение числа приблизительных (с погрешностью в 20%) покоординатных совпадений к числу отличных от нуля значений в векторах признаков для различных классов обфусцированных образцов. Для этого определим индикаторную функцию h3, которая равна 1, если хотя бы у одного из векторов xi или yi j -я координата ненулевая и число рёбер или вершин определённого j-го цвета изменилось не более чем на 20%, и равная 0 иначе:
1, (|xij - yij| < 0.2xij) Л (xij = 0 V yij = 0);
h3(xi,yi,j) =
0, иначе.
Подсчёт доли скриптов с отношением к > £ числа приблизительных покоординатных совпадений к числу отличных от нуля значений в векторе признаков выполняется с помощью
функции
/32(£) = -—
т
(ж*, Уг): г е 1, — Л
Е ^з(Жг,Уг, ^) _
790
Е ^2 (жг, Уг, ) .7=1
> £
Полученные результаты построения /32(£) для различных обфускаторов представлены на рис. 5. Графики на рис. 5 не сильно отличаются от графиков на рис. 4. Часть линий оказались смещены вправо и вверх. Левее всех по прежнему остаются кривые, ассоциированные с обфускаторами jscrewit, gnirts, defendjs и javascript-obfuscator.
Далее анализируется отношение числа исчезших или появившихся после обфускации цветов вершин или рёбер к общему числу используемых цветов вершин или рёбер в об-
Рис. 5. Доля скриптов с минимальным отношением числа приблизительных покоординатных совпадений к числу отличных от нуля значений в векторе признаков
фусцированной и необфусцированной версиях программы при использовании различных программ для обфускации. Определим индикаторную функцию Л,4, равную 1, если вершина (ребро) ]-го цвета появилось или исчезло в результате обфускации, т.е. ]-я координата вектора признаков обнулилась или стала ненулевой, и равную 0 иначе:
Подсчёт доли скриптов с отношением к > £ числа исчезнувших или появившихся после обфускации цветов вершин или рёбер к общему числу используемых цветов вершин или рёбер в обфусцированной и необфусцированной версиях программы выполняется с помощью функции
Полученные результаты построения /42(£) для различных обфускаторов представлены на рис. 6. Из графика на рис. 6 следует, что при обфсукации программами jscrewit, gnirts, defendjs и javascript-obfuscator вершины одного цвета чаще менялись на вершины другого цвета. По результатам анализа графиков на рис. 2-6 можно сделать предположение, что для повышения качества классификации по признаку используемого обфускатора требуется помимо подсчёта цветов вершин и рёбер на АСД использовать дополнительные признаки, в том числе не связанные с синтаксической структурой кода, например, энтропию, частоту различных ключевых слов языка [8] и др. В теории, это должно позволить поднять качество детектирования для скриптов, обфусцированных обфускаторами, которые меньше влияют на синтаксическую структуру. В целом, видно, что для достижения наилучшего качества детектирования обфускации требуется комбинировать как лексические, так и синтаксические признаки программного кода.
В работе рассмотрено построение классификаторов программ на JavaScript по признаку используемого обфускатора и по признаку обфусцированности. Результаты экспериментов показали, что полученные модели обладают характеристиками качества, сравнимыми с результатами, продемонстрированными в исследовании Телленбаха и др. [8], при этом предложенный алгоритм предварительной обработки программ перед подачей на вход классификатору более простой и не требует предварительной работы экспертов по анализу распространённых обфусцирующих преобразований и соответствующих им конструкций языка JavaScript, ключевых слов языка и характерных выражений. Таким образом, предлагаемая концепция требует меньших временных затрат на предварительный анализ и подготовку
1, = 0 Л yj = 0) V = 0 Л yj = 0); 0, иначе.
790
Е h2(Xi,yi, j) j=l
Заключение
Рис. 6. Доля скриптов с минимальным отношением числа пропавших или появившихся после обфускации цветов вершин или рёбер к числу отличных от нуля значений в векторе признаков
данных, а так же её несложно распространить для исследования и анализа программ на языках программирования, отличнык от JavaScript. В то же время, анализ сгенерированных образцов обфусцированнык программ показал, что для улучшения качества детектора обфускации, когда синтаксическая структура не сильно изменяется, требуется дополнительная информация об анализируемой программе, например, данные об энтропии, пропорции символов в верхнем и нижнем регистре, частоте употребления определённый символов [24] и др. Таким образом можно обнаруживать применения обфусцирующих трансформаций, воздействующих на лексическую структуру (например, простое изменение названий переменный). Открытым остаётся вопрос о противодействии сокрытию обфусцированного кода внутри обымнык программ — методике, применяемой злоумышленниками для усложнения обнаружения вредоносного кода [28].
Список литературы
1. Collberg C., Thomborson C., Low D. A taxonomy of obfuscating transformations // New Zealand. Univ. of Auckland. Dep. of Computer Science. Technical report. 1997. No. 148. 36 p.
2. Cesare S., Xiang Y.. Software similarity and classification. L.; N.Y.: Springer, 2012. 88 p.
3. Curtsinger C., Livshits B., Zorn B.G., Seifert C. ZOZZLE: Fast and precise in-browser JavaScript malware detection // 20th USENIX security symp. (San Francisco, CA, USA, August 10-12, 2011): Proc. Berkeley: USENIX Assoc., 2011. Pp. 33-48.
4. Kapravelos A., Shoshitaishvili Y., Cova M., Kruegel C., Vigna G. Revolver: An automated approach to the detection of evasive web-based malware // 22nd USENIX security symp. (Washington. DC, USA, August 14-16, 2013): Proc. Berkeley: USENIX Assoc., 2013. Pp. 637-651.
5. Fass A., Krawczyk R.P., Backes M., Stock B. JaSt: Fully syntactic detection of malicious (obfuscated) JavaScript // Detection of intrusions and malware and vulnerability assessment: 15th intern. conf. on detection of intrusions and malware and vulnerability assessment: DIMVA 2018 (Saclay, France, June 28-29, 2018): Proc. Cham: Springer, 2018. Pp. 303-325. DOI: 10.1007/978-3-319-93411-2_14
6. Wang J., Xue Y., Liu Y., Tan T.H. JSDC: A hybrid approach for JavaScript malware detection and classification // 10th ACM symp. on information, computer and communications security: ASIA CCS'15 (Singapore, April 14-17, 2015): Proc. N.Y.: ACM, 2015. Pp. 109-120. DOI: 10.1145/2714576.2714620
7. Blanc G., Miyamoto D., Akiyama M., Kadobayashi Y. Characterizing obfuscated JavaScript using abstract syntax trees: Experimenting with malicious scripts // 26th intern. conf. on advanced information networking and applications workshops (Fukuoka, Japan, March 26-29, 2012): Proc. N.Y.: IEEE, 2012. Pp. 344-351. DOI: 10.1109/WAINA.2012.140
8. Tellenbach B., Paganoni S., Rennhard M. Detecting obfuscated JavaScripts from known and unknown obfuscators using machine learning // Intern. J. on Advances in Security. 2016. Vol. 9, no. 3-4. Pp. 196-206. DOI: 10.21256/zhaw-1537
9. Ndichu S., Kim S., Ozawa S., Misu T., Makishima K. A machine learning approach to detection of JavaScript-based attacks using AST features and paragraph vectors // Applied Soft Computing. 2019. Vol. 84. Article 105721. DOI: 10.1016/j.asoc.2019.105721
10. ECMAScript 2019 Language Specification. Режим доступа: https://www.ecma-international. org/ecma-262/10.0/index.html (дата обращения: 20.03.2020).
11. Friedman J.H. Greedy function approximation: a gradient boosting machine // Annals of Statistics. 2001. Vol. 29, no. 5. Pp. 1189-1232.
12. Сервис GitHub [Электрон. ресурс]. Режим доступа: https://github.com (дата обращения: 20.03.2020).
13. Acornjs/acorn [Электрон. ресурс]. Режим доступа: https://github.com/acornjs/acorn (дата обращения: 20.03.2020).
14. Alexhorn/defendjs [Электрон. ресурс]. Режим доступа: https://github.com/alexhorn/defendjs (дата обращения: 20.03.2020).
15. Gnirts: Obfuscate string literals in JavaScript code [Электрон. ресурс]. Режим доступа: https://anseki.github.io/gnirts (дата обращения: 20.03.2020).
16. JavaScript obfuscator tool [Электрон. ресурс]. Режим доступа: https://obfuscator.io (дата обращения: 20.03.2020).
17. Zswang/jfogs [Электрон. ресурс]. Режим доступа: https://github.com/zswang/jfogs (дата обращения: 20.03.2020).
18. JScrewlt [Электрон. ресурс]. Режим доступа: https://jscrew.it (дата обращения: 20.03.2020).
19. UglifyJS: JavaScript compressor/minifier [Электрон. ресурс]. Режим доступа: http:// lisperator.net/uglifyjs (дата обращения: 20.03.2020).
20. Closure tools [Электрон. ресурс]. Режим доступа: https://developers.google.com/closure (дата обращения: 20.03.2020).
21. Pham H.-D., Le T.D., Vu T.N. Static PE malware detection using gradient boosting decision trees algorithm // Future data and security engineering: Intern. conf. on future data and security engineering: FDSE 2018 (Ho Chi Minh City, Vietnam, November 28-30, 2018): Proc. Cham: Springer, 2018. Pp. 228-236. DOI: 10.1007/978-3-030-03192-3.17
22. Singh L., Hofmann M. Dynamic behavior analysis of android applications for malware detection // Intern. conf. on intelligent communication and computational techniques: ICCT 2017 (Jaipur, India, December 22-23, 2017): Proc. N.Y.: IEEE, 2018. Pp. 1-7. DOI: 10.1109/intelcct.2017.8324010
23. Cui H., Huang D., Fang Y., Liu L., Huang C. Webshell detection based on random forest-gradient boosting decision tree algorithm // 3rd intern. conf. on data science in cyberspace: DSC 2018 (Guangzhou, China, June 18-21, 2018): Proc. N.Y.: IEEE, 2018. Pp. 153-160. DOI: 10.1109/DSC.2018.00030
24. Pogosova M. Detecting obfuscated scripts with machine-learning techniques: Cand. diss. Helsinki: Aalto Univ., 2020. 58 p. Режим доступа: https://aaltodoc.aalto.fi/bitstream/handle/ 123456789/43575/master_Pogosova-Mariam-2020.pdf (дата обращения 28.06.2020).
25. HyafilL., RivestR.L. Constructing optimal binary decision trees is NP-complete//Information Processing Letters. 1976. Vol. 5, no. 1. Pp. 15-17. DOI: 10.1016/0020-0190(76)90095-8
26. Prokhorenkova L., Gusev G., Vorobev A., Dorogush A.V., Gulin A. CatBoost: unbiased boosting with categorical features // NIPS 2018: 32nd conf. on neural information processing systems (Montreal, Canada, December 3-8, 2018): Proc. Red Hook: Curran Assoc. Inc., 2019. Pp. 6639-6649.
27. Dorogush A.V., Ershov V., Gulin A. CatBoost: gradient boosting with categorical features support. Режим доступа: https://arxiv.org/pdf/1810.11363.pdf (дата обращения 28.06.2020).
28. Fass A., Backes M., Stock B. HideNoSeek: Camouflaging malicious JavaScript in Benign ASTs // ACM SIGSAC conf. on computer and communications security: CCS'19 (London, UK, November 11-15, 2019): Proc. N.Y.: ACM, 2019. Pp. 1899-1913. DOI: 10.1145/3319535.3345656
Mathematics and Mathematical Modeling, 2020, no. 2, pp. 1-24.
DOI: 10.24108/mathm.0220.0000218
Mathematics & Mathematical Modelling
Electronic journal http://mathmelpub.ru ISSN 2412-5911
© Ponomarenko G. S., Klyucharev P. G., 2020.
Detection of Obfuscated JavaScript Code Based on Abstract Syntax Trees Coloring
Ponomarenko G. S.1, Klyucharev P. G.1
1Bauman Moscow State Technical University, Russia * gs.ponomarenko@yandex.ru
Keywords: obfuscation, obfUscation detection, JavaScript obfuscation, AST, AST coloring
Received: 24.04.2020, Revised: 07.05.2020.
The paper deals with a problem of the obfuscated JavaScript code detection and classification based on Abstract Syntax Trees (AST) coloring. Colors of the AST vertexes and edges are assigned with regard to the types of the AST vertexes specified by the program lexical and syntax structure and the programming language standard. Research involved a few stages. First of the all, a non-obfuscated JavaScript programs dataset was collected by the public repositories evaluation. Secondly, obfuscated samples were created using eight open-source obfuscators. Classifier models were built using an algorithm of gradient boosting on the decision trees (GBDT). We built two types of the classifiers. The first one is the model that classifies the program according to the type of the obfuscator used, i.e. based on what obfuscator created the sample. The second one tries to detect samples obfuscated by the obfuscator whose samples are not observed during training. The quality of the obtained models is on par with the known published results. The feature engineering method proposed in the paper does not require a preliminary analysis of the obfuscators and obfuscating transformations. In the final part of the paper we analyze a quality of models estimated, discussing the certain statistical properties of the obfuscated and non-obfuscated samples obtained and corresponding colored ASTs. Analysis of generated samples of obfuscated programs has shown that the method proposed in the paper has some limitations. In particular, it is difficult to recognize minifiers or other obfuscating programs, which change the lexical structure to a greater extent and the syntax to a lesser extent. To improve the quality of detection of this kind of obscuring transformations, one can built combined classifiers using both the method based on the AST coloring and the additional information about lexemes and punctuation, for example, entropy of identifiers and strings, proportion of characters in upper and lower case, usage frequency of certain characters etc.
References
1. Collberg C., Thomborson C., Low D. A taxonomy of obfuscating transformations. New Zealand. Univ. of Auckland. Dep. of Computer Science. Technical report, 1997, no. 148, 36 p.
2. Cesare S., Xiang Y.. Software similarity and classification. L.; N.Y.: Springer, 2012. 88 p.
3. Curtsinger C., Livshits B., Zorn B.G., Seifert C. ZOZZLE: Fast and precise in-browser JavaScript malware detection. 20th USENIX security symp. (San Francisco, CA, USA, August 10-12, 2011): Proc. Berkeley: USENIX Assoc., 2011. Pp. 33-48.
4. Kapravelos A., Shoshitaishvili Y., Cova M., Kruegel C., Vigna G. Revolver: An automated approach to the detection of evasive web-based malware. 22nd USENIX security symp. (Washington. DC, USA, August 14-16, 2013): Proc. Berkeley: USENIX Assoc., 2013. Pp. 637-651.
5. Fass A., Krawczyk R.P., Backes M., Stock B. JaSt: Fully syntactic detection of malicious (obfuscated) JavaScript. Detection of intrusions and malware and vulnerability assessment: 15th intern. conf. on detection of intrusions and malware and vulnerability assessment: DIMVA 2018 (Saclay, France, June 28-29, 2018): Proc. Cham: Springer, 2018. Pp. 303-325. DOI: 10.1007/978-3-319-93411-2_14
6. Wang J., Xue Y., Liu Y., Tan T.H. JSDC: A hybrid approach for JavaScript malware detection and classification. 10th ACM symp. on information, computer and communications security: ASIA CCS'15 (Singapore, April 14-17, 2015): Proc. N.Y.: ACM, 2015. Pp. 109-120. DOI: 10.1145/2714576.2714620
7. Blanc G., Miyamoto D., Akiyama M., Kadobayashi Y. Characterizing obfuscated JavaScript using abstract syntax trees: Experimenting with malicious scripts. 26th intern. conf. on advanced information networking and applications workshops (Fukuoka, Japan, March 26-29, 2012): Proc. N.Y.: IEEE, 2012. Pp. 344-351. DOI: 10.1109/WAINA.2012.140
8. Tellenbach B., Paganoni S., Rennhard M. Detecting obfuscated JavaScripts from known and unknown obfuscators using machine learning. Intern. J. on Advances in Security, 2016, vol. 9, no. 3-4, pp. 196-206. DOI: 10.21256/zhaw-1537
9. Ndichu S., Kim S., Ozawa S., Misu T., Makishima K. A machine learning approach to detection of JavaScript-based attacks using AST features and paragraph vectors. Applied Soft Computing, 2019, vol. 84, article 105721. DOI: 10.1016/j.asoc.2019.105721
10. ECMAScript 2019 Language Specification. Available at: https://www.ecma-international. org/ecma-262/10.0/index.html, accessed 20.03.2020.
11. Friedman J.H. Greedy function approximation: a gradient boosting machine. Annals ofStatis-tics, 2001, vol.29, no. 5, pp. 1189-1232.
12. GitHub service: website. Available at: https://github.com, accessed 20.03.2020.
13. Acornjs/acorn: website. Available at: https://github.com/acornjs/acorn, accessed 20.03.2020.
14. Alexhorn/defendjs: website. Available at: https://github.com/alexhorn/defendjs, accessed 20.03.2020.
15. Gnirts: Obfuscate string literals in JavaScript code: website. Available at: https://anseki. github.io/gnirts, accessed 20.03.2020.
16. JavaScript obfuscator tool: website. Available at: https://obfuscator.io, accessed 20.03.2020.
17. Zswang/jfogs: website. Available at: https://github.com/zswang/jfogs, accessed 20.03.2020.
18. JScrewlt: website. Available at: https://jscrew.it accessed 20.03.2020.
19. UglifyJS: JavaScript compressor/minifier: website. Available at: http:// lisperator.net/uglifyjs, accessed 20.03.2020.
20. Closure tools: website. Available at: https://developers.google.com/closure, accessed 20.03.2020.
21. Pham H.-D., Le T.D., Vu T.N. Static PE malware detection using gradient boosting decision trees algorithm. Future data and security engineering: Intern. conf. on future data andsecurity engineering: FDSE 2018 (Ho Chi Minh City, Vietnam, November 28-30, 2018): Proc. Cham: Springer, 2018. Pp. 228-236. DOI: 10.1007/978-3-030-03192-3.17
22. Singh L., Hofmann M. Dynamic behavior analysis of android applications for malware detection. Intern. conf. on intelligent communication and computational techniques: ICCT
2017 (Jaipur, India, December 22-23, 2017): Proc. N.Y.: IEEE, 2018. Pp. 1-7. DOI: 10.1109/intelcct.2017.8324010
23. Cui H., Huang D., Fang Y., Liu L., Huang C. Webshell detection based on random forest-gradient boosting decision tree algorithm. 3rd intern. conf. on data science in cyberspace: DSC
2018 (Guangzhou, China, June 18-21, 2018): Proc. N.Y.: IEEE, 2018. Pp. 153-160. DOI: 10.1109/DSC.2018.00030
24. Pogosova M. Detecting obfuscated scripts with machine-learning techniques: Cand. diss. Helsinki: Aalto Univ., 2020. 58 p. Available at: https://aaltodoc.aalto.fi/bitstream/handle/ 123456789/43575/master_Pogosova-Mariam-2020.pdf, accessed 28.06.2020.
25. Hyafil L., Rivest R.L. Constructing optimal binary decision trees is NP-complete. Information Processing Letters, 1976, vol. 5, no. 1, pp. 15-17. DOI: 10.1016/0020-0190(76)90095-8
26. Prokhorenkova L., Gusev G., Vorobev A., Dorogush A.V., Gulin A. CatBoost: unbiased boosting with categorical features. NIPS 2018: 32nd conf. on neural information processing systems (Montreal, Canada, December 3-8, 2018): Proc. Red Hook: Curran Assoc. Inc., 2019. Pp. 6639-6649.
27. Dorogush A.V., Ershov V., Gulin A. CatBoost: gradient boosting with categorical features support. Available at: https://arxiv.org/pdf/1810.11363.pdf, accessed 28.06.2020.
28. Fass A., Backes M., Stock B. HideNoSeek: Camouflaging malicious JavaScript in Benign ASTs. ACM SIGSAC conf. on computer and communications security: CCS'19 (London, UK, November 11-15, 2019): Proc. N.Y.: ACM, 2019. Pp. 1899-1913. DOI: 10.1145/3319535.3345656