果冻
版权:2023-2026 Anders Møller & Oskar Haarklou Veileborg
Jelly是一个静态分析器 表演
- 调用图表构建, (中文(简体) ),
- 库使用模式匹配,以及
- 脆弱性暴露分析
用于使用节点.js平台的JavaScript(和TypeScript)程序.
分析器设计基于JAM [1],TAPIR [2]和ACG [3] 的构思,支持近似解释 [4] 和间接界限[5]. 其核心是一流不敏感控制流和点对点分析,以及追踪图书馆使用情况的接入路径. 它模拟了ECMAScript语言和标准库的主要部分(意为不完全健全!), 并(目前)将Node.js标准库视为未知代码.
[1] 本杰明·巴斯列夫·尼尔森,马丁·特克拉姆·托普,安德斯·默勒: 用于安全扫描Node.js应用程序的模块调用图构造。 。 。 . ISTA 2021: 29-41号
[2] Anders Møller, Benjamin Barslev Nielsen, 马丁·特克拉姆·托尔普: 检测 JavaScript 程序中因中断库更改而受影响的位置。 。 。 . Proc. ACM Programm. Lang. 4 (OPSLA): 187:1-187: 25 (2020) (英语)
[3] Asger Feldthaus, Max Schäfer, Manu Sridharan, 朱利安·多尔比, 弗兰克·提普: JavaScript IDE 服务的近似调用图的高效构建。 。 。 . Proc. ICSE 2013: 752-761 (英语)
[4] 马西亚斯·鲁德·劳尔森(Mathias Rud Laursen), 徐文ny, 安德斯·默勒: 减少静态分析与近似解释不一致。 。 。 . Proc. ACM计划. Lang. 8(PLDI):194: 1–194:24 (2024) (英语)
[5] 马杜里马·查克拉博蒂,阿卡什·格纳纳库马尔,马努·斯里德哈兰,安德斯·默勒: 间接调用图分析 Proc. ECOOP 2024: 27:1-27:27 (英语)
安装
npm install -g @cs-au-dk/jelly
其他备选方案如下: 如何建设。 。 。 .
使用量
见全用:
jelly --help
在运行Jelly静态分析器时,会给出一个或多个条目文件作为输入.
Directories 被扩展( 使用heuristics 来跳过某些文件和目录, 见 文件.ts) (中文(简体) ).
从条目文件中可以到达的所有文件都被分析,除了
如果选项 --ignore-dependencies ,在这种情况下只分析条目文件,
并仅使用基准目录中的文件(自动检测或使用选项指定) --basedir 或者说 -b页:1.
例如,生成一个用于 winston 软件包及其所有依赖性,包括JSON格式和HTML可视化:
jelly -j cg.json -m cg.html node_modules/winston
查看 cg.html 在浏览器中 :

要设置堆积限制, 前缀命令如下:
NODE_OPTIONS=--max-old-space-size=8192
关于Linux vm.max_map_count 系统设置还影响到可以使用多少内存。 如果改变 --max-old-space-size 在Node.js选项没有帮助,
尝试运行 sysctl vm.max_map_count 以查看当前设置。 例如,在64GB RAM的机器上,您可以用 sudo sysctl -w vm.max_map_count=524288。 。 。 .
注意分析所有依赖性(即不使用) --ignore-dependencies)可以花很长时间.
二. 备选方案 --max-indirections 或者说 --timeout 可用于提前终止分析,以提供部分(不正确)结果.
特定软件包也可以使用 --include-packages 或者说 --exclude-packages。 。 。 .
如何建设
安装依赖性 :
npm install
编译类型脚本代码 :
npm run build
编译后,Jelly可以这样运行:
node lib/main.js
构建二进制可执行文件( 可选), 放置在 dist/数字 :
sudo npm install -g pkg
npm run pkg
注意 二进制可执行文件不支持动态调用图构建 .
夹克
构建 Docker 图像(包括支持动态调用图构建) :
npm run build-docker
在 Docker 中运行 Jelly, 将目录指定为当前工作目录的第一个参数 :
./bin/jelly-docker . tests/helloworld/app.js --callgraph-html cg.html
服务器模式
Jelly可以作为命令行界面的替代程序在服务器-模式中运行:
jelly-server
或者说
node lib/server.js
并参见上面关于如何构建二进制可执行文件的说明.
使用 JSON 格式向服务器发送请求 src/typings/ipc.ts。 。 。 .
与双行标题(包括空行)同步返回响应
Content-Length: <bytes>
与 \r\n 断线.
近似解释
使静态分析能够进行近似解释(见上文参考[4]),使用选项 --approx数字 :
jelly --approx tests/helloworld/app.js
(此示例假设您通过运行首先安装了测试依赖性) npm run tests-install. ) (中文(简体) )
或者,您可以单独使用选项进行近似解释和静态分析 --approx-only 财务报告和审定财务报表 --approx-load数字 :
jelly --approx-only hints.json tests/helloworld/app.js
jelly --approx-load hints.json tests/helloworld/app.js
间接界限
允许间接界限(见上文参考[5]),使用选项 --max-indirections数字 :
jelly --max-indirections 2 tests/helloworld/app.js
动态调用图构建
Jelly 支持动态调用图形构建通过 节点Prof, (中文(简体) ), 它可用于测量静态分析的回想(或不健全).
安装节点Prof( 另见上文关于多克的信息):
sudo dnf install g++ libstdc++-static
mkdir -p ~/tools; cd ~/tools
git clone --depth 1 --branch 6.0.4 https://github.com/graalvm/mx.git
export PATH=$PATH:$HOME/tools/mx
mx -y fetch-jdk --java-distribution labsjdk-ce-17
export JAVA_HOME=$HOME/.mx/jdks/labsjdk-ce-17-jvmci-22.2-b01
git clone --depth 1 https://github.com/Haiyang-Sun/nodeprof.js.git
cd nodeprof.js
mx sforceimports
mx --dy /compiler build
例如,运行 tests/micro/classes.js 或者说 tests/helloworld/app.js 带有调用图形构造的仪器:
export GRAAL_HOME=$HOME/tools/graal/sdk/latest_graalvm_home
jelly tests/micro/classes.js -d cg.json
jelly tests/helloworld/app.js -d cg.json
JavaScript 程序的附加参数可以在之后添加 --。 。 。 .
也可以运行 npm test 有仪器的:
jelly --npm-test tests/mochatest -d cg.json
另一种办法是添加 $JELLY_HOME/lib/bin/node 改为 PATH 设置 JELLY_OUT例如,直接运行Mocha:
cd tests/mochatest
PATH=$JELLY_HOME/bin:$PATH JELLY_OUT=cg.json node_modules/.bin/mocha
地点 JELLY_HOME 是Jelly的家目录.
这导致文件 cg.json-<PID> 用于执行的每个仪器文件.
调用图(以静态或动态方式生成)可以比较精确和召回:
jelly --compare-callgraphs cg1.json cg2.json
对于开发者
在监视模式下编译类型脚本代码 :
npm run build-watch
作为脚本安装( I)jelly 财务报告和审定财务报表 jelly-server促进发展:
sudo npm link
安装测试的依赖性 :
npm run tests-install
运行所有测试 :
npm test
运行单个测试(由regex指定),例如:
npm test -- -t tests/helloworld
为了实现堆栈痕迹的源地图转换,前缀命令通过:
NODE_OPTIONS=--enable-source-maps