Как мне повезло с ней столкнуться
В конце 2025 года мир react разработчиков облетела новость о опасной узявимости в серверных реакт компонентах. Уязвимость получила максимальный уровень опасности по шкале CVVS и ей был присвоен номер CVE-2025-55182. Было очень много новостей на эту тему прямо под новый год.
Официальные сообщества react и nextjs поспешили выпустить патчи обновлений и призвали всех обновиться как можно быстрее: вот и вот. Сама же проблема, состоит в неидеально реализованной сериализации для react server components, которая позволяет злоумышленнику выполнять свой код, более подробно описано в статье.
Но я, как и наверно, многие пользователи с небольшими пет-проектами никуда не спешил. И более того, даже забыл про это. Хотя, уже в декабре, мой сайт дважды вылетал в нерабочее состояние по неизвестной причине, т.е. он просто переставал открываться, но основной работы было много и я ограничился простым перезапуском докер контейнеров.
Но на днях, доедая салаты, решил дать желудку отдохнуть и заняться потреблением умственной пищи, а точнее - решил разобраться что же происходит с моим сайтом. Кстати мой сайт это небольшая галерея изображений и артов чувашской тематики, посетителей там немного, поэтому заходите, будем рады. Работал он в тот момент на 15.0.0 версии nextjs и 19.0.0 версии react, развернут как и многие в docker, который крутится на vps, который я арендую у провайдера webhost1.
В панели управления vps нагрузка cpu оказалась 100%, раньше я не часто обращал внимания на этот показатель, но раньше он всегда был в норме. И действительно, посмотрев статистику я увидел что такой рост потребления начался с 6 декабря.

Сперва я грешил на на сам проект и решил заглянуть в гит, нет ли там правок которые могли привести к каким-либо поломкам, по совпадению они там оказались, но изучив их стало понятно что дело не в них. Тогда было решено поизучать, что происходить на самом vps сервере (там стоит ubuntu 24), для чего воспользовался утилитой btop и посмотрел какие ресурсы больше всего едят ресурсы процессора.

Подозрительные процессы
Как видно на скриншоте (рис.2) больше всего жрет процесс softirq, полез в гугл узнать что это такое и тут начались мои мытарства по разнообразным источникам информации на тему системных прерываний в linux (soft irq). Потратив несколько часов на бесплодное погружение в основы работы linux (сразу скажу в этом я полный ноль и если где-то сморожу глупость прошу строго не судить), я заметил что в строке команды есть параметр --randomx-1gb-page, координаты скриншота примерно 50% по высоте и 100% по широте.

Полез в яндекс узнать, что это за параметр такой и первый же ответ выдал ссылку на инструкцию к майнеру XMRRig. Вскоре этот процесс сам потух и появился новый, но уже с названием javae. Стало понятно, что это просто замаскированные названия для внедренных злоумышленниками процессов, а в данном случае для майнера.
Получается, благодаря тому, что я запускал docker под root пользователем майнер смог выставить себе настройку на повышенное потребление оперативки. Я проверил также открытые порты, никаких подозрительных портов кроме стандартных октрыто не было. Проверил также расписание cron, в нем тоже ничего подозрительного.
Откуда же майнерам взяться на моем vps сервере? Гугл ИИ вполне доказательно подсказал мне, что этот майнер вполне мог быть заброшен благодаря новой уязвимости react2shell. Кстати название было дано по аналогии с другой известной уязвимостью log4shell.
Тогда я обновил версии и nextjs и react и всех связанных пакетов, перезапустил vps и контейнеры и все заработало как положено. После нескольких часов мониторинга все было в норме - диаграмма сердцебиения CPU пришла в норму. Получается я отделался месяцем работы своего vps на благо вероломных майнеров. Но не у всех было так гладко, в этой статье описана более проблемная история, возможно кому-то поможет.

Что дальше?
Остановиться на этом было нельзя, т.к. данная проблема явно тыкнула меня носом не только в низкую компетенцию по части администрирования и кибербезопасности, но и в очевидную халатность: docker крутился под root пользователем. Было решено перевести docker в rootless режим.
Процитирую документацию по rootless mode:
Режим без прав суперпользователя позволяет запускать демон Docker и контейнеры от имени пользователя без root прав, чтобы снизить риск возникновения уязвимостей в демоне Docker и среде выполнения контейнеров.
Был заведен дополнительный пользователь, выставлены все нужные настройки, установлены утилиты, перенастроен деплой, выданы нужные права на каталоги, предоставлен доступ к портам до 1024, чтобы сайт снова заработал, а команда docker version подтвердила, что docker запущен в rootless режиме (поле context на скриншоте).

Спустя сутки полет нормальный, я надеюсь это были первые и последние проблемы по части безопасности в этому году.
Выводы
Для себя я сделал следующие выводы:
Даже во фронтенд фреймворках уязвимости могут быть весьма опасными и не надо пренебрегать безопасностью
Даже для пет проектов не надо лениться обновлять пакеты если их скомпрометировали
Docker надо запускать в rootless mode
Комментарии (13)

Gariks
08.01.2026 17:10Если проект на github лежит можно настроить dependabot, он будет сам делать pr с обновлениями. На разных языках в пакетных менеджерах есть проверка на уязвимости, в js вроде npm audit, в ci можно настроить задачу по расписанию. shift left security называется подобная деятельность. По поводу сервера будь там go, rust, js перед ним обычно ставят nginx, чтобы application не торчал наружу своими портами. А чтобы не палить свой vds есть такая штука как zero trust tunnel у cf. Но да в любом случае vds надо настраивать, голая система никак не защищена.

dufrein2013 Автор
08.01.2026 17:10Спасибо за развернутый совет. dependabot у меня стоит, но я забил на него по своей лени. nginx тоже стоит. остальные моменты изучу. Думаю мне повезло, что у меня все работало в докер, хоть и под root, если бы все работало просто напрямую в ubuntu. как мне кажется, последствия могли быть хуже

DMaslo
08.01.2026 17:10В контейнере root — такой же root, если есть bind-volume. Граница между контейнером и системой сильно размыта. Даже без volume есть способы обойти изоляцию, потому что Docker тоже работает с привилегиями ядра. Рекомендую сделать аудит /srv/* и /tmp/* — там могли остаться артефакты или бэкдоры. Одним словом "аудит"... И сервисы и таймеры сервисов искать нужно... Жене делал тоже на реакте, без сервер рендеринг компонентов, уже втора неделя апдейта... Признаюсь честно - практически ноль в реакте, я от админа рос потому и докеризация и администрирование просто и понятно.

dufrein2013 Автор
08.01.2026 17:10спасибо за совет. аудит сделаю, буду немного осваивать администрирование

Damby
08.01.2026 17:10Тоже хлебнул проблем от этой уязвимости, причем дважды.
Последствия: пришлось переустанавливать ОС в облаке.
Несколько проектов крутилось в контейнерах, а один лендинг через root запускался через system.d. Как раз таки через лендинг злоумышленник попал на сервер, разместил монеро майнер, который постоянно восставал из мертвых при отключении процесса и перезагрузке. По итогу благодаря llm удалось побороть его. Просканил система и нашлись бэкдоры, которые оставил злоумышленник, бороться с этим уже было очень тяжело, было принято решение переустанавливать ОС.
В этот же день ещё до перестановки ОС майнер снова ожил. Когда во всех проектах обновили версии реакт пакетов, к сожалению пропустил один MR от разработчика и запустил проект с уязвимостью, но благо он был в докере и не смог вылезти за его пределы.
Благо у нас проекты такого характера, что простои в 1-2ч особо не влияют на клиентов, иначе было бы больно.
Приятно только что получен бесценный опыт и эта ситуация сподвигнула провести больше мероприятий по обеспечению безопасности сервера.
З Ы таймвеб предупреждал, что на сервере найдены уязвимости и следует обновить пакеты, но у сожалению это выпало на выходные дни, да и не придал большого значения этому.
Всем здоровья на ваших серверах)

dufrein2013 Автор
08.01.2026 17:10спасибо за интересную историю. хорошо что ваш хостинг подсказал, мой молчал. подскажите, а lim это что?

DMaslo
08.01.2026 17:10LLM - математическо-статистическая модель использования слов. ))) то что в наши дни окрестили "AI"ом

leon_shtuet
08.01.2026 17:10Как мне повезло с ней столкнутся
Автор блин :(, "столкнутЬся". Что сделатЬ? Столкнуться.

dufrein2013 Автор
08.01.2026 17:10спасибо что заметили) обычно сам такие вещи замечаю у других, но тут просто спешил сдать статью по горячей памяти)
TimiCH2011
У меня тоже самое произошло. Правда в моем случае из-за майнера лег сайт. Если бы этого не произошло, я бы даже не заметил появления чужака в системе. Названия у скриптов для запуска майнера были смешные, сразу ясно происхождение хакера :)
dufrein2013 Автор
такая же ситуация, если бы они не ложили сайты, то так бы и крутились их майнеры