Files
Amnezia-Web-Panel/SECURITY_REMEDIATION_RU.md
T
Максимов Владимир Сергеевич 553f41926d Security, Fixes and localization
Security:
- reject existing sessions for disabled and record-only accounts
- enforce protocol and instance ownership when downloading configurations
- store CAPTCHA answers server-side with expiry and replay protection
- revoke share authorization after password changes or sharing is disabled
- restrict language-switch redirects and harden language cookies
- limit JSON backup size and improve input validation
- quote Telemt command arguments and SSH upload paths
- use private temporary directories for sudo operations and backup downloads
- selectively update dependencies to address confirmed vulnerabilities

Fixes and localization:
- fix service worker and static asset version paths in PyInstaller builds
- complete French, Persian, and Chinese translations to match all 687 keys
- translate remaining English strings in those locales
- add security, bundled-resource, and translation completeness regression tests
- add English and Russian security reports documenting fixes and remaining risks
2026-09-28 17:53:25 +03:00

17 KiB
Raw Blame History

Отчёт о проверке и устранении уязвимостей

Область проверки и статус

Проект: 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/<filename> открывало секреты другим локальным пользователям и допускало условную атаку через симлинк. Исправлено: перед привилегированным копированием создаётся приватный каталог 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 не было.

Источники

Версии сопоставлены с диапазонами advisory. Наличие уязвимой библиотеки само по себе не доказывает удалённую эксплуатацию через приложение. Часть дополнительных API-запросов к источникам ограничена rate limit; исчерпывающая проверка всех текущих и транзитивных CVE не заявляется.