
إطار خداع يعتمد على LLM أولاً: "الحاوية الوهمية التي ترد عليك!™"

تقديم honeyprompt، إطار عمل خداع يعتمد على LLM أولاً، صُنع بواسطة/لمطوري الويب. مشروع شغف شخصي لـ @alectrocute.
يدعم جميع مزودي LLM الرئيسيين في السحابة والمحليين. SSH وHTTP وTLS وTCP وtelnet وغيرها. يأتي كحاوية صغيرة (وكثنائي ثابت واحد) ويحتفظ بكل المقابض في ملف واحد honeyprompt.yaml.
لا حاجة لتجميع الإضافات، ولا تشغيل قاعدة بيانات، سهل التوسع ويمكن نشره على أجهزة منخفضة المواصفات.
يتوفر مثيل تجريبي على 172.233.151.216، مع لوحة الويب غير الموثقة هنا:
http://172.233.151.216:9090. وهو مثيل عام لـ honeyprompt يعمل على VPS رخيص من Linode، مع openrouter/free كمزود/نموذج LLM الوحيد.
لأسهل إعداد في عام 2026، نوصي باستخدام Docker وOpenRouter/openrouter/free كمزود LLM. جميع مزودي LLM الرئيسيين في السحابة والمحليين مدعومون. ثلاثة ملفات وأمر واحد ينشر النشر الافتراضي الكامل: سبعة أدوات خداع مدعومة بـ LLM، تخزين دائم للأحداث، ولوحة المشغل.
1. احصل على التكوين الافتراضي وملف compose وقالب env:
# إذا لم يكن لديك Docker:
# curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh
mkdir honeypot && cd honeypot
wget https://raw.githubusercontent.com/alectrocute/honeyprompt/main/honeyprompt.yaml
wget https://raw.githubusercontent.com/alectrocute/honeyprompt/main/compose.yaml
wget -O .env https://raw.githubusercontent.com/alectrocute/honeyprompt/main/.env.example
(أو استنسخ المستودع وانتقل إليه cd — نفس الملفات الثلاثة.)
2. املأ ملف .env. قيمتان مطلوبتان:
OPENROUTER_API_KEY=sk-or-... # استخدم مفتاحاً مخصصاً مع حد إنفاق
HONEYPROMPT_PANEL_PASSWORD=changeme # كلمة مرور المصادقة الأساسية للوحة
3. ابدأه:
docker compose up -d
4. اختبره:
ssh -p 2222 root@localhost # كلمة المرور: root — ثم اكتب أي شيء
curl http://localhost:2375/v1.54/containers/json # واجهة Docker API "المكشوفة"
5. شاهد ما يحدث في اللوحة للقراءة فقط على http://127.0.0.1:9090 (سجل الدخول باسم admin مع كلمة مرور اللوحة الخاصة بك). كل اتصال وبيانات اعتماد وأمر يتدفق مباشرة. إذا كنت منشوراً على مضيف بعيد، ستحتاج إلى كشف منفذ :9090 في compose.yaml. هذا غير موصى به لنشرات الإنتاج.
استخدم إصداراً مرقماً بدلاً من
latestلنشرات الإنتاج — عيّنHONEYPROMPT_IMAGEفي.env.
الملف honeyprompt.yaml الذي قمت بتنزيله للتو هو ملف توضيحي مشروح بالكامل. يشمل ملفات تعريف لـ:
/ يقدم صفحة nginx الترحيبية القياسية فوراً، والمسارات الأعمق تمر إلى LLM لصفحات إنترانت كاملة HTML/CSS ونماذج تسجيل الدخول ولوحات الإدارة المصممة لإبقاء المهاجم ينقر.[!مهم] حتى إذا كنت تستخدم LLM، حدد المسارات الأكثر استخداماً وأضف قواعد ثابتة لها. سيوفر لك هذا كمية هائلة من رموز LLM ويسرع الاستجابات للطلبات التي لا تستحق تكلفة استدعاء LLM. أمثلة عشوائية:
whoami، فحوصات الصحة، أيقونة المفضلة، استفسارات الإصدار، إلخ.
هذا الحد الأدنى من honeyprompt.yaml يزيّف صندوق SSH بقاعدتين ثابتتين وبدون LLM:
panel:
enabled: true
address: "0.0.0.0:8080"
events:
buffer: 2000
file: /data/events.jsonl # نشاط المهاجم الدائم
services:
- protocol: ssh
address: "0.0.0.0:2222"
description: "وحدة بناء Ubuntu 26.04 LTS"
serverName: "gpu-runner-07"
passwordRegex: "^(root|admin|123456)$" # كلمات المرور التي "تعمل"
commands:
- regex: "^whoami$"
handler: "root"
- regex: "^(.+)$"
handler: "bash: command not found"
docker run --rm \
-p 2222:2222 -p 8080:8080 \
-v "$(pwd)/honeyprompt.yaml:/etc/honeyprompt/honeyprompt.yaml:ro" \
-v honeyprompt-data:/data \
alectrocute/honeyprompt:latest
لنشر دائم، استخدم compose.yaml المرفق. يغطي دليل النشر إصدارات Docker Hub وأسرار GitHub المطلوبة وإعداد المنفذ والجدار الناري والوصول للوحة عبر SSH والترقيات والاستعادة وتخزين الأحداث والعزل.
كل ما على وعاء العسل (honeypot) فعله هو شيء واحد جيد: البقاء مقنعاً لفترة كافية حتى يستمر المهاجم في الكتابة. كل أمر ينفذه هو استخبارات — الأدوات التي يلجأ إليها، بيانات الاعتماد التي يعيد استخدامها، الثغرات (CVEs) التي يفترض أنك لم تقم بتصحيحها. وعاء العسل الثابت يخرج عن الشخصية بمجرد تشغيل أمر لم يتوقعه المؤلف. honeyprompt يسلم تلك اللحظة إلى LLM، بحيث تجيب الصدفة على dmesg | tail أو cat /etc/shadow بالطريقة التي يجيب بها النظام الحقيقي، وتستمر الجلسة.
شاهد عرض Adel Karimi الرائع في DEF CON 32 حول Galah، (أول؟) وعاء عسل LLM، الذي ألهم هذا المشروع: https://www.youtube.com/watch?v=XGsm4Qcc_Ag
هذا هو الجزء الذي يستحق الفهم مسبقاً، لأن الاثنين منفصلان عمداً:
تقوم بتكوينهما بشكل منفصل:
# العسل: نشاط المهاجم.
events:
buffer: 2000 # الأحداث الأخيرة محفوظة في الذاكرة للوحة
file: /data/events.jsonl # حفظ كل حدث كـ JSON Lines
# تشخيصات وقت التشغيل الخاصة به.
logging:
level: info # debug | info | warn | error
format: text # كيف يظهر على وحدة التحكم: text (مقروء للبشر) أو json
file: /data/honeyprompt.log # اختياري؛ على القرص يكون دائماً JSON
events.jsonl هو كائن JSON واحد مكتفي بذاته لكل سطر — جاهز لـ tail -f أو الإرسال إلى SIEM أو إعادة التشغيل باستخدام jq. أوامر Docker أعلاه تقوم بتركيب الـ volume المسمى honeyprompt-data في /data، لذا تبقى الأحداث حتى بعد استبدال الحاوية. يتم إلحاق كلا الملفين ويتم مسحهما عند الإغلاق النظيف.
format يؤثر فقط على كيفية عرض سجلات التشغيل على وحدة التحكم؛ ملف سجل التشغيل، عند تفعيله، يكون دائماً JSON منظم ليسهل تحليله.

لوحة تحكم اختيارية للقراءة فقط تبث أحداث الخداع فور حدوثها، وتصنفها حسب البروتوكول، وتصدر كل شيء بصيغة JSON بنقرة واحدة:
panel:
enabled: true
address: "0.0.0.0:8080"
auth: # مصادقة أساسية اختيارية
username: admin
password: "${HONEYPROMPT_PANEL_PASSWORD}"
لوحة التحكم هي HTML وCSS وجافا سكريبت عادية (src/panel/assets) مضمنة في الثنائي. اترك auth غير معرّف لتعطيل المصادقة.
كل مزود هو وحدة خاصة به مع مهلة زمنية وإعادة محاولات وحدود معدل ورؤوس خاصة به. المفاتيح تأتي من البيئة. خارج الصندوق:
قم بتكوين المزودين، اختر pool.strategy (round-robin، weighted، random، أو failover)، ويوزع honeyprompt الحركة بينهم. إذا انتهت مهلة المزود المختار أو أعاد خطأً قابلاً لإعادة المحاولة، ينتقل honeyprompt تلقائياً إلى التالي — الخلفية الميتة لا توقف وعاء العسل أبداً. الأخطاء غير القابلة لإعادة المحاولة (مثل مفتاح API خاطئ) توقف التسلسل لتعرف بدلاً من استنزاف الحصة بصمت.
تستخدم الخدمات التجمع العالمي ما لم تسمي مجموعة فرعية خاصة بها من المزودين:
llm:
enabled: true
providers: [local-ollama] # اسم واحد: إجبار هذه الخدمة على هذا المزود
اسرد عدة أسماء للحفاظ على موازنة الحمل والتحويل الاحتياطي، ولكن فقط ضمن تلك المجموعة الفرعية:
llm:
enabled: true
providers: [openai-primary, openrouter-backup]
عندما يجب أن تشارك عدة خدمات نفس مجموعة المزودين — أو مجموعة فرعية تحتاج استراتيجيتها الخاصة بدلاً من الاستراتيجية العامة — قم بتعريف تجمع مسمى. التجمع له اسم واستراتيجية وقائمة مزودين مرتبة، وتشير إليه الخدمة بالاسم في أي مكان تسمي فيه مزوداً:
pools:
- name: cheap-first
strategy: failover # جرب النموذج المحلي أولاً، ثم انتقل إلى API المدفوع
order: [local-ollama, openrouter]
- name: spread
strategy: round-robin
order: [openrouter, openai]
services:
- protocol: ssh
# ...
llm:
enabled: true
providers: [cheap-first] # اسم تجمع، بدلاً من مزود
- protocol: http
# ...
llm:
enabled: true
providers: [spread]
يجب أن يكون اسم التجمع هو الإدخال الوحيد في providers — لا يُسمح بخلط تجمع مع مزودين فرديين في قائمة واحدة، لأنه سيكون غامضاً أي استراتيجية تفوز. تعيش أسماء التجمعات في نفس مساحة الأسماء مثل أسماء المزودين ولا يمكن أن تتعارض معها.
عندما لا تكون "مطابقة regex" أو "اسأل النموذج" كافية، تتيح لك الخطافات دمج TypeScript الخاص بك في مسار الطلب والاستجابة. يمكن للخطاف إعادة كتابة الطلب قبل أن يصل إلى النموذج، أو إعادة كتابة الرد قبل أن يصل إلى المهاجم.
import { registerHook } from "./src/engine/hooks.ts";
registerHook({
name: "fake-latency-notice",
transformResponse(response, ctx) {
if (ctx.protocol === "ssh" && /rm -rf/.test(ctx.input)) {
return "rm: cannot remove '/': Operation not permitted\n";
}
return response;
},
});
أشر إليه بالاسم من قائمة hooks: لأي خدمة. يتم شحن خطاف مدمج redact-secrets مفعلاً في مثال التكوين حتى لا يتمكن النموذج من إعادة صدى بيانات اعتماد حقيقية.
يتم تقديم مقاييس Prometheus في /metrics على اللوحة (غير موثقة، بحيث تعمل أدوات الجمع تلقائياً):
honeyprompt_events_total{protocol="ssh"} 412
honeyprompt_llm_requests_total{provider="openai",protocol="ssh"} 118
honeyprompt_auth_attempts_total{protocol="ssh"} 87
honeyprompt_engine_errors_total{protocol="http"} 0
هل تريد المساهمة أو تريد ثنائياً أصلياً؟ ستحتاج إلى Deno 2.x — الاعتماد الوحيد.
deno task check # فحص الأنواع
deno task lint
deno task fmt
deno task test # اختبارات الوحدة + التكامل
deno task start -- --config honeyprompt.yaml # تشغيل محلي
deno task dev -- --config honeyprompt.yaml # تشغيل مع مراقبة الملفات
deno task compile # -> ./dist/honeyprompt (ثنائي مكتفي بذاته)
deno compile يضع وقت التشغيل وأصول اللوحة وكل شيء في ملف قابل للتنفيذ واحد بدون أي تبعيات. يتم إرفاق الثنائيات المعدة مسبقاً لأنظمة Linux وmacOS وWindows بكل إصدار موسوم.
تقوم CI بتشغيل التنسيق والفحص والتحقق من الأنواع والاختبارات والتحقق من صحة التكوين و compile عبر المنصات وبناء Docker مع كل دفعة. وضع علامة vX.Y.Z يقطع ثنائيات الإصدار وينشر الصورة متعددة البنى المرفقة مع منشأ وشهادة SBOM إلى alectrocute/honeyprompt.
honeyprompt run [--config <path>] بدء كل خدمة مكونة (الافتراضي)
honeyprompt validate [--config <path>] تحليل والتحقق من صحة التكوين ثم الخروج — ممتاز لـ CI
honeyprompt version
honeyprompt help
--config الافتراضي هو ./honeyprompt.yaml، أو $HONEYPROMPT_CONFIG إذا تم تعيينه (الحاوية تضبطه على /etc/honeyprompt/honeyprompt.yaml).
هذه أداة لجذب ودراسة المهاجمين على بنية تحتية تملكها أو مصرح لك باختبارها. كشف خدمات الخداع لا يزال يعني كشف خدمات؛ قم بتشغيلها على مضيفات معزولة، حافظ على تحديثها، ولا توجهها نحو أي شيء لا يمكنك تحمل استكشافه. الخداع ليس بديلاً عن تأمين الشيء الحقيقي.
إذا كنت ترغب في المساهمة في هذا المشروع واستخدام وكيل AI أو الاعتماد بشكل كبير على الكود المُنشأ، فهذا جيد تماماً — ولكن سيتم اختبارك شخصياً في كل سطر من الكود الذي تقدمه، وإذا لم تظهر فهماً فورياً خالٍ من AI، فسيتم رفض مساهمتك بالكامل وإلغاؤها.
MIT.
| المزود | النوع | ملاحظات |
|---|
| Ollama | ollama | نماذج محلية؛ الافتراضي localhost:11434 |
| llama.cpp | llamacpp | نقطة نهاية OpenAI المحلية server |
| OpenAI | openai | OPENAI_API_KEY |
| Azure OpenAI | azure | يحتاج azure.deployment + azure.apiVersion |
| OpenRouter | openrouter | OPENROUTER_API_KEY |
| Anthropic | anthropic | ANTHROPIC_API_KEY |
| Google Gemini | google | GEMINI_API_KEY |
| أي شيء على شكل OpenAI | openai-compatible | وجه baseUrl إلى بوابتك |