richardwaters9049/MalViz

GitHub: richardwaters9049/MalViz

MalViz 是一个本地优先的恶意软件静态分析平台,通过安全的隔离存储和 Python 分析引擎,为可疑文件生成可解释的风险评估报告。

Stars: 0 | Forks: 0

# MalViz MalViz 是一个本地优先的恶意软件分析 MVP,用于安全地上传可疑文件,在应用程序仓库之外进行隔离,在 Python worker 中运行静态分析,并向用户和管理员提供清晰、可解释的扫描报告。 它有意采取保守策略:上传的样本绝不会被执行,原始文件字节不会存储在 PostgreSQL 中,并且 Next.js 应用程序本身不执行恶意软件分析。 ## 目录 | 章节 | 描述 | | --- | --- | | [项目目标](#project-aim) | MalViz 旨在实现的目标。 | | [概述](#overview) | 主要应用程序流程和架构。 | | [技术栈](#tech-stack) | 框架、服务和运行时工具。 | | [预期输出](#expected-output) | 完成的扫描报告的样式。 | | [仓库结构](#repository-structure) | 重要代码存放的位置。 | | [前置条件](#prerequisites) | 本地开发所需的工具。 | | [环境变量](#environment) | 必需的配置值。 | | [如何运行](#how-to-run) | 单命令、Docker 和手动设置选项。 | | [如何使用该程序](#how-to-use-the-programme) | 上传、扫描、审查和管理文件。 | | [测试与验证](#testing-and-verification) | 检查项目的命令。 | | [安全说明](#security-notes) | 处理可疑文件的安全边界。 | | [当前项目状态](#current-project-status) | 目前已实现的功能和剩余工作。 | ## 项目目标 MalViz 的目标是为静态恶意软件分析提供一个干净、安全且可扩展的基础。 该项目侧重于: - 可疑文件的安全上传处理 - 在 Git 项目之外进行隔离存储 - Web 应用程序和分析 worker 之间清晰的职责边界 - 模块化的静态分析插件 - 可解释的风险评分 - 对非专业人士有用,同时展示技术细节的报告 - 能够在日后无需大规模重写的情况下支持更深层检测器的代码库 MalViz 不是一个沙箱,不会动态执行恶意软件。动态分析、沙箱机制、机器学习和外部恶意软件共享功能被刻意排除在当前 MVP 的范围之外。 ## 概述 在宏观层面上,MalViz 的工作方式如下: ``` User -> Next.js App Router -> authentication -> uploads -> dashboard -> scan and admin pages -> thin API routes -> service/security modules -> PostgreSQL -> metadata -> scan jobs -> scan results -> indicators -> feedback -> audit logs -> Redis / BullMQ -> upload-side queue signal -> Python worker -> claims queued jobs -> reads quarantined files -> runs static-analysis plugins -> scores findings -> writes structured reports -> Next.js UI -> displays status, verdict, score, reasons, indicators, and actions ``` Next.js 负责用户体验、身份验证、上传验证、元数据存储、队列信号传递和报告展示。Python worker 负责文件分析。 上传的原始文件会被写入 `MALVIZ_QUARANTINE_DIR`,而不是应用程序仓库,不是 `frontend/public`,也不是 PostgreSQL。 ## 技术栈 | 领域 | 技术 | | --- | --- | | Web 应用 | Next.js App Router 16, React 19, TypeScript | | 样式 | Tailwind CSS, 本地 UI 组件, lucide-react 图标 | | 包管理/运行时 | Bun | | 数据库 | PostgreSQL | | ORM | Prisma | | 队列信号 | Redis 和 BullMQ | | Worker | Python 3 | | Worker 测试 | pytest | | 前端/后端测试 | Vitest, TypeScript, ESLint | | 本地服务 | Docker Compose | Docker Compose 将本地服务映射到非默认端口,以避免常见的冲突: - PostgreSQL: `localhost:55432` - Redis: `localhost:56379` ## 预期输出 成功的扫描会生成一份结构化的 JSON 报告,存储在 PostgreSQL 中并显示在 UI 中。 用户应期望看到: - 扫描状态,例如 `Queued`、`Scanning`、`Clean`、`Suspicious`、`Malicious` 或 `Failed` - 判定结论 - 满分为 100 的风险评分 - 纯英文摘要 - 评分背后的原因 - 提取的指标,如哈希值、URL、域名、IP 地址、电子邮件或可疑命令 - 建议的操作 - 匹配的规则 - 技术发现 JSON - 分析元数据,包括插件结果和非致命的插件错误 报告内容示例: ``` Verdict: Suspicious Risk score: 45/100 Summary: This file shows suspicious indicators with a score of 45/100. Reasons: - The file appears to be a script capable of running commands. - Network indicators were embedded in the file. Suggested actions: - Treat this file cautiously until reviewed. - Avoid opening it on a normal workstation. - Review the listed reasons and indicators. ``` 该报告是刻意设计为可解释的。MalViz 不应在没有说明原因的情况下断言文件是恶意的。 ## 仓库结构 ``` frontend/ src/ app/ Next.js App Router pages and API route shells components/ UI, layout, upload, scan, and admin components public/ static assets served by Next.js next.config.ts Next.js app configuration postcss.config.mjs frontend CSS pipeline configuration backend/ lib/ auth, Prisma client, services, security, reports, queues prisma/ database schema, migrations, and seed data scripts/ backend database and maintenance helpers tests/ TypeScript service tests and safe upload fixtures worker/python/ Python static-analysis worker, plugins, and pytest tests infra/ docker/ Docker-only image definitions config/ eslint.config.mjs lint configuration prisma.config.ts Prisma CLI configuration vitest.config.ts test runner configuration scripts/ dev/ local startup scripts ``` ## 前置条件 在本地运行 MalViz 之前,请安装以下内容: - Bun - Docker 和 Docker Compose - Python 3 一键启动脚本将创建 worker 虚拟环境,并为常规开发安装 Python 依赖项。 ## 环境变量 从示例文件创建本地环境文件: ``` cp .env.example .env ``` 重要变量: ``` DATABASE_URL="postgresql://malviz:malviz@localhost:55432/malviz?schema=public" REDIS_URL="redis://localhost:56379" APP_URL="http://localhost:3000" SESSION_COOKIE_NAME="malviz_session" MALVIZ_QUARANTINE_DIR="/tmp/malviz-quarantine" MALVIZ_DELETED_FILE_RETENTION_DAYS="7" MAX_UPLOAD_SIZE_MB="25" MAX_UPLOAD_BYTES="26214400" ``` 注意事项: - 请将 `.env` 保留在本地。它会被 Git 忽略。 - 确保提交 `.env.example`。 - 推荐使用 `MAX_UPLOAD_SIZE_MB`。 - 为保持兼容性,仍支持 `MAX_UPLOAD_BYTES`。 - `MALVIZ_QUARANTINE_DIR` 应指向 Git 项目之外。 - 切勿使用 `frontend/public`、项目目录或任何同步文件夹进行隔离存储。 ## 如何运行 ### 选项 1:单命令本地启动 从全新克隆开始: ``` bun run setup ``` 此脚本会: - 安装 Bun 依赖项 - 启动 PostgreSQL 和 Redis - 应用数据库迁移 - 填充演示用户数据 - 验证填充的用户身份 - 创建 Python worker 虚拟环境 - 安装 worker 依赖项 - 启动 Python worker - 启动 Next.js 开发服务器 在以下地址打开应用程序: [http://localhost:3000](http://localhost:3000) ### 选项 2:Docker 热重载 在 Docker 中运行完整的开发技术栈: ``` bun run docker:dev ``` 这将启动: - PostgreSQL - Redis - 迁移和数据填充任务 - Next.js 开发服务器 - Python worker Web 和 worker 容器共享一个挂载在 `/quarantine` 的命名隔离卷。 使用以下命令停止 Docker 技术栈: ``` bun run docker:dev:down ``` ### 选项 3:手动设置 启动基础服务: ``` docker compose --project-directory . -f infra/docker/compose.yml up -d ``` 安装依赖项并准备数据库: ``` bun install bun run db:generate bun run db:migrate --name init bun run db:seed ``` 创建 Python worker 环境: ``` python3 -m venv backend/worker/python/.venv source backend/worker/python/.venv/bin/activate pip install -r backend/worker/python/requirements.txt ``` 启动 Web 应用程序: ``` bun run dev ``` 在另一个终端中启动 worker: ``` bun run worker:python ``` ## 如何使用该程序 1. 打开 [http://localhost:3000](http://localhost:3000)。 2. 选择一个预置的演示用户。 3. 前往 `/upload`。 4. 上传一个或多个文件。 5. MalViz 会验证文件元数据,将字节写入隔离存储,将元数据存储在 PostgreSQL 中,并创建扫描作业。 6. Python worker 会提取排队的作业并运行静态分析插件。 7. 前往 `/scans` 查看扫描历史记录。 8. 打开扫描详情页面以查看判定结论、分数、原因、指标、建议的操作和技术细节。 9. 管理员用户可以前往 `/admin` 审查可疑、恶意、未知或失败的扫描,并添加反馈备注。 有用的路由: | 路由 | 用途 | | --- | --- | | `/` | 登录 / 选择账户 | | `/dashboard` | 当前扫描概览 | | `/upload` | 上传待分析文件 | | `/scans` | 扫描历史记录 | | `/scans/[id]` | 扫描报告详情 | | `/admin` | 管理员审查队列 | | `/settings` | 账户和运行时设置 | 为了兼容性,旧的 `/results` 路由会重定向到 `/scans`。 ## 测试与验证 Python 测试脚本使用 `python3 -m pytest`,并将 `PYTHONPATH` 指向 `backend/worker/python`。在运行之前,请确保你的 `python3` 解释器可以使用 `pytest`。如果你使用虚拟环境,请先激活它。 运行主要检查: ``` bun run lint bunx tsc --noEmit bun run test bun run test:python bunx prisma validate --config config/prisma.config.ts bun run build ``` 手动验收检查: - 上传 `backend/tests/fixtures/samples/clean-note.txt` 并确认它获得了低风险结果。 - 上传 `backend/tests/fixtures/samples/suspicious-script.txt`、`backend/tests/fixtures/samples/network-indicators.log` 或 `backend/tests/fixtures/samples/base64-heavy.txt`,并确认报告解释了可疑信号。 - 确认上传的文件被写入 `MALVIZ_QUARANTINE_DIR` 目录下。 - 确认上传的文件未被写入 `frontend/public` 或 Git 项目目录下。 - 确认非管理员用户只能看到他们自己的扫描记录。 - 确认管理员用户可以审查可疑、恶意、未知和失败的扫描。 清理软删除的隔离文件: ``` bun run quarantine:prune ``` ## 安全说明 - 将每次上传都视为具有敌意。 - 不要执行上传的样本。 - Next.js 不得分析或执行文件内容。 - Python worker 仅执行静态分析。 - 原始文件名仅作为元数据存储。 - 存储的文件名基于 UUID。 - 原始文件字节保留在隔离存储中。 - 原始文件字节不存储在 PostgreSQL 中。 - 上传和扫描事件会被审计记录。 - 当 Redis 可用时,使用基于 Redis 的上传速率限制,并为本地开发提供内存中回退机制。 ## 当前项目状态 MalViz 目前具有: - 由服务模块支持的轻量级 API 路由 - 外部隔离存储 - PostgreSQL 元数据和结构化报告 - 基于 Redis/BullMQ 的上传端队列信号传递 - Python 静态分析 worker - 用于哈希计算、文件类型检测、字符串提取、熵分析和指标提取的模块化 worker 插件 - 可解释的风险评分 - 扫描历史记录和详情页面 - 管理员审查工作流 - 移动端导航 - 针对核心逻辑的 TypeScript 和 Python 测试覆盖率 剩余的战略工作: - 选择一个权威的生产环境队列源 - 为 Office、PDF、归档文件、JavaScript、PowerShell 和 PE 文件添加更深层的文件格式检测器 - 添加端到端的 UI 自动化 - 为更庞大的数据集添加更丰富的扫描过滤和分页功能
标签:DAST, Python, 云安全监控, 安全检测工具, 恶意软件分析, 搜索引擎查询, 文件隔离, 无后门, 测试用例, 自动化攻击, 请求拦截, 逆向工具, 静态分析