
OliveTin — это self-hosted веб-интерфейс для предоставления конечным пользователям доступа к предопределённым shell-командам. Этот репозиторий содержит proof-of-concept, демонстрирующий два независимых вектора внедрения OS-команд в путь выполнения Shell-режима OliveTin, оба из которых обходят предусмотренные приложением проверки безопасности аргументов shell.
| ID CVE | CVE-2026-27626 |
| Компонент | OliveTin |
| Класс уязвимости | CWE-78: Нейтрализация специальных элементов, используемых в команде ОС |
| CVSS 3.1 | 9.9–10.0 (Критический) — AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H |
| Затронутые версии | Все версии ≤ 3000.10.0 (коммиты до 0.0.0-20260222101908-4bbd2eab1532) |
| Исправленная версия | 0.0.0-20260222101908-4bbd2eab1532 или новее |
| Уведомление | GHSA-49gm-hh7w-wfvf |
| Раскрыта | 2026-02-22 (уведомление), 2026-02-25 (NVD) |
OliveTin — это самостоятельный веб-интерфейс для предоставления предопределённых команд оболочки конечным пользователям. Этот репозиторий содержит доказательство концепции, демонстрирующее два независимых вектора внедрения команд ОС в режиме выполнения команд оболочки OliveTin, оба из которых обходят предусмотренные приложением проверки безопасности аргументов оболочки.
OliveTin позволяет администратору определять Действия — команды оболочки с параметризованными аргументами — которые аутентифицированные (или, в зависимости от конфигурации, анонимные) пользователи могут запускать из веб-интерфейса или через вебхуки. Чтобы предотвратить выход пользователя за пределы предполагаемой команды через значения аргументов, OliveTin пропускает каждый предоставленный пользователем аргумент через checkShellArgumentSafety() перед тем, как встроить его в строку команды и передать в sh -c.
Это и есть граница безопасности, которую нарушает уязвимость. OliveTin явно различает "администратор определяет команду" и "пользователь предоставляет значение" — проверка безопасности существует специально для того, чтобы пользователь не смог превратить значение аргумента в способ выполнения произвольных команд.
password не проверяетсяcheckShellArgumentSafety() проверяет только фиксированный разрешённый список типов аргументов:
func checkShellArgumentSafety(argType string, value string) bool {
dangerousTypes := []string{"string", "int", "bool", "choice"}
for _, dt := range dangerousTypes {
if argType == dt {
return sanitizeInput(value)
}
}
// ОШИБКА: тип "password" не проверяется
return true // Считается безопасным
}
password — это документированный, предназначенный тип аргумента для приёма чувствительных пользовательских данных, но он отсутствует в dangerousTypes, поэтому проверка проходит до return true без санитизации. Любой пользователь, способный заполнить аргумент типа password в Действии режима Shell, может внедрить метасимволы оболочки (;, |, `, $() и т.д.), которые выполняют произвольные команды от пользователя процесса OliveTin.
Эксплуатируемость этого вектора усиливается настройками по умолчанию OliveTin: саморегистрация включена, а authType: none установлен из коробки, поэтому во многих реальных развёртываниях "аутентифицированный пользователь" не требует никаких реальных преград.
Независимо от Вектора 1, обработчик вебхуков OliveTin извлекает произвольные пары ключ/значение из JSON тела входящего вебхука и вставляет их напрямую в ExecutionRequest.Arguments (service/internal/executor/handler.go:153-157).
Поскольку у этих ключей, полученных из вебхука, нет соответствующего ActionArgument, определённого в конфигурации действия, parseActionArguments() (arguments.go) не находит тип аргумента для проверки и полностью пропускает checkShellArgumentSafety() — и не только для password, а для всех типов. Сырое значение встраивается в команду оболочки и передаётся в sh -c без какой-либо проверки.
Поскольку приём входящих вебхуков от внешних/недоверенных источников является одним из основных поддерживаемых вариантов использования OliveTin, этот вектор не требует никакой аутентификации.
Экземпляр OliveTin, работающий в режиме Shell с любым Действием, запускаемым через вебхук, уязвим для неаутентифицированного удалённого выполнения кода с привилегиями процесса OliveTin — что потенциально может привести к полной компрометации хоста в зависимости от того, как развёрнут OliveTin (на голом металле или в контейнере, предоставленные возможности и т.д.).
Вы, вероятно, уязвимы, если ваш экземпляр OliveTin:
password, доступное недоверенным/менее привилегированным пользователям (Вектор 1), илиpython3 CVE-2026-27626.py -u <ЦЕЛЬ> [ОПЦИИ]
0.0.0-20260222101908-4bbd2eab1532 или новее, как только это станет доступно в вашем канале обновлений.password на любых Действиях, доступных недоверенным пользователям.authType, отличный от none).| Дата | Событие |
|---|---|
| 2026-02-20 | CVE зарезервирован |
| 2026-02-22 | Опубликовано уведомление о безопасности GitHub |
| 2026-02-25 | Публикация в NVD |
| 2026-02-27 | Уведомление обновлено |
Этот PoC опубликован только для защитных исследований, разработки методов обнаружения и авторизованного тестирования на проникновение. Не запускайте его против систем, которыми вы не владеете или на тестирование которых у вас нет явного письменного разрешения. Неправильное использование этого кода против сторонних систем может нарушить законы о компьютерных преступлениях (например, CFAA в США, Закон о неправомерном использовании компьютеров в Великобритании и аналогичные законы в других странах) и является исключительной ответственностью лица, выполняющего его.
Md Saikat (0xh7ml)
| Опция | Описание | По умолчанию |
|---|
-u, --url | Целевой хост/IP | Обязательно |
-p, --port | Порт OliveTin | 1337 |
-x, --cmd | Команда для выполнения | id |