# Отчёт о проверке и устранении уязвимостей ## Область проверки и статус Проект: PRVTPRO/Amnezia-Web-Panel. Исходная версия: `f90cc5c`, 1.7.0. Отчёт: https://www.scangit.org/report/76397 . Из встроенных данных извлечены и рассмотрены **18 групп, 30 срабатываний**. Номера строк сканера относятся к сканировавшейся версии, а не к текущему файлу. Дополнительно проверены авторизация, CAPTCHA, защищённые ссылки и исполнение SSH-команд. **Исправления находятся только в локальной рабочей копии. Коммит, публикация, развёртывание и повторное сканирование ScanGit не выполнялись.** «Исправлено» означает изменение кода и локальную регрессионную проверку, а не закрытие записи на сайте сканера. Это ограниченный аудит исходного кода, не полный пентест и не гарантия отсутствия других уязвимостей. ## Разбор всех групп ScanGit | Группа, с нуля | Находка / количество | Заключение и действие | |---|---|---| | 0 | Insecure HTTP / 1 | Фиксированный локальный API ngrok `127.0.0.1:4040`, а не передача через внешний HTTP. Заявленная удалённая транспортная уязвимость не подтверждена. | | 1 | Unrestricted file upload / 1 | Импорт JSON доступен администратору; загрузка исполняемого файла не подтверждена. Усилена защита: чтение максимум 32 MiB, проверка корневого объекта и кодировки. Ограничение тела на прокси всё равно необходимо: multipart разбирается раньше обработчика. | | 2 | Cookie без HttpOnly / 1 | Cookie языка не содержит секрета авторизации. Добавлен HttpOnly как дополнительная защита. | | 3 | Cookie без Secure / 1 | Secure включён при HTTPS; работа через HTTP на localhost сохранена. Это не принудительный HTTPS и не изменение политики session-cookie. | | 4 | Telemt curl SSRF / 1 | Произвольное назначение запроса не подтверждено: используется loopback. Однако выявлена и исправлена настоящая инъекция shell-аргументов: каждый аргумент экранируется, URL передаётся после `--`, globbing curl выключен. | | 5 | Critical command injection / 1 | Указанный `taskkill` запускается списком аргументов без shell. Данная точка не подтверждает shell injection. Не выдаётся за закрытую критическую уязвимость. | | 6 | Path traversal / 5 | Локальные переводы, фиксированные пути, разрешённые провайдеры туннеля и фиксированные имена назначения. Имена элементов ZIP/TAR в установщике туннеля не используются как пути назначения. Управляемый HTTP-запросом обход пути в указанных точках не подтверждён. | | 7 | Template XSS / 7 | Вызов шаблона/редиректа/ответа сам по себе не доказывает XSS. Обычные случаи защищены автоэкранированием Jinja или фиксированными адресами. Реальный open redirect через Referer при смене языка устранён: разрешён только локальный путь того же origin. Полное отсутствие XSS во всех шаблонах и JavaScript не заявляется. | | 8 | AST path traversal / 2 | Перебор процессов в `/proc`, а не пути из HTTP-запроса. Заявленная web path traversal не подтверждена. | | 9 | Предсказуемые временные пути / 2 | Исправлено: атомарные приватные каталоги `mktemp -d`, экранирование путей, очистка в finally. Дополнительно устранена подстановка команд через путь назначения привилегированной загрузки и добавлена проверка результата перемещения. | | 10 | click 8.3.1 / 1 | CVE-2026-7246 оспаривается в записи CNA/проектом. Использование `click.edit` приложением не найдено. Версия оставлена; подтверждённая инъекция команд в панели не заявляется. | | 11 | cryptography 44.0.0 / 1 | Обновлена до 44.0.1 для указанной проблемы встроенного OpenSSL, CVE-2024-12797. **Более новые advisory cryptography остаются открытыми.** | | 12 | Flask 3.1.0 / 1 | Обновлён до 3.1.3. CVE-2025-47278 исправлена начиная с 3.1.1. Использование Flask и fallback-ключей этим FastAPI-приложением не найдено. | | 13 | idna 3.11 / 1 | Обновлена до 3.15 для CVE-2026-45409, включая альтернативные функции обработки меток/кодека. | | 14 | Paramiko 3.5.1 / 1 | **Открыто:** CVE-2026-44405, согласование устаревшего RSA SHA-1. Исправляющий коммит присутствует в 5.0.0; major-upgrade или запрет алгоритмов требуют проверки управляемых серверов. Потенциально несовместимое изменение автоматически не внесено. | | 15 | Pillow 12.1.1 / 1 | Обновлена до 12.3.0: указанная CVE-2026-42311 и дополнительные найденные исправления. Декодирование недоверенных PSD в приложении не найдено. | | 16 | python-multipart 0.0.20 / 1 | Обновлена до 0.0.32: CVE-2026-53539 и дополнительные найденные исправления парсера. | | 17 | Starlette 0.46.2 / 1 | Обновлена до 0.49.1 вместе с совместимой FastAPI 0.120.1: закрыта указанная CVE-2025-62727, DoS через Range, и проблема блокирования multipart. **Более новые advisory Starlette остаются открытыми.** | Дополнительно AnyIO обновлена с 4.12.1 до 4.14.2 по найденным новым advisory. Массового обновления всех библиотек не проводилось. ## Дополнительные исправления - **Отключённые учётные записи:** старые cookie-сессии больше не предоставляют доступ пользователям с `enabled=False` или `role=none`. Сохранена совместимость старых записей без enabled. - **Чужие конфигурации:** проверка владения теперь учитывает сервер, client ID, семейство протокола и экземпляр. Сохранены допустимые псевдонимы AWG. Обход проверки доступен только явным ролям admin/support. Исходная проблема требовала совпадения client ID в разных экземплярах. - **Ответ CAPTCHA в cookie и повторное использование:** клиент получает только случайный непрозрачный ID. Ответ хранится на сервере; TTL пять минут, максимум 4096 записей, блокировка и атомарное однократное потребление. Неверная попытка расходует challenge; обновление CAPTCHA аннулирует предыдущую. - **Старые сессии защищённых ссылок:** авторизация привязана к ревизии. Смена/очистка пароля и отключение sharing аннулируют прежние сессии. URL ссылки остаётся прежним. Старые Boolean-cookie требуют повторной авторизации; ссылки без пароля остаются публичными. - **Смена языка:** отклоняются неподдерживаемые языки и внешние Referer-редиректы; корректный локальный путь и query сохраняются. - **JSON-бэкапы:** некорректная кодировка и корень не-объект возвращают клиентскую ошибку без записи данных. Предыдущая правка ресурсов EXE `/sw.js` сохранена и проверена отдельно; она не считается устранением уязвимости. ## Доработки по независимому ревью Ревью выявило ещё одну существовавшую проблему высокого риска: скачивание удалённого бэкапа через предсказуемый `/tmp/` открывало секреты другим локальным пользователям и допускало условную атаку через симлинк. Исправлено: перед привилегированным копированием создаётся приватный каталог mode-0700 владельца SSH/SFTP. Очистка перенесена во внешний finally и выполняется также при сбое создания локального файла или открытия SFTP; ошибки очистки журналируются. Два новых регрессионных теста падали до исправления и проходят после. Замечание к фикстуре sudo-теста также устранено, как описано ниже. Эта последняя доработка проверена локально, но отдельное повторное независимое ревью для неё не выполнялось. ## Проверки - Объединённый целевой запуск: **59 тестов прошли**, без ошибок и падений — авторизация, CAPTCHA, SSH/Telemt, sharing, web-защита, предположения сканера, пути PWA и отсутствие sudo-паролей в командах. - Полный набор: **459 тестов**, `failures=1, errors=9, skipped=1`. Названия оставшихся падений совпадают с исходными проблемами шаблона сервера. На исходном HEAD ранее выполнялся набор из 401 теста с теми же 1 failure / 9 errors / 1 skip. Отдельно наблюдалось нестабильное падение теста случайных AWG-параметров; его не относим к этой правке. - `uv pip check --python .venv/Scripts/python.exe`: все 42 установленных пакета совместимы по ограничениям зависимостей. - `git diff --check` проходит после нормализации окончаний строк requirements. - Существующая фикстура теста утечки sudo-пароля адаптирована к `mktemp`; теперь проверяет отсутствие пароля во всех командах, а не только в последней. - Проверки локальные, SSH замокан. Реальные удалённые серверы, собранный EXE и сборки Linux/macOS не проверялись. Атакующие запросы к развёрнутой панели не отправлялись. ## Открытые риски и выпуск 1. **Все зависимости безопасными не объявляются.** Новые исправления cryptography требуют более крупного перехода — рассмотрен кандидат 50.0.0. Новые проблемы Starlette включают обработку UNC-путей Windows StaticFiles, dispatch методов и лимиты URL-encoded форм — рассмотрены Starlette 1.3.1 и совместимая FastAPI. Эти миграции не применены автоматически в рамках минимальных изменений. Для Windows EXE проблему статики следует рассматривать приоритетно, а не как ложное срабатывание. 2. Устаревшие SSH-алгоритмы Paramiko и доверие ключам через AutoAddPolicy требуют отдельной проверки совместимости и hardening. 3. Защита восстановления удалённых архивов от symlink/hardlink требует отдельной доработки: проверка пути после распаковки не является общей гарантией безопасности. Доступ администратора уменьшает поверхность атаки, но не делает импорт чужого архива безопасным. 4. Хранилище CAPTCHA рассчитано на **один worker/process**. Для нескольких процессов нужно общее TTL-хранилище с атомарным извлечением. Перезапуск аннулирует CAPTCHA; массовая выдача может вытеснять действующие записи. Ограничение частоты запросов остаётся отдельной задачей. 5. Нужны HTTPS и лимиты запросов на reverse proxy. Лимит JSON-импорта не ограничивает весь multipart-трафик/временный диск до проверки прав обработчиком. 6. Эта правка не вводит глобальное версионирование всех сессий при смене пароля обычной учётной записи. Доступ отключённого пользователя запрещён, пока он отключён; общее принудительное завершение сессий — отдельная задача. 7. Старые ошибки рендеринга/JavaScript `server.html` не исправлены; полного зелёного набора тестов пока нет. 8. Перед выпуском: проверить diff, выполнить SSH smoke-test на root/sudo-серверах, проверить вход/CAPTCHA/sharing и восстановление тестового бэкапа, пересобрать артефакты всех платформ и повторить ScanGit. Сохранить резервную копию и возможность отката. Автоматического push не было. ## Источники - https://github.com/encode/starlette/security/advisories/GHSA-7f5h-v6xp-fcq8 - https://github.com/pyca/cryptography/security/advisories/GHSA-79v4-65xg-pq4g - https://github.com/kjd/idna/security/advisories/GHSA-65pc-fj4g-8rjx - https://github.com/advisories/GHSA-4grg-w6v8-c28g - https://github.com/advisories/GHSA-r374-rxx8-8654 - https://github.com/advisories/GHSA-pwv6-vv43-88gr - https://github.com/advisories/GHSA-5rvq-cxj2-64vf Версии сопоставлены с диапазонами advisory. Наличие уязвимой библиотеки само по себе не доказывает удалённую эксплуатацию через приложение. Часть дополнительных API-запросов к источникам ограничена rate limit; исчерпывающая проверка всех текущих и транзитивных CVE не заявляется.