Strategy/retrospective/daily/2025-12-10.md
+

2025-12-10

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

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

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

Изменение строки:

  • Было 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, если не нужен для анализа.

Pasted image 20251210204853.png
Нашёл и пофиксил причину обрыва/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 "";

}



}

По Написать статью про агента-метаревьюера обсудили ключевые ошибки и составили базовую схему.
Теперь надо сделать нормальный сетап эвала.

Choose icon