MalwareBazaar → CAPE → MISP Automated Pipeline
Dokumenteninformationen
| Attribut | Wert |
|---|---|
| Dokumentenversion | 1.0 |
| Erstellungsdatum | 2026-01-19 |
| Letzte Änderung | 2026-01-19 |
| Klassifizierung | INTERN |
| Zielgruppe | ITSO / Cyber Security Analyst Level 3 |
| Dokumentenverantwortlicher | IT-Sicherheitsbetrieb |
| Review-Zyklus | Quartalsweise |
- Zweck und Geltungsbereich
- Systemübersicht und Architektur
- Regulatorische Anforderungen
- Installation und Konfiguration
- Betriebsverfahren
- Wartungsverfahren
- Incident Response Prozeduren
- Troubleshooting
- Sicherheitsaspekte
- Anhänge
Dieses Betriebshandbuch dokumentiert den Betrieb des CAPE Feed Systems - einer automatisierten Pipeline zur Integration externer Threat Intelligence Feeds mit der CAPE Malware-Analyse-Plattform.
Das Handbuch gilt für:
- Die CAPE Feed-Installation unter
/opt/cape-feed/ - Die Docker-Container-Infrastruktur
- Die Anbindung an MalwareBazaar (abuse.ch)
- Die Anbindung an ransomware.live
CAPE Feed automatisiert die kontinuierliche Beschaffung und Analyse aktueller Malware-Samples:
- Polling: Regelmäßiger Abruf neuer Samples von Threat Intelligence Feeds
- Prefiltering: Optionale Vorfilterung nach Dateityp und Größe
- Download: Sichere Beschaffung der Malware-Samples
- Submission: Automatische Einreichung an CAPE Sandbox
- State Management: SQLite-basierte Deduplizierung
- Reporting: JSONL-Logging für SIEM-Integration
Quelle: /opt/cape-feed/app/feed2cape2misp.py:4-18
Mermaid-Diagramm (klicken zum Ausklappen)
flowchart TB
subgraph FEEDS["EXTERNE THREAT FEEDS"]
MB["MalwareBazaar<br/>abuse.ch<br/>Poll: 30s"]
RWL["ransomware.live<br/>Pro API<br/>Poll: 15 min"]
end
subgraph CONTAINER["Docker: cape-feed"]
Poll["1. Poll Feed APIs"]
State["2. Check State DB"]
Filter["3. Prefilter<br/>Max 10 MB"]
Download["4. Download Sample"]
Submit["5. Submit to CAPE"]
Log["6. Update State + Log"]
Poll --> State --> Filter --> Download --> Submit --> Log
end
subgraph STORAGE["Persistente Daten"]
StateDB["state.db"]
Reports["reports/feed2cape2misp.jsonl"]
Quarantine["quarantine/"]
Yara["yara/"]
end
FEEDS --> CONTAINER
CONTAINER -.-> STORAGE
CONTAINER --> CAPE["CAPE Sandbox<br/>/apiv2/tasks/create/file/"]
CAPE --> MISP["MISP<br/>Threat Intelligence Platform"]
style FEEDS fill:#667eea,color:#fff
style CONTAINER fill:#11998e,color:#fff
style CAPE fill:#ff0844,color:#fff
style MISP fill:#4facfe,color:#fff
ASCII-Diagramm (Legacy)
┌────────────────────────────────────────────────────────────────────────┐
│ CAPE Feed Pipeline (v1.7.0) │
├────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ Externe Threat Feeds │ │
│ ├──────────────────────────┬──────────────────────────────────┤ │
│ │ MalwareBazaar │ ransomware.live │ │
│ │ (abuse.ch) │ (Pro API) │ │
│ │ Poll: 30s │ Poll: 900s │ │
│ └──────────────────────────┴──────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ Docker Container: cape-feed │ │
│ │ /opt/cape-feed/app/feed2cape2misp.py │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ 1. Poll Feed APIs │ │
│ │ 2. Check State DB (Deduplizierung) │ │
│ │ 3. Prefilter (Größe, Typ) │ │
│ │ 4. Download Sample │ │
│ │ 5. Submit to CAPE │ │
│ │ 6. Update State + Log │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ CAPE Sandbox │ │
│ │ /apiv2/tasks/create/file/ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ Persistente Daten │ │
│ │ /opt/cape-feed/work/ │ │
│ │ ├── state.db (SQLite State) │ │
│ │ ├── reports/ (JSONL Logs) │ │
│ │ ├── quarantine/ (Fehlgeschlagene Downloads) │ │
│ │ └── yara/ (Ransomware.live YARA Rules) │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
└────────────────────────────────────────────────────────────────────────┘
| Feed | URL | Polling-Intervall | Authentifizierung |
|---|---|---|---|
| MalwareBazaar | https://mb-api.abuse.ch/api/v1/ | 30 Sekunden | API-Key |
| ransomware.live | https://api-pro.ransomware.live | 900 Sekunden | API-Key |
Quelle: /opt/cape-feed/.env:1-35
/opt/cape-feed/
├── app/
│ ├── feed2cape2misp.py # Hauptskript (v1.7.0)
│ └── requirements.txt # Python Dependencies
├── work/ # Persistente Daten (Volume)
│ ├── state.db # SQLite State-Datenbank
│ ├── reports/ # JSONL-Reports
│ │ └── feed2cape2misp.jsonl
│ ├── quarantine/ # Quarantäne bei Fehlern
│ └── yara/ # YARA-Rules von ransomware.live
├── .env # Konfiguration
├── docker-compose.yml # Docker-Compose-Datei
└── Dockerfile # Container-Image-Definition
| MaRisk-Anforderung | Umsetzung |
|---|---|
| AT 7.2 (IT-Risikomanagement) | Proaktive Threat Intelligence Integration |
| AT 4.3.2 (Risikoidentifikation) | Kontinuierliche Erfassung neuer Bedrohungen |
| BAIT-Kapitel | Relevanz | Maßnahme |
|---|---|---|
| IV. Informationssicherheit | Threat Intelligence | Automatisierte Feed-Integration |
| VIII. Outsourcing | Externe Dienste | abuse.ch und ransomware.live dokumentiert |
| DORA-Artikel | Anforderung | Umsetzung |
|---|---|---|
| Art. 5 | IKT-Risikomanagement | Automatische Threat-Erkennung |
| Art. 13 | Threat Intelligence | Integration externer Feeds |
| Control | Umsetzung |
|---|---|
| A.5.7 Threat Intelligence | Automatisierte Feed-Integration |
| A.12.2 Schutz vor Malware | Proaktive Sample-Analyse |
# Docker und Docker Compose prüfen
docker --version
docker-compose --version
# Container-Status
docker ps | grep cape-feedDie Konfiguration erfolgt über /opt/cape-feed/.env:
MalwareBazaar-Konfiguration:
# /opt/cape-feed/.env:1-6
MB_URL=https://mb-api.abuse.ch/api/v1/
MB_AUTH_KEY=316cbb787c01ca3eea2ec6899dd77c67ede2273c2b797e92
MB_QUERY=get_recent
MB_SELECTOR=time
MB_LIMIT=10Polling-Konfiguration:
# /opt/cape-feed/.env:8-11
POLL_SECONDS=30 # Polling-Intervall MalwareBazaar
PREFILTER_ENABLED=true # Vorfilterung aktiviert
MAX_MB_PER_FILE=10 # Max. 10 MB pro DateiCAPE-Integration:
# /opt/cape-feed/.env:13-20
CAPE_SUBMIT_URL=https://127.0.0.1/apiv2/tasks/create/file/
CAPE_TLS_VERIFY=false # Selbstsigniertes Zertifikat
CAPE_TAGS_DEFAULT=win11,x64 # Standard-Tags
CAPE_ALLOWED_TAGS=dotnet,dotnet6-9,java,pdf,vcredist,win11,x64
CAPE_RETRY_MAX=5 # Max. Retry-Versuche
CAPE_RETRY_BACKOFF_SECONDS=60Ransomware.live-Integration:
# /opt/cape-feed/.env:28-35
RWL_ENABLED=true
RWL_BASE_URL=https://api-pro.ransomware.live
RWL_API_KEY=b2963856-5ed9-4141-bdd9-93e1a4bb01bc
RWL_POLL_SECONDS=900 # Alle 15 Minuten
RWL_TIMEOUT_SECONDS=20
RWL_YARA_SYNC=false # YARA-Sync deaktiviert
RWL_YARA_DIR=/work/yaraQuelle: /opt/cape-feed/.env
# /opt/cape-feed/docker-compose.yml
version: "3.9"
services:
cape-feed:
image: cape-feed-cape-feed
container_name: cape-feed
restart: unless-stopped
env_file:
- .env
volumes:
- ./work:/work # Persistente Daten
network_mode: host # Für localhost->CAPE Zugriff
stop_grace_period: 30s # Sauberes ShutdownQuelle: /opt/cape-feed/docker-compose.yml
cd /opt/cape-feed
# Container starten
docker-compose up -d
# Logs verfolgen
docker-compose logs -f cape-feed
# Container-Status
docker-compose pscd /opt/cape-feed
# Graceful Stop (30s Wartezeit)
docker-compose down
# Sofortiger Stop
docker-compose killContainer-Logs:
# Live-Logs
docker logs -f cape-feed
# Letzte 100 Zeilen
docker logs --tail 100 cape-feedJSONL-Reports:
# Aktuelle Einträge
tail -f /opt/cape-feed/work/reports/feed2cape2misp.jsonl
# Statistik (letzte 24h)
cat /opt/cape-feed/work/reports/feed2cape2misp.jsonl | \
jq -r 'select(.event=="sample_submitted") | .sha256' | \
wc -lState-Datenbank:
# SQLite-Statistiken
sqlite3 /opt/cape-feed/work/state.db "SELECT COUNT(*) FROM samples;"
# Letzte 10 Samples
sqlite3 /opt/cape-feed/work/state.db \
"SELECT sha256, first_seen FROM samples ORDER BY first_seen DESC LIMIT 10;"# MalwareBazaar-Samples heute
cat /opt/cape-feed/work/reports/feed2cape2misp.jsonl | \
grep "$(date +%Y-%m-%d)" | \
jq -r 'select(.source=="malwarebazaar") | .sha256' | \
sort -u | wc -l
# ransomware.live-Samples heute
cat /opt/cape-feed/work/reports/feed2cape2misp.jsonl | \
grep "$(date +%Y-%m-%d)" | \
jq -r 'select(.source=="ransomware.live") | .sha256' | \
sort -u | wc -lDie SQLite-Datenbank wächst kontinuierlich:
# Datenbankgröße prüfen
ls -lh /opt/cape-feed/work/state.db
# Alte Einträge bereinigen (> 90 Tage)
sqlite3 /opt/cape-feed/work/state.db "
DELETE FROM samples
WHERE first_seen < datetime('now', '-90 days');
VACUUM;
"# JSONL-Logs komprimieren (älter als 7 Tage)
find /opt/cape-feed/work/reports -name "*.jsonl" -mtime +7 -exec gzip {} \;
# Alte komprimierte Logs löschen (älter als 180 Tage)
find /opt/cape-feed/work/reports -name "*.jsonl.gz" -mtime +180 -deletecd /opt/cape-feed
# Container stoppen
docker-compose down
# Image neu bauen
docker-compose build --no-cache
# Container starten
docker-compose up -dBei Kompromittierung oder planmäßiger Rotation:
# 1. Neuen Key in .env eintragen
nano /opt/cape-feed/.env
# 2. Container neu starten
docker-compose restart cape-feed
# 3. Logs auf Auth-Fehler prüfen
docker logs --tail 50 cape-feed | grep -i "auth\|error"Symptome: Keine neuen Samples, Fehler in Logs
Diagnose:
# API-Erreichbarkeit testen
curl -X POST https://mb-api.abuse.ch/api/v1/ \
-d "query=get_recent&selector=time"
# Container-Logs prüfen
docker logs --tail 100 cape-feed | grep -i errorMaßnahmen:
- API-Erreichbarkeit prüfen (Firewall, DNS)
- API-Key-Gültigkeit verifizieren
- Bei persistentem Ausfall: Alternative Feeds aktivieren
Symptome: Downloads erfolgreich, aber keine CAPE-Tasks
# Quarantäne-Verzeichnis prüfen
ls -la /opt/cape-feed/work/quarantine/
# CAPE-API-Erreichbarkeit testen
curl -k https://127.0.0.1/apiv2/cuckoo/status/Maßnahmen:
- CAPE-Services prüfen (
systemctl status cape*) - CAPE-Queue-Status prüfen
- Quarantäne-Samples manuell einreichen
# Speicherverbrauch
du -sh /opt/cape-feed/work/*
# Quarantäne bereinigen
rm -rf /opt/cape-feed/work/quarantine/*
# State-DB optimieren
sqlite3 /opt/cape-feed/work/state.db "VACUUM;"| Fehler | Ursache | Lösung |
|---|---|---|
Connection refused |
CAPE nicht erreichbar | CAPE-Services prüfen |
401 Unauthorized |
Ungültiger API-Key | Key in .env aktualisieren |
Sample already known |
Deduplizierung aktiv | Erwartetes Verhalten |
Prefilter: size exceeded |
Sample zu groß | MAX_MB_PER_FILE anpassen |
Download failed |
Feed-API-Problem | Retry-Mechanismus wartet ab |
# Container mit interaktiver Shell starten
docker-compose run --rm cape-feed /bin/sh
# Manueller Python-Test
python3 /app/feed2cape2misp.pyBei Korruption der State-Datenbank:
# Container stoppen
docker-compose down
# State-DB sichern und löschen
mv /opt/cape-feed/work/state.db /opt/cape-feed/work/state.db.backup
rm -f /opt/cape-feed/work/state.db-journal
# Container neu starten (erstellt neue DB)
docker-compose up -d- Container läuft im
host-Netzwerk für lokalen CAPE-Zugriff - Externe Verbindungen nur zu dokumentierten APIs
| Credential | Speicherort | Schutz |
|---|---|---|
| MB_AUTH_KEY | .env | Dateiberechtigung 640 |
| RWL_API_KEY | .env | Dateiberechtigung 640 |
- MalwareBazaar: HTTPS (TLS 1.2+)
- ransomware.live: HTTPS (TLS 1.2+)
- CAPE-API: Selbstsigniert (
CAPE_TLS_VERIFY=false)
Fehlgeschlagene Downloads werden in /opt/cape-feed/work/quarantine/ isoliert:
- Automatische Quarantäne bei Download-Fehlern
- Manuelle Prüfung vor Wiedereinsendung erforderlich
| Datei | Zweck |
|---|---|
/opt/cape-feed/.env |
Umgebungsvariablen |
/opt/cape-feed/docker-compose.yml |
Container-Orchestrierung |
/opt/cape-feed/Dockerfile |
Image-Definition |
/opt/cape-feed/work/state.db |
SQLite State-Datenbank |
# Container-Management
docker-compose up -d # Starten
docker-compose down # Stoppen
docker-compose restart cape-feed # Neustart
docker-compose logs -f cape-feed # Logs
# Monitoring
docker ps | grep cape-feed # Status
tail -f /opt/cape-feed/work/reports/feed2cape2misp.jsonl # Reports
# State-DB
sqlite3 /opt/cape-feed/work/state.db "SELECT COUNT(*) FROM samples;"| Feed | Beschreibung | Lizenz |
|---|---|---|
| MalwareBazaar | abuse.ch Malware-Repository | Kostenlos (Community) |
| ransomware.live | Ransomware Threat Intelligence | Pro API (kostenpflichtig) |
| Version | Datum | Autor | Änderung |
|---|---|---|---|
| 1.0 | 2026-01-19 | IT-Sicherheit | Initiale Erstellung |
Ende des Dokuments
Dieses Dokument unterliegt der Klassifizierung INTERN und darf nur innerhalb des Instituts verwendet werden.