← все проекты

Безопасность и серверы

После взлома Полигона (31.08) и Хвостов (07–28.09): закрыть дыры на всех 5 серверах, каждый проект — закрытая система (не root, свои сети, .env 600, порты только через nginx), сторож взлома, бэкапы вне сервера; сократить серверы с 5 до 3.

server: cfru 80.90.184.203, aitodo 72.56.85.41, farm 72.56.74.240 (VPN владельца), contentfactory 72.56.72.118, amnezia 72.56.81.222память: security-audit-2026-10-03, security-architecture, openrouter-key-theft-2026-09-23
В РАБОТЕS1 · С0 · Срочное после аудита 03.103/6

Цель: Закрыть активные дыры: Хвосты, DirectPilot, вход по паролю на aitodo, сторож взлома

🔴 Хвосты: Next 15.1.6 → 15.1.12, сети web/back разведены, порт только для nginx
✓ Сайт 200 снаружи, Next 15.1.12 в контейнере, из web redis/postgres = bad address, api ok, /tmp чистый, 3140 снаружи закрыт. Улики и снимок контейнера: cfru:/root/incident-20260923/hvosty-20261003, образ hvosty-web-compromised:20261003. Коммит 522ffc1 в локальном репо.
feature
🔴 DirectPilot: порт 3080 закрыт снаружи, Next 15.3.2 → 15.3.9
✓ ufw-правило 3080 удалено (проверено с aitodo: закрыт). Сборка ✓ Compiled, pm2 dp-web online, /, /login, /api/health = 200 локально. Коммит aa2eafa. Наружу вернуть через nginx+домен+пароль.
feature
🔴 Сторож следов взлома: cfru + aitodo, тревога в Лию
✓ cfru:/opt/sec-watch/rce-watch.py, cron */10 с flock, лог /var/log/sec-watch.log. Логи pm2/docker раз в 10 мин, файлы майнера (docker diff) раз в час. На уликах Хвостов ловит: 24 метки в логе, 102 файла. Проверочное сообщение в Лию отправлено.
feature
🔴 aitodo, farm, contentfactory, amnezia: SSH только по ключу + защита от подбора
PasswordAuthentication no, PermitRootLogin prohibit-password, MaxAuthTries 3, fail2ban. Входов по паролю в журналах нет ни одного, все входы по ключу (с farm и cfru).
⛔ Автофильтр прав Claude Code не дал менять sshd. Владелец запускает команду сам или разрешает действие.
feature
Хвосты: пароль на Redis
Из web Redis уже недоступен (сети разведены). Пароль — второй слой: requirepass + REDIS_URL в .env.
feature
🔴 Next: RCE без входа через оптимизатор картинок (AVIF), закрыт только в 15.5.24
Найдено 03.10 сканом лаборатории (SkillSpector + база OSV, проверено запросом api.osv.dev). GHSA-2xp9-vwfh-vxw4 (опубликовано 08.09.2026): libheif внутри sharp, RCE при оптимизации AVIF. Затронуты Next 10.0.0-15.5.23 и 16.0.0-16.3.2. Обновлённые сегодня Хвосты 15.1.12 и DirectPilot 15.3.9 его НЕ закрывают. Задеты также прод КЗ 14.0.4 и cz-core 14.2.23 (у них ещё CVE-2025-29927, обход middleware, исправлен в 14.2.25/15.2.3), ai-poligon 15.1.6 (остановлен). Там же HIGH: обходы middleware и SSRF, исправлены в 15.5.16-15.5.21. Временная мера без обновления: images.unoptimized=true или убрать avif из images.formats, либо закрыть /_next/image в nginx для чужих адресов; опасно, если remotePatterns пускают чужие домены или есть загрузка картинок пользователями. Исправление: next до 15.5.24+ (для 14.x переход на 15.5.24). Сначала опись: grep \"next\" package.json по всем приложениям cfru и aitodo. РАЗБОР 03.10 (только чтение, ничего не менялось). Уязвимость подтверждена в OSV: исправлено в 15.5.24 и 16.3.3. - «Убрать avif из images.formats» НЕНАДЁЖНО: дыра при разборе AVIF-файла на входе, а formats про выходной формат. Надёжная временная мера: images.unoptimized=true (ручка /_next/image отдаёт 404, как у navesy/zavod-order/bonimed, проверено curl). - DirectPilot 15.3.9: снаружи закрыт с утра (ufw 3080 удалён), next/image не используется. Срочности нет. - Хвосты 15.1.12: ручка жива (400 на пробе), sharp есть, но чужие домены не разрешены, а API отдаёт только PDF/docx, свою картинку злоумышленнику не подложить. Риск низкий; next/image не используется, мера ничего не меняет на сайте. - Прод КЗ 14.0.4 (3001/3002, 24contentzavod.ru): ручка жива (500 на пробе), sharp 0.32.6 (с libheif) = задет. Загрузки пользователей идут в /storage/v1 через nginx, Next их не видит, чужие домены не разрешены. Риск низкий, но все маршруты не перебраны. next/image в 4 файлах: при unoptimized картинки пойдут без сжатия, вид тот же. - cz-core 14.2.23 (newtest, 3160): sharp НЕ установлен, Next 14 жмёт через squoosh (без libheif), этой дырой скорее всего не задет. Остаётся CVE-2025-29927. - Вывод: мера безопасна сама по себе; риск только в пересборке и рестарте прода. Порядок: Хвосты, затем прод КЗ в тихий час; DirectPilot и cz-core не трогать сегодня. Полное лечение = обновление до 15.5.24 (для КЗ это 14→15, отдельно через стенд). ВРЕМЕННАЯ МЕРА ВЫКАЧЕНА 03.10 ~06:45 UTC по «да» владельца (images.unoptimized=true, /_next/image → 404, проверено снаружи curl): - Хвосты: коммит 83d91b7 (локальный репо), сборка docker с --env-file .env (без него падает /admin: Invalid URL), up -d --no-deps web. Страницы 200, cap_drop/no-new-privileges/127.0.0.1 на месте. - Прод КЗ 3002: коммит dcfb0193 в fix/impersonate-on-v1.4, сборка в сторону /root/sec-20261003/build-prod-cf.sh, вход 200, главная/блог/студия 200. Было 500 (ручка жила). Прошлая сборка /var/www/content-factory-prod.standalone.prev-20261003-064042. - Стенд КЗ 3001 (test., принимает вебхуки поддержки прода): коммит 6d7c278a в test/sprint-3-quality, build-stend-cf.sh, вход 200. Прошлая /var/www/content-factory.standalone.prev-20261003-064503. - Записка docs/security/2026-10-03-next-image.md в обоих репо КЗ, раздел в docs/01-architecture.md Хвостов. - DirectPilot и cz-core не трогали (закрыт снаружи / без sharp). ОСТАЛОСЬ: обновить Next до 15.5.24+ (Хвосты, DirectPilot; КЗ 14→15 через стенд), после этого вернуть сжатие. Удалить prev-сборки по согласию.
feature
планS2 · Проверки по сроку0/3

Цель: Отложенные проверки: сработало ли

↑ Неделя после закрытия дыр: сторож молчит, Хвосты чистые, 3080 закрыт
⏱ 10.10 · просрочено 20 дн.
КОМАНДЫ ПРОВЕРКИ: ssh cfru 'tail -50 /var/log/sec-watch.log | grep -c ALERT; tail -3 /var/log/sec-watch.log' (ждём 0 ALERT и свежие строки «чисто») ssh cfru 'docker logs --since 168h hvosty-web-1 2>&1 | grep -c RCE_OUT; docker diff hvosty-web-1 | grep -cE "kworkerd|redis-server.pid|/XX"' (ждём 0 и 0) ssh aitodo 'timeout 3 bash -c "exec 3<>/dev/tcp/80.90.184.203/3080" && echo OPEN || echo closed' (ждём closed, пока нет домена) Если сторож молчит, но лог пустой или старый — сторож сломан, это тоже провал.
check
ПК: неделя после переезда проектов на SSD, удалить *.old-hdd?
⏱ 28.10 · просрочено 2 дн.
20.10.2026 проекты в работе перенесены с HDD E: на SSD C:\Dev скриптом C:\Dev\ssd-move.ps1 (подготовка -Prep, переключение ярлыком «Перенос на SSD.cmd» при закрытом VS Code). На E: остались ссылки, старые копии лежат рядом как *.old-hdd. Потолок владельца: 100 ГБ на C:. Проверка: 1) Лог: Get-Content C:\Dev\ssd-move.log -Tail 40 — какие папки «готово», какие «занято/не сошлась». 2) Ссылки: Get-ChildItem 'E:\Проекты для Гитхаба','E:\' -Force | ? { $_.LinkType } | ft Name,Target 3) Тормоза: Get-Counter '\PhysicalDisk(*)\% Idle Time','\Memory\Pages Input/sec' -SampleInterval 2 -MaxSamples 5 — E: не должен стоять на 0% простоя. 4) Проект плавания: в любой копии _wt-swim прогнать pnpm vitest run, сравнить с тем, что было. 5) Встречи: расшифровка в виджете стартует за секунды, а не за минуты. Если всё ок: спросить владельца «да» на удаление *.old-hdd (Клиенты.old-hdd, Новое поколение TODO.old-hdd и др.) — это деструктив, без «да» не удалять.
check
contentfactory (72.56.72.118) выключен: ничего не всплыло → удалить в Timeweb
⏱ 30.10 · сегодня
28.10 владелец выключает сервер «Контент фабрика - сервис» (72.56.72.118). Перед этим перенесено: 1) планировщик боевого Контент-завода (scheduler/run */5, reset-expired 21:00, recover-stuck */10) теперь в crontab cfru, на contentfactory строки закомментированы #MOVED-TO-CFRU-20261028; 2) архивы в cfru:/opt/backups/contentfactory-20261028/ (family-life.tgz: код+база sqlite+файлы; pulse-analytics.tgz: код+база; content-factory-config.tgz: .env и незакоммиченное staging; crontab-root.txt), суммы SHA256SUMS сверены, базы integrity ok. ПРОВЕРКА: ssh cfru 'tail -c 300 /var/log/scheduler.log; date' — последняя запись «Scheduler run completed» не старше 5 минут. Плюс спросить владельца: никто не жаловался на Family Life / VPN / Контент-завод. Всё чисто → владелец удаляет сервер в панели Timeweb (вместе с бэкапами и IP), задачу done. Потом убрать contentfactory из карты серверов (скилл server-map) и из задачи про SSH по ключу в С0.
check

Ворклог (места остановки)

28.10.2026, 12:40:47 · Проверки по сроку · claude

28.10 разбор 4 NL-серверов под сокращение. farm = личный VPN владельца (никому не раздаём). aitodo НЕ раздавать: 44 проекта на cfru ходят через его прокси :8888, блок IP положит их. contentfactory: VPN пустые 4 недели, Family Life не менялся с 19.07, pulse-analytics = старая копия. Перенесено на cfru: 3 крона планировщика боевого Контент-завода (первый запуск с cfru 12:40 UTC прошёл, 27 фабрик, без ошибок; на contentfactory последний запуск 12:35) и архивы в /opt/backups/contentfactory-20261028/ (суммы и базы проверены). Владелец выключает contentfactory сам.

→ 30.10 проверка ee2bcc29: планировщик идёт с cfru, жалоб нет → владелец удаляет contentfactory в Timeweb. amnezia (72.56.81.222): на AmneziaWG сидит один друг (~30 ГБ/мес), ждём решения владельца: оставить ему сервер / снять / всё же aitodo. После снятия NL: апгрейд cfru (RAM 20/23, swap 8/8 забит, диск 93%), цену согласовать.

03.10.2026, 07:14:48 · С0 срочное · claude

Дыра Next через сжатие картинок закрыта временной мерой на Хвостах, проде КЗ и стенде КЗ: images.unoptimized=true, /_next/image отвечает 404 снаружи (до: 400/500). Хвосты: коммит 83d91b7, docker build с --env-file. Прод КЗ: dcfb0193, сборка в сторону, простой секунды, вход/главная/блог/студия 200. Стенд КЗ: 6d7c278a. Записки в docs обоих проектов.

→ Настоящее лечение: Next 15.5.24+ на Хвостах и DirectPilot, КЗ 14→15 через стенд; потом вернуть сжатие. Убрать prev-сборки КЗ от 03.10 по согласию. DirectPilot и cz-core временной мерой не трогали.

03.10.2026, 06:32:36 · С0 срочное · claude

Разбор дыры Next через сжатие картинок (GHSA-2xp9-vwfh-vxw4, исправлено в 15.5.24/16.3.3), только чтение. Задеты по-настоящему двое: Хвосты 15.1.12 и прод КЗ 14.0.4 (sharp 0.32.6). DirectPilot снаружи закрыт; cz-core без sharp (squoosh), этой дырой скорее всего не задет. Подложить свой AVIF ни на Хвостах, ни на КЗ пути не найдено: чужие домены не разрешены, загрузки идут в /storage мимо Next. «Убрать avif из formats» признано ненадёжным, верная временная мера images.unoptimized=true. Разбор дописан в задачу e30dba7a.

→ Ждём «да» владельца на images.unoptimized=true: Хвосты сегодня (вид сайта не меняется), прод КЗ в тихий час (сборка, потом рестарт; картинки в 4 местах без сжатия). DirectPilot и cz-core не трогать. Потом настоящее лечение: Next 15.5.24, для КЗ переход 14→15 через стенд.

03.10.2026, 02:12:26 · С0 · claude

Аудит всех 5 серверов. Найдено: Хвосты взломаны (тот же React2Shell, что Полигон), DirectPilot уязвим под root, на aitodo/farm/contentfactory/amnezia вход по паролю, взаимный root cfru<->aitodo, бэкапы только локальные. Сделано: Хвосты и DirectPilot закрыты, сторож взлома в cron на cfru (cfru+aitodo, тревога в Лию).

→ SSH только по ключу на 4 серверах (команду запускает владелец, автофильтр не пустил). Ждёт «ок» план спринтов С1-С5: периметр, связи между серверами, бэкапы вне сервера, сокращение 5->3, изоляция процессов.