
مرصد استخبارات التهديدات يجمع خلاصات CISA KEV وThreatFox وURLhaus وMalwareBazaar مع ميزات البحث وتتبع التغييرات والتصدير بصيغ STIX/CSV/JSONL.
نظام مراقبة تهديدات يضع الأدلة أولاً، يُبقي حالة المصدر الحالية، وأحداث التغيير الجوهرية، وقياس التشغيل عن بُعد للجلب منفصلةً دلالياً. تبقى البيانات المفقودة أو القديمة أو المعطلة أو غير المتاحة مفقودةً بشكل مرئي. لا تستبدل الواجهة أبداً سجلات تجريبية أو إسناداً مستنتجاً.
الإصدار الحالي يقوّي تواريخ الأدلة وحالة الإقرار المحلية للجهاز، ويجعل جميع حالات فشل القراءة المهمة متميزة بصرياً عن حالات النتائج الصفرية الناجحة، ويثبّت طلبات الارتباط، ويعزّز درج الأدلة، وفلاتر التحقيق المحدودة، وتفسير المصدر، وعناصر التحكم للجوال، ومحاسبة التصدير. كل علامة إعادة تشغيل متحركة لا تزال تقابل حدث NEW أو UPDATED أو REMOVED محفوظاً؛ وهي ليست حركة مرور شبكة زخرفية.

Pulse — العلاقات عبر المصادر، وصحة المصدر، وتحليل الحالة الحالية.

Replay — إعادة بناء محصورة بالصفحة لانتقالات NEW وUPDATED وREMOVED المحفوظة.
تشمل الأسطح الحية الإضافية التموضع الجغرافي التقريبي للبنية التحتية للعناوين العامة وطرق عرض الأدلة من طرف أول لـURLhaus / MalwareBazaar. تلك الأسطح لا تمثَّل عن قصد بلقطات شاشة بديلة أو مكررة في ملف README هذا.
اللقطات الإنتاجية لقطات شاشة حافظة للمصدر من مرصد v1.2.0 الحي. وهي مقتصصة ومعاد تحجيمها/ضغطها للعرض؛ الأدلة المعروضة، والطوابع الزمنية، والأعداد، وقيم IOC، وحالات الواجهة لا يُعاد توليدها أو استبدالها.
يعتمد Worker الإنتاجي على Cloudflare D1. تبقى بيانات اعتماد التغذية أسراراً حصرية للخادم في Cloudflare Worker ولا تُطلب أبداً في المتصفح.
1.2.022.13.0 أو أحدثيعمل هذا النشر في وضع demand-driven. يستهدف المستودع الآن Cloudflare Workers القياسية مباشرة؛ المشغلات المجدولة غير مفعّلة عن قصد في v1.2.0، لذلك لا يدّعي التطبيق جمعاً مستمراً. يمكن لجدولة مستقبلية استدعاء نفس عملية runIngestionCycle() بعد تحقق منفصل من الصحة والأداء التشغيلي.
يرسل المتصفح طلب صيانة صريحاً ومحدوداً عند أول استخدام وكل خمس دقائق أثناء فتحه:
POST /api/ingest
↓
runIngestionCycle()
↓
configuration → TTL → backoff → D1 lease → fetch → normalize → validate
↓
snapshot cache + current observations + material events + cycle statistics
القراءات العادية منفصلة ومحلية:
GET /api/observations → D1 current state, scoped before pagination
GET /api/search → D1 current state, scoped before pagination
GET /api/kev → D1 current CISA catalog
GET /api/events → D1 material change ledger
GET /api/geo → local observations + bounded cached IP enrichment
لا يستدعي أي من مسارات GET هذه محوِّلاً مصدرياً. إذا حصل هذا المشروع لاحقاً على جدولة مدعومة فعلياً، يمكنها استدعاء نفس عملية runIngestionCycle() دون إنشاء تنفيذ تحديث ثانٍ.
تُعرض التغطية لكل مصدر. لا تُقدَّم واجهات برمجة التطبيقات المحدودة أبداً ككتالوجات كاملة.
يمتلك الربط DB مجموعات بيانات متميزة:
threat_source_cache وthreat_source_cache_chunks: أحدث لقطة مُتحقق منها لكل مصدر، مخزنة في أجزاء مفتاحية بالجيل.observations: أحدث حالة حالية مطبَّعة لكل هوية مصدر مستقرة. يحافظ على أول استيعاب، وآخر مشاهدة من المصدر، وآخر تغيير جوهري، والتجزئة الحالية، وعدد المراجعات، وأحدث نتيجة استيعاب.observation_events: أحداث أدلة NEW وUPDATED وREMOVED ذات المعنى والدافعة. تجعل الحمولات المطبَّعة السابقة والحالية والتجزئات وفرّاقات الحقول الحتمية الحالات السابقة قابلة لإعادة البناء.source_fetch_log: قياس عن بُعد محدود لمحاولات الجلب دون أجسام استجابة أو بيانات اعتماد.source_ingest_cycles: أعداد محدودة لكل تحديث للجلب والصلاحية والرفض والجديد والمحدَّث وغير المتغير والمُزال.source_refresh_lease: عقود قصيرة مدعومة بـD1 لكل مصدر تمنع العزلات المتزامنة من تكرار تحديثات المصادر العلوية.ingestion_runtime: أحدث صحة لدورة الاستيعاب الإجمالية.تعريفات مخطط وقت التشغيل موجودة في db/schema.ts. تضيف التهيئة أعمدة الحالة الحالية الجديدة إلى جدول الملاحظات الموجود قبل إنشاء الفهارس التابعة.
هذه الأسئلة مختلفة عن قصد:
observations واللقطة المصدَرية المُتحقق منها عن هذا./api/observations?window=... الملاحظات الحالية حسب observedAt العلوي.observation_events و/api/revisions عن هذا.لا يُوصف الوضع الحالي خطأً بأنه جدول سجل تاريخي لسبعة أيام. يُحتفظ بسجل الأحداث الجوهرية لسبعة أيام. يُحتفظ بقياس عن بُعد الجلب والدورات ليومين وبسقف 200 صف لكل مصدر. تُشذَّب الملاحظات الحالية غير الكتالوجية التي لم تظهر مجدداً لمدة سبعة أيام. تبقى CISA حالية لأن كل استجابة ناجحة هي كتالوج كامل؛ تبقى الصفوف المُزالة من ذلك الكتالوج متاحة لمدة 30 يوماً قبل الشذب.
لا يمكن لغياب CISA وحده حالياً إنشاء حدث REMOVED لأن محوِّلها يسترجع كتالوجاً كاملاً حالياً. لا يُعامَل الغياب عن نتائج ThreatFox أو URLhaus أو MalwareBazaar المحدودة كحذف.
المشاهدة غير المتغيرة تقدّم lastObservedInSnapshotAt/lastIngestedAt الحاليين لكنها لا تُنشئ حدثاً ولا تزيد revisionCount. يبقى lastChangedAt قائماً بعد المشاهدات غير المتغيرة اللاحقة.
يفصل عرض Exploited بين:
dateAdded الخاص بـCISA بتدرج يومي داخل نطاق صريح TODAY أو 7D أو 30D. لا تُقدَّم النوافذ الأقل من يوم في المرصد أبداً كدقة CISA.يدعم الكتالوج الحالي البحث من جانب الخادم، وفلاتر المورّد والمنتج والمضاف حديثاً وارتباط برامج الفدية وتاريخ الإضافة، والتنقل بالصفحات عبر مؤشر غير شفاف. يعرض CVE والمورّد والمنتج واسم الثغرة وتاريخ الإضافة وتاريخ الاستحقاق وارتباط برامج الفدية والإجراء المطلوب. لا يختلق درجات CVSS.
تغطي تجزئات المحتوى حقول الأدلة المطبَّعة، لا القيود الدفترية للمرصد. التجزئة المتغيرة تُنتج حدث UPDATED مع الحمولة المطبَّعة السابقة والحمولة المطبَّعة الجديدة والتجزئتين السابقة/الجديدة وفرّاقاً حتمياً على:
يستعلم درج الأصل عن /api/revisions?id=... ويكشف التجزئة الحالية وآخر تغيير جوهري وعدد المراجعات والأحداث المحفوظة والفرّاقات على مستوى الحقول. لا تظهر طوابع زمنية متقلبة للاستيعاب في فرّاقات المحتوى.
يكشف الدرج أيضاً أثر أدلة مُرقّماً لكل سجل مقبول: الحقول المطبَّعة المقبولة، والحقول الاختيارية التي ظلت غائبة، والتحويلات للعرض فقط، وأساس التصنيف، وأساس الهوية المستقرة. يصف هذا الأثر الأدلة المحفوظة فقط. لا تُحتفظ القيم العلوية المرفوضة ولا تُخصص لها هويات مرصد اصطناعية أبداً. تُمثَّل الرفضات بشكل منفصل كأعداد إجمالية لكل دورة مع رموز حقول وأسباب محدودة؛ تُوصف الدورات القديمة المجمَّعة قبل ذلك المخطط بأنها تفتقر إلى تفصيل بدلاً من إعادة بنائها.
يعرض «الأحداث الأخيرة» التغييرات الجوهرية فقط. لا يصدر مئات الصفوف غير المتغيرة SEEN بعد تحديث CISA كامل. تُلخَّص تلك المشاهدات في إحصائيات دورات المصادر.
يقارن عرض «الإيجاز» الافتراضي سجل الأحداث الجوهرية المحفوظ بمؤشر إقرار مُرقّماً مخزوناً في المتصفح الحالي فقط. يُوصف أول استخدام والتخزين الممسوح كخط أساس أولي لا كنشاط جديد. إذا سبق مؤشر محفوظ السجل المحفوظ، توضح الواجهة أنه لا يمكن إثبات دلتا كاملة.
لا يغيّر الإقرار أحداث الخادم أو يحذفها أبداً. يمكن تصدير المؤشر واستيراده كـJSON لنقل متعمد بين الأجهزة؛ ولا يُقدَّم كحالة متزامنة مع حساب، ولا يُرسل معرّف الجهاز المولَّد إلى الخادم أبداً.
تصف إجماليات «الإيجاز» صفحة السجل المُعادة حالياً وتُوصف بأنها مقيّدة بالمعروض/الصفحة. لا تُقدَّم كإجماليات للسجل المحفوظ الكامل.
تُتحقق الطوابع الزمنية للإقرار المستوردة بدقة وتُحوَّل إلى شكل UTC ISO-8601 قبل التخزين أو المقارنة. يُعامَل تخزين المتصفح كخيار اختياري: التخزين المحلي المحجوب أو الفاشل يعرض خطأً مضمّناً مدمجاً ولا يُعطِّل «الإيجاز» أبداً.
يصيغ بيئة عمل التصدير الصفحة المرئية المحمَّلة والمُتحقق منها بالفعل كـCSV أو JSONL أو STIX 2.1 أو نص منزوع الأسلحة أو بيان أدلة يحتوي السياسة المطبَّقة وتجزئات السجلات المتاحة. ينقل البحث المحلي النشط ونطاق المصدر إلى التصدير. قائمة السماح المصدَرية الفارغة تُصدِّر صفر سجلات. يمثّل STIX ثغرات CISA CVE ككائنات Vulnerability وتجزئات الملفات المُتحقق منها — بما فيها قيم MalwareBazaar SHA-256 — ككائنات Indicator. أعداد المحددة والمنبعثة وغير المدعومة متميزة؛ تُكشف السجلات غير المدعومة في بيانات الحزمة الوصفية بدلاً من إسقاطها بصمت. لا ينفذ التصدير أي جمع علوي. تبقى الثقة المفقودة مفقودة، وتبقى الخلافات عبر المصادر سجلات منفصلة، ولا تدخل أحداث السجل المُزالة تصديرات الحالة الحالية بصمت أبداً. هذه المخرجات ناقلات أدلة، لا توصيات حظر لجدران الحماية.
تستخدم المصادر منتهية الصلاحية تأخيرات إعادة محاولة محدودة قدرها 1 و2 و5 و15 و30 دقيقة. يُحترم Retry-After الأكبر الصالح حتى ساعة واحدة. أثناء التأجيل، تُقدَّم لقطة سابقة صالحة كقديمة؛ يبقى المصدر الفاشل الفارغ دون اتصال.
قبل الجلب، يحصل المصدر المؤهل على عقد D1 شرطي قصير. لا يمكن لعزل آخر استبدال حامل غير منتهي العقد، لذلك لا يتقدم سوى تحديث واحد. إذا كان D1 غير متاح، يبلغ النظام صراحةً عن وضع متدهور للقطات فقط وعقد ذاكرة للعزل؛ لا يُوصف ذلك الاحتياط كموزّع.
تستخدم الملاحظات الحالية ومساحات العمل الخاصة بالمصادر والبحث المحلي وكتالوج CISA والأحداث الجوهرية ومراجعات السجلات استعلامات مؤشر محدودة من جانب الخادم. تُطبَّق قيود المصدر والنوع قبل الترتيب والتنقل. ترمّز المؤشرات صف الفرز المستقر، وتُتحقق من طولها/أحرفها/مخططها، وتفشل بأمان برمز HTTP 400 عند التشوه. لا يستلم المتصفح مجموعة بيانات السبعة أيام الكاملة لمجرد التنقل محلياً.
محدد معدل API عداد نافذة ثابتة في الذاكرة محصور بعزل Worker. يُوصف بدقة كحماية محلية للعزل بأفضل جهد، لا كحد معدل Cloudflare شامل موثوق. القراءات العادية محدودة بـ120 طلباً في الدقيقة لكل عنوان IP عميل مُبلَّغ عنه؛ وللاستيعاب مجموعة منفصلة بستة طلبات في الدقيقة، وللجغرافيا مجموعة منفصلة باثني عشر طلباً في الدقيقة. لا تُضاف كتابات D1 إلى كل قراءة لمجرد المبالغة في وصف هذا الضابط.
POST /api/ingest — دورة صيانة صريحة مدفوعة بالطلب؛ تحترم TTL والتأجيل وعقود D1.GET /api/observations?window=24h&scope=urlhaus&limit=100&cursor=... — نافذة حالة حالية محلية مقسّمة إلى صفحات؛ النطاقات المُتحقق منها هي all وurlhaus وmalwarebazaar وinfrastructure.GET /api/search?q=indicator&window=24h&scope=urlhaus&limit=100&cursor=... — بحث محلي محدود النطاق مقسّم إلى صفحات؛ صفر استدعاءات علوية.GET /api/kev?limit=50&q=...&vendor=...&product=...&ransomware=known&addedSince=YYYY-MM-DD&cursor=... — كتالوج CISA الحالي الكامل.GET /api/events?limit=50&cursor=... — سجل الأحداث الجوهرية.GET /api/revisions?id=...&limit=50&cursor=... — السجل الحالي بالإضافة إلى المراجعات المحفوظة.GET /api/correlations?id=... — أقران المؤشرات المتطابقة من الحالة الحالية على مستوى مجموعة البيانات.يقرأ التطوير المحلي على Cloudflare بيانات الاعتماد الحصرية للخادم من .dev.vars. انسخ .dev.vars.example إلى .dev.vars واملأ فقط التغذية المرخَّص لك باستخدامها:
THREATFOX_AUTH_KEY=
URLHAUS_AUTH_KEY=
MALWAREBAZAAR_AUTH_KEY=
يجب تخزين بيانات اعتماد الإنتاج كأسرار Cloudflare Worker، ولا تكون أبداً مصدراً ملتزماً أو متغيرات GitHub مكشوفة للعميل. يصل إليها التطبيق فقط عبر سطح ربط بيئة تشغيل Workers. يجب ألا تظهر أبداً في NEXT_PUBLIC_* أو مكونات العميل أو HTML أو السجلات أو ملفات البيانات التجريبية أو الملفات الملتزمة.
يستهدف المستودع Cloudflare Workers القياسية مباشرة. wrangler.jsonc هو مصدر الحقيقة لإعدادات Worker ويعلن ربط D1 مبدئياً اسمه DB. يزوّد Wrangler 4 تلقائياً مورد D1 هذا عند أول نشر موثق ويُبقي الربط مرتبطاً في عمليات النشر اللاحقة. لا يُلتزم أي معرّف D1 خاص بحساب.
أوامر التطوير والإنتاج:
npm ci
npm run dev
npm run build
npm run preview
# authenticated Cloudflare session / CI only
npm run deploy
يعمل تحقق GitHub Actions في كل طلب سحب ودفع إلى main. النشر الإنتاجي يدوي عن قصد عبر سير عمل deploy production ويتطلب أسرار مستودع باسمي CLOUDFLARE_API_TOKEN وCLOUDFLARE_ACCOUNT_ID. يمنع هذا فرعاً غير مراجع أو إعداد بيانات اعتماد ناقصاً من النشر تلقائياً.
npm ci
npm audit --omit=dev --audit-level=high
npm audit --audit-level=high
npm test
npm run lint
npm test هي نقطة دخول الاختبار المدعومة: ينفذ بناء إنتاج كاملاً قبل المجموعة الحتمية حتى يتمكن فحص عزل أسرار العميل على مستوى القطعة الأثرية من فحص dist/client. تشغيل node --test مباشرة على نسخة عمل نظيفة يحذف عن قصد تلك القطعة الأثرية للبناء المطلوبة. تغطي الاختبارات التحليل الصارم لطوابع التقويم والإقرار الزمنية، والتخزين الاختياري للجهاز، وتبعيات الارتباط المستقرة، والأدلة المطبَّعة، وتجزئة الوسوم الأساسية، وإنشاء الأحداث الجوهرية، وإعادة الاستيعاب غير المتغيرة، والحفاظ على الحمولة السابقة، ومتانة آخر تغيير، وفرّاقات الحقول، والاحتفاظ بالأحداث وفجوات السجل، وآثار الأدلة، وسياسة تصدير المصدر الفارغ، وسلامة تمثيل/عدد STIX، وأهلية TTL/التأجيل، وعقود التحديث، وتوصيل النطاق-قبل-الترقيم من جانب الخادم، واستعلامات GEO/KEV-الأخير المخصصة، والتحقق من المؤشر، وعزل مسار القراءة، وتغطية المصدر، وسياسة المراجع الخارجية، ودقة تحديد المعدل، وعزل فشل المصدر، وعزل أسرار العميل.
يعرض وضع GEO فقط ملاحظات IPv4/IPv6 العامة المُتحقق منها. يختار استعلام D1 مخصص سجلات IP المؤهلة عبر نافذة الحالة الحالية المطلوبة بدلاً من إعادة استخدام صفحة الملاحظات العامة. يُبلغ الاستجابة عن إجماليات السجلات المرشحة وعما إذا كان حد الأمان البالغ 2,000 سجل قد بُلغ. لا يمكن للمتصلين توفير وجهات علوية عشوائية أو قوائم IP. GeoJS هو المزود الأساسي الثابت وFreeIPAPI هو الاحتياط الثابت؛ الروابط العلوية العشوائية مستحيلة. يحد التطبيق العمل الخارجي عبر سقف طلبات من 12 عنواناً، وتخزيناً مؤقتاً ناجحاً في D1 لمدة 30 يوماً، وتخزيناً مؤقتاً لإعادة المحاولة لخمس دقائق، ومحدد مسار مخصص. تحتفظ كل نقطة مرسومة بأصل مزودها الفعلي ويمكنها فتح سجلها المحلي الأساسي.
نُشر بموجب رخصة MIT. انظر LICENSE.
اختيار وضع GEO يجعل الخادم يرسل كل مرشح IP عام مُتحقق منه، مع بيانات طلب HTTPS العادية، إلى GeoJS ثم إلى FreeIPAPI عند الحاجة إلى الاحتياط. لذلك يمكن لهؤلاء المزودين ملاحظة العناوين العامة التي يُستعلم عنها. العناوين الخاصة والمحجوزة والتوثيقية والمقدمة من العميل لا تُرسل أبداً؛ لا ينفذ وضع العلاقات أي طلبات تحديد موقع جغرافي.
يعيد بناء مساحة عمل Replay الصفحة الحالية من انتقالات السجل الجوهري بترتيب وقت اكتشاف المرصد. حركة NEW وUPDATED وREMOVED مدفوعة حصرياً بالأحداث المخزنة. وهي محصورة بالصفحة بوضوح ولا تدّعي إعادة بناء لقطة تاريخية كاملة أو حجم حركة مرور شبكة.
توفر حزمة world-atlas المشتقة من Natural Earth خريطة الأساس المحلية. تجمّع الخريطة عناوين IP المتواجدة في نفس الموقع، وتدعم تفاصيل التمرير والنقر للانتقال إلى الأصل، وتُبلغ عن أعداد المحددة جغرافياً والمستبعدة وغير المتاحة والمعلقة. تُستبعد النطاقات الخاصة والمحجوزة والتوثيقية والمتعددة الإرسال وغير العامة بأي حال قبل أي استدعاء مزود.
يُقدَّم التحديد الجغرافي للـIP صراحةً كموقع بنية تحتية تقريبي. ليس موقع فاعل أو أصل حدث أو جنسية أو نتيجة ملكية أو ادعاء إسناد. يبقى الإثراء الفاشل غائباً؛ لا يولّد التطبيق إحداثيات بديلة أبداً.
يبقى التصور الافتراضي حقلاً تفاعلياً موجهاً بالقوى للملاحظات الفردية المرتبطة بمصدرها وبعائلة البرمجيات الخبيثة المقدَّمة صراحةً. تدعم اللوحة سحب العقد وتحريك الحقل والتكبير وحركة مرور الروابط المتحركة والفحص المباشر للأصل. GEO سطح أدلة منفصل بدلالات الأصل والفشل الخاصة به.
| المصدر | بيانات الاعتماد | TTL | التغطية الفعلية |
|---|
| CISA KEV | لا شيء | 30 دقيقة | الكتالوج الحالي الكامل المُتحقق منه |
| ThreatFox | THREATFOX_AUTH_KEY | 15 دقيقة | نافذة IOC المطلوبة لـ24 ساعة |
| URLhaus | URLHAUS_AUTH_KEY | 15 دقيقة | أحدث 500 سجل يُرجعها مسار الأحداث الأخيرة |
| MalwareBazaar | MALWAREBAZAAR_AUTH_KEY | 15 دقيقة | أحدث 100 سجل بيانات وصفية يُرجعها المسار |
geo_ip_cache: نتائج تحديد جغرافي تقريبي للـIP مُتحقق منها وإدخالات تخزين مؤقت سلبي محدودة. تنتهي النتائج الناجحة بعد 30 يوماً؛ تُعاد محاولة عمليات البحث الفاشلة بعد خمس دقائق. تُزال صفوف D1 منتهية الصلاحية بشكل انتهازي أثناء طلبات GEO، ويُحدد الاحتياطي داخل العزل بسقف 2,000 إدخال.GET /api/geo?window=24h — يستمد المرشحين فقط من ملاحظات IP العامة المحلية المُتحقق منها، ويسترجع على الأكثر 12 نتيجة مزود غير مخزنة مؤقتاً لكل طلب، ويعيد نقاط WGS84 تقريبية مخزنة مؤقتاً مع أصلها.GET /api/status — دلالات المصدر والحالة الحالية والحداثة ووضع الاستيعاب والدورة والعقد وتحديد المعدل.