文档版本变更:
版本 | 日期 | 修改记录 |
---|---|---|
v0.0.1 | 2022/11/8 | 确定设计文档框架 |
v0.0.2 | 2022/11/9 | 完成概要说明部分 |
v0.0.3 | 2022/11/11 | 完成体系结构设计和数据库设计部分 |
v0.1.0 | 2022/11/15 | 完成界面设计部分 |
一、概要说明
npm是JavaScript的包管理工具,现代js开发中大部分第三方库的下载都是通过npm进行的,开源开发者们也乐意将自己得库上传到npm上。近些年许多攻击者针对流行的软件包管理器以及他们的用户进行供应链攻击,npm就包括在其中。在2021年,通过利用开源软件的供应链,安全攻击的数量同比增长了650%。
论文What are Weak Links in the npm Supply Chain?中对npm供应链的安全风险做了比较详细的分析,但是其中仍然有些不足,比如作者分析的后三种风险并没有得到从业者的认可,而作者通过调研得到的从业者的观点却没有得到深入分析,另外论文所使用的数据也有些过时了。
因此本项目希望在此篇论文的基础上,结合自己的调研和讨论,从六个方面分析npm供应链的安全风险。
我们初步将项目分为如下需求。
- 数据爬取,通过npm官方提供的接口爬取所有包的相关数据用于进一步分析。
- 数据清洗,在爬取的数据中有部分不符合我们的需求或者无法用于分析,这部分数据需要剔除。
- 数据存储。实际操作中发现由于npm管理着百万级的第三方包,每次爬取都需要花费相当多的时间,因此我们将数据以一定组织形式存储起来。
- 数据处理,通过得到的数据分析npm供应链的安全风险,主要分为六个方面。
- 过期的维护者域。如果维护者的域已过期,并且在其帐户上没有设置2FA身份验证,则攻击者可以劫持一个组件。
- 安装脚本。攻击者可以使用安装脚本,通过软件包安装步骤来运行执行恶意行为的命令。
- 未维护的包。攻击者可以针对那些更有可能因为缺乏维护而偷偷侵入恶意软件的软件包。
- 第三方包的代码仓库。代码仓库与npm中的代码版本不一致,或者代码仓库长时间没有提交。
- 名称相似的恶意软件。
- 宽松的开源许可证。
- 后端,由于本项目规模不大,无需搭建复杂的后端框架,因此选择flask作为我们的后端框架。
- 前端,使用vue.js框架搭建,用于直观展示一些数据。
二、体系结构设计
体系设计部分遵循了数据层-服务层-应用层的框架。
数据层
在数据获取方面,npm相关包的信息储存在CouchDB数据库中,利用python的request包来进行爬取,因为数据量较大,每次爬取消耗时间较长,因此采用Mysql数据库进行存储,并在数据清洗阶段剔除无用的数据。
服务层
后端使用flask框架来进行轻量级开发,与前端使用json格式来进行数据通信,在不影响后端使用的同时尽量减轻框架本身复杂程度带来的冗杂问题。
应用层
前端使用VUE框架进行搭建,采用element-ui框架和echarts图表。
三、数据库设计
package
名称 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
---|---|---|---|---|---|
id | varchar | 50 | yes | yes | |
name | varchar | 50 | 包名 | ||
author_id | varchar | 发布者id | |||
description | varchar | 50 | 简介 | ||
liscense | varchar | 20 | 许可证 | ||
lastest_time | datetime | 最新版本发布时间 | |||
version | varchar | 20 | 最新版本号 | ||
deprecated | tinyint | 是否弃用 | |||
has_install_script | tinyint | 是否有安装脚本 | |||
repository | varchar | 50 | 仓库链接 | ||
modified_time | datetime | 最近修改时间 | |||
is_malicious | tinyint | 是否是恶意包 |
human
名称 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
---|---|---|---|---|---|
id | int | yes | yes | ||
name | varchar | 20 | 用户名 | ||
varchar | 50 | 邮箱 | |||
url | varchar | 255 | 主页地址 |
contributors
名称 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
---|---|---|---|---|---|
id | int | yes | yes | ||
human_id | int | ||||
package_id | varchar | 50 |
maintainers
名称 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
---|---|---|---|---|---|
id | int | yes | yes | ||
human_id | int | ||||
package_id | varchar | 50 |
dependencies
名称 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
---|---|---|---|---|---|
id | int | yes | yes | ||
dependent_id | varchar | 50 | 依赖者 | ||
dependee_id | varchar | 50 | 被依赖者 | ||
type | varchar | 10 | 依赖类型 |
四、业务界面设计
搜索栏设计
页面最上方的搜索栏可以检索具体某个包或者某个维护者的风险信息。
总览栏设计
总览栏显示了当前数据库中所有包的数量、被弃用的包的数量、恶意包的数量以及维护者的数量。
数据详情
通过图表的形式直观展示npm生态中不同方面的风险程度。