العودة إلى المنشورات
أرشيف الأبحاث

الكشف عن بوابات OpenClaw عبر mDNS

الكشف عن كشف بوابات OpenClaw وClawdbot وMoltbot من خلال الاستماع إلى إعلانات خدمات mDNS باستخدام قالب Nuclei ببروتوكول JavaScript.

openclawnucleiexposuremdnsudpdetectionai-security

يعيش OpenClaw لحظته الآن. وكيل الذكاء الاصطناعي المستقل هذا — الذي قد تعرفه باسم Clawdbot أو Moltbot، بحسب متى التقيت به لأول مرة — تسلّق قوائم GitHub بسرعة خلال الأسابيع الماضية، ويقوم الناس بنشر نسخ منه في كل مكان. ومنذ الأسبوع الماضي، يمر بأول لحظة أمنية حقيقية له: صدر CVE-2026-25253، وهو ثغرة RCE بنقرة واحدة، مع وصول تصحيح لها بعد أيام قليلة فحسب. إذا كنت تشغّل هذه النسخ، أو كنت مسؤولاً عن شبكة قد يفعل فيها شخص ما ذلك، فهذا هو الوقت المناسب لمعرفة أين توجد.

خلفية سريعة

يربط OpenClaw نماذج اللغة الكبيرة (Claude وGPT-4 ونماذج Google) بجهازك ومتصفح حقيقي، ويتيح لوكيل ذكاء اصطناعي تنفيذ المهام نيابةً عنك — الدردشة عبر Telegram/Slack، وتنفيذ مهام الويب، وتشغيل الأوامر. المكوّن الذي يعنيه هذا القالب هو خدمة البوابة، التي تُعلن عن نفسها للاكتشاف المحلي عبر DNS متعدد البث (mDNS) على المنفذ 5353/UDP.

ملاحظة حول التسمية، لأن أدوات المطابقة تعتمد عليها: المشروع يُسمى الآن OpenClaw، لكنه صدر باسم Clawdbot وقبل ذلك باسم Moltbot — قاعدة كود واحدة، وأسماء خدمات mDNS لا تزال تحمل العلامة التجارية القديمة (_clawdbot-gw و_openclaw-gw). يطابق القالب كليهما حتى لا يتسبب تغيير الاسم في إغفال الكشف.

القالب

id: openclaw-exposure
info:
  name: Openclaw (formerly Clawdbot / Moltbot) - Detect
  author: rxerium
  severity: info
  description: |
    Clawdbot Gateway service was detected exposing configuration information via mDNS including DNS settings, gateway details, and service configuration.
  classification:
    cwe-id: CWE-200
  metadata:
    verified: true
    max-request: 1
    shodan-query: product:openclaw
    fofa-query: body="ClawdBot"
  tags: network,openclaw,gateway,exposure,udp,mdns,js,discovery
javascript:
  - pre-condition: |
      isUDPPortOpen(Host,Port);
    code: |
      let c = require("nuclei/net");
      let conn = c.Open('udp', `${Host}:${Port}`);
      // mDNS query for _clawdbot-gw._tcp.local PTR record
      let packet = "000000000001000000000000095f7365727669636573075f646e732d7364045f756470056c6f63616c00000c0001"
      conn.SendHex(packet);
      let resp = conn.RecvString(2048);
      resp;
    args:
      Host: "{{Host}}"
      Port: 5353
    matchers:
      - type: dsl
        dsl:
          - "contains(response, '_openclaw-gw') && success == true"
          - "contains(response, 'clawdbot') && success == true"
        condition: or
    extractors:
      - type: regex
        part: response
        name: server
        group: 1
        regex:
          - 'displayName=([a-zA-Z0-9._-]+)'

كيف يعمل

هذا قالب بروتوكول JavaScript، وليس HTTP. معظم قوالب الكشف عن الإخفاقات ترسل طلب GET وتطابق نص الاستجابة. هذا القالب يستخدم مكتبة nuclei/net في Nuclei لفتح مقبس خام والتحدث مباشرةً بروتوكولاً ثنائياً — وهذا ضروري لأن mDNS شيء لا يمكن التعبير عنه بأدوات مطابقة HTTP.

الشرط المسبق يتحكم في كل العملية. يتحقق isUDPPortOpen(Host, Port) من أن 5353/UDP يستمع فعلاً قبل إرسال أي حزمة. إذا كان مغلقاً، يتوقف القالب مباشرةً ولا تُستهلك أي طلب — مما يُبقي عمليات المسح رخيصة عند توجيه الأداة نحو نطاق واسع حيث لن تشغّل معظم المضيفين بوابةً.

يرسل الكود استعلام mDNS خاماً ويقرأ الرد. يفتح اتصال UDP إلى Host:5353، ويرسل حزمة DNS مشفرة بنظام hex باستخدام SendHex، ويقرأ ما يصل إلى 2048 بايت. الحمولة المفككة هي استعلام تعداد خدمات DNS-SD — سؤال PTR للعنوان _services._dns-sd._udp.local، وهو الاستعلام الفوقي القياسي "قائمة بكل ما تُعلن عنه". يجيب المضيف الذي يشغّل البوابة بخدماته المُعلنة، ويظهر اسم خدمة OpenClaw/Clawdbot في تلك الاستجابة.

أدوات المطابقة تؤكد أنها بوابة. فحصان DSL مدمجان بـ or: contains(response, '_openclaw-gw') أو contains(response, 'clawdbot')، كلاهما مشروط بـ success == true حتى لا يُنتج مقبس نصف مفتوح أو قراءة فارغة نتيجة إيجابية زائفة. أي من السلسلتين في رد mDNS يؤكد أنك تنظر إلى بوابة OpenClaw، أياً كانت العلامة التجارية التي تحملها.

أداة الاستخراج تسحب الاسم المعروض للجهاز. يلتقط تعبير منتظم displayName=... من الإعلان ويعرضه كـ server في مخرجاتك. لذا فالنتيجة الإيجابية ليست مجرد "توجد بوابة" — بل تحصل على الاسم المقروء الذي أعطاه له المشغّل، وهو ذهب بالنسبة للجرد والفرز.

الخطورة info، CWE-200. هذا هو التصنيف الصادق: يكشف القالب عن كشف معلومات (CWE-200، كشف المعلومات) — بوابة تُعلن عن تكوينها حيث لا ينبغي لها ذلك — وليس استغلالاً نشطاً. تسرب mDNS على واجهة يمكن الوصول إليها هو النتيجة؛ ما يفعله المهاجم بعد ذلك مشكلة منفصلة.

verified: true يعني أن القالب جرى التحقق منه على نسخة حقيقية، وليس مكتوباً فحسب وفق المواصفات — لذا فالمطابقة موثوقة.

لماذا يستحق الكشف عبر mDNS الاهتمام

البصمة عبر HTTP هي الطريقة الواضحة للعثور على هذه البوابات، وتنجح. لكن mDNS يلتقط شريحة مختلفة. قد تتسرب البوابة باكتشاف الخدمات إلى شبيكة شبكة يمكن للمهاجم الوصول إليها، حتى عندما يكون الجانب HTTP محمياً بجدار حماية، أو خلف وكيل، أو على منفذ غير قياسي لم يغطِّه مسح HTTP. هذا ذو صلة خاصة بالتقييمات الداخلية والشبكات المسطحة، حيث يعبر البث المتعدد قطاعات لا ينبغي له اجتيازها بكل ارتياح، والبوابة تُعلن فعلياً "أنا هنا، وهذا اسمي" لكل ما على الشبكة. شغّل هذا جانباً مع بصمة HTTP وستحصل على تغطية لا يتيحها أيٌّ منهما منفرداً.

التشغيل على نطاق واسع

شبكتك الخاصة ومحيطها أولاً — التفويض الأوضح، ونتائج mDNS تكون أكثر قابلية للتنفيذ داخل الشبكات التي تتحكم فيها.

nuclei -t openclaw-exposure.yaml -l targets.txt -o openclaw-hits.txt

يُثبّت القالب بالفعل المنفذ 5353 في args الخاص به، والشرط المسبق isUDPPortOpen يعني أنك تستطيع رمي قائمة مضيفين واسعة دون قصف أي شيء — المنافذ المغلقة تُتجاوز قبل إرسال حزمة.

قم بالتصفية المسبقة بمسح UDP للنطاقات الكبيرة. مسح UDP أبطأ من TCP، لذا على النطاقات الواسعة من المفيد إيجاد مستمعي 5353 النشطين أولاً وتمرير أولئك فقط إلى Nuclei:

# naabu doesn't do UDP; use nmap for the 5353/udp sweep
nmap -sU -p 5353 --open -iL ranges.txt -oG - | awk '/Up$/{print $2}' > mdns-hosts.txt
nuclei -t openclaw-exposure.yaml -l mdns-hosts.txt -o openclaw-hits.txt

على نطاق الإنترنت، ارتكز على بيانات المسح. لا ترسل UDP بشكل نشط عبر الإنترنت بأكمله — إنه صاخب وبطيء ومعقد قانونياً. استخدم استعلامات metadata المضمنة في القالب (product:openclaw على Shodan، body="ClawdBot" على FOFA) لتعداد النسخ المكشوفة، ثم شغّل القالب فقط ضد المرشحين في نطاقك المفوّض.

شغّله باستمرار، لا مرة واحدة. قاعدة تثبيت OpenClaw ترتفع يومياً الآن، مما يعني ظهور بوابات جديدة باستمرار — مسح لمرة واحدة يصبح قديماً بسرعة. واقرن كل نتيجة إيجابية بعمليتين: أزل البوابة عن أي واجهة يمكن الوصول إليها، وقم بتدوير بيانات الاعتماد التي تحملها.

لماذا يهم هذا

تسرب mDNS هو النتيجة التي ينتجها القالب، لكن سبب الاهتمام الآن تحديداً هو ما يجلس خلف بوابة مكشوفة.

التوقيت هو القصة. جرى الكشف عن CVE-2026-25253 في 26 يناير وتصحيحه في OpenClaw 2026.1.29، الذي صدر نهاية الأسبوع الماضي. هو تنفيذ كود عن بُعد بنقرة واحدة: تقبل واجهة Control UI عنوان gatewayUrl من سلسلة استعلام URL وتفتح تلقائياً WebSocket إليه دون تأكيد، مما يُسرّب رمز المصادقة للنسخة إلى من يتحكم في ذلك العنوان. اسرق الرمز، واخترق WebSocket، ونفّذ الأوامر. لا يحتاج مصادقة مسبقة، مُصنَّف CVSS 8.8 (CWE-669، النقل غير الصحيح للموارد بين النطاقات)، و— الجزء الكريه — يعمل حتى ضد نسخ تعمل فقط على localhost، لأن الهجوم يتمحور عبر متصفح الضحية نفسه. يُطلق عليه الباحثون "سلسلة قتل RCE بنقرة واحدة". كود إثبات المفهوم موجود بالفعل على الملأ، والتغطية الإعلامية الواسعة لا تزال تصل في اللحظة التي أكتب فيها هذا.

هذه المشكلة الحادة، لكن المشكلة الدائمة هي الكشف بشكل عام. يخزّن OpenClaw بيانات اعتماد للنماذج السحابية التي يقودها — Claude وOpenAI وGoogle AI — بالإضافة إلى رموز لأي تكاملات مراسلة وأدوات قمت بتوصيلها. البوابة المكشوفة هي SSH مفتوح بلا كلمة مرور، إلا أن "كلمة المرور" هنا كومة من بيانات اعتماد الذكاء الاصطناعي المدفوعة ومعقل على الجهاز المضيف. ولأن الوكيل هوية لها صلاحيات وصول، فإن من يستولي عليه يرث رموزه ومنح OAuth، ويمكنه إعطاؤه تعليمات ينفذها دون تساؤل. بيانات الاعتماد هي الجائزة الفورية؛ المعقل الدائم داخل وكيل ذو امتياز هو الجائزة الدائمة. البوابة التي تبث displayName الخاص بها عبر mDNS تجعل نفسها أسهل للعثور عليها. هذه هي الثغرة التي يُعالجها هذا القالب.

التخفيف

إذا كنت تشغّل OpenClaw، قائمة مهام هذا الأسبوع:

  1. طبّق التصحيح الآن. قم بالتحديث إلى 2026.1.29 أو أحدث — فهو يُصلح CVE-2026-25253. التصحيح لا يتراجع عن الكشف السابق، لذا اعتبره الخطوة الأولى لا العمل كله.
  2. قم بتدوير رمز البوابة وكل بيانات اعتماد مخزنة. authToken جديد، ومفاتيح API جديدة لـ Claude وOpenAI وGoogle AI، وراجع سجلات الاستخدام. إذا كانت يمكن الوصول إليها، افترض أنها مخترقة.
  3. أزلها عن أي واجهة يمكن الوصول إليها. اربطها بالحلقة الراجعة، أو ضعها خلف VPN أو حاسوب وثبة أو ZTNA، وأوقف 5353/UDP عند حدود الشبيكات حتى يتوقف mDNS عن اجتياز شبكات لا ناقة له فيها. الحلقة الراجعة هي الحد الأدنى لا الحد الأقصى — RCE يتمحور عبر المتصفح، فـ localhost-فقط ليس مروراً مجانياً.
  4. شغّل الوكيل بأقل صلاحية. لا "وضع الإله". قلّص وصوله إلى النظام والملفات والمفاتيح، وراقبه كأي حساب يحمل منح API وOAuth دائمة.
  5. راقب نمط الاستغلال. ضع علامة على اتصالات WebSocket غير المتوقعة من المتصفحات إلى نطاقات خارجية، وأنشئ تنبيهات على تغييرات تكوين البوابة.

الكشف نفسه ليس غريباً — شرط مسبق، واستعلام mDNS خام، وأداتا مطابقة نصية. القيمة في التوقيت: يلتقط البوابات التي تُعلن عن نفسها على الشبكة حتى حين يكون الجانب HTTP مقفلاً، في اللحظة ذاتها التي يجعل فيها RCE عام بنقرة واحدة إيجادها أمراً عاجلاً. شغّله مبكراً، شغّله كثيراً، ودوّر المفاتيح عند كل نتيجة. بيئات تشغيل الوكلاء هويات تمتلك مفاتيح؛ إيجاد المكشوفة منها بسرعة هو كل اللعبة.