Мы предлагаем инструмент для статического анализа кода JavaScript. С этой целью мы строим AST (абстрактное синтаксисное дерево) входного файла JavaScript. Чтобы рассуждать об условиях, которые необходимо выполнить для конкретного пути выполнения, мы впоследствии добавляем края потока управления в AST. Мы называем полученный график как CFG (график потока управления). Затем, чтобы рассуждать о зависимости от переменных, мы добавляем края потока данных в CFG. Наконец, чтобы вычислять значения переменных, мы выполняем анализ указателя. Мы называем полученный график как PDG (график зависимости программы).
Пожалуйста, обратите внимание, что в своем текущем состоянии код является POC, а не полностью готовым к производству API.
Мы принимаем определение CFG, которое немного отличается от Аллена, поскольку мы усиливаем наш AST с помощью краев потока управления. Таким образом, мы строим совместную структуру, которая объединяет информацию о потоке управления с мелкозернистыми узлами AST и краями. Наш PDG также немного отличается от определения Ferrante et al. как мы решили добавить края потока данных в наш CFG. Таким образом, мы сохраняем информацию, касающуюся порядка заявления, и имеем мелкозернистое представление потоков данных непосредственно на уровне переменной (так как мы строим CFG на AST).
Дополнительную информацию можно найти в моей диссертации.
Этот код использовался для статического анализа расширений браузеров. Смотрите Doublex Paper & Code.
Предварительные версии этого кода также использовались для обнаружения вредоносных образцов JavaScript: Hidenoseek Paper & Code и JSTAP Paper & Code.
И изучить методы преобразования кода JavaScript: Paper & Code.
install python3 # (tested with 3.7.3 and 3.7.4)
install nodejs
install npm
cd src
npm install esprima # (tested with 4.0.1)
npm install escodegen # (tested with 1.14.2 and 2.0.0)
Чтобы установить graphviz (только для графиков рисования, еще не задокументировано, откройте проблему, если заинтересован)
pip3 install graphviz
On MacOS: install brew and then brew install graphviz
On Linux: sudo apt-get install graphviz
Чтобы сгенерировать PDG конкретного файла *.js, запустите следующие команды Python3 из местоположения папки src :
>>> from build_pdg import get_data_flow
>>> pdg = get_data_flow('INPUT_FILE', benchmarks=dict())
По умолчанию соответствующий PDG не будет храниться. Чтобы хранить его в существующей папке PDG_PATH, вызовите:
$ python3 -c "from build_pdg import get_data_flow; get_data_flow('INPUT_FILE', benchmarks=dict(), store_pdgs='PDG_PATH')"
Обратите внимание, что мы добавили тайм -аут 10 мин для анализа потока данных/указателя (см. Строка 149 src/build_pdg.py ) и предел памяти 20 ГБ (см. Строка 115 src/build_pdg.py ).
Давайте рассмотрим DIR содержащий несколько файлов JavaScript для анализа. Чтобы сгенерировать PDG (= ASTS, улучшенные с помощью управления и потока данных, и анализа указателей) всех этих файлов, запустите следующую команду Shell из местоположения папки src :
$ python3 -c "from build_pdg import store_pdg_folder; store_pdg_folder('DIR')"
Соответствующие PDG будут храниться в DIR/PDG .
В настоящее время мы используем 1 ЦП, но вы можете изменить его путем изменения переменной num_workers из src/utility_df.py (One Line 51 ).
Этот проект лицензирован в соответствии с условиями лицензии AGPL3, которые вы можете найти в LICENSE .