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

تقديم `honeyprompt`، إطار عمل خداع يعتمد على LLM أولاً، صُنع بواسطة/لمطوري الويب. مشروع شغف شخصي لـ [@alectrocute](https://github.com/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:**
```bash
# إذا لم يكن لديك 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`.** قيمتان مطلوبتان:
```dotenv
OPENROUTER_API_KEY=sk-or-... # استخدم مفتاحاً مخصصاً مع حد إنفاق
HONEYPROMPT_PANEL_PASSWORD=changeme # كلمة مرور المصادقة الأساسية للوحة
```
**3. ابدأه:**
```bash
docker compose up -d
```
**4. اختبره:**
```bash
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`](https://github.com/alectrocute/honeyprompt/blob/main/compose.yaml). هذا غير موصى به لنشرات الإنتاج.
> استخدم إصداراً مرقماً بدلاً من `latest` لنشرات الإنتاج — عيّن `HONEYPROMPT_IMAGE` في `.env`.
الملف [`honeyprompt.yaml`](https://github.com/alectrocute/honeyprompt/blob/main/honeyprompt.yaml) الذي قمت بتنزيله للتو هو ملف توضيحي مشروح بالكامل. يشمل ملفات تعريف لـ:
- **خادم ويب شركة عام** — المنفذ 80، أوسع شبكة؛ `/` يقدم صفحة nginx الترحيبية القياسية فوراً، والمسارات الأعمق تمر إلى LLM لصفحات إنترانت كاملة HTML/CSS ونماذج تسجيل الدخول ولوحات الإدارة المصممة لإبقاء المهاجم ينقر.
- **بوابات MCP / العامل** — اكتشاف HTTP قابل للبث، بيانات OAuth، استدعاءات أدوات JSON-RPC، وأدوات إنتاج مغرية.
- **واجهة Docker Engine API 29.5** — سطح المنفذ 2375 غير الموثق المستخدم من قبل ديدان السحابة الحقيقية.
- **واجهة Kubernetes API v1.36** — اكتشاف مساحات الأسماء وأعباء العمل والأسرار وConfigMaps وRBAC.
- **بنية تحتية لبناء AI على Ubuntu 26.04** — SSH وأعباء عمل GPU وDocker وkubeconfigs وحالة CI وبيانات اعتماد المزود.
- **Redis 8.8** — استفسارات RESP الشائعة المستخدمة لسرقة بيانات الاعتماد والثبات والحركة الجانبية.
- **الحافة الصناعية / OT** — سطح إدارة Telnet قديم عمداً، لأن الدفاع الحديث لا يزال بحاجة لرصد الهجمات على البنية التحتية القديمة.
### التشغيل بدون LLM
> [!مهم]
> حتى إذا كنت تستخدم LLM، حدد المسارات الأكثر استخداماً وأضف قواعد ثابتة لها. سيوفر لك هذا كمية هائلة من رموز LLM ويسرع الاستجابات للطلبات التي لا تستحق تكلفة استدعاء LLM. أمثلة عشوائية: `whoami`، فحوصات الصحة، أيقونة المفضلة، استفسارات الإصدار، إلخ.
هذا الحد الأدنى من `honeyprompt.yaml` يزيّف صندوق SSH بقاعدتين ثابتتين وبدون LLM:
```yaml
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"
```
```bash
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`](https://github.com/alectrocute/honeyprompt/blob/main/compose.yaml) المرفق. يغطي [دليل النشر](https://github.com/alectrocute/honeyprompt/blob/main/DEPLOYMENT.md) إصدارات Docker Hub وأسرار GitHub المطلوبة وإعداد المنفذ والجدار الناري والوصول للوحة عبر SSH والترقيات والاستعادة وتخزين الأحداث والعزل.
## لماذا الخداع القائم على LLM أولاً، باختصار
كل ما على وعاء العسل (honeypot) فعله هو شيء واحد جيد: البقاء مقنعاً لفترة كافية حتى يستمر المهاجم في الكتابة. كل أمر ينفذه هو استخبارات — الأدوات التي يلجأ إليها، بيانات الاعتماد التي يعيد استخدامها، الثغرات (CVEs) التي يفترض أنك لم تقم بتصحيحها. وعاء العسل الثابت يخرج عن الشخصية بمجرد تشغيل أمر لم يتوقعه المؤلف. honeyprompt يسلم تلك اللحظة إلى LLM، بحيث تجيب الصدفة على `dmesg | tail` أو `cat /etc/shadow` بالطريقة التي يجيب بها النظام الحقيقي، وتستمر الجلسة.
شاهد عرض Adel Karimi الرائع في DEF CON 32 حول Galah، (أول؟) وعاء عسل LLM، الذي ألهم هذا المشروع: <https://www.youtube.com/watch?v=XGsm4Qcc_Ag>
## ما يتم تسجيله: تياران منفصلان
هذا هو الجزء الذي يستحق الفهم مسبقاً، لأن الاثنين منفصلان عمداً:
- أحداث الخداع: كل تفاعل للمهاجم: الاتصالات، محاولات المصادقة، كل أمر أو طلب، الاستجابة التي أرسلها honeyprompt، أي مزود ونموذج أجاب، والمدة التي استغرقها. هذه هي استخبارات التهديدات الخاصة بك. تُحفظ في مخزن مؤقت في الذاكرة للوحة الحية ويمكنك حفظها كلها على القرص.
- سجلات التشغيل: بدء التشغيل، المنافذ التي ربطها، فشل المزود، الإغلاق، الأخطاء الداخلية. هذا ما تقرأه عندما يسيء _وقت التشغيل_ التصرف. لا علاقة له بنشاط المهاجم.
تقوم بتكوينهما بشكل منفصل:
```yaml
# العسل: نشاط المهاجم.
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 بنقرة واحدة:
```yaml
panel:
enabled: true
address: "0.0.0.0:8080"
auth: # مصادقة أساسية اختيارية
username: admin
password: "${HONEYPROMPT_PANEL_PASSWORD}"
```
لوحة التحكم هي HTML وCSS وجافا سكريبت عادية ([`src/panel/assets`](https://github.com/alectrocute/honeyprompt/blob/main/src/panel/assets)) مضمنة في الثنائي. اترك `auth` غير معرّف لتعطيل المصادقة.
## المزودون
كل مزود هو وحدة خاصة به مع مهلة زمنية وإعادة محاولات وحدود معدل ورؤوس خاصة به. المفاتيح تأتي من البيئة. خارج الصندوق:
| المزود | النوع | ملاحظات |
| ---------------------- | ------------------- | --------------------------------------------- |
| 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` إلى بوابتك |
### موازنة الحمل والتحويل الاحتياطي
قم بتكوين المزودين، اختر `pool.strategy` (`round-robin`، `weighted`، `random`، أو `failover`)، ويوزع honeyprompt الحركة بينهم. إذا انتهت مهلة المزود المختار أو أعاد خطأً قابلاً لإعادة المحاولة، ينتقل honeyprompt تلقائياً إلى التالي — الخلفية الميتة لا توقف وعاء العسل أبداً. الأخطاء غير القابلة لإعادة المحاولة (مثل مفتاح API خاطئ) توقف التسلسل لتعرف بدلاً من استنزاف الحصة بصمت.
تستخدم الخدمات التجمع العالمي ما لم تسمي مجموعة فرعية خاصة بها من المزودين:
```yaml
llm:
enabled: true
providers: [local-ollama] # اسم واحد: إجبار هذه الخدمة على هذا المزود
```
اسرد عدة أسماء للحفاظ على موازنة الحمل والتحويل الاحتياطي، ولكن فقط ضمن تلك المجموعة الفرعية:
```yaml
llm:
enabled: true
providers: [openai-primary, openrouter-backup]
```
### التجمعات المسماة
عندما يجب أن تشارك عدة خدمات نفس مجموعة المزودين — أو مجموعة فرعية تحتاج استراتيجيتها الخاصة بدلاً من الاستراتيجية العامة — قم بتعريف **تجمع مسمى**. التجمع له اسم واستراتيجية وقائمة مزودين مرتبة، وتشير إليه الخدمة بالاسم في أي مكان تسمي فيه مزوداً:
```yaml
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 الخاص بك في مسار الطلب والاستجابة. يمكن للخطاف إعادة كتابة الطلب قبل أن يصل إلى النموذج، أو إعادة كتابة الرد قبل أن يصل إلى المهاجم.
```ts
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](https://deno.com) 2.x — الاعتماد الوحيد.
```bash
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 بكل [إصدار](../../releases) موسوم.
تقوم CI بتشغيل التنسيق والفحص والتحقق من الأنواع والاختبارات والتحقق من صحة التكوين و `compile` عبر المنصات وبناء Docker مع كل دفعة. وضع علامة `vX.Y.Z` يقطع ثنائيات الإصدار وينشر الصورة متعددة البنى المرفقة مع منشأ وشهادة SBOM إلى [`alectrocute/honeyprompt`](https://hub.docker.com/r/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](https://github.com/alectrocute/honeyprompt/blob/main/LICENSE).