Laakhishiv6/malware-analysis

GitHub: Laakhishiv6/malware-analysis

基于 EMBER 2018 LightGBM 模型的全栈恶意软件静态分析平台,上传 PE 文件即可秒级获得恶意性判定结果。

Stars: 0 | Forks: 0

# MalSand — AI 恶意软件分析平台 由 **EMBER 2018 LightGBM** 模型驱动的全栈恶意软件分析沙箱。 上传任何 PE 二进制文件,即可获得即时的静态分析判定结果:**MALICIOUS**(恶意)、**SUSPICIOUS**(可疑)或 **BENIGN**(良性)。 ## 技术栈 | 层级 | 技术 | |---|---| | 前端 | Next.js 15, TypeScript, TailwindCSS, shadcn/ui, Zustand | | 后端 | FastAPI (async), SQLAlchemy 2.0, PostgreSQL, Celery, Redis | | ML 模型 | EMBER 2018 LightGBM (2381特征静态 PE 分析) | | 认证 | JWT (access + refresh tokens), bcrypt | | 基础设施 | Docker Compose (6个服务) | ## 项目结构 ``` malware analysis project/ ├── backend/ # FastAPI application │ ├── main.py # App entry point │ ├── requirements.txt │ ├── Dockerfile │ └── app/ │ ├── api/v1/endpoints/ # REST endpoints (auth, analysis, health) │ ├── core/ │ │ ├── config.py # Pydantic settings │ │ ├── ember_model.py # LightGBM model loader + inference │ │ └── security.py # JWT + bcrypt │ ├── models/ # SQLAlchemy models (User, AnalysisJob) │ ├── repositories/ # Async DB repositories │ ├── services/ # Business logic (AuthService, AnalysisService) │ ├── tasks/ │ │ └── analysis_tasks.py # Celery task — runs EMBER inference │ └── websockets/ # WebSocket connection manager ├── frontend/ # Next.js application │ └── src/ │ ├── app/(dashboard)/analyses/page.tsx # Upload + results page │ ├── components/analysis/ # UploadZone, ResultCard │ ├── lib/api.ts # Axios client + analysisApi helpers │ └── types/index.ts # Shared TypeScript types ├── ember2018/ # Pre-trained model (you provide this) │ └── ember_model_2018.txt # LightGBM model file (121 MB) ├── tests/ # pytest test suite │ ├── conftest.py │ ├── test_ember_inference.py │ ├── test_analysis_api.py │ └── test_analysis_task.py ├── scripts/ │ └── test_model.py # CLI tool to test the model directly ├── docker-compose.yml └── .env.example ``` ## 前置条件 - [Docker Desktop](https://www.docker.com/products/docker-desktop/)(适用于推荐的 Docker 方式) - **或者** Python 3.12 + Node.js 18+(适用于本地开发) - 项目根目录下包含 `ember_model_2018.txt` 的 `ember2018/` 目录 ## 快速开始 — Docker Compose 这是运行完整技术栈最简单的方式。 ### 1. 克隆 / 打开项目 ``` cd "D:\malware analysis project" ``` ### 2. 创建您的 `.env` 文件 ``` # Windows PowerShell Copy-Item .env.example .env # macOS / Linux cp .env.example .env ``` 生成一个安全的 `SECRET_KEY` 并将其粘贴到 `.env` 中: ``` python -c "import secrets; print(secrets.token_urlsafe(64))" ``` 您的 `.env` 文件应如下所示: ``` SECRET_KEY= DEBUG=false DATABASE_URL=postgresql://malsand:malsand@postgres:5432/malsand REDIS_URL=redis://redis:6379/0 CORS_ORIGINS=["http://localhost:3000"] NEXT_PUBLIC_API_URL=http://localhost:8000 NEXT_PUBLIC_WS_URL=ws://localhost:8000 ``` ### 3. 构建并启动所有服务 ``` docker compose up --build ``` 首次构建需要几分钟时间(安装包括 LightGBM 和 LIEF 在内的 ML 依赖)。 ### 4. 打开应用 | 服务 | URL | |---|---| | **前端** | http://localhost:3000 | | **后端 API** | http://localhost:8000 | | **API 文档** | http://localhost:8000/api/docs *(需要 `DEBUG=true`)* | | **Celery Flower** | http://localhost:5555 | 注册账号并登录,然后在侧边栏导航至 **Analyses** 以上传文件。 ### 停止技术栈 ``` docker compose down # stop containers, keep data docker compose down -v # stop containers AND delete all data ``` ## 本地开发(不使用 Docker) 如果您希望后端和前端都启用热重载,请使用此方式。 ### 仅启动基础设施 ``` docker compose up postgres redis -d ``` ### 后端 ``` cd backend python -m venv .venv .venv\Scripts\Activate.ps1 # Windows PowerShell # source .venv/bin/activate # macOS / Linux pip install -r requirements.txt ``` 设置环境变量并启动服务器: ``` $env:DATABASE_URL = "postgresql://malsand:malsand@localhost:5432/malsand" $env:REDIS_URL = "redis://localhost:6379/0" $env:SECRET_KEY = "dev-secret-change-me" $env:EMBER_MODEL_DIR = "..\ember2018" $env:UPLOAD_DIR = ".\uploads" $env:DEBUG = "true" uvicorn main:app --host 0.0.0.0 --port 8000 --reload ``` ### Celery Worker(新终端) ``` cd backend .venv\Scripts\Activate.ps1 $env:DATABASE_URL = "postgresql://malsand:malsand@localhost:5432/malsand" $env:REDIS_URL = "redis://localhost:6379/0" $env:EMBER_MODEL_DIR = "..\ember2018" $env:UPLOAD_DIR = ".\uploads" celery -A app.tasks.celery_app worker --loglevel=info --concurrency=2 ``` ### 前端(新终端) ``` cd frontend npm install npm run dev ``` 打开 http://localhost:3000。 ## 环境变量 | 变量 | 默认值 | 描述 | |---|---|---| | `SECRET_KEY` | — | **必填。** JWT 签名密钥。使用 `secrets.token_urlsafe(64)` 生成 | | `DATABASE_URL` | `postgresql://malsand:malsand@postgres:5432/malsand` | PostgreSQL 连接字符串 | | `REDIS_URL` | `redis://redis:6379/0` | Redis 连接字符串 | | `EMBER_MODEL_DIR` | `../ember2018` | 包含 `ember_model_2018.txt` 的目录路径 | | `UPLOAD_DIR` | `./uploads` | 上传的样本文件存储位置 | | `DEBUG` | `false` | 启用 `/api/docs` 的 API 文档和 SQL 回显 | | `CORS_ORIGINS` | `["http://localhost:3000"]` | 允许的 CORS 源(JSON 数组) | | `ACCESS_TOKEN_EXPIRE_MINUTES` | `30` | JWT access token 有效期 | | `REFRESH_TOKEN_EXPIRE_DAYS` | `7` | JWT refresh token 有效期 | ## API 接口 ### 认证 ``` POST /api/v1/auth/register Register a new user POST /api/v1/auth/login Login → { access_token, refresh_token } POST /api/v1/auth/refresh Refresh access token ``` ### 分析 ``` POST /api/v1/analysis/upload Upload a binary → { job_id, status, filename } GET /api/v1/analysis/{job_id} Get job status and result GET /api/v1/analysis/?skip&limit List all analysis jobs ``` ### 其他 ``` GET /api/v1/health/ Health check WS /ws/analysis/{id} WebSocket for real-time updates ``` ## 分析工作原理 ``` User uploads file │ ▼ POST /api/v1/analysis/upload → SHA256 hash computed → File saved to uploads/ → AnalysisJob created (status=PENDING) → Celery task queued → Returns job_id immediately (HTTP 202) │ ▼ Celery Worker picks up task → Reads file bytes → EMBER PEFeatureExtractor → 2381-feature vector → LightGBM Booster.predict() → score [0, 1] → Maps score to verdict: ≥ 0.90 → MALICIOUS / HIGH ≥ 0.50 → MALICIOUS / MEDIUM ≥ 0.20 → SUSPICIOUS / LOW < 0.20 → BENIGN / HIGH → Updates AnalysisJob (status=COMPLETED) │ ▼ Frontend polls GET /api/v1/analysis/{job_id} every 2s → Displays verdict, score bar, SHA256, file size ``` ## 运行测试 ``` # 从项目根目录 cd "D:\malware analysis project" # 安装测试 deps(如果尚未在 venv 中) pip install pytest pytest-asyncio pytest-mock # 运行所有测试 pytest tests/ -v ``` 测试覆盖率: | 文件 | 测试内容 | |---|---| | `test_ember_inference.py` | `score_to_verdict`(8个参数化用例),带有模拟 LightGBM/ember 的 `predict_bytes` | | `test_analysis_api.py` | 上传 202,缺少文件 422,获取任务,404,无效 UUID,列表分页,limit 验证 | | `test_analysis_task.py` | 任务未找到路径,正常路径结果,文件缺失时设置 FAILED 状态 | ## 快速模型测试(无需服务器) 直接从命令行在任何文件上测试 EMBER 模型: ``` python scripts/test_model.py "C:\Windows\System32\notepad.exe" # 指向不同的模型目录 python scripts/test_model.py sample.exe --model-dir path/to/ember2018 ``` 示例输出: ``` [*] Loading model from ember2018\ember_model_2018.txt ... [+] Model loaded [*] Analysing notepad.exe (201,216 bytes) ... ================================================== File : notepad.exe Size : 201,216 bytes Score : 0.012341 [░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░] Verdict : BENIGN Confidence : HIGH ================================================== ``` ## 故障排除 **找不到 `ember_model_2018.txt`** 确保 `ember2018/` 目录位于项目根目录且包含 `ember_model_2018.txt`。在 Docker 中,这会作为只读卷自动挂载。 **`ember` 包安装失败** 手动安装依赖: ``` pip install lightgbm lief numpy pip install git+https://github.com/elastic/ember.git ``` **文件不是有效的 PE / 分数异常** EMBER 模型是在 Windows PE 文件(`.exe`、`.dll`、`.sys`)上训练的。上传非 PE 文件(脚本、压缩包、文档)将产生不可靠的分数。 **Celery 任务一直处于 PENDING 状态** Worker 容器(或本地 Celery 进程)未运行。请检查 `docker compose ps` 或手动启动 Worker。 **端口已被占用** 如果 3000、8000 或 5432 端口被占用,请在 `docker-compose.yml` 中修改主机端口(例如 `"8001:8000"`)。
标签:AI安全, AMSI绕过, Apex, AV绕过, bcrypt, Celery, Chat Copilot, DAST, DNS 反向解析, Docker, Docker Compose, EMBER, FastAPI, JWT, LightGBM, PE文件分析, PostgreSQL, Python, Redis, shadcn/ui, TailwindCSS, TypeScript, Zustand, 二进制分析, 云安全监控, 云安全运维, 人工智能, 威胁检测, 安全分析平台, 安全插件, 安全防御评估, 异步编程, 恶意软件分析, 搜索引擎查询, 无后门, 机器学习, 样本分析, 沙箱, 测试用例, 深度学习, 用户模式Hook绕过, 网络信息收集, 网络安全, 请求拦截, 逆向工具, 隐私保护, 静态分析