Этот репозиторий содержит большую часть кода нашей бумаги CCS'19: «Hidenoseek: камуфляция вредоносного JavaScript в доброкачественных ASTS», а именно:
Обратите внимание, что в своем текущем состоянии код представляет собой POC, а не полностью подготовленный к производству API.
Hidenoseek - это новая и общая камуфляжная атака, которая изменяет конструкции вредоносных образцов JavaScript, чтобы точно воспроизвести существующий доброкачественный синтаксис. Для этой цели мы статически улучшаем абстрактные синтаксисные деревья (AST) действительных входов JavaScript с помощью управления и информации о потоке данных. Мы называем полученную структуру данных как график зависимости программы (PDG). В частности, Hidenoseek ищет изоморфные подграфы между злонамеренными и доброкачественными файлами. В частности, он заменяет доброкачественные подпаст на их злонамеренные эквиваленты (та же синтаксическая структура) и корректирует доброкачественные зависимости данных-без изменения AST-так, чтобы злонамеренная семантика сохранялась.
По этическим причинам мы решили опубликовать ни полный код нашего модуля выбора клона, ни наш модуль замены клона. Следовательно, эта версия Hidenoseek может быть использована для обнаружения синтаксических клонов, но не для их переписывания .
install python3 # (tested with 3.6.7)
install nodejs # (tested with 8.10.0)
install npm # (tested with 3.5.2)
cd src
npm install escodegen # (tested with 1.9.1)
cd ..
Hidenoseek работает непосредственно на уровне PDG. Чтобы обнаружить клоны между 2 папками JavaScript, вы должны заранее генерировать PDGS (см. Генерацию PDGS) и дать их в качестве входной функции для функции src/samples_generation.replace_ast_df_folder .
Чтобы обнаружить клоны между 2 образцами JavaScript, вы должны непосредственно дать пути файлов в качестве входных данных для функции src/samples_generation.replace_ast .
Чтобы сгенерировать PDGS файлов JS из папки FOLDER_NAME, запустите следующую команду Shell из местоположения папки src :
$ python3 -c "from pdgs_generation import store_pdg_folder; store_pdg_folder('FOLDER_NAME')"
Соответствующие PDG будут храниться в FOLDER_NAME/PDG.
Чтобы сгенерировать PDG одного данного файла js input_file, запустите следующие команды Python3 из местоположения папки src :
>>> from pdgs_generation import get_data_flow
>>> pdg = get_data_flow('INPUT_FILE', benchmarks=dict())
По умолчанию соответствующий PDG не будет храниться. Чтобы хранить его в существующей папке PDG_PATH, вызовите:
>>> from pdgs_generation import get_data_flow
>>> pdg = get_data_flow('INPUT_FILE', benchmarks=dict(), store_pdgs='PDG_PATH')
Обратите внимание, что для этой версии Hidenoseek мы добавили тайм -аут 60 секунд для процесса генерации PDG (см. Строка 83 src/pdgs_generation.py ).
Чтобы найти клоны между доброкачественными PDGS из папки FOLDER_BENIGN_PDGS, и злонамеренными из FOLDE_MALICIOL_PDGS, запустите следующую команду Python3 из места папки src :
$ python3 -c "from samples_generation import replace_ast_df_folder; replace_ast_df_folder('FOLDER_BENIGN_PDGS', 'FOLDER_MALICIOUS_PDGS')"
Для каждого вредоносного PDG папка PDG_NAME-ANALYSIS будет создан в FOLDER_MALICIOL_PDGS. Для каждого проанализированного PDG он будет содержать файл JSON (формат имени: benign_malicious.json), который суммирует основные выводы, такие как идентичные узлы, доля идентичных узлов, разнородные токены, разные тесты ...
Кроме того, мы отображаем в stdout доброкачественный и вредоносный код сообщенных клонов. Это может быть отключено, например, для многопроцестрой, комментируя вызов в линию 153 print_clones 153 src/samples_generation.py .
Чтобы найти клоны между доброкачественным файлом JS Benign_js и злонамеренным one halious_js, запустите следующие команды Python3 из местоположения папки src :
>>> from samples_generation import replace_ast
>>> replace_ast('BENIGN_JS', 'MALICIOUS_JS')
Выходы, с точки зрения файла json и stdout, как и ранее.
Функции src/pdgs_generation.store_pdg_folder и src/samples_generation.replace_ast_df_folder полностью параллелизированы. В обоих случаях мы в настоящее время используем 1 ЦП, но вы можете изменить его путем изменения переменной num_workers из src/utility_df.py . Если вы используете более 1 процессора, вы должны прокомментировать вызов в линию print_clones src/samples_generation.py .
example/Benign-example содержит example.js Доброкачественный пример из нашей бумаги, в то время как example/Malicious-seed/seed.js -это злонамеренное семя из нашей бумаги.
Чтобы обнаружить клоны между этими двумя файлами, запустите следующие команды Python3 из местоположения папки src :
>>> from samples_generation import replace_ast
>>> replace_ast('../example/Benign-example/example.js', '../example/Malicious-seed/seed.js')
Вы получите следующий вывод на Stdout:
INFO:Successfully selected 2 clones in XXXs
==============
[<node.Node object at XXX>, <node.Node object at XXX>]
obj.setAttribute('type', 'application/x-shockwave-flash');
obj = document.createElement('object');
[<node.Node object at XXX>, <node.Node object at XXX>]
wscript.run('cmd.exe /c "<malicious powershell>;"', '0');
wscript = WScript.CreateObject('WScript.Shell');
--
[<node.Node object at XXX>, <node.Node object at XXX>]
obj.setAttribute('tabindex', '-1');
obj = document.createElement('object');
[<node.Node object at XXX>, <node.Node object at XXX>]
wscript.run('cmd.exe /c "<malicious powershell>;"', '0');
wscript = WScript.CreateObject('WScript.Shell');
--
==============
INFO:Could find 100.0% of the malicious nodes in the benign AST
Наш инструмент обнаружил 2 клона (каждый раз, состоящий из 2 операторов). Это означает, что все злонамеренное семя может быть переписано двумя различными способами в доброкачественном примере.
Кроме того, был создан example/Malicious-seed/seed-analysis/example_seed.json , содержащий дополнительную информацию клона.
Если вы используете Hidenoseek для академических исследований, вам настоятельно рекомендуется цитировать следующую статью:
@inproceedings{fass2019hidenoseek,
author="Fass, Aurore and Backes, Michael and Stock, Ben",
title="{textsc{HideNoSeek}: Camouflaging Malicious JavaScript in Benign ASTs}",
booktitle="ACM CCS",
year="2019"
}
В области вредоносных программ системы обучения стали популярными для обнаружения новых злонамеренных вариантов. Тем не менее, злоумышленники с конкретными и внутренними знаниями целевой системы могут создавать входные образцы, которые неверно классифицируются. На практике предположение о сильных злоумышленниках нереально, поскольку это подразумевает доступ к инсайдерской информации. Вместо этого мы предлагаем Hidenoseek, новую и общую камуфляжную атаку, которая уклоняется от всего класса детекторов на основе синтаксических функций, без необходимости какой -либо информации о системе, которую она пытается уклониться. Наша атака состоит в том, чтобы изменить конструкции злонамеренных образцов JavaScript для воспроизведения доброкачественного синтаксиса.
Для этой цели мы автоматически переписываем абстрактные синтаксисные деревья (AST) вредоносных вводов JavaScript в существующие доброкачественные. В частности, Hidenoseek использует вредоносные семена и ищут изоморфные подграфы между семенами и традиционными доброкачественными сценариями. В частности, он заменяет доброкачественные подразделы на их злонамеренные эквиваленты (та же синтаксическая структура) и корректирует доброкачественные зависимости данных-без изменения AST-так, чтобы злонамеренная семантика сохранялась. На практике мы использовали 23 злонамеренных семена для создания 91 020 злонамеренных сценариев, которые прекрасно воспроизводят AST 10 000 лучших веб -страниц. Кроме того, мы можем произвести в среднем 14 различных вредоносных образцов с одинаковым AST, что и в каждой топ -10 Alexa.
В целом, стандартный обученный классификатор имеет 99,98% ложных негативов с входами HidenoSeek, в то время как классификатор, обученный таким образцам, имеет более 88,74% ложных срабатываний, что делает целевые статические детекторы ненадежными.
Этот проект лицензирован в соответствии с условиями лицензии AGPL3, которые вы можете найти в LICENSE .