В начале июля 2026 года компания Volexity, специализирующаяся на расследовании инцидентов информационной безопасности, завершила анализ атаки на устройства SonicWall SMA 1000-й серии. Исследователи выявили, что злоумышленник, отслеживаемый под идентификатором UTA0533, использовал цепочку из двух уязвимостей нулевого дня (0-day) для получения полного контроля над VPN-устройствами. Инцидент затронул модели 6210, 7210 и 8200v, для которых SonicWall выпустил исправления 14 июля 2026 года.
Описание
Расследование началось после того, как в телеметрии заказчика были зафиксированы подозрительные попытки аутентификации и бокового перемещения, исходящие от самих VPN-устройств. Специалисты Volexity получили административный доступ к двум скомпрометированным устройствам по SSH и собрали образы памяти и дисков для детального анализа. Уже на этапе первичной триады были обнаружены артефакты, однозначно подтверждающие компрометацию обоих устройств. Самая ранняя зафиксированная активность злоумышленника датируется 22 июня 2026 года.
В ходе анализа логов, образов памяти и дисков исследователи восстановили полную картину атаки. По данным анализа, ключевую роль сыграла уязвимость CVE-2026-15409 - это обход аутентификации на предварительном этапе в компоненте /wsproxy. Она позволяет неавторизованному внешнему запросу установить WebSocket-туннель к сервисам, которые должны быть доступны только на локальном хосте. Для этого достаточно отправить GET-запрос с указанием User-Agent: SMA Connect Agent и параметром bmID, начинающимся с "-3389". В результате атакующий получает доступ к службам на портах 1050 (CouchDB), 1051 (Erlang Port Mapper Daemon) и 8188 (сервис управления SMA).
Управляющий сервис на порту 8188 изначально защищён базовой HTTP-аутентификацией. Пароль для неё формируется на основе аппаратного идентификатора продукта (product_uuid), который хранится в файле, доступном для чтения любым пользователем системы. Исследователи отметили, что в некоторых физических устройствах UUID оказался одинаковым для разных экземпляров, что ещё больше упрощает его компрометацию. Хотя в данном инциденте обход аутентификации напрямую не использовался, злоумышленник применил другой путь для чтения этого файла.
Согласно выводам экспертов, UTA0533 эксплуатировал CouchDB, который установлен по умолчанию на устройствах SMA. База данных CouchDB имеет жестко заданные учётные данные admin:admin и доступна только локально. Используя WebSocket-туннель, атакующий связался с CouchDB и, действуя от имени пользователя couchdb, создал скрипт в каталоге /tmp. Этот скрипт прочитал файл product_uuid, после чего злоумышленник смог вычислить пароль для управляющего сервиса.
Дальнейшая эскалация привилегий стала возможна благодаря уязвимости CVE-2026-15410. Она затрагивает метод sysCtrl.execRemoveHotfix, который принимает пользовательский ввод для построения пути к файлу отката. Из-за отсутствия должной проверки пути можно применить обход каталогов: подставив "../../../../../tmp/1234.sh", атакующий заставляет систему выполнить произвольный скрипт с правами root.
Таким образом, полная цепочка эксплуатации выглядит следующим образом. Сначала злоумышленник отправляет неаутентифицированный запрос к /wsproxy с нужными параметрами и устанавливает WebSocket-туннель. Затем через туннель он обращается к CouchDB, записывает файл от имени пользователя couchdb, читает product_uuid и получает пароль для управляющего сервиса. После этого, используя метод execRemoveHotfix с обходом пути, он запускает вредоносный скрипт от root.
После получения полного контроля UTA0533 установил на одном из устройств инструменты для закрепления в системе и дальнейшего бокового перемещения. В каталоге /usr/bin был размещён setuid-бинарник xzfind (который злоумышленник называет "rootrun"), позволяющий любому непривилегированному пользователю выполнять команды от root. Кроме того, на диск был записан скрипт deploy_new.py, названный исследователями KNUCKLEBALL. Этот на Python-скрипт внедрял два Java-архива в легитимный процесс workplace.startup.CommandStartup.
Первый архив содержал Suo5 - открытое средство перенаправления HTTP-трафика. Второй архив, названный ORANGETAIL, представлял собой веб-шелл, работающий аналогично инструменту Behinder. Все запросы к веб-шеллу требовали особую строку User-Agent: "Mozilla/6.0 (Windows NT 11.0; Win64; x64) AppleWebKit/1537.136 (KHTML, like Gecko) Chrome/149.0.0.1 Safari/1537.136". Эта строка выглядит как настоящий агент, но использует несуществующие номера версий. Для внешнего доступа к веб-шеллу злоумышленник модифицировал конфигурацию nginx и добавил два пути: /__api__/login и /__api__/logout, которые перенаправлялись на соответствующие JSP-страницы.
На втором скомпрометированном устройстве подобных инструментов обнаружено не было - исследователи связали это с перезагрузкой устройства 2 июля 2026 года, которая удалила из памяти резидентные бэкдоры. Однако на этом устройстве злоумышленник успел использовать tcpdump для захвата незашифрованного LDAP-трафика. В каталоге /var/tmp были найдены скрипты и файлы, свидетельствующие о перехвате учётных данных, передаваемых на внутренние контроллеры домена.
После получения доступа UTA0533 предпринял попытки бокового перемещения в сеть заказчика. Для этого он использовал как туннель Suo5, так и веб-шелл ORANGETAIL. Следователи зафиксировали более 200 различных IP-адресов, с которых осуществлялась активность. Часть адресов принадлежала коммерческим VPN-сервисам ExpressVPN и MullvadVPN. Также были обнаружены имена хостов, которые злоумышленник ненамеренно раскрыл, включая DESKTOP-5P0TSCP, DESKTOP-IC3C80F, DESKTOP-KRLUI3J и KALI.
Несмотря на серьёзную компрометацию самих VPN-устройств, исследователи отмечают, что злоумышленнику, вероятно, не удалось успешно переместиться на другие системы в сети. Тем не менее, объём полученных привилегий позволяет предположить, что утечка учётных данных, хранящихся или обрабатываемых устройством, могла произойти. Специалисты Volexity опубликовали подробные индикаторы компрометации и YARA-правила для обнаружения вредоносного ПО, обнаруженного в рамках расследования.
Пользователям SonicWall SMA 1000-й серии настоятельно рекомендуется немедленно установить горячее исправление (hotfix) и обновить прошивку до версий 12.4.3-03453 или 12.5.0-02835. Дополнительно следует проверить логи на предмет аномальных запросов к /wsproxy, неожиданных файлов в /tmp и /var/tmp, а также модификаций конфигурации nginx по пути /var/lib/unit/conf.json. Обнаружение setuid-бинарников, отсутствующих в списке штатных, также является признаком компрометации.
Индикаторы компрометации
IPv4
- 108.205.8.173
- 147.45.51.19
- 150.241.210.53
- 202.8.105.201
- 217.77.15.99
- 42.200.172.14
- 81.19.140.217
- 89.117.20.1
MD5
- 54d21399b8b52b48a0fef68450593e45
- 5f3a55201c511c9ff9be4c16c41028a2
SHA1
- 5e5b716f2385c818ec61198be1a2a07a4560eac5
- c2b0ae0a1f42a139abe4dd612676066ec1426394
SHA256
- 1e1e68bbb899450a57274a8b12082ed4e2040a2aae77014f20431689d2b4edee
- 81a9af3846bad3a1107164ff7cf0a08e020b31a3b32fd17866e17d4c1565f7f2
- 8c470301dcb7278f73e622f1950073567b34011c64b60cdfbb0f89803923a5a3
- ea9154e374e4f77bc2cf54282e23543573980342a85bc888cb23f20b8bbba081
YARA
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | rule apt_webshell_java_orangetail_b: UTA0533 ORANGETAIL { meta: author = "threatintel@volexity.com" date = "2026-07-06" description = "Detection for the accept logic of ORANGETAIL, a custom Java webshell used by UTA0533." hash1 = "1e1e68bbb899450a57274a8b12082ed4e2040a2aae77014f20431689d2b4edee" hash2 = "ea9154e374e4f77bc2cf54282e23543573980342a85bc888cb23f20b8bbba081" os = "all" os_arch = "all" scan_context = "file,memory" severity = "critical" report1 = "TIB-20260714B" last_modified = "2026-07-14T09:45:38Z" license = "See license at https://github.com/volexity/threat-intel/blob/main/LICENSE.txt" rule_id = 13240 version = 6 strings: $s1 = ".equals($1.getHeader(\"User-Agent\"))) { javax.servlet.jsp.JspFactory" ascii $s2 = " $2.setStatus(404); $2.setContentLength(0); $2.flushBuffer(); return;" ascii condition: all of them } |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | rule apt_webshell_java_orangetail: UTA0533 ORANGETAIL { meta: author = "threatintel@volexity.com" date = "2026-07-06" description = "Detection for ORANGETAIL, a custom Java webshell used by UTA0533." hash1 = "ea9154e374e4f77bc2cf54282e23543573980342a85bc888cb23f20b8bbba081" os = "all" os_arch = "all" scan_context = "file,memory" severity = "critical" report1 = "TIB-20260714B" last_modified = "2026-07-14T09:45:31Z" license = "See license at https://github.com/volexity/threat-intel/blob/main/LICENSE.txt" rule_id = 13239 version = 5 strings: $s1 = "agentmain called args=" $s2 = "tryInject=" $s3 = "agentmain ex:" $s4 = "javassist=" $s5 = "tryInject exception" $s6 = "found loaded class:" condition: 4 of ($s*) } |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | rule apt_malware_any_uta0533_ua: UTA0533 { meta: author = "threatintel@volexity.com" date = "2026-07-06" description = "Identify any blob containing a bogus user-agent used in different components of an attack attributed to UTA0533." hash1 = "8c470301dcb7278f73e622f1950073567b34011c64b60cdfbb0f89803923a5a3" os = "all" os_arch = "all" scan_context = "file,memory" severity = "critical" report1 = "TIB-20260714B" last_modified = "2026-07-14T09:45:26Z" license = "See license at https://github.com/volexity/threat-intel/blob/main/LICENSE.txt" rule_id = 13237 version = 3 strings: $s1 = "Mozilla/6.0 (Windows NT 11.0; Win64; x64) AppleWebKit/1537.136 (KHTML, like Gecko) Chrome/149.0.0.1 Safari/1537.136" ascii condition: $s1 } |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | rule apt_malware_python_knuckleball: UTA0533 KNUCKLEBALL { meta: author = "threatintel@volexity.com" date = "2026-07-06" description = "Detects KNUCKLEBALL, a python based injector malware, using string patterns." hash1 = "8c470301dcb7278f73e622f1950073567b34011c64b60cdfbb0f89803923a5a3" os = "linux" os_arch = "all" scan_context = "file,memory" severity = "high" report1 = "TIB-20260714B" last_modified = "2026-07-14T09:45:44Z" license = "See license at https://github.com/volexity/threat-intel/blob/main/LICENSE.txt" rule_id = 13233 version = 5 strings: $s1 = "/tmp/.java_pid{pid}" ascii $s2 = "/tmp/.attach_pid{pid}" ascii $s3 = "timeout waiting for JVMTI attach socket" ascii $s4 = "workplace.startup.CommandStartup" ascii $s5 = "/var/run/control.unit.sock" ascii $func1 = "unit_put(" ascii $func2 = "check_gate(" ascii $func3 = "inject_jar(" ascii $func4 = "find_wp_pid(" ascii condition: 2 of ($s*) or 3 of ($func*) } |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | rule apt_malware_linux_rootrun: UTA0533 ROOTRUN { meta: author = "threatintel@volexity.com" date = "2026-07-06" description = "Detects rootrun a setuid privilege escalation utility for Linux written in C using strings." hash1 = "81a9af3846bad3a1107164ff7cf0a08e020b31a3b32fd17866e17d4c1565f7f2" os = "linux" os_arch = "all" scan_context = "file,memory" severity = "high" last_modified = "2026-07-14T08:18:49Z" license = "See license at https://github.com/volexity/threat-intel/blob/main/LICENSE.txt" rule_id = 13232 version = 4 strings: $s1 = "rootrun" ascii $s2 = "execlp" ascii $s3 = "Usage: rootrun rootrun <command>\n" ascii $s4 = "Failed to setuid" ascii condition: all of them } |