
Agentisches Gedächtnis für CTI in Python — STIX-Wissensgraphen, Auflösung von Bedrohungsakteur-Aliasen, offline-first RAG, MCP-Server für Claude Code und LangChain-Agenten
Das einzige agentische Gedächtnissystem, das für Cyber Threat Intelligence entwickelt wurde.
Wenn ein erfahrener Analyst geht, verschwinden zwei oder drei Jahre Kontext mit ihm – Kundenumgebungen, frühere Untersuchungen, TTPs von Akteuren, False-Positive-Muster, jedes mühsam erworbene "Moment mal, das haben wir schon einmal gesehen." ZettelForge ist ein agentisches Gedächtnissystem, das dafür sorgt, dass der Kontext beim Team bleibt.
Es extrahiert CVEs, Bedrohungsakteure, IOCs und ATT&CK-Techniken aus Analystennotizen und Bedrohungsberichten, löst Aliase auf (APT28 = Fancy Bear = STRONTIUM = Sofacy), baut einen STIX 2.1-Wissensgraphen auf und gibt jede vergangene Untersuchung an Ihre Analysten – und über MCP an Claude Code – in natürlicher Sprache zurück. Läuft vollständig prozessintern. Keine API-Schlüssel. Keine Cloud. Keine Daten verlassen den Host.
Star · pip install zettelforge · Dokumentation · ThreatRecall (gehostet) · Changelog
v2.6.2 (2026-04-27): Der Konfigurations-Webeditor wird mit funktionierenden Dropdowns für alle Enum-Felder (LLM/Embedding-Anbieter, Log-Level, PII-Aktion, Syntheseformat) und einem funktionierenden "Übernehmen"-Button ausgeliefert. Neue
[crewai]-Erweiterung macht ZettelForge als CrewAI-Tools verfügbar –pip install zettelforge[crewai]. Vollständiger Changelog
Wenn ZettelForge in Ihren CTI-Workflow passt, ist ein Star das schnellste Signal, dass sich eine weitere Investition in diese Kategorie lohnt.
Jedes SOC verliert Analysten. Wenn sie gehen, verschwinden Untersuchungskontext, Akteurszuschreibungen und umgebungsspezifische False-Positive-Muster mit ihnen. Ihre Ersatzleute öffnen dieselben Tickets erneut, lesen dieselben Berichte und bauen dieselben mentalen Modelle von Grund auf neu auf.
Allgemeine KI-Gedächtnissysteme beheben dies nicht für Sicherheitsteams. Sie können APT28 nicht von Fancy Bear unterscheiden, wissen nicht, dass CVE-2024-3094 die XZ-Utils-Hintertür ist, können Sigma oder YARA nicht parsen und haben kein Konzept von MITRE ATT&CK-Technik-IDs. Wenn ein CTI-Analyst ihnen ein Jahr an Intel-Berichten gibt, erhalten sie unscharfe semantische Suche über den Chatverlauf zurück.
ZettelForge wurde für Analysten entwickelt, die in Bedrohungsgraphen denken. Es extrahiert automatisch CVEs, Bedrohungsakteure, IOCs und ATT&CK-Techniken, löst Aliase über Namenskonventionen hinweg auf, baut einen Wissensgraphen mit kausalen Beziehungen auf und ruft Erinnerungen mittels absichtsbewusster gemischter Suche ab – alles prozessintern, ohne externe API-Abhängigkeit.
Gedächtniserweiterung schließt 33 % der Lücke zwischen kleinen und großen Modellen bei CTI-Aufgaben (CTI-REALM, Microsoft 2026, mit GPT-4 als Baseline für große Modelle). Siehe vollständiger Benchmark-Bericht für Methodik und Vergleiche.
| Fähigkeit | ZettelForge | Mem0 | Graphiti | Cognee |
|---|---|---|---|---|
| CTI-Entitätsextraktion (CVEs, Akteure, IOCs) | Ja | Nein | Nein | Nein |
| STIX 2.1-Ontologie | Ja | Nein | Nein | Nein |
| Bedrohungsakteur-Alias-Auflösung | Ja (APT28 = Fancy Bear) | Nein | Nein | Nein |
| Wissensgraph mit kausalen Tripeln | Ja | Nein | Ja | Ja |
| Absichtsklassifizierte Abfrage (5 Typen) | Ja | Nein | Nein | Nein |
| Prozessintern / keine externe API erforderlich | Ja | Nein | Nein | Nein |
| Prüfprotokolle im OCSF-Schema | Ja | Nein | Nein | Nein |
| MCP-Server (Claude Code) | Ja | Nein | Nein | Nein |
Entitätsextraktion – Automatische Identifizierung von CVEs, Bedrohungsakteuren, IOCs (IPs, Domains, Hashes, URLs, E-Mails), MITRE ATT&CK-Techniken, Kampagnen, Eindringungssets, Tools, Personen, Orten und Organisationen. Regex + LLM NER mit durchgängiger STIX 2.1-Typisierung.
Wissensgraph – Entitäten werden Knoten, Ko-Vorkommen wird zu Kanten. Das LLM leitet kausale Tripel ab ("APT28 verwendet Cobalt Strike"). Zeitkanten und Supersession verfolgen, wie sich Intelligence entwickelt.
Alias-Auflösung – APT28, Fancy Bear, Sofacy, STRONTIUM werden alle auf denselben Akteursknoten aufgelöst. Funktioniert automatisch beim Speichern und Abrufen.
Gemischte Abfrage – Vektorähnlichkeit (768-dim fastembed, ONNX) + Graphdurchquerung (BFS über Wissensgraphenkanten), gewichtet nach Absichtsklassifikation. Fünf Absichtstypen: faktisch, zeitlich, relational, explorativ, kausal.
Gedächtnisevolution – Mit evolve=True wird neuer Intel mit vorhandenem Gedächtnis verglichen. Das LLM entscheidet über HINZUFÜGEN, AKTUALISIEREN, LÖSCHEN oder NICHTSTUN. Veralteter Intel wird ersetzt. Widersprüche werden aufgelöst. Duplikate werden übersprungen.
RAG-Synthese – Synthetisiert Antworten über alle gespeicherten Erinnerungen hinweg mit dem direct_answer-Format.
Architekturbedingt prozessintern – fastembed (ONNX) für Embeddings, llama-cpp-python für optionale lokale LLM-Inferenz, SQLite + LanceDB für Speicherung und standardmäßig Ollama auf localhost. Es sind keine externen API-Schlüssel erforderlich. Ausgehender Netzwerkzugriff kann beim ersten Ausführen auftreten, wenn Embedding-/LLM-Modelle heruntergeladen werden; nach dem Vorladen der Modelle kann es vollständig offline (auch auf luftspaltengetrennten Hosts) ausgeführt werden.
Prüfprotokollierung im OCSF-Schema – Jeder Vorgang sendet ein strukturiertes Ereignis im Open Cybersecurity Schema Framework-Format. Was Sie mit dem Protokollstrom machen (SIEM, WORM-Speicher, nichts), bleibt Ihnen überlassen.
pip install zettelforge
from zettelforge import MemoryManager
mm = MemoryManager()
# CTI speichern – Entitäten (CVEs, Akteure, ATT&CK-IDs, IOCs) werden via Regex extrahiert
mm.remember("APT28 verwendet Cobalt Strike für seitliche Bewegungen via T1021")
mm.remember("APT28 (Fancy Bear) greift NATO-Verteidigungsunternehmen mit Spear-Phishing an")
mm.remember("CVE-2024-3094 ist die XZ-Utils-Hintertür (CVSS 10.0), die sshd betrifft")
# Abrufen kombiniert Vektor- + Graphsuche; Alias-Auflösung wird aktiv (Fancy Bear -> APT28)
for note in mm.recall("Welche Tools verwendet Fancy Bear?", k=3):
print(f"[{note.metadata.tier}] {note.content.raw}")
Das funktioniert mit einer frischen pip install ohne externe Dienste. Embeddings laufen prozessintern via fastembed (~80 MB ONNX-Modell, das beim ersten Aufruf heruntergeladen wird). MemoryManager() schreibt standardmäßig nach ~/.amem/; überschreiben mit ZETTELFORGE_DATA_DIR oder per Konfiguration. Eine ausführbare Kopie befindet sich unter examples/quickstart.py.
ollama pull qwen3.5:9b && ollama serve
# Wenn Ollama läuft, gibt synthesize() eine echte Zusammenfassung über alle gespeicherten Notizen zurück
answer = mm.synthesize("Fasse bekannte APT28-TTPs zusammen")
print(answer["synthesis"]["answer"])
# Die Hintergrund-LLM-NER reichert die gespeicherten Notizen ebenfalls mit zusätzlichen Entitäten an
ZettelForge erkennt Ollama automatisch. Um einen anderen Anbieter zu verwenden (local llama-cpp, litellm für über 100 Anbieter, mock für Tests), siehe Konfiguration. Ohne LLM gibt synthesize() immer noch eine strukturierte Antwort zurück, aber das Feld answer ist ein Platzhalter – nur remember und recall liefern im reinen Pip-Modus nützliche Ergebnisse.
# Neuer Intel trifft ein – evolve=True aktiviert die Gedächtnisevolution:
# Das LLM extrahiert Fakten, vergleicht sie mit vorhandenen Notizen und entscheidet HINZUFÜGEN/AKTUALISIEREN/LÖSCHEN/NICHTSTUN
mm.remember(
"APT28 hat seine Taktiken geändert. Sie haben DROPBEAR fallen gelassen und nutzen jetzt Edge-Geräte aus.",
domain="cti",
evolve=True, # vorhandene APT28-Notiz wird ersetzt, nicht dupliziert
)
Jeder remember()-Aufruf löst eine Pipeline aus:
Jeder recall()-Aufruf kombiniert zwei Abrufstrategien:
pip install zettelforge
Erstellen oder bearbeiten Sie .claude.json in Ihrem Projektstammverzeichnis (oder ~/.claude/.claude.json für globalen Zugriff):
{
"mcpServers": {
"zettelforge": {
"command": "python3",
"args": ["-m", "zettelforge.mcp"]
}
}
}
Wenn ZettelForge in einer virtuellen Umgebung installiert ist, verwenden Sie den vollständigen Pfad zu diesem Python-Interpreter:
{
"mcpServers": {
"zettelforge": {
"command": "/home/user/.venvs/zettelforge/bin/python",
"args": ["-m", "zettelforge.mcp"]
}
}
}
Starten Sie Claude Code und überprüfen Sie, ob die Tools verfügbar sind:
claude
# Innerhalb der Sitzung fragen: "Welche Tools hast du von zettelforge verfügbar?"
Sieben Tools werden bereitgestellt: zettelforge_remember, zettelforge_recall, zettelforge_synthesize, zettelforge_entity, zettelforge_graph, zettelforge_stats und zettelforge_sync (erfordert Enterprise-Paket). Siehe MCP-Protokollreferenz für vollständige Schemata, JSON-RPC-Anfrage-/Antwortbeispiele, Fehlercodes und den Lazy-Singleton-Lebenszyklus. Zur Fehlerbehebung, virtualenv-Pfaden und manuellem Tool-Testing siehe set-up-mcp-server.
Ausgewertet gegen veröffentlichte akademische Benchmarks:
| Benchmark | Was wird gemessen | Punktzahl |
|---|---|---|
| CTI-Abruf (CTIBench-Teilmenge) | Zuschreibung, CVE-Verknüpfung, Multi-Hop | 75.0 % |
| RAGAS | Abrufqualität (Schlüsselwortpräsenz) | 78.1 % |
| LOCOMO (ACL 2024) | Konversationelles Gedächtnisabruf | 22.0 % |
Die Spalte Punktzahl berichtet ZettelForge-Messungen, die mit Ollama-gehosteten Modellen durchgeführt wurden, mit einer Ausnahme: Die LOCOMO-Zeile wurde bei v2.1.1 mit einem Ollama-Cloud-Richter für die Evaluierungsbewertung (nicht lokale Generierung) neu gemessen. Siehe den vollständigen Benchmark-Bericht für benchmarkspezifische Methodik, Versionshistorie und pro Suite Richterkonfiguration.
Sigma- und YARA-Regeln sind erstklassige Gedächtnis-Primitive. Analysieren, validieren und übernehmen Sie eine Regel, und ihre Tags werden zu Graphkanten: MITRE ATT&CK-Techniken, CVEs, Bedrohungsakteurs-Aliase, Tools und Malware-Familien werden gegen dieselbe Ontologie wie jede andere Notiz aufgelöst. Ein gemeinsamer DetectionRule-Supertyp trägt die Subtypen SigmaRule und YaraRule, sodass eine einzelne Regel-UUID über beide Formate hinweg adressierbar ist.
Sigma-Regeln werden gegen das beigefügte SigmaHQ-JSON-Schema validiert. YARA-Regeln werden mit plyara geparst und gegen den CCCS-YARA-Metadatenstandard geprüft (Stufen: strict, warn, non_cccs). Die Übernahme ist idempotent – das erneute Übernehmen einer unveränderten Regel gibt die ursprüngliche Notiz über eine inhaltsgehashte source_ref zurück.
from zettelforge import MemoryManager
from zettelforge.sigma import ingest_rule as ingest_sigma
from zettelforge.yara import ingest_rule as ingest_yara
mm = MemoryManager()
ingest_sigma("rules/proc_creation_win_office_macro.yml", mm)
ingest_yara("rules/webshell_china_chopper.yar", mm, tier="warn")
# Massenübernahme aus SigmaHQ oder einem privaten Regel-Repository
python -m zettelforge.sigma.ingest /pfad/zu/sigma/regeln/
python -m zettelforge.yara.ingest /pfad/zu/yara/regeln/ --tier warn
# CI-Fixture-Prüfung – parsen + validieren, keine Schreibvorgänge
python -m zettelforge.sigma.ingest regeln/ --dry-run
Ein LLM-Regelerklärer (zettelforge.detection.explainer.explain) erzeugt eine strukturierte JSON-Zusammenfassung – Absicht, Schlüsselfelder, Umgehungshinweise, False-Positive-Hypothesen – für jede DetectionRule. Er läuft synchron auf Abruf in v1; die asynchrone Anreicherungswarteschlangen-Verdrahtung kommt in v1.1. Ratenbegrenzung via ZETTELFORGE_EXPLAIN_RPM (Standard 60 Aufrufe/Minute).
Referenzen: Sigma-Spezifikation, SigmaHQ-Regeln, CCCS YARA, YARA-Dokumentation.
Übernehmen Sie abgeschlossene ATHF-Jagden in das ZettelForge-Gedächtnis. MITRE-Techniken und IOCs werden extrahiert und im Wissensgraphen verknüpft.
python examples/athf_bridge.py /pfad/zu/jagden/
# 12 Jagd(en) geparst
# 12/12 Jagden in ZettelForge übernommen
Siehe examples/athf_bridge.py.
ThreatRecall ist die kommerzielle Distribution von ZettelForge mit aktivierten Enterprise-Erweiterungen. Es wird standardmäßig als verwaltete SaaS angeboten, mit optionalen selbst gehosteten On-Premises- und Air-Gapped-Bereitstellungen für klassifizierte Umgebungen. Enterprise-Add-Ons:
SaaS wird in Minuten bereitgestellt, ohne dass eine Infrastruktur gewartet werden muss. Selbst gehostet wird als bereitstellbares Bundle für Umgebungen ausgeliefert, in denen ausgehender Netzwerkverkehr eingeschränkt oder verboten ist.
Auf die Warteliste setzen – derzeit werden Designpartner onboarded.
| Variable | Standard | Beschreibung |
|---|---|---|
AMEM_DATA_DIR | ~/.amem | Datenverzeichnis |
ZETTELFORGE_BACKEND | sqlite | SQLite-Community-Backend. TypeDB verfügbar via Erweiterung. |
ZETTELFORGE_LLM_PROVIDER | local | local (llama-cpp) oder ollama |
Siehe config.default.yaml für alle Optionen.
Siehe CONTRIBUTING.md für das Entwicklungssetup.
MIT – Siehe LICENSE.
Erstellt von Patrick Roland – LinkedIn | Director of SOC Services, Summit 7 Systems | Navy Nuclear Veteran | CISSP, CCP (CMMC 2.0 Professional)
ZettelForge ist MIT-lizenziert. Star das Repository, öffne Issues und reiche PRs ein – alle Beiträge sind willkommen.