bashiragutale-gif/vulnerability-scanner
GitHub: bashiragutale-gif/vulnerability-scanner
基于 MERN 全栈架构的自动化漏洞检测平台,集成依赖扫描、静态代码分析与风险评估,帮助团队持续监控项目安全状况。
Stars: 0 | Forks: 0
# DepGuard — 自动化依赖漏洞检测系统
这是一个用于自动化软件供应链安全扫描的全栈 MERN 应用程序,
根据论文项目开发计划构建(React + Node.js/Express + MongoDB)。
## 已实现功能
| 阶段 | 功能 | 位置 |
|---|---|---|
| 1 | 架构、REST API 设计、数据库 schema | `backend/src/models`, `backend/src/routes` |
| 2 | JWT 认证、注册/登录/登出、密码重置、个人资料、三级 RBAC (user/manager/admin) | `backend/src/controllers/authController.js`, `userController.js`, `utils/roles.js` |
| 3 | 项目 CRUD、ZIP 上传、GitHub clone/pull、项目历史 | `backend/src/controllers/projectController.js`, `services/githubService.js` |
| 4 | 依赖扫描器 (`npm audit` + OSV.dev CVE 交叉引用)、CVSS 分数 | `backend/src/services/dependencyScanner.js`, `services/cveService.js` |
| 5 | 源代码扫描器:SQLi、XSS、硬编码密钥、命令注入、弱加密、配置错误 | `backend/src/services/sourceScanner.js` |
| 6 | 风险评分引擎、风险分类、优先修复建议 | `backend/src/services/riskEngine.js` |
| 7 | 仪表盘统计、PDF 安全报告 | `backend/src/controllers/dashboardController.js`, `services/pdfService.js` |
| 8 | 计划的每日/每周/每月扫描、扫描结果对比 | `backend/src/services/scheduler.js`, `scanController.js#compareScans` |
| 9 | Jest + Supertest 测试示例 | `backend/tests/auth.test.js` |
| 10 | 本 README / 架构文档 | — |
## 技术栈
- **前端:** React 18 + Vite + React Router + Tailwind CSS + Recharts + lucide-react
- **后端:** Node.js + Express.js,分层架构为 routes → middleware → controllers → services → models
- **数据库:** MongoDB + Mongoose
- **认证:** JWT (bearer token),bcrypt 密码哈希
- **安全工具:** `npm audit`,OSV.dev API,自定义基于 regex 的静态分析器
## 项目结构
```
vuln-scanner/
├── backend/
│ ├── src/
│ │ ├── config/ # DB connection
│ │ ├── models/ # Mongoose schemas: User, Project, Scan, Vulnerability, SourceIssue, Report
│ │ ├── controllers/ # Route handlers (thin, delegate to services)
│ │ ├── middleware/ # auth, error handling, validation, file upload
│ │ ├── routes/ # Express routers
│ │ ├── services/ # Business logic: scanners, risk engine, GitHub, CVE lookup, PDF, scheduler
│ │ └── app.js
│ ├── tests/
│ ├── server.js
│ └── package.json
├── frontend/
│ ├── src/
│ │ ├── api/ # Axios client + typed endpoint calls
│ │ ├── context/ # AuthContext (JWT session state)
│ │ ├── components/ # Layout, ScoreGauge, SeverityBadge
│ │ ├── pages/ # Login, Register, Dashboard, Projects, ProjectDetail, ScanDetail, AdminUsers
│ │ └── routes/ # ProtectedRoute
│ └── package.json
└── README.md
```
## 系统角色
标准三级 RBAC,在 `backend/src/utils/roles.js` 中进行服务端强制执行,并按路由应用
(永远不要信任前端进行授权):
| 角色 | 自己的项目 | 其他用户的项目/扫描/报告 | 用户管理 |
|---|---|---|---|
| `user` (默认) | 完全权限 (创建/扫描/编辑/删除) | 无访问权限 | 否 |
| `manager` | 完全权限 | 只读 (查看/下载,不能编辑/删除/触发) | 否 |
| `admin` | 完全权限 | 完全权限 | 是 (更改角色、激活/停用、删除) |
`manager` 角色专为需要全局安全状况可见性的审计员/主管设立,且
不能触碰其他团队的项目或用户目录。只有 `admin` 可以通过 `PATCH /api/users/:id/role` 提升/降级
角色。
## 开始使用
### 前置条件
- Node.js 18+
- 本地运行的 MongoDB 或连接字符串 (Atlas 等)
- PATH 中可用的 `git` CLI (用于 GitHub 仓库克隆)
### 后端
```
cd backend
cp .env.example .env # edit MONGO_URI, JWT_SECRET, etc.
npm install
npm run dev # starts on http://localhost:5000
```
### 前端
```
cd frontend
cp .env.example .env # VITE_API_URL=http://localhost:5000/api
npm install
npm run dev # starts on http://localhost:5173
```
打开 http://localhost:5173,注册一个账号,然后创建一个项目 (GitHub URL 或 ZIP 上传)
并点击 **运行扫描**。
### 运行测试
```
cd backend
npm test
```
## 各扫描器工作原理
**依赖扫描器** (`services/dependencyScanner.js`)
递归发现项目中的每个 `package.json` (跳过 `node_modules`、`.git`、
构建输出等),因此典型的全栈布局 —— 一个 React `frontend/` 和一个 Node/Express
`backend/`,各自都有自己的清单,且仓库根目录下没有 package.json —— 都会被
完整扫描,而不仅仅是根目录。每个子项目独立扫描:读取
`package.json`/`package-lock.json`,运行 `npm audit --json` 获取权威的 CVE 数据,然后
将每个直接/开发依赖与免费的 OSV.dev API 进行交叉引用,以捕获 npm 注册表
安全公告源遗漏的任何内容。扫描结果会标记 `subProject` (例如 `frontend`、`backend`),以便在多包仓库中保持结果的可追溯性。
**源代码扫描器** (`services/sourceScanner.js`)
一个无依赖的静态分析器,遍历所有 `.js/.jsx/.ts/.tsx` 文件 (跳过
`node_modules`、`.git`、构建输出) 并标记匹配已知风险模式的代码行:
SQL 字符串拼接、`dangerouslySetInnerHTML`/`innerHTML`、硬编码的密钥/API 密钥、
未经过滤的 `exec`/`spawn` 调用、弱哈希 (MD5/SHA1)、通配符 CORS 以及硬编码的 JWT 密钥。
这是一个启发式的初步筛查工具,不能完全替代 SAST —— 请将结果视为需要审查的线索。
**风险引擎** (`services/riskEngine.js`)
通过确定性的严重程度加权扣分,将扫描发现转化为 0–100 的安全评分,
对整体风险进行分类 (低/中/高/严重),并生成优先升级列表。
**持续监控** (`services/scheduler.js`)
`node-cron` 任务每天 (02:00)、每周 (周一 03:00)
和每月 (1 号 04:00) 为每个活跃项目重新运行 `runFullScan()`,因此安全评分趋势和扫描对比能够展示真实的历史记录。
## 论文撰写的说明与下一步计划
- 密码重置目前在非生产环境响应中直接返回 token,而不是通过电子邮件
发送 —— 在进行任何实际部署之前,需要接入交易邮件服务提供商 (例如 SendGrid/Nodemailer)。
- 源代码扫描器特意设计得简单/基于 regex 以保持无依赖;更强的
版本可以集成 ESLint 安全插件或 Semgrep 规则,以达到第 5 阶段“最佳实践”的标准。
- `npm audit` 在扫描时需要访问互联网连接到 npm 的注册表 —— 如果扫描处于气隙隔离环境下的代码,
OSV.dev 交叉引用步骤仍需要出站 HTTPS 连接。
- 如果要投入生产环境,请添加基于用户的限流 (不仅仅是基于 IP) 并为 admin 操作添加审计日志。
标签:DevSecOps, MERN, MITM代理, 上游代理, 安全专业人员, 自定义脚本, 软件供应链安全, 远程方法调用, 错误基检测, 静态代码分析