
ذاكرة وكيلية لـ CTI في بايثون — رسوم بيانية معرفية STIX، حل أسماء مستعارة للجهات التهديدية، RAG غير متصل أولاً، خادم MCP لوكلاء Claude Code وLangChain
نظام الذاكرة العاملي الوحيد المصمم لاستخبارات التهديدات السيبرانية.
عندما يغادر محلل أول، تختفي معه سنتان أو ثلاث من السياق — بيئات العملاء، التحقيقات السابقة، تقنيات وتكتيكات وإجراءات الخصوم، أنماط النتائج الإيجابية الكاذبة، وكل "انتظر، لقد رأينا هذا من قبل" الذي تم اكتسابه بصعوبة. ZettelForge هو نظام ذاكرة عاملي مصمم بحيث يبقى السياق مع الفريق.
إنه يستخرج CVEs، والخصوم، ومؤشرات الاختراق (IOCs)، وتقنيات ATT&CK من ملاحظات المحللين وتقارير التهديدات، ويحل الأسماء المستعارة (APT28 = Fancy Bear = STRONTIUM = Sofacy)، ويبني رسمًا بيانيًا للمعرفة وفقًا لـ STIX 2.1، ويقدم كل تحقيق سابق لمحلليك — ولـ Claude Code عبر MCP — بلغة طبيعية. يعمل بالكامل داخل العملية. لا مفاتيح API. لا سحابة. لا تغادر البيانات الجهاز.
نجمة · pip install zettelforge · الوثائق · ThreatRecall (مستضاف) · سجل التغييرات
الإصدار 2.6.2 (2026-04-27): محرر الويب للتكوين يأتي مع قوائم منسدلة عاملة لجميع الحقول المعدودة (موفر LLM/التضمين، مستوى التسجيل، إجراء PII، تنسيق التوليف) وزر تطبيق عامل. إضافة جديدة
[crewai]تمكن ZettelForge كأدوات CrewAI --pip install zettelforge[crewai]. سجل التغييرات الكامل
إذا كان ZettelForge يناسب سير عمل استخبارات التهديدات السيبرانية الذي تديره، فإن النجمة هي أسرع إشارة على أن هذه الفئة تستحق الاستمرار في الاستثمار فيها.
كل مركز عمليات أمني (SOC) يفقد محللين. عندما يغادرون، يختفي معهم سياق التحقيق، وإسناد الخصوم، وأنماط النتائج الإيجابية الكاذبة الخاصة بالبيئة. يقوم بدلاؤهم بإعادة فتح نفس التذاكر، وإعادة قراءة نفس التقارير، وإعادة بناء نفس النماذج الذهنية من الصفر.
أنظمة الذاكرة العامة للذكاء الاصطناعي لا تحل هذه المشكلة لفرق الأمن. لا يمكنها التمييز بين APT28 و Fancy Bear، ولا تعلم أن CVE-2024-3094 هو باب خلفي لـ XZ Utils، ولا تستطيع تحليل Sigma أو YARA، وليس لديها مفهوم لمعرفات تقنيات MITRE ATT&CK. عندما يعطيها محلل استخبارات التهديدات السيبرانية عامًا من تقارير الاستخبارات، فإنها تعيد بحثًا دلاليًا ضبابيًا عبر سجل الدردشة.
ZettelForge صُمم للمحللين الذين يفكرون في رسوم بيانية للتهديدات. إنه يستخرج CVEs، والخصوم، ومؤشرات الاختراق (IOCs)، وتقنيات ATT&CK تلقائيًا، ويحل الأسماء المستعارة عبر اصطلاحات التسمية، ويبني رسمًا بيانيًا للمعرفة بعلاقات سببية، ويسترجع الذكريات باستخدام بحث ممزوج واعي بالنوايا — كل ذلك داخل العملية، دون اعتماد على واجهات برمجة تطبيقات خارجية.
يعمل تعزيز الذاكرة على سد 33% من الفجوة بين النماذج الصغيرة والكبيرة في مهام استخبارات التهديدات السيبرانية (CTI-REALM, Microsoft 2026، باستخدام GPT-4 كخط أساس للنموذج الكبير). راجع تقرير المعايير الكامل للمنهجية والمقارنات.
استخراج الكيانات -- يحدد تلقائيًا CVEs، والخصوم، ومؤشرات الاختراق (IOCs) (عناوين IP، نطاقات، تجزئات، URLs، بريد إلكتروني)، وتقنيات MITRE ATT&CK، والحملات، ومجموعات الاختراق، والأدوات، والأشخاص، والمواقع، والمنظمات. تعبيرات منتظمة + LLM NER مع أنواع STIX 2.1 في كل مكان.
الرسم البياني للمعرفة -- تصبح الكيانات عقدًا، ويصبح التواجد المشترك حوافًا. يستنتج LLM ثلاثيات سببية ("APT28 تستخدم Cobalt Strike"). الحواف الزمنية والإحلال تتعقب كيفية تطور الاستخبارات.
حل الأسماء المستعارة -- APT28، Fancy Bear، Sofacy، STRONTIUM كلها تتحل إلى نفس عقدة الخصم. يعمل تلقائيًا عند التخزين والاستدعاء.
الاسترجاع الممزوج -- تشابه المتجهات (768-dim 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()
# تخزين استخبارات التهديدات السيبرانية -- يتم استخراج الكيانات (CVEs، خصوم، معرفات ATT&CK، IOCs) عبر التعبيرات المنتظمة
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 بدون خدمات خارجية. تعمل التضمينات داخل العملية عبر fastembed (نموذج ONNX ~80 ميجابايت يتم تنزيله عند الاستدعاء الأول). MemoryManager() يكتب إلى ~/.amem/ افتراضيًا؛ قم بتجاوز ذلك باستخدام ZETTELFORGE_DATA_DIR أو عبر التكوين. توجد نسخة قابلة للتشغيل في examples/quickstart.py.
ollama pull qwen3.5:9b && ollama serve
# مع تشغيل Ollama، تقوم synthesize() بإرجاع ملخص حقيقي عبر الملاحظات المخزنة
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 فقط.
# تصل استخبارات جديدة -- evol=True يمكّن تطور الذاكرة:
# يستخرج LLM الحقائق، ويقارنها بالملاحظات الموجودة، ويقرر إضافة/تحديث/حذف/لا إجراء
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 (يتطلب حزمة المؤسسة). راجع مرجع بروتوكول MCP للمخططات الكاملة، أمثلة طلب/استجابة JSON-RPC، رموز الأخطاء، ودورة حياة الوحدة المفردة البطيئة. لاستكشاف الأخطاء وإصلاحها، مسارات البيئات الافتراضية، واختبار الأدوات يدويًا، راجع إعداد خادم MCP.
تم التقييم وفقًا للمعايير الأكاديمية المنشورة:
يبلغ عمود النتيجة قياسات ZettelForge التي تم تشغيلها باستخدام نماذج مستضافة على Ollama، مع استثناء واحد: تم إعادة قياس صف LOCOMO في الإصدار 2.1.1 باستخدام قاضي سحابي Ollama لتقييم التصنيف (وليس التوليد المحلي). راجع تقرير المعايير الكامل لمنهجية خاصة بكل معيار، وسجل الإصدارات، وتكوين القاضي لكل مجموعة.
قواعد Sigma و YARA هي بدائيات ذاكرة من الدرجة الأولى. تحليل القاعدة والتحقق من صحتها وإدخالها يجعل علاماتها تصبح حوافًا في الرسم البياني: تقنيات MITRE ATT&CK، CVEs، أسماء الخصوم المستعارة، الأدوات، وعائلات البرامج الضارة تتحل ضد نفس الأنطولوجيا مثل أي ملاحظة أخرى. نوع فائق مشترك 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. يعمل بشكل متزامن عند الطلب في الإصدار 1؛ توصيل قائمة انتظار الإثراء غير المتزامنة هو للإصدار 1.1. محدود المعدل عبر ZETTELFORGE_EXPLAIN_RPM (افتراضي 60 استدعاء/دقيقة).
المراجع: مواصفات Sigma، قواعد SigmaHQ، YARA لـ CCCS، وثائق YARA.
أدخل عمليات صيد ATHF المكتملة في ذاكرة ZettelForge. يتم استخراج تقنيات MITRE ومؤشرات الاختراق وربطها في الرسم البياني للمعرفة.
python examples/athf_bridge.py /path/to/hunts/
# تم تحليل 12 عملية صيد
# تم إدخال 12/12 عملية صيد في ZettelForge
راجع examples/athf_bridge.py.
ThreatRecall هو التوزيع التجاري لـ ZettelForge مع إضافات المؤسسة الممكنة. يتم تقديمه كـ SaaS مُدار افتراضيًا، مع خيارات النشر الذاتي المحلي والبيئات المنفصلة عن الشبكة للبيئات المصنفة. الإضافات المؤسسية:
ينشر SaaS في دقائق بدون بنية تحتية للصيانة. يُشحن النشر الذاتي كحزمة قابلة للنشر للبيئات التي يكون فيها الخروج الشبكي مقيدًا أو محظورًا.
انضم إلى قائمة الانتظار -- حاليًا نضم شركاء التصميم.
راجع config.default.yaml لجميع الخيارات.
راجع CONTRIBUTING.md لإعداد بيئة التطوير.
MIT -- راجع LICENSE.
بُني بواسطة Patrick Roland -- LinkedIn | مدير خدمات SOC، Summit 7 Systems | مخضرم بحرية نووية | CISSP، CCP (CMMC 2.0 Professional)
ZettelForge مرخص تحت MIT. قم بنجم المستودع، وافتح المشكلات، وأرسل طلبات السحب — كل المساهمات مرحب بها.
| القدرة | ZettelForge | Mem0 | Graphiti | Cognee |
|---|
| استخراج كيانات استخبارات التهديدات السيبرانية (CVEs، خصوم، IOCs) | نعم | لا | لا | لا |
| أنطولوجيا STIX 2.1 | نعم | لا | لا | لا |
| حل الأسماء المستعارة للخصوم | نعم (APT28 = Fancy Bear) | لا | لا | لا |
| رسم بياني للمعرفة بثلاثيات سببية | نعم | لا | نعم | نعم |
| استرجاع مصنّف بالنوايا (5 أنواع) | نعم | لا | لا | لا |
| يعمل داخل العملية / لا يتطلب واجهة برمجة تطبيقات خارجية | نعم | لا | لا | لا |
| سجلات التدقيق بنظام OCSF | نعم | لا | لا | لا |
| خادم MCP (Claude Code) | نعم | لا | لا | لا |
| المعيار | ما يقيسه | النتيجة |
|---|
| استرجاع استخبارات التهديدات السيبرانية (مجموعة فرعية من 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 |