From a3fb5a2dcc6c1308d6a286b96ed1a441d74803b9 Mon Sep 17 00:00:00 2001 From: treamz Date: Fri, 24 Jul 2026 23:49:09 +0300 Subject: [PATCH] docs: session handoff 2026-07-24 23:48 (security audit) --- docs/SESSION_LOG.md | 1 + docs/sessions/2026-07-24-2348.md | 52 ++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 docs/sessions/2026-07-24-2348.md diff --git a/docs/SESSION_LOG.md b/docs/SESSION_LOG.md index 31f94cb..a745ffc 100644 --- a/docs/SESSION_LOG.md +++ b/docs/SESSION_LOG.md @@ -4,4 +4,5 @@ с итогами, решениями, открытыми вопросами и инструкцией «как продолжить». Ведётся скиллом `/session-handoff`. +- [2026-07-24 23:48 — Аудит безопасности (19 фиксов) + снятие лимитов /compress, деплой на VPS](sessions/2026-07-24-2348.md) - [2026-07-24 17:43 — Локальная копия, снятие лимитов /compress, скилл деплоя под VPS](sessions/2026-07-24-1743.md) diff --git a/docs/sessions/2026-07-24-2348.md b/docs/sessions/2026-07-24-2348.md new file mode 100644 index 0000000..f4c8faa --- /dev/null +++ b/docs/sessions/2026-07-24-2348.md @@ -0,0 +1,52 @@ +# 2026-07-24 23:48 — Аудит безопасности + снятие лимитов /compress, деплой на VPS + +**Сделано:** +- **Снят лимит в `/compress` для админа** (без лимита размера/количества/rate-limit) — задеплоено на прод, работает. +- **Security-аудит всего сервиса** (4 code-reviewer агента): 6 CRITICAL, 9 HIGH, ~15 MEDIUM, 8 LOW + 36 npm-уязвимостей. +- **Исправлено и задеплоено на VPS 19 находок** (пакет 1 + пакет 2), проверено функционально. +- **Зафиксировано в git:** VPS локальный commit `18c9fd7` (снапшот прода), локаль + Gitea commit `626a28f`. +- Бэкапы всех правок на VPS: `*.bak-audit20260724` (пакет 1) и `*.bak-audit20260724b` (пакет 2), плюс `*.bak-20260724` (compress). + +**Изменённые / созданные файлы (все на VPS-версиях, синхронизированы в локаль):** +- [lib/ssrf.js](../../lib/ssrf.js) — переписан: IPv6/mapped, A+AAAA, fail-closed, CGNAT +- [lib/ws.js](../../lib/ws.js) — авторизация на upgrade + maxPayload + owner-check при subscribe +- [lib/queue.js](../../lib/queue.js) — `user_id` в jobs + миграция ALTER TABLE + reaper зависших `processing` +- [lib/session.js](../../lib/session.js) — fail-fast без SESSION_SECRET/DB_PASSWORD +- [lib/admin.js](../../lib/admin.js) — admin-гейт сужен до `/frontend/`-ассетов +- [lib/logger.js](../../lib/logger.js) — ротация лога 5MB +- [routes/compress.js](../../routes/compress.js) — admin без лимитов; archiver `.on('error')`; SVG убран из sharp +- [routes/parser.js](../../routes/parser.js) — ревалидация редиректов; потоковое чтение 2MB; санитайз `javascript:`/`data:` +- [routes/httpclient.js](../../routes/httpclient.js) — ревалидация каждого редиректа +- [routes/redirects.js](../../routes/redirects.js) — ревалидация каждого хопа +- [routes/pdf.js](../../routes/pdf.js) — archiver `.on('error')`; dpi clamp 36-300; rate-limit на весь роутер +- [routes/svgeditor.js](../../routes/svgeditor.js) — `safeColor()` (XSS) +- [routes/video.js](../../routes/video.js) — rate-limit `/convert`; owner-check в `/convert` и `/progress` +- [routes/auth.js](../../routes/auth.js) — session fixation в register; dummy-hash против timing +- [routes/api.js](../../routes/api.js) — publicLimiter; скрыты сырые ошибки БД +- [server.js](../../server.js) — error-handler ПОСЛЕ AdminJS; `/health` публично только `{status:ok}` +- [public/compress.html](../../public/compress.html) — admin-детект (`/auth/me`), снятие клиентской отсечки + +**Решения:** +- **Прод = VPS 195.140.146.84** (Docker-контейнер `wadevelop`), rpi4 — двойник. Деплой SFTP + `docker restart wadevelop` (см. скилл `/deploy-wadevelop`). +- Правки делались от **актуальных VPS-версий** файлов (скачаны в scratchpad), т.к. локаль/rpi4 расходятся с VPS. +- **CSP `unsafe-inline` НЕ трогали** — переход на nonce требует правки всех 21 HTML, риск сломать фронт непропорционален выигрышу. +- **DNS-rebinding pinning (HIGH-14) отложен** — нужен кастомный fetch-agent; сейчас закрыт fail-closed + ревалидацией. +- npm-зависимости не обновляли — отдельная задача с риском ломающих изменений. + +**Открытые вопросы / следующие шаги:** +- [ ] **Проверить вручную под залогиненной сессией:** video-конвертация (прогресс через WS + owner-check не сломал легитимный поток). +- [ ] Полный DNS-rebinding pinning (HIGH-14) — кастомный fetch-agent/`request-filtering-agent`. +- [ ] Утечки `err.message` в pdf.js (~13 мест) → generic + лог. +- [ ] Обновить уязвимые npm-зависимости (sharp/ws/undici, 36 шт.) с прогоном. +- [ ] LOW: plaintext-пароль в payload admin.js new-action; prompt injection в api.js regex; утечка таймера в api.js. +- [ ] Свести две расходящиеся копии (VPS-прод vs rpi4-двойник) в один git; решить судьбу rpi4. + +**Как продолжить (для чистой сессии):** +- Контекст: память `project-wa-dev-tools.md`, `server-195-140-146-84.md`. **Прод = VPS 195.140.146.84 / контейнер `wadevelop` / `/opt/sites/www/wadevelop.ru/`.** rpi4 — двойник, НЕ деплоить. +- Деплой: скилл `/deploy-wadevelop` (SFTP + `docker restart wadevelop`). SSH: `python3 C:/Users/tream/.claude/ssh_cmd.py root@195.140.146.84 ""`. +- Проверка прода: `curl -s -o /dev/null -w "%{http_code}\n" https://wadevelop.ru/` (200); `docker logs wadevelop --tail 10`. +- Откат правок: бэкапы `*.bak-audit20260724*` в `/opt/sites/www/wadevelop.ru/` или `git reset` на VPS (снапшот `18c9fd7`). + +**Ссылки:** +- Прод: https://wadevelop.ru — VPS 195.140.146.84 (FirstVDS, treamz.fvds.ru), контейнер `wadevelop` +- Git: Gitea rpi4:3002 `treamz/wa-dev-tools`, локаль на коммите `626a28f`; VPS-снапшот `18c9fd7`