2025-12-10
По Scientific Deep Research добавил пару ошибочных юзкейсов, но самое главное за сегодня - добавил кнопку “Распечатать отчёт”

При выкатывании изменений на прод сервер (4 файла залил)

Похоже, что торчал открытый порт.

Изменение строки:
-
Было 3000:3000 — Docker публиковал порт 3000 на всех интерфейсах (0.0.0.0). Если на VPS нет firewall-правил, этот порт был доступен из интернета напрямую, помимо прокси через nginx.
-
Стало 127.0.0.1:3000:3000 — порт 3000 теперь слушает только на loopback. Из внешней сети к нему нельзя достучаться; доступ есть только локально/через nginx или SSH-туннель.
Что это значит для атаки:
-
До изменения любой мог увидеть открытый 3000 (сканы интернет-узлов, Shodan и т.п.) и отправить запросы прямо в Next.js.
-
В логах контейнера было видно, что из процесса next-server запускался sh startup.sh → wget …/r.sh → /tmp/.XIN-unix/javae. Это характерно для RCE/командной инъекции в приложении или в его runtime.
-
Вероятный сценарий: атакующий нашёл открытый 3000 и дернул уязвимую точку (например, в API-роуте), получив возможность выполнить shell-команду, откуда и скачался майнер.
Что делать далее:
-
Оставить 3000 только на localhost (как сейчас) и использовать его только через nginx.
-
Убедиться, что firewall запрещает внешний доступ к 3000 (если есть ufw/iptables — добавить правило).
-
Проверить nginx-конфиг: он должен проксировать на 127.0.0.1:3000, не пробрасывая прямой внешний доступ.
-
Проверить и закрыть уязвимость в приложении (API-роуты, RCE), смотреть внешние access-логи nginx на странные запросы в период заражения.
-
После расследования можно удалить образец /root/javae_malware, если не нужен для анализа.

Нашёл и пофиксил причину обрыва/Idle: nginx рубил стрим по умолчанию через ~60 c. Твои запросы идут по SSE, бэкенд работает ~5 минут (видно в логах run 17:39–17:43). nginx крутил прокси на 127.0.0.1:3000 без увеличенных таймаутов, поэтому соединение рвалось и фронт показывал Idle.
Что сделал:
-
В /etc/nginx/sites-enabled/deepresearch-ai4s-pro.conf в location / добавил proxy_read_timeout 600s; и proxy_send_timeout 600s;.
-
Проверил конфиг nginx -t и перезагрузил systemctl reload nginx.
Логи бэкенда (request_id 8790ee54-579c-4bad-82cf-a56d6b8b9159) показывают полный успех: финальные шаги, Completed 5 tasks, и run завершён в 17:43:56 за ~291 сек — но до фикса фронт терял соединение раньше.
Сейчас таймауты 10 минут, поток не должен обрываться. Проверь ещё раз из внешней сети.
Если раньше пробрасывали 3000:3000 наружу и ходили напрямую, то запросы шли прямо к Next.js без nginx-прокси. У Next/Node таймауты по умолчанию длиннее и SSE не обрывались — поэтому “Idle” не ловили. Но тогда порт был открыт всему интернету, что и позволило залить майнер.
Сейчас трафик идёт через nginx (443 → 127.0.0.1:3000). У nginx были дефолтные ~60с таймауты, он рвал длинный SSE-стрим, фронт показывал Idle. Я увеличил таймауты до 600s — теперь поведение должно совпасть с “как было”, но безопаснее: порт 3000 не торчит наружу.
На прод сервере в файле
/etc/nginx/sites-enabled/deepresearch-ai4s-pro.conf
server {
listen 80;
server_name deepresearch.ai4s.pro;
return 301 <a href="https://$host$request_uri;">https://$host$request_uri;</a>
}
server {
listen 443 ssl;
server_name deepresearch.ai4s.pro;
ssl_certificate /etc/letsencrypt/live/deepresearch.ai4s.pro/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/deepresearch.ai4s.pro/privkey.pem;
location / {
proxy_pass <a href="http://127.0.0.1:3000;">http://127.0.0.1:3000;</a>
proxy_http_version 1.1;
proxy_read_timeout 600s;
proxy_send_timeout 600s;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_buffering off;
proxy_cache_bypass $http_upgrade;
proxy_set_header Accept-Encoding "";
}
}
По Написать статью про агента-метаревьюера обсудили ключевые ошибки и составили базовую схему.
Теперь надо сделать нормальный сетап эвала.