
Агентная память для CTI на Python — графы знаний STIX, разрешение псевдонимов угроз, автономный RAG, MCP-сервер для агентов Claude Code и LangChain
Единственная агентная система памяти, созданная для киберразведки угроз.
Когда уходит аналитик старшего звена, вместе с ним уходят два-три года контекста — окружение клиентов, предыдущие расследования, тактики, приёмы и процедуры (TTP) злоумышленников, шаблоны ложных срабатываний, каждое выстраданное «погодите, мы это уже видели». ZettelForge — это агентная система памяти, созданная для того, чтобы контекст оставался с командой.
Она извлекает CVE, угрозные акторы, IOCs и техники ATT&CK из заметок аналитиков и отчётов об угрозах, разрешает псевдонимы (APT28 = Fancy Bear = STRONTIUM = Sofacy), строит граф знаний в формате STIX 2.1 и возвращает каждое прошлое расследование обратно вашим аналитикам — а также Claude Code через MCP — на естественном языке. Работает полностью внутри процесса. Никаких ключей API. Никакого облака. Данные не покидают хост.
Поставить звезду · pip install zettelforge · Документация · ThreatRecall (хостинг) · Журнал изменений
v2.6.2 (2026-04-27): Редактор конфигурации в вебе теперь работает с выпадающими списками для всех перечисляемых полей (провайдер LLM/встраивания, уровень логирования, действие с PII, формат синтеза) и работающей кнопкой Apply. Новый модуль
[crewai]предоставляет ZettelForge в виде инструментов CrewAI —pip install zettelforge[crewai]. Полный журнал изменений
Если ZettelForge подходит для вашего рабочего процесса в CTI, звезда — самый быстрый сигнал о том, что в эту категорию стоит продолжать инвестировать.
В любом SOC уходят аналитики. Когда они уходят, контекст расследований, атрибуция злоумышленников и характерные для окружения шаблоны ложных срабатываний уходят с ними. Их замены снова открывают те же тикеты, перечитывают те же отчёты и заново выстраивают те же ментальные модели с нуля.
Универсальные системы памяти для ИИ не решают эту проблему для команд безопасности. Они не могут отличить APT28 от Fancy Bear, не знают, что CVE-2024-3094 — это бэкдор XZ Utils, не умеют парсить Sigma или YARA и не имеют понятия об идентификаторах техник MITRE ATT&CK. Когда CTI-аналитик передаёт им год разведывательных отчётов, они возвращают расплывчатый семантический поиск по истории чата.
ZettelForge создан для аналитиков, мыслящих графами угроз. Он автоматически извлекает CVE, угрозных акторов, IOCs и техники ATT&CK, разрешает псевдонимы в разных системах именования, строит граф знаний с причинно-следственными связями и извлекает воспоминания с помощью интеллектуального смешанного поиска — всё внутри процесса, без внешних зависимостей от API.
Увеличение объёма памяти закрывает 33% разрыва между малыми и большими моделями в задачах CTI (CTI-REALM, Microsoft 2026, с GPT-4 в качестве базовой большой модели). См. полный отчёт о тестировании с методологией и сравнениями.
Извлечение сущностей — Автоматически определяет CVE, угрозных акторов, IOCs (IP, домены, хэши, URL, email), техники MITRE ATT&CK, кампании, наборы вторжений, инструменты, людей, места и организации. Регулярные выражения + LLM NER с типами STIX 2.1 на всём протяжении.
Граф знаний — Сущности становятся узлами, совместная встречаемость — рёбрами. LLM выводит причинные тройки («APT28 использует Cobalt Strike»). Временные рёбра и замещение отслеживают эволюцию разведывательных данных.
Разрешение псевдонимов — APT28, Fancy Bear, Sofacy, STRONTIUM — все сводятся к одному узлу актора. Работает автоматически при сохранении и извлечении.
Смешанный поиск — Векторное сходство (768-мерное fastembed, ONNX) + обход графа (BFS по рёбрам графа знаний), взвешенное классификацией намерения. Пять типов намерений: фактический, временной, реляционный, исследовательский, причинный.
Эволюция памяти — С evolve=True новые разведданные сравниваются с существующей памятью. LLM принимает решение ADD, UPDATE, DELETE или NOOP. Устаревшие данные замещаются. Противоречия разрешаются. Дубликаты пропускаются.
Синтез RAG — Синтезируйте ответы по всем сохранённым воспоминаниям с форматом direct_answer.
Внутрипроцессная архитектура — fastembed (ONNX) для встраиваний, llama-cpp-python для опционального локального вывода LLM, SQLite + LanceDB для хранения и Ollama на localhost по умолчанию. Внешние ключи API не требуются. При первом запуске может потребоваться исходящий сетевой доступ для загрузки моделей встраивания/LLM; после предварительной загрузки моделей может работать полностью офлайн (в том числе на изолированных хостах).
Журналирование аудита в схеме OCSF — Каждая операция порождает структурированное событие в формате Open Cybersecurity Schema Framework. Что делать с потоком журналов (SIEM, WORM-хранилище, ничего) — решаете вы.
pip install zettelforge
from zettelforge import MemoryManager
mm = MemoryManager()
# Сохраняем CTI — сущности (CVE, акторы, ID ATT&CK, IOC) извлекаются через регулярные выражения
mm.remember("APT28 uses Cobalt Strike for lateral movement via T1021")
mm.remember("APT28 (Fancy Bear) targets NATO defense contractors with spear-phishing")
mm.remember("CVE-2024-3094 is the XZ Utils backdoor (CVSS 10.0) affecting sshd")
# Поиск объединяет векторный + графовый поиск; разрешение псевдонимов работает (Fancy Bear -> APT28)
for note in mm.recall("What tools does Fancy Bear use?", k=3):
print(f"[{note.metadata.tier}] {note.content.raw}")
Это работает из чистой pip install без внешних сервисов. Встраивания выполняются внутри процесса через fastembed (модель ONNX ~80 МБ загружается при первом вызове). MemoryManager() по умолчанию пишет в ~/.amem/; переопределите через ZETTELFORGE_DATA_DIR или конфигурацию. Рабочая копия находится в examples/quickstart.py.
ollama pull qwen3.5:9b && ollama serve
# При работающем Ollama синтез возвращает сводку по всем сохранённым заметкам
answer = mm.synthesize("Summarize known APT28 TTPs")
print(answer["synthesis"]["answer"])
# Фоновый LLM NER также обогащает сохранённые заметки дополнительными сущностями
ZettelForge автоматически обнаруживает Ollama. Чтобы использовать другого провайдера (local llama-cpp, litellm для 100+ провайдеров, mock для тестов), см. Конфигурация. Без LLM synthesize() всё равно возвращает структурированный ответ, но поле answer является запасным заполнителем — только remember и recall дают полезные результаты в режиме только pip.
# Поступают новые разведданные -- evolve=True включает эволюцию памяти:
# LLM извлекает факты, сравнивает с существующими заметками, принимает решение ADD/UPDATE/DELETE/NOOP
mm.remember(
"APT28 has shifted tactics. They dropped DROPBEAR and now exploit edge devices.",
domain="cti",
evolve=True, # существующая заметка об APT28 замещается, а не дублируется
)
Каждый вызов remember() запускает конвейер:
Каждый вызов recall() сочетает две стратегии поиска:
pip install zettelforge
Создайте или отредактируйте .claude.json в корне проекта (или ~/.claude/.claude.json для глобального доступа):
{
"mcpServers": {
"zettelforge": {
"command": "python3",
"args": ["-m", "zettelforge.mcp"]
}
}
}
Если ZettelForge установлен в виртуальном окружении, укажите полный путь к интерпретатору Python:
{
"mcpServers": {
"zettelforge": {
"command": "/home/user/.venvs/zettelforge/bin/python",
"args": ["-m", "zettelforge.mcp"]
}
}
}
Запустите Claude Code и убедитесь, что инструменты доступны:
claude
# Внутри сессии спросите: "Какие инструменты у вас есть из zettelforge?"
Доступны семь инструментов: zettelforge_remember, zettelforge_recall, zettelforge_synthesize, zettelforge_entity, zettelforge_graph, zettelforge_stats и zettelforge_sync (требуется enterprise-пакет). См. справочник по протоколу MCP с полными схемами, примерами запросов/ответов JSON-RPC, кодами ошибок и жизненным циклом ленивого синглтона. Для устранения неполадок, путей к виртуальным окружениям и ручного тестирования инструментов см. настройка MCP-сервера.
Оценка по опубликованным академическим бенчмаркам:
В столбце Оценка указаны измерения ZettelForge, выполненные с моделями под управлением Ollama, за одним исключением: строка LOCOMO была переизмерена в v2.1.1 с использованием облачного судьи Ollama для оценки (не локальной генерации). См. полный отчёт о тестировании с методологией по бенчмаркам, историей версий и конфигурацией судьи для каждого набора.
Правила Sigma и YARA являются примитивами памяти первого класса. При разборе, проверке и загрузке правила его теги становятся рёбрами графа: техники MITRE ATT&CK, CVE, псевдонимы угрозных акторов, инструменты и семейства вредоносных программ разрешаются в той же онтологии, что и любая другая заметка. Общий супертип DetectionRule содержит подтипы SigmaRule и YaraRule, поэтому один UUID правила адресуется в обоих форматах.
Правила Sigma проверяются по вендорской схеме JSON SigmaHQ. Правила YARA разбираются с помощью plyara и проверяются по стандарту метаданных YARA CCCS (уровни: strict, warn, non_cccs). Загрузка идемпотентна — повторная загрузка неизменённого правила возвращает исходную заметку по хэшу содержимого source_ref.
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")
# Массовая загрузка из SigmaHQ или частного репозитория правил
python -m zettelforge.sigma.ingest /path/to/sigma/rules/
python -m zettelforge.yara.ingest /path/to/yara/rules/ --tier warn
# Проверка для CI -- разбор + валидация, без записи
python -m zettelforge.sigma.ingest rules/ --dry-run
Объяснитель правил на основе LLM (zettelforge.detection.explainer.explain) создаёт структурированную сводку в формате JSON — намерение, ключевые поля, примечания по обходу, гипотезы ложных срабатываний — для любого DetectionRule. В v1 он выполняется синхронно по запросу; подключение асинхронной очереди обогащения запланировано на v1.1. Скорость ограничена через ZETTELFORGE_EXPLAIN_RPM (по умолчанию 60 вызовов/мин).
Ссылки: Спецификация Sigma, Правила SigmaHQ, CCCS YARA, Документация YARA.
Загружайте завершённые охоты ATHF в память ZettelForge. Техники MITRE и IOCs извлекаются и связываются в графе знаний.
python examples/athf_bridge.py /path/to/hunts/
# 12 hunt(s) parsed
# Ingested 12/12 hunts into ZettelForge
ThreatRecall — это коммерческая версия ZettelForge с включёнными корпоративными расширениями. По умолчанию предлагается как управляемый SaaS, с возможностью локального развёртывания (on-prem) и изолированных развёртываний для секретных сред. Корпоративные дополнения:
SaaS развёртывается за минуты без необходимости обслуживания инфраструктуры. Локальная версия поставляется в виде развёртываемого пакета для сред, где исходящий сетевой трафик ограничен или запрещён.
Записаться в лист ожидания — в настоящее время набираем партнёров по дизайну.
См. config.default.yaml для всех опций.
См. CONTRIBUTING.md для настройки разработки.
MIT — см. LICENSE.
Создано Патриком Роландом — LinkedIn | Директор служб SOC, Summit 7 Systems | Ветеран атомного флота ВМС США | CISSP, CCP (CMMC 2.0 Professional)
ZettelForge распространяется по лицензии MIT. Поставьте звезду репозиторию, открывайте issues и отправляйте PR — любые вклады приветствуются.
| Возможность | ZettelForge | Mem0 | Graphiti | Cognee |
|---|
| Извлечение CTI-сущностей (CVE, акторы, IOC) | Да | Нет | Нет | Нет |
| Онтология STIX 2.1 | Да | Нет | Нет | Нет |
| Разрешение псевдонимов угрозных акторов | Да (APT28 = Fancy Bear) | Нет | Нет | Нет |
| Граф знаний с причинными тройками | Да | Нет | Да | Да |
| Классифицированный по намерению поиск (5 типов) | Да | Нет | Нет | Нет |
| Внутрипроцессная работа / не требуется внешнее API | Да | Нет | Нет | Нет |
| Журналы аудита в схеме OCSF | Да | Нет | Нет | Нет |
| MCP-сервер (Claude Code) | Да | Нет | Нет | Нет |
| Бенчмарк | Что измеряет | Оценка |
|---|
| CTI Retrieval (подмножество CTIBench) | Атрибуция, связь с CVE, многошаговость | 75.0% |
| RAGAS | Качество поиска (наличие ключевых слов) | 78.1% |
| LOCOMO (ACL 2024) | Восстановление контекста диалоговой памяти | 22.0% |
| Переменная | По умолчанию | Описание |
|---|
AMEM_DATA_DIR | ~/.amem | Директория данных |
ZETTELFORGE_BACKEND | sqlite | Сообщество-бэкенд SQLite. TypeDB доступен через расширение. |
ZETTELFORGE_LLM_PROVIDER | local | local (llama-cpp) или ollama |