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
17 KiB
Отчёт о проверке и устранении уязвимостей
Область проверки и статус
Проект: 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 не проверялись. Атакующие запросы к развёрнутой панели не отправлялись.
Открытые риски и выпуск
- Все зависимости безопасными не объявляются. Новые исправления cryptography требуют более крупного перехода — рассмотрен кандидат 50.0.0. Новые проблемы Starlette включают обработку UNC-путей Windows StaticFiles, dispatch методов и лимиты URL-encoded форм — рассмотрены Starlette 1.3.1 и совместимая FastAPI. Эти миграции не применены автоматически в рамках минимальных изменений. Для Windows EXE проблему статики следует рассматривать приоритетно, а не как ложное срабатывание.
- Устаревшие SSH-алгоритмы Paramiko и доверие ключам через AutoAddPolicy требуют отдельной проверки совместимости и hardening.
- Защита восстановления удалённых архивов от symlink/hardlink требует отдельной доработки: проверка пути после распаковки не является общей гарантией безопасности. Доступ администратора уменьшает поверхность атаки, но не делает импорт чужого архива безопасным.
- Хранилище CAPTCHA рассчитано на один worker/process. Для нескольких процессов нужно общее TTL-хранилище с атомарным извлечением. Перезапуск аннулирует CAPTCHA; массовая выдача может вытеснять действующие записи. Ограничение частоты запросов остаётся отдельной задачей.
- Нужны HTTPS и лимиты запросов на reverse proxy. Лимит JSON-импорта не ограничивает весь multipart-трафик/временный диск до проверки прав обработчиком.
- Эта правка не вводит глобальное версионирование всех сессий при смене пароля обычной учётной записи. Доступ отключённого пользователя запрещён, пока он отключён; общее принудительное завершение сессий — отдельная задача.
- Старые ошибки рендеринга/JavaScript
server.htmlне исправлены; полного зелёного набора тестов пока нет. - Перед выпуском: проверить 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 не заявляется.