OpenClaw переживает свой звёздный час. Автономный ИИ-агент — вы можете знать его как Clawdbot или Moltbot, в зависимости от того, когда впервые с ним столкнулись — стремительно поднялся в чартах GitHub за последние несколько недель, и люди разворачивают экземпляры повсюду. С прошлой недели у него также наступил первый настоящий момент в сфере безопасности: опубликована CVE-2026-25253 — RCE одним кликом — и патч появился лишь несколько дней спустя. Если вы запускаете эти экземпляры или отвечаете за сеть, где кто-то может это делать, сейчас время выяснить, где именно они находятся.
Краткий контекст
OpenClaw подключает LLM (Claude, GPT-4, модели Google) к вашей машине и настоящему браузеру, позволяя агенту выполнять работу от вашего имени — переписываться в Telegram/Slack, выполнять веб-задачи, запускать команды. Компонент, который интересует этот шаблон, — служба шлюза, которая анонсирует себя для локального обнаружения через multicast 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, отправляет hex-кодированный DNS-пакет через 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, Information Exposure) — шлюз, анонсирующий свою конфигурацию там, где не должен, — а не активную эксплуатацию. mDNS, утекающий на достижимый интерфейс, и есть находка; что злоумышленник делает дальше — отдельная проблема.
verified: true означает, что шаблон был подтверждён на реальном экземпляре, а не только написан по спецификации — совпадению можно доверять.
Почему стоит иметь обнаружение через mDNS
HTTP-фингерпринтинг — очевидный способ найти эти шлюзы, и он работает. Но mDNS улавливает другой срез. Шлюз может утекать обнаружение сервисов в сетевой сегмент, доступный злоумышленнику, даже когда HTTP-сторона закрыта межсетевым экраном, находится за прокси или работает на нестандартном порту, который ваше HTTP-сканирование не охватило. Это особенно актуально для внутренних оценок и плоских сетей, где multicast беспечно пересекает сегменты, которые не должен, а шлюз фактически объявляет всем в сети: «Я здесь, и вот моё имя». Запустите это вместе с 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 без подтверждения, утекая токен аутентификации экземпляра тому, кто контролирует этот URL. Крадёшь токен, перехватываешь WebSocket, выполняешь команды. Предварительная аутентификация не нужна, оценка CVSS 8.8 (CWE-669, некорректная передача ресурсов между областями), и — неприятная деталь — атака работает даже против экземпляров, запущенных только на localhost, поскольку она поворачивается через собственный браузер жертвы. Исследователи называют это «kill chain RCE в один клик». Код proof-of-concept уже публичен, и широкое медиаосвещение только начинает приходить, пока я это пишу.
Это острая проблема, но перманентная — экспозиция в целом. OpenClaw хранит учётные данные для облачных моделей, которыми управляет, — Claude, OpenAI, Google AI, — а также токены для любых подключённых интеграций с мессенджерами и инструментами. Открытый шлюз — это SSH без пароля, только вместо пароля — куча платных ИИ-учётных данных и точка опоры на хосте. А поскольку агент — это идентичность с доступом, тот, кто его захватывает, наследует его токены и OAuth-гранты и может давать ему инструкции, которые он выполнит без вопросов. Учётные данные — немедленная добыча; устойчивая точка опоры внутри привилегированного агента — долгосрочная. Шлюз, транслирующий свой displayName через mDNS, просто делает себя более заметным. Вот та брешь, для закрытия которой создан этот шаблон.
Меры по устранению
Если вы запускаете OpenClaw, список дел на эту неделю:
- Установите патч сейчас. Обновитесь до 2026.1.29 или выше — он исправляет CVE-2026-25253. Установка патча не устраняет предыдущую экспозицию, поэтому считайте это первым шагом, а не всей работой.
- Ротируйте токен шлюза и каждый сохранённый секрет. Новый
authToken, новые API-ключи для Claude/OpenAI/Google AI, и проверьте журналы использования. Если шлюз был доступен — предполагайте, что он скомпрометирован. - Уберите его с любого достижимого интерфейса. Привяжите к loopback, или поставьте за VPN, bastion или ZTNA, и заблокируйте 5353/UDP на границах сегментов, чтобы mDNS перестал пересекать сети, где ему нечего делать. Loopback — это пол, а не потолок: RCE действует через браузер, так что только localhost не является гарантией безопасности.
- Запускайте агента с минимальными привилегиями. Никакого «режима бога». Ограничьте его доступ к системе, файлам и ключам, и мониторьте его как любую учётную запись с постоянными API- и OAuth-грантами.
- Следите за паттерном эксплуатации. Отмечайте неожиданные WebSocket-соединения из браузеров к внешним доменам и оповещайте об изменениях конфигурации шлюза.
Само обнаружение несложно — предусловие, сырой mDNS-запрос, два строковых матчера. Ценность — в тайминге: он захватывает шлюзы, анонсирующие себя в сети, даже когда HTTP-сторона заблокирована, именно в тот момент, когда публичный RCE в один клик делает их поиск срочным. Запускайте рано, запускайте часто, ротируйте ключи при каждом совпадении. Среды выполнения агентов — это идентичности с ключами; быстро находить открытые — вот вся игра.