formalsec/graphjs
GitHub: formalsec/graphjs
基于多版本依赖图的 JavaScript 静态漏洞扫描器,专注于检测 npm 包中的污点传播和原型污染等安全漏洞。
Stars: 22 | Forks: 2
# 基于多版本依赖图的高效 JavaScript 静态漏洞分析
Mafalda Ferreira, Miguel Monteiro, Tiago Brito, Miguel E. Coimbra, Nuno Santos, Limin Jia, and José Fragoso
Santos. 2024. Efficient Static Vulnerability Analysis for JavaScript with Multiversion Dependency Graphs.
https://dl.acm.org/doi/10.1145/3656394
## 工件评估
[工件评估](./artifact-evaluation) 文件夹包含复现原始论文结果和图表所需的所有必要说明和脚本。
## 团队
### 主要贡献者
#### 合作者
- [Tiago Brito](https://www.dpss.inesc-id.pt/blog/tiago-brito/)
- [Miguel Coimbra](https://www.dpss.inesc-id.pt/~mcoimbra/)
- [Limin Jia](https://www.andrew.cmu.edu/user/liminjia/)
- [Miguel Monteiro](https://www.linkedin.com/in/miguel-monteiro-229b86195/)
## Graph.js:面向 _npm_ 包的静态漏洞扫描器
Graph.js 是一款静态漏洞扫描器,专门用于分析 _npm_ 包并检测污点风格和原型污染漏洞。
其执行流程由两个阶段组成:**图构建** 和 **图查询**。在第一阶段,Graph.js 构建待分析程序的多版本依赖图 (MDG)。
这种基于图的数据结构将抽象语法树、控制流图和数据依赖图合并到同一表示中。此阶段有两个输出:
1. 图输出:.csv 格式的节点和边。
2. 图指标:graph_stats.json
在第二阶段,Graph.js 将图导入 Neo4j 图数据库,并执行用 Cypher 编写的图查询,以捕获易受攻击的代码模式,例如连接不可靠源和危险汇的数据依赖路径。
- 目前,Graph.js 检测四种类型的漏洞:原型污染 (CWE-1321)、OS 命令注入 (CWE-78)、任意代码执行 (CWE-94) 和路径遍历 (CWE-22)。
## 安装说明
Graph.js 使用 [Node](https://nodejs.org/en) 生成图,并使用 [Neo4j](https://neo4j.com/) 查询图。
它可以在本地执行,也可以在 Docker 容器中执行(更简单且更稳健的设置)。 ### 使用 Docker #### 前置条件: - [Python3](https://www.python.org/downloads/) - [Docker](https://www.docker.com/) 通过运行以下命令构建 Docker 容器: ``` docker build -t graphjs . ``` ### 本地运行 #### 前置条件: - [Node](https://nodejs.org/en) (已测试 v18+)。 - [Neo4j v5](https://neo4j.com/)。说明:https://neo4j.com/docs/operations-manual/current/installation/linux/ 通过运行以下命令设置本地环境: ``` ./setup.sh ``` ## 使用方法 ### 使用 Docker Graph.js 提供命令行界面。使用 **-h** 运行以获取简短描述。 ``` Usage: ./graphjs_docker.sh -f [options]
Description: Run Graph.js for a given file in a Docker container.
Required:
-f Filename (.js).
Options:
-o Path to store analysis results.
-l Store docker logs.
-e Create exploit template.
-s Silent mode: Does not save graph .svg.
-h Print this help.
```
要运行 Graph.js,请运行命令:
```
./graphjs_docker.sh -f [options]
```
### 本地运行
Graph.js 提供命令行界面。使用 **-h** 运行以获取简短描述。
```
Usage: graphjs.py [-h] -f FILE [-o OUTPUT] [-s] [-d] [-e]
Options:
-h, --help show this help message and exit
-f FILE, --file FILE Path to JavaScript file (.js) or directory containing JavaScript files for analysis.
-o OUTPUT, --output OUTPUT
Path to store all output files.
-s, --silent Silent mode - no console and graph output.
-d, --docker Query mode - executes neo4j in a docker container instead of running locally.
-e, --exploit Generates symbolic tests.
```
要运行 Graph.js,请运行命令:
```
python3 graphjs.py -f [options]
```
默认情况下,所有结果都存储在项目根目录下的 *graphjs-results* 文件夹中,结构如下:
```
graphjs-results
├── graph
│ ├── graph_stats.json (stores some metrics)
│ ├── nodes.csv (csv file of the graph nodes)
│ ├── rels.csv (csv file of the graph relationships)
│ └── normalized.js (normalized code)
└── taint_summary_detection.json (detection results)
```
## 可复用性
Graph.js 代码旨在方便他人直接使用,并可以轻松调整以适应
新场景。如前所述,Graph.js 由两个阶段组成:图构建和图查询。
图构建代码位于 `graphjs/parser/src` 文件夹中,最相关的文件组织如下:
```
src
├── parser.ts
├── output # Code to generate outputs (.csv and .svg)
├── traverse # Parsing algorithms
├── dependency
│ ├── structures/dependency_trackers.ts
│ └── dep_builder.ts
├── ast-builder.ts
├── cfg-builder.ts
└── cg-builder.ts
```
与 MDG 构建算法相关的代码位于
`src/traverse/dependency`,其中文件 `structures/dependency_trackers.ts`
包含论文中提到的规则和结构。
MDG 旨在通用,因此所有构建步骤均可
通过创建新类型的节点和边来适应新场景。
查询代码位于 `graphjs/detection`
文件夹中。查询是完全可定制的,因此,不仅可以
修改现有查询,还可以创建新查询,以便
在图中搜索新的不同模式。
## 仅生成图
- 在 *parser* 文件夹内执行
```
npm start -- -f [options]
```
#### 程序选项
| 描述 | 标志 | 默认值 | 必需 | 依赖项 |
|--------------------------------------------------------------|:-------------------:|:--------------------:|------------|------------|
| 待分析的 JavaScript 文件 | -f | - | 是 | - |
| 配置文件的位置 | -c | _'../config.json'_ | 否 | - |
| 规范化文件的位置 | -o | - | 否 | - |
| 图输出目录的位置 (csv 和 svg 文件) | -g | _'src/graphs/'_ | 否 | - |
| 输出图 csv 文件 | --csv | _false_ | 否 | - |
| 输出图形图像 | --graph | _false_ | 否 | - |
| 在图形图像中设置要忽略的结构数组 | --i=[AST, CFG...] | _[]_ | 否 | _graph_ |
| 在图形图像中设置要忽略的函数数组 | --if=[...] | _[]_ | 否 | _graph_ |
| 在图形图像中的每个语句中显示代码 | --sc | _false_ | 否 | _graph_ |
| 静默模式 (非详细) | --silent | _false_ | 否 | - |
### 出版物和开源仓库
Graph.js 的开发与该小组进行的其他研究相关。
#### 1. Node.js 包漏洞检测 JavaScript 静态分析工具研究
这项工作包括对用于检测 Node.js 代码中漏洞的静态代码分析工具的实证研究。
我们创建了一个包含 957 个 Node.js 代码漏洞的精选数据集,通过分析 _npm_ 咨询报告中包含的信息对其进行表征和注释。
该数据集可在[此处](https://github.com/VulcaN-Study/Supplementary-Material)获取。
与此工作相关的出版物是:
- **VulcaN Dataset [1]**: Tiago Brito, Mafalda Ferreira, Miguel Monteiro, Pedro Lopes, Miguel Barros, José Fragoso Santos, Nuno Santos:
*“Study of JavaScript Static Analysis Tools for Vulnerability Detection in Node.js Packages”*,
刊于 *IEEE Transactions on Reliability 2023 (ToR 2023)*。
```
@inproceedings{vulcan_tor,
author = {Brito, Tiago and Ferreira, Mafalda and Monteiro, Miguel and Lopes, Pedro and Barros, Miguel and Santos, José Fragoso and Santos, Nuno},
booktitle = {IEEE Transactions on Reliability},
title = {Study of JavaScript Static Analysis Tools for Vulnerability Detection in Node.js Packages},
year = {2023},
pages = {1-16},
doi = {10.1109/TR.2023.3286301},
}
```
#### 2. RuleKeeper:面向 Web 框架的 GDPR 感知个人数据合规性
在这项工作中,我们开发了 RuleKeeper 的原型,这是一个面向 Web 框架的 GDPR 感知策略合规系统。
RuleKeeper 使用 Graph.js 自动检查 Node.js 服务器中是否存在 GDPR 合规性错误。
该原型可在[此处](https://github.com/rulekeeper/rulekeeper)获取。
与此工作相关的出版物是:
- **RuleKeeper**:
Mafalda Ferreira, Tiago Brito, José Fragoso Santos, Nuno Santos:
*“RuleKeeper: GDPR-Aware Personal Data Compliance for Web Frameworks”*,
刊于 *Proceedings of 44th IEEE Symposium on Security and Privacy (S&P’23)*, 2023。
```
@inproceedings{ferreira_sp23,
author = {Ferreira, Mafalda and Brito, Tiago and Santos, José Fragoso and Santos, Nuno},
title = {RuleKeeper: GDPR-Aware Personal Data Compliance for Web Frameworks},
booktitle = {Proceedings of 44th IEEE Symposium on Security and Privacy (S&P'23)},
year = {2023},
doi = {10.1109/SP46215.2023.00058},
pages = {1014-1031},
publisher = {IEEE Computer Society},
address = {Los Alamitos, CA, USA},
}
```
![]() |
![]() |
![]() |
![]() |
| Mafalda Ferreira | José Fragoso Santos | Filipe Marques | Nuno Santos |
它可以在本地执行,也可以在 Docker 容器中执行(更简单且更稳健的设置)。 ### 使用 Docker #### 前置条件: - [Python3](https://www.python.org/downloads/) - [Docker](https://www.docker.com/) 通过运行以下命令构建 Docker 容器: ``` docker build -t graphjs . ``` ### 本地运行 #### 前置条件: - [Node](https://nodejs.org/en) (已测试 v18+)。 - [Neo4j v5](https://neo4j.com/)。说明:https://neo4j.com/docs/operations-manual/current/installation/linux/ 通过运行以下命令设置本地环境: ``` ./setup.sh ``` ## 使用方法 ### 使用 Docker Graph.js 提供命令行界面。使用 **-h** 运行以获取简短描述。 ``` Usage: ./graphjs_docker.sh -f
标签:GraphJS, JavaScript安全, MITM代理, Node.js安全, NPM包审计, SAST, TLS抓取, Web安全, 云安全监控, 依赖图, 原型污染, 多版本依赖图, 学术论文复现, 盲注攻击, 自动化攻击, 自动化攻击, 蓝队分析, 请求拦截, 软件安全, 静态分析



