icepaule/IcePorge-MWDB-Feeder

GitHub: icepaule/IcePorge-MWDB-Feeder

一个自动化从多个威胁情报源聚合恶意软件样本并上传至 MWDB 仓库的 Docker 化管道工具。

Stars: 0 | Forks: 0

# IcePorge MWDB-Feeder **多源恶意软件样本聚合器** [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) 聚合来自多个威胁情报源的恶意软件样本,并将其上传至 MWDB。 # MWDB-Feeder 操作手册 - 多源恶意软件聚合器 **文档信息** | 属性 | 值 | |----------|------| | 文档版本 | 1.0 | | 创建日期 | 2026-01-22 | | 最后修改 | 2026-01-22 | | 分类 | 内部 | | 目标受众 | ITSO / 网络安全分析师 Level 3 | | 文档负责人 | IT 安全运营 | | 审查周期 | 每季度 | ## 目录 1. [目的与适用范围](#1-zweck-und-geltungsbereich) 2. [系统概览与架构](#2-systemübersicht-und-architektur) 3. [合规性要求](#3-regulatorische-anforderungen) 4. [安装与配置](#4-installation-und-konfiguration) 5. [操作流程](#5-betriebsverfahren) 6. [维护流程](#6-wartungsverfahren) 7. [事件响应程序](#7-incident-response-prozeduren) 8. [故障排除](#8-troubleshooting) 9. [安全注意事项](#9-sicherheitsaspekte) 10. [附录](#10-anhänge) ## 1. 目的与适用范围 ### 1.1 文档目的 本操作手册记录了 MWDB-Feeder 系统的运营情况,这是一条自动化 pipeline,用于从多个外部威胁情报源聚合恶意软件样本,并上传到 MWDB(Malware Database)仓库。 ### 1.2 适用范围 本手册适用于: - 位于 `/opt/mwdb-feeder/` 的 MWDB-Feeder 安装 - Docker 容器基础设施 - 与 MWDB-Core + Karton Stack 的集成 ### 1.3 系统目的 MWDB-Feeder 自动化地从各种“野外”来源持续获取恶意软件样本: 1. **轮询 (Polling)**:定期从多个威胁情报源获取新样本 2. **去重**:基于 SQLite 避免重复上传 3. **下载**:通过 Hash 校验安全获取恶意软件样本 4. **上传**:通过 mwdblib 自动上传至 MWDB 5. **打标 (Tagging)**:自动使用来源和恶意软件标签进行标记 6. **报告**:JSONL 日志记录,用于 SIEM 集成 ### 1.4 与 CAPE-Feed 的区别 | 方面 | CAPE-Feed | MWDB-Feeder | |--------|-----------|-------------| | **目标** | 直接提交至 CAPE | 构建 MWDB 仓库 | | **来源** | MalwareBazaar, ransomware.live | URLhaus, ThreatFox, Hybrid Analysis, (ANY.RUN) | | **Pipeline** | Feed → CAPE → MISP | Feed → MWDB → Karton → CAPE | | **侧重点** | 专注于勒索软件 | 广泛的恶意软件类型 | **来源**:`/opt/mwdb-feeder/app/feeder.py:1-14` ## 2. 系统概览与架构 ### 2.1 架构图 ![MWDB-Feeder 架构](https://static.pigsec.cn/wp-content/uploads/repos/cas/46/46f67d2f0ecff31cb427f5ac1780a0d89d1ead873e1c2dfe4df5aa977e54f8fc.svg)
Mermaid 图(点击展开) ``` flowchart TB subgraph FEEDS["EXTERNE THREAT FEEDS"] URLhaus["URLhaus
abuse.ch
Poll: 5 min"] ThreatFox["ThreatFox
abuse.ch
Poll: 5 min"] Hybrid["Hybrid Analysis
Falcon Sandbox
Poll: 15 min"] AnyRun["ANY.RUN
API-Key nötig
Deaktiviert"] end subgraph CONTAINER["Docker: mwdb-feeder"] Poll["1. Poll Feed APIs"] Dedupe["2. Deduplizierung
SQLite"] Download["3. Download
+ Hash-Verify"] Upload["4. Upload + Tags
via mwdblib"] Poll --> Dedupe --> Download --> Upload end subgraph STORAGE["Persistente Daten"] StateDB["state.db"] Reports["reports/mwdb-feeder.jsonl"] end FEEDS --> CONTAINER CONTAINER --> MWDB["MWDB-Core
http://mwdb:8080/api"] CONTAINER -.-> STORAGE subgraph KARTON["Karton Pipeline"] Classifier["classifier"] Archive["archive-extractor"] Config["config-extractor"] CapeSubmit["cape-submitter"] Classifier --> Archive --> Config --> CapeSubmit end MWDB --> KARTON CapeSubmit --> CAPE["CAPE Sandbox"] style FEEDS fill:#667eea,color:#fff style CONTAINER fill:#11998e,color:#fff style MWDB fill:#f093fb,color:#fff style KARTON fill:#4facfe,color:#fff style CAPE fill:#ff0844,color:#fff ```
ASCII 图(旧版) ``` ┌────────────────────────────────────────────────────────────────────────┐ │ MWDB-Feeder Pipeline (v1.0.0) │ ├────────────────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ Externe Threat Feeds │ │ │ ├─────────────┬─────────────┬─────────────┬───────────────────┤ │ │ │ URLhaus │ ThreatFox │ Hybrid │ ANY.RUN │ │ │ │ (abuse.ch) │ (abuse.ch) │ Analysis │ (API-Key) │ │ │ │ Poll: 5min │ Poll: 5min │ Poll: 15min│ Poll: 10min │ │ │ └─────────────┴─────────────┴─────────────┴───────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ Docker Container: mwdb-feeder │ │ │ │ /opt/mwdb-feeder/app/feeder.py │ │ │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 1. Poll Feed APIs (parallel) │ │ │ │ 2. Check State DB (SQLite Deduplizierung) │ │ │ │ 3. Size Check (max 50 MB) │ │ │ │ 4. Download Sample + Hash Verify │ │ │ │ 5. Upload to MWDB via mwdblib │ │ │ │ 6. Add Tags (source, malware family, verdict) │ │ │ │ 7. Update State + JSONL Log │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ MWDB-Core │ │ │ │ http://mwdb:8080/api │ │ │ │ (Docker-Netzwerk) │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ Karton Pipeline │ │ │ │ classifier → archive-extractor → config-extractor │ │ │ │ ↓ │ │ │ │ cape-submitter → CAPE Sandbox │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ Persistente Daten │ │ │ │ /opt/mwdb-feeder/work/ │ │ │ │ ├── state.db (SQLite State) │ │ │ │ └── reports/ (JSONL Logs) │ │ │ │ └── mwdb-feeder.jsonl │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ └────────────────────────────────────────────────────────────────────────┘ ```
### 2.2 威胁情报源 | Feed | URL | 轮询 | 认证 | 状态 | 描述 | |------|-----|---------|------|--------|--------------| | URLhaus | https://urlhaus-api.abuse.ch/v1/ | 5 分钟 | Auth-Key | ✅ 激活 | 恶意软件 Payloads(ZIP 加密) | | ThreatFox | https://threatfox-api.abuse.ch/api/v1/ | 5 分钟 | Auth-Key | ✅ 激活 | IOCs(仅记录 Hash,不下载) | | Hybrid Analysis | https://www.hybrid-analysis.com/api/v2/ | 15 分钟 | API-Key | ✅ 激活 | Falcon Sandbox 公共 Feed | | ANY.RUN | https://api.any.run/v1/ | 10 分钟 | API-Key | ❌ 需要 API-Key | 需要付费计划 | **来源**:`/opt/mwdb-feeder/.env` ### 2.3 目录结构 ``` /opt/mwdb-feeder/ ├── app/ │ ├── feeder.py # Hauptskript (v1.0.0) │ └── requirements.txt # Python Dependencies ├── work/ # Persistente Daten (Volume) │ ├── state.db # SQLite State-Datenbank │ └── reports/ # JSONL-Reports │ └── mwdb-feeder.jsonl ├── .env # Konfiguration (API-Keys) ├── docker-compose.yml # Docker-Compose-Datei └── Dockerfile # Container-Image-Definition ``` ### 2.4 Feed 详情 #### URLhaus (abuse.ch) - **数据格式**:ZIP 加密的恶意软件样本 - **密码**:`infected` - **Hash 校验**:解压后进行 SHA256 校验 - **标签**:`source:urlhaus`, `malware:{signature}` #### ThreatFox (abuse.ch) - **数据格式**:基于 Hash 的 IOCs(无直接下载) - **用途**:记录 SHA256 Hash 以供交叉引用 - **标签**:`source:threatfox` #### Hybrid Analysis (Falcon Sandbox) - **数据格式**:原始二进制文件或 GZIP 压缩文件 - **限制**:并非所有样本都可下载(HTTP 400) - **标签**:`source:hybrid_analysis`, `verdict:{verdict}`, `malware:{vx_family}` #### ANY.RUN - **状态**:需要付费 API-Key(Searcher 计划或更高) - **API-Key**:https://app.any.run/profile → API & Limits - **注意**:网页抓取会被 Cloudflare 拦截 ## 3. 合规性要求 ### 3.1 BaFin / MaRisk | MaRisk 要求 | 实施方式 | |-------------------|-----------| | AT 7.2(IT 风险管理) | 多源威胁情报聚合 | | AT 4.3.2(风险识别) | 持续捕获新威胁 | ### 3.2 BAIT | BAIT 章节 | 相关性 | 措施 | |--------------|----------|----------| | IV. 信息安全 | 威胁情报 | 自动化多 Feed 集成 | | VIII. 外包 | 外部服务 | abuse.ch,Hybrid Analysis 已记录在案 | ### 3.3 DORA | DORA 条款 | 要求 | 实施方式 | |--------------|-------------|-----------| | 第 5 条 | ICT 风险管理 | 自动化威胁检测 | | 第 13 条 | 威胁情报 | 集成多个外部 Feed | ### 3.4 ISO 27001 | 控制 | 实施方式 | |---------|-----------| | A.5.7 威胁情报 | 多源 Feed 集成 | | A.12.2 防范恶意软件 | 通过 MWDB/Karton 进行主动样本分析 | ## 4. 安装与配置 ### 4.1 前置条件 ``` # 检查 Docker 和 Docker Compose docker --version docker compose version # MWDB-Core Stack 必须运行 cd /opt/mwdb-core docker compose ps ``` ### 4.2 环境变量 配置通过 `/opt/mwdb-feeder/.env` 进行: **MWDB 连接**: ``` # /opt/mwdb-feeder/.env MWDB_URL=http://mwdb:8080/api MWDB_API_KEY=eyJ0eXAiOiJKV1Q... # JWT Token aus MWDB UI ``` **URLhaus (abuse.ch)**: ``` URLHAUS_ENABLED=true URLHAUS_URL=https://urlhaus-api.abuse.ch/v1/ URLHAUS_AUTH_KEY=b3437fd58ef417... # abuse.ch Auth-Key URLHAUS_POLL_SECONDS=300 URLHAUS_ZIP_PASSWORD=infected ``` **ThreatFox (abuse.ch)**: ``` THREATFOX_ENABLED=true THREATFOX_URL=https://threatfox-api.abuse.ch/api/v1/ THREATFOX_AUTH_KEY=b3437fd58ef417... # Gleicher abuse.ch Auth-Key THREATFOX_POLL_SECONDS=300 ``` **Hybrid Analysis**: ``` HYBRID_ANALYSIS_ENABLED=true HYBRID_ANALYSIS_API_KEY=nzkq8o2t310c9d... # Von hybrid-analysis.com HYBRID_ANALYSIS_POLL_SECONDS=900 ``` **ANY.RUN**(可选 - 付费): ``` ANYRUN_ENABLED=false ANYRUN_API_KEY= # API-Key von any.run/profile ANYRUN_POLL_SECONDS=600 ``` **通用设置**: ``` WORK_DIR=/work STATE_DB=/work/state.db REPORT_PATH=/work/reports/mwdb-feeder.jsonl MAX_MB_PER_FILE=50 # Max. Dateigröße in MB ``` **来源**:`/opt/mwdb-feeder/.env` ### 4.3 Docker-Compose 配置 ``` # /opt/mwdb-feeder/docker-compose.yml services: mwdb-feeder: build: . container_name: mwdb-feeder restart: unless-stopped env_file: - .env volumes: - ./work:/work networks: - mwdb-core_default # Verbindung zum MWDB-Stack stop_grace_period: 30s networks: mwdb-core_default: external: true ``` **来源**:`/opt/mwdb-feeder/docker-compose.yml` ### 4.4 获取 API-Key | 服务 | 注册 | 费用 | |--------|---------------|--------| | abuse.ch (URLhaus/ThreatFox) | https://auth.abuse.ch/ | 免费 | | Hybrid Analysis | https://www.hybrid-analysis.com/signup | 免费(有速率限制) | | ANY.RUN | https://app.any.run/ → Profile → API | 付费(Searcher 计划) | ## 5. 操作流程 ### 5.1 启动容器 ``` cd /opt/mwdb-feeder # 启动 Container docker compose up -d # 跟踪 Logs docker compose logs -f mwdb-feeder # Container 状态 docker compose ps ``` ### 5.2 停止容器 ``` cd /opt/mwdb-feeder # 优雅停止(等待30秒) docker compose down # 立即停止 docker compose kill ``` ### 5.3 重建容器 在修改 `feeder.py` 或 `.env` 后: ``` cd /opt/mwdb-feeder # 使用 Cache 重新构建 docker compose build && docker compose up -d # 不使用 Cache 重新构建(在 Dependency 更改时) docker compose build --no-cache && docker compose up -d ``` ### 5.4 监控 **容器日志**: ``` # 实时 Logs docker logs -f mwdb-feeder # 最后 100 行 docker logs --tail 100 mwdb-feeder # 仅显示错误 docker logs mwdb-feeder 2>&1 | grep -i error ``` **JSONL 报告**: ``` # 当前条目 tail -f /opt/mwdb-feeder/work/reports/mwdb-feeder.jsonl # 今日上传 cat /opt/mwdb-feeder/work/reports/mwdb-feeder.jsonl | \ grep "$(date +%Y-%m-%d)" | \ jq -r 'select(.uploaded==true) | .sha256' | wc -l ``` **状态数据库**: ``` # 已处理 Sample 总数 sqlite3 /opt/mwdb-feeder/work/state.db "SELECT COUNT(*) FROM processed;" # 最后 10 个 Sample sqlite3 /opt/mwdb-feeder/work/state.db \ "SELECT sha256, source, processed_at FROM processed ORDER BY processed_at DESC LIMIT 10;" # 按来源统计 sqlite3 /opt/mwdb-feeder/work/state.db \ "SELECT source, COUNT(*) as count FROM processed GROUP BY source;" ``` ### 5.5 Feed 统计 ``` # 按来源上传(今日) for source in urlhaus hybrid_analysis anyrun; do count=$(cat /opt/mwdb-feeder/work/reports/mwdb-feeder.jsonl | \ grep "$(date +%Y-%m-%d)" | \ jq -r "select(.source==\"$source\" and .uploaded==true) | .sha256" | wc -l) echo "$source: $count" done ``` ## 6. 维护流程 ### 6.1 状态数据库维护 ``` # 检查数据库大小 ls -lh /opt/mwdb-feeder/work/state.db # 清理旧条目(> 90 天) sqlite3 /opt/mwdb-feeder/work/state.db " DELETE FROM processed WHERE processed_at < datetime('now', '-90 days'); VACUUM; " ``` ### 6.2 日志轮转 ``` # 压缩 JSONL-Logs(早于 7 天) find /opt/mwdb-feeder/work/reports -name "*.jsonl" -mtime +7 -exec gzip {} \; # 删除旧的压缩 Logs(早于 180 天) find /opt/mwdb-feeder/work/reports -name "*.jsonl.gz" -mtime +180 -delete ``` ### 6.3 API-Key 轮换 ``` # 1. 在 .env 中输入新 Key nano /opt/mwdb-feeder/.env # 2. 重启 Container docker compose restart mwdb-feeder # 3. 检查 Logs 中的 Auth 错误 docker logs --tail 50 mwdb-feeder | grep -i "auth\|error\|401" ``` ### 6.4 更新 MWDB API-Key 如果 MWDB API-Key 过期: ``` # 1. 在 MWDB UI 中生成新 Key # https://:8443/ → Profile → API Keys # 2. 输入到 .env 中 nano /opt/mwdb-feeder/.env # MWDB_API_KEY= # 3. 重启 Container docker compose restart mwdb-feeder ``` ## 7. 事件响应程序 ### 7.1 Feed 故障 **症状**:没有来自某一来源的新样本,日志中出现错误 **诊断**: ``` # 测试 URLhaus API curl -s -H "Auth-Key: $URLHAUS_AUTH_KEY" \ "https://urlhaus-api.abuse.ch/v1/payloads/recent/?limit=1" | jq .query_status # 测试 Hybrid Analysis API curl -s -H "api-key: $HYBRID_ANALYSIS_API_KEY" \ -H "User-Agent: Falcon Sandbox" \ "https://www.hybrid-analysis.com/api/v2/feed/latest" | head -100 # 检查 Container-Logs docker logs --tail 100 mwdb-feeder | grep -i error ``` **措施**: 1. 检查 API 可达性(防火墙,DNS) 2. 验证 API-Key 有效性 3. 检查速率限制(特别是 Hybrid Analysis) 4. 如果故障持续:暂时禁用该来源 ### 7.2 MWDB 上传错误 **症状**:下载成功,但没有 MWDB 上传 ``` # 测试 MWDB 可达性 curl -s -H "Authorization: Bearer $MWDB_API_KEY" \ "http://mwdb:8080/api/ping" # 检查 MWDB-Container cd /opt/mwdb-core && docker compose ps ``` **措施**: 1. 检查 MWDB 服务 2. 验证 API-Key 有效性 3. 检查容器之间的网络连接 ### 7.3 存储空间问题 ``` # 内存消耗 du -sh /opt/mwdb-feeder/work/* # 优化 State-DB sqlite3 /opt/mwdb-feeder/work/state.db "VACUUM;" ``` ## 8. 故障排除 ### 8.1 常见错误 | 错误 | 原因 | 解决方案 | |--------|---------|--------| | `MWDB client not available` | API-Key 无效 | 在 MWDB UI 中检查/更新 Key | | `Invalid ZIP and hash mismatch` | URLhaus 下载损坏 | 正常现象,将被跳过 | | `Hybrid Analysis download failed: 400` | 样本无法下载 | 正常现象(API 限制) | | `ANY.RUN: API key invalid` | 无/错误的 API-Key | 购买付费计划 | | `too large (X bytes)` | 样本超过 MAX_MB | 预期行为 | ### 8.2 调试模式 ``` # 使用 Shell 启动 Container docker compose run --rm mwdb-feeder /bin/sh # 手动 Python 测试 python3 /app/feeder.py ``` ### 8.3 状态重置 如果状态数据库损坏: ``` # 停止 Container docker compose down # 备份并删除 State-DB mv /opt/mwdb-feeder/work/state.db /opt/mwdb-feeder/work/state.db.backup rm -f /opt/mwdb-feeder/work/state.db-journal # 重启 Container(创建新 DB) docker compose up -d ``` **注意**:状态重置后,已存在于 MWDB 中的样本将被再次处理,但 mwdblib 会自动识别重复项。 ## 9. 安全注意事项 ### 9.1 网络隔离 - 容器仅与 MWDB 网络通信 - 外部连接仅指向已记录的 API(HTTPS) ### 9.2 凭据管理 | 凭据 | 存储位置 | 保护 | |------------|-------------|--------| | MWDB_API_KEY | .env | 文件权限 640 | | URLHAUS_AUTH_KEY | .env | 文件权限 640 | | HYBRID_ANALYSIS_API_KEY | .env | 文件权限 640 | | ANYRUN_API_KEY | .env | 文件权限 640 | ``` # 设置权限 chmod 640 /opt/mwdb-feeder/.env ``` ### 9.3 TLS 配置 | 连接 | TLS | 备注 | |------------|-----|-----------| | URLhaus API | HTTPS (TLS 1.2+) | abuse.ch | | ThreatFox API | HTTPS (TLS 1.2+) | abuse.ch | | Hybrid Analysis | HTTPS (TLS 1.2+) | Falcon Sandbox | | MWDB API | HTTP | Docker 内部网络 | ### 9.4 Hash 校验 所有下载在上传前都会进行 SHA256 校验: - URLhaus:在 ZIP 解压后 - Hybrid Analysis:在可选的 GZIP 解压后 - ANY.RUN:在下载后直接进行 ## 10. 附录 ### 10.1 配置文件参考 | 文件 | 用途 | |-------|-------| | `/opt/mwdb-feeder/.env` | 环境变量 + API-Keys | | `/opt/mwdb-feeder/docker-compose.yml` | 容器编排 | | `/opt/mwdb-feeder/Dockerfile` | 镜像定义 | | `/opt/mwdb-feeder/app/feeder.py` | 主脚本 | | `/opt/mwdb-feeder/work/state.db` | SQLite 状态数据库 | ### 10.2 命令参考 ``` # Container 管理 docker compose up -d # Starten docker compose down # Stoppen docker compose restart mwdb-feeder # Neustart docker compose logs -f mwdb-feeder # Logs docker compose build --no-cache # Rebuild # 监控 docker ps | grep mwdb-feeder # Status tail -f /opt/mwdb-feeder/work/reports/mwdb-feeder.jsonl # Reports # State-DB sqlite3 /opt/mwdb-feeder/work/state.db "SELECT COUNT(*) FROM processed;" sqlite3 /opt/mwdb-feeder/work/state.db "SELECT source, COUNT(*) FROM processed GROUP BY source;" ``` ### 10.3 Feed 来源概览 | Feed | 提供商 | 类型 | 费用 | 注册 | |------|----------|-----|--------|---------------| | URLhaus | abuse.ch | 恶意软件 Payloads | 免费 | https://auth.abuse.ch/ | | ThreatFox | abuse.ch | IOCs(基于 Hash) | 免费 | https://auth.abuse.ch/ | | Hybrid Analysis | CrowdStrike | 沙箱样本 | 免费(有速率限制) | https://www.hy-analysis.com/signup | | ANY.RUN | ANY.RUN Ltd | 沙箱样本 | 付费 | https://app.any.run/ | ### 10.4 与 MWDB + Karton 的交互 ``` mwdb-feeder │ ▼ ┌─────────────────┐ │ MWDB │ ← Sample-Repository │ (Port 8081) │ └────────┬────────┘ │ Karton Task ▼ ┌─────────────────┐ │ karton-system │ ← Task-Dispatcher └────────┬────────┘ │ ┌────┴────┬────────────┐ ▼ ▼ ▼ ┌────────┐ ┌────────┐ ┌──────────────┐ │class- │ │archive-│ │cape-submitter│ │ifier │ │extract │ │ → CAPE │ └────────┘ └────────┘ └──────────────┘ ``` ### 10.5 凭据参考 所有访问凭据均记录在: - `/root/.claude/mwdb-credentials.md` ### 10.6 修订历史 | 版本 | 日期 | 作者 | 更改 | |---------|-------|-------|----------| | 1.0 | 2026-01-22 | IT 安全 | 初始创建 | **文档结束** *本文档分类为内部机密,仅供机构内部使用。*
标签:DAST, PB级数据处理, 入侵检测系统, 威胁情报, 安全数据湖, 安全运维, 开发者工具, 恶意软件分析, 自动化采集, 请求拦截, 逆向工具