Этот репозиторий содержит код для статьи ACSAC'19: «JStap: статический предварительный фильтр для злого обнаружения JavaScript».
Обратите внимание, что в своем текущем состоянии код представляет собой POC, а не полностью подготовленный к производству API.
JSTAP - это модульная статическая злой системе обнаружения JavaScript. Наш детектор состоит из десяти модулей, включая пять различных способов абстрагирования кода (а именно токенов, абстрактного синтаксического дерева (AST), графика потока управления (CFG), графика зависимости программы с учетом только потоков данных (PDG-DFG) и PDG) и два способа извлечения функций (использующие N-Грамс или идентифицирующие значения). Основываясь на частоте этих специфических моделей, мы обучаем случайного классификатора леса для каждого модуля.
install python3 version 3.6.7
install python3-pip # (tested with 9.0.1)
pip3 install -r requirements.txt # (tested versions indicated in requirements.txt)
install nodejs # (tested with 8.10.0)
install npm # (tested with 3.5.2)
cd pdg_generation
npm install escodegen # (tested with 1.9.1)
cd ../classification
npm install esprima # (tested with 4.0.1)
cd ..
Для анализа AST, CFG, PDG-DFG и PDG вы должны генерировать PDG рассматриваемых файлов отдельно и заранее. После этого дайте папку (ы), содержащую PDG в качестве входных данных для учащегося или классификатора (в случае анализа на основе AST, например, мы используем только информацию AST, содержащуюся в PDG). Напротив, для подхода на основе токенов, вы должны предоставить непосредственно папку, содержащую файлы JS в качестве входных данных для учащегося/классификатора.
Чтобы сгенерировать PDGS файлов JS (.js) из папки Folder_Name, запустите следующую команду Shell из местоположения папки pdg_generation :
$ python3 -c "from pdgs_generation import *; store_pdg_folder('FOLDER_NAME')"
Соответствующие PDG будут храниться в FOWER_NAME/ANALOSAL/PDG.
В настоящее время мы используем 2 процессора для процесса генерации PDGS; Это может быть изменено путем изменения переменной num_workers из pdg_generation/utility_df.py.
Чтобы построить модель из папок, доброкачественных и злонамеренных, содержащих файлы JS (для анализа на основе токков) или PDG (для других анализов), используйте опцию-D доброкачественную злонамеренную и добавьте их соответствующую наземную истину с помощью доброкачественного злокачественного.
Выберите функции, появляющиеся в учебном наборе с CHI2 на 2 независимых наборах данных:-VD Доброкачественная валидата злонамеренная валидата с их соответствующей наземной истиной-VL доброкачественной злонамеренной.
Укажите свой уровень анализа с помощью-Level, за которым следует либо «токены», «ast», «cfg», «pdg-dfg» или «pdg».
Укажите функции, которые анализ должен использовать с помощью -функциями, за которыми следуют любые «ngrams», «значение». Вы можете выбрать, где хранить функции, выбранные CHI2 с помощью -Analysis_path (по умолчанию JSTAP/Analysis).
Вы можете выбрать имя модели с помощью -Mn (по умолчанию «модель») и ее каталог с -MD (по умолчанию JSTAP/Analysis).
$ python3 learner.py --d BENIGN/ MALICIOUS/ --l benign malicious --vd BENIGN-VALIDATE/ MALICIOUS-VALIDATE/ --vl benign malicious --level LEVEL --features FEATURES --mn FEATURES_LEVEL
Процесс аналогичен для процесса классификации.
Чтобы классифицировать образцы JS из папок Benign2 и Malicous2, используйте Option -D Benign2 Malious2. Чтобы загрузить существующую модель feature_level для использования для процесса классификации, используйте опцию -M effacts_level. Сохранить тот же уровень анализа и функции, что и для обучения классификатора:
$ python3 classifier.py --d BENIGN2/ MALICIOUS2/ --level LEVEL --features FEATURES --m FEATURES_LEVEL
Если вы знаете основную правду о образцах, которые вы классифицируете, и хотели бы оценить точность вашего классификатора, используйте вариант - -L с соответствующей наземной истиной:
$ python3 classifier.py --d BENIGN2 MALICIOUS2 --l benign malicious --level LEVEL --features FEATURES --m FEATURES_LEVEL
В настоящее время мы используем 2 процессора для процессов обучения и классификации; Это может быть изменено путем изменения переменной num_workers из классификации/utility.py.
Чтобы сгенерировать графические представления AST (SAVE_PATH_AST), CFG (SAVE_PATH_CFG) и/или PDG (SAVE_PATH_PDG) одного данного файла js input_file, мы используем библиотеку Graphviz.
Для установки Graphviz:
pip3 install graphviz
On MacOS: install brew and then brew install graphviz
On Linux: install graphviz
Запустите следующие команды Python3 из местоположения папки pdg_generation
>>> from pdgs_generation import *
>>> pdg = get_data_flow('INPUT_FILE', benchmarks=dict(), save_path_ast='ast', save_path_cfg='cfg', save_path_pdg='pdg')
Остерегайтесь, Graphviz может добавить ошибку, когда графики становятся слишком большими.
Чтобы просто отобразить графики, не храня их, используйте значение «нет». В противном случае и по дефолту значение неверно.
Примечание. По умолчанию соответствующий PDG не будет храниться. Чтобы сохранить его в существующей папке PDG_PATH, добавьте параметр store_pdgs='PDG_PATH' в предыдущую команду.
Если вы используете JSTAP для академических исследований, вам настоятельно рекомендуется цитировать следующую статью:
@inproceedings{fass2019jstap,
author="Fass, Aurore and Backes, Michael and Stock, Ben",
title="{textsc{JStap}: A Static Pre-Filter for Malicious JavaScript Detection}",
booktitle="Proceedings of the Annual Computer Security Applications Conference~(ACSAC)",
year="2019"
}
Учитывая успех веб -платформы, злоумышленники злоупотребляли своим основным языком программирования, а именно JavaScript, чтобы установить различные типы атак на своих жертв. Из -за большого объема таких вредоносных сценариев системы обнаружения полагаются на статический анализ, чтобы быстро обрабатывать подавляющее большинство образцов. Эти статические подходы не являются непогрешимыми, хотя и приводят к неправильным классификациям. Кроме того, им не хватает семантической информации, которая выходит за рамки чисто синтаксических подходов. В этой статье мы предлагаем JSTAP, модульную статическую систему обнаружения JavaScript, которая расширяет возможность обнаружения существующих лексических и на основе AST трубопроводов, также используя управление и информацию о потоке данных. Наш детектор состоит из десяти модулей, включая пять различных способов абстрагирования кода, с разными уровнями контекста и семантической информации, и двумя способами извлечения особенностей. Основываясь на частоте этих специфических моделей, мы обучаем случайного классификатора леса для каждого модуля.
На практике JSTAP превосходит существующие системы, которые мы переопределили и протестировали в нашем наборе данных на общую сумму более 270 000 образцов. Чтобы улучшить обнаружение, мы также объединяем прогнозы нескольких модулей. Первый слой единодушного голосования классифицирует 93% нашего набора данных с точностью 99,73%, в то время как второй слой на основе комбинации альтернативных модулей-нацеливается еще 6,5% нашего первоначального набора данных с точностью более 99%. Таким образом, JSTAP может использоваться в качестве точного предварительного фильтра, что означает, что ему потребуется только перенаправить менее 1% образцов на дополнительные анализы. Для воспроизводимости и прямой развертываемости наших модулей мы делаем нашу систему общедоступной.
Этот проект лицензирован в соответствии с условиями лицензии AGPL3, которые вы можете найти в LICENSE .