·15 мин·5 просмотров

Безопасность FreePBX после CVE-2025-64328: мониторинг АТС

900+ инсталляций FreePBX заражены веб-шеллами. Как обнаружить компрометацию, защитить АТС и настроить постоянный мониторинг безопасности с помощью конфигов Asterisk и SQL-запросов.

A
Astervis
Команда инженеров и продактов

Прямо сейчас более 900 инсталляций FreePBX работают с установленными веб-шеллами. Возможно, ваша — одна из них.

В феврале 2026 года Shadowserver Foundation подтвердил, что более 900 систем Sangoma FreePBX были активно скомпрометированы через CVE-2025-64328 — постаутентификационную уязвимость внедрения команд в модуле filestore пакета Endpoint Manager. Атаки начались в декабре 2025 года. Патч существовал с ноября. Большинство пострадавших его так и не установили.

Это не теоретический риск. Группировка INJ3CTOR3 разворачивала на уязвимых системах веб-шелл EncystPHP. Оказавшись внутри, злоумышленники выполняют произвольные команды от имени пользователя asterisk, генерируют мошеннические исходящие звонки и продвигаются вглубь сети жертвы.

Моё мнение: настоящая проблема не в самой уязвимости, а в том, что у большинства администраторов FreePBX нулевая видимость происходящего на их АТС. Они не могут обнаружить взлом, потому что никогда не настраивали мониторинг. Эта статья исправляет ситуацию.

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

Что произошло: разбор CVE-2025-64328

CVE-2025-64328 (CVSS 8.6) — это уязвимость внедрения команд в модуле Endpoint Manager для FreePBX, а конкретно в функции check_ssh_connect() внутри компонента filestore.

Чем она опасна:

  • Вектор атаки: аутентифицированный пользователь отправляет HTTP-запрос с параметрами command=testconnection и driver=SSH. Переданные пользователем значения host, port, user, key и path попадают в вызов exec() без какой-либо санитизации.
  • Последствия: выполнение произвольных shell-команд от имени пользователя asterisk — сервисной учётной записи, которая управляет всей вашей АТС.
  • Уязвимые версии: FreePBX Endpoint Manager 17.0.2.36 и выше, до версии 17.0.3.
  • Кто эксплуатирует: INJ3CTOR3 — известная группировка, атакующая VoIP-инфраструктуру ради телефонного мошенничества.

Внедряемый веб-шелл (EncystPHP) даёт постоянный удалённый доступ, выполнение команд и возможность разворачивать дополнительные веб-шеллы. Кампанию задокументировала FortiGuard Labs (Fortinet) в январе 2026 года.

Кто в зоне риска

Если у вас FreePBX с модулем Endpoint Manager и админ-панель доступна из интернета — даже за аутентификацией — вы в зоне поражения.

Данные Shadowserver показывают скомпрометированные инсталляции более чем в 50 странах:

  • 401 в США
  • 51 в Бразилии
  • 43 в Канаде
  • 40 в Германии
  • 36 во Франции

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

Шаг 1. Проверьте, не взломаны ли вы уже

Прежде чем что-то защищать, убедитесь, что систему ещё не захватили. Выполните эти проверки на сервере FreePBX по SSH.

Ищем веб-шеллы

Веб-шелл EncystPHP и похожие нагрузки обычно прячутся в корне веб-сервера. Поищите подозрительные PHP-файлы:

# Найти PHP-файлы, изменённые за последние 120 дней, в веб-доступных каталогах find /var/www/html -name "*.php" -mtime -120 -ls 2>/dev/null # Поиск типичных сигнатур веб-шеллов grep -rl "eval(base64_decode" /var/www/html/ 2>/dev/null grep -rl "system(\$_" /var/www/html/ 2>/dev/null grep -rl "exec(\$_" /var/www/html/ 2>/dev/null grep -rl "passthru(" /var/www/html/ 2>/dev/null grep -rl "shell_exec(" /var/www/html/ 2>/dev/null | grep -v "/vendor/" # Проверить файлы, принадлежащие пользователю asterisk, которых там быть не должно find /var/www/html -user asterisk -name "*.php" -newer /var/www/html/index.php -ls

Если хоть одна из команд что-то нашла — остановитесь. Считайте систему скомпрометированной. Не пытайтесь её «вычистить»: разворачивайте заново из заведомо чистой резервной копии, сделанной до декабря 2025 года.

Проверьте несанкционированные cron-задания

Веб-шеллы часто закрепляются через cron:

# Проверить crontab пользователя asterisk crontab -u asterisk -l # Проверить системные каталоги cron ls -la /etc/cron.d/ ls -la /etc/cron.daily/ cat /var/spool/cron/asterisk 2>/dev/null # Поискать недавно изменённые записи cron find /etc/cron* -mtime -120 -ls 2>/dev/null

Проверьте активные сетевые соединения

Скомпрометированные АТС часто держат исходящие соединения с управляющими серверами (C2):

# Список всех установленных соединений процесса asterisk ss -tnp | grep asterisk # Поиск неожиданных исходящих соединений (не ваши SIP-транки) ss -tnp state established | grep -v ":5060" | grep -v ":5061" # Проверить слушателей на нетипичных портах ss -tlnp | grep -v -E ":(22|80|443|5060|5061|8080|8443|4569|10000)"

Проверьте CDR на телефонное мошенничество

Главная цель INJ3CTOR3 — toll fraud, то есть генерация дорогих международных звонков через вашу АТС. Проверьте CDR:

-- Найти звонки на международные премиум-направления (за последние 30 дней) -- Выполнять в MySQL/MariaDB Asterisk или в вашей базе CDR SELECT calldate, src, dst, duration, disposition, channel FROM cdr WHERE calldate > DATE_SUB(NOW(), INTERVAL 30 DAY) AND ( dst LIKE '011%' -- Международные (набор из США) OR dst LIKE '00%' -- Международные (набор из ЕС) OR dst LIKE '+%' -- Международный формат E.164 OR LENGTH(dst) > 12 -- Необычно длинные номера ) AND duration > 0 ORDER BY calldate DESC LIMIT 100;
-- Найти звонки вне рабочих часов (возможный признак мошенничества) SELECT DATE(calldate) as call_date, HOUR(calldate) as call_hour, COUNT(*) as call_count, SUM(duration) as total_seconds, COUNT(DISTINCT dst) as unique_destinations FROM cdr WHERE calldate > DATE_SUB(NOW(), INTERVAL 30 DAY) AND (HOUR(calldate) < 6 OR HOUR(calldate) > 22) AND disposition = 'ANSWERED' GROUP BY DATE(calldate), HOUR(calldate) HAVING call_count > 5 ORDER BY call_date DESC, call_hour;
-- Обнаружить резкие всплески исходящего трафика SELECT DATE(calldate) as call_date, COUNT(*) as total_calls, COUNT(CASE WHEN dst LIKE '011%' OR dst LIKE '00%' OR dst LIKE '+%' THEN 1 END) as international_calls, SUM(duration) as total_duration_sec, ROUND(SUM(duration)/3600, 1) as total_hours FROM cdr WHERE calldate > DATE_SUB(NOW(), INTERVAL 60 DAY) GROUP BY DATE(calldate) ORDER BY call_date DESC;

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

Моё мнение: большинство администраторов FreePBX заглядывают в CDR раз в месяц, когда приходит счёт от SIP-оператора. К этому моменту взломанная система успевает нагенерировать мошеннических звонков на тысячи долларов. Мониторинг CDR в реальном времени — не роскошь: это разница между инцидентом на $200 и телефонным счётом на $20 000.

Шаг 2. Обновите и защитите FreePBX

Если система чистая (или вы переразвернули её из бэкапа), вот как её закрыть.

Установите патч

Обновите модуль Endpoint Manager до версии 17.0.3 или новее:

# Обновить модули FreePBX fwconsole ma upgradeall fwconsole reload # Проверить версию Endpoint Manager fwconsole ma list | grep endpoint

Если обновиться прямо сейчас не получается, отключите уязвимую функциональность, ограничив доступ к компоненту filestore.

Закройте админ-панель

Уязвимость требует аутентификации, но это слабый барьер, если панель администратора смотрит в интернет.

Ограничьте доступ по IP через iptables:

# Разрешить админ-панель только из вашей управляющей сети iptables -A INPUT -p tcp --dport 443 -s 10.0.0.0/8 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -s 192.168.0.0/16 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j DROP # Разрешить админ-панель с конкретного публичного IP (ваш офис) iptables -A INPUT -p tcp --dport 443 -s YOUR.OFFICE.IP.HERE -j ACCEPT

Либо используйте Responsive Firewall в FreePBX:

Admin -> Connectivity -> Firewall -> Interfaces - Пометьте интерфейс локальной сети как "Trusted" - Пометьте WAN/интернет как "Internet" (не Trusted) - Включите "Responsive Firewall" только для SIP - НИКОГДА не помечайте интернет-интерфейс как Trusted

Отключите ненужные модули

Каждый включённый модуль — это дополнительная поверхность атаки:

# Список всех установленных модулей fwconsole ma list # Отключить модули, которыми вы не пользуетесь fwconsole ma disable endpointman # Если не используете Endpoint Manager fwconsole ma disable restapi # Если не используете REST API fwconsole ma disable webrtc # Если не используете WebRTC fwconsole reload

Ужесточите доступ по SSH

Цепочка атаки часто начинается со взлома SSH. Закройте его:

# /etc/ssh/sshd_config - добавьте или измените: Port 2222 # Сменить стандартный 22 PermitRootLogin no # Никогда не пускать root по SSH PasswordAuthentication no # Только вход по ключу AllowUsers your-admin-user # Белый список конкретных пользователей MaxAuthTries 3 LoginGraceTime 30
# Перезапустить SSH после изменений systemctl restart sshd

Устали угадывать, что происходит в очередях?

Astervis даёт 30+ реалтайм-графиков, KPI операторов и CRM-интеграцию для вашего Asterisk PBX. On-premise. Установка за 5 минут. От $119/мес flat без ограничения на операторов.

Попробовать бесплатно

Настройте Fail2Ban для FreePBX

Fail2Ban следит за логами и блокирует IP-адреса после неудачных попыток авторизации:

# /etc/fail2ban/jail.local [freepbx] enabled = true filter = freepbx action = iptables-allports[name=FreePBX, protocol=all] logpath = /var/log/asterisk/freepbx_security.log maxretry = 3 bantime = 86400 findtime = 600 [asterisk] enabled = true filter = asterisk action = iptables-allports[name=Asterisk, protocol=all] logpath = /var/log/asterisk/messages maxretry = 3 bantime = 86400 findtime = 600
# /etc/fail2ban/filter.d/freepbx.conf [Definition] failregex = \[SECURITY\](.*) from <HOST> ignoreregex =
# Перезапустить Fail2Ban systemctl restart fail2ban # Посмотреть текущие блокировки fail2ban-client status freepbx

Шаг 3. Настройте постоянный мониторинг безопасности

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

Следите за логами Asterisk на предмет подозрительной активности

В логах Asterisk есть сигналы, на которые большинство администраторов никогда не смотрит.

Ключевые лог-файлы:

Лог-файлЧто в нём
/var/log/asterisk/freepbx_security.logНеудачные авторизации, заблокированные IP
/var/log/asterisk/fullВсе события Asterisk, включая активность каналов
/var/log/asterisk/messagesПопытки SIP-регистрации, ошибки
/var/log/httpd/access_logПопытки доступа к веб-панели
/var/log/secureПопытки входа по SSH

Скрипт автоматической проверки логов:

#!/bin/bash # /usr/local/bin/pbx-security-check.sh # Запускать по cron каждый час: 0 * * * * /usr/local/bin/pbx-security-check.sh ALERT_EMAIL="admin@yourcompany.com" LOG="/var/log/asterisk/freepbx_security.log" # Подсчитать неудачные попытки авторизации за последний час FAILURES=$(grep "$(date -d '1 hour ago' '+%Y-%m-%d %H')" "$LOG" 2>/dev/null | grep -c "SECURITY") if [ "$FAILURES" -gt 20 ]; then echo "ALERT: $FAILURES auth failures in the last hour on $(hostname)" | \ mail -s "FreePBX Security Alert" "$ALERT_EMAIL" fi # Проверить появление новых PHP-файлов в корне веб-сервера NEW_PHP=$(find /var/www/html -name "*.php" -mmin -60 -ls 2>/dev/null) if [ -n "$NEW_PHP" ]; then echo "ALERT: New PHP files detected in web root:\n$NEW_PHP" | \ mail -s "FreePBX: Suspicious File Alert" "$ALERT_EMAIL" fi # Проверить неожиданные исходящие соединения SUSPICIOUS=$(ss -tnp state established | grep asterisk | grep -v -E ":(5060|5061|3306|6379)" | head -5) if [ -n "$SUSPICIOUS" ]; then echo "ALERT: Unexpected outbound connections from asterisk:\n$SUSPICIOUS" | \ mail -s "FreePBX: Suspicious Connection Alert" "$ALERT_EMAIL" fi

Настройте детекцию аномалий по CDR

Анализ CDR ловит toll fraud быстрее любого другого метода. Вот запрос, который можно выполнять ежедневно:

-- Ежедневная детекция аномалий: сравнение сегодняшней картины со средней за 30 дней SELECT 'TODAY' as period, COUNT(*) as total_calls, COUNT(CASE WHEN dst LIKE '011%' OR dst LIKE '00%' OR dst LIKE '+%' THEN 1 END) as international_calls, ROUND(AVG(duration), 0) as avg_duration, COUNT(DISTINCT src) as unique_sources, MAX(duration) as longest_call FROM cdr WHERE calldate >= CURDATE() UNION ALL SELECT '30D_AVG' as period, ROUND(COUNT(*) / 30, 0) as total_calls, ROUND(COUNT(CASE WHEN dst LIKE '011%' OR dst LIKE '00%' OR dst LIKE '+%' THEN 1 END) / 30, 0) as international_calls, ROUND(AVG(duration), 0) as avg_duration, ROUND(COUNT(DISTINCT src) / 30, 0) as unique_sources, MAX(duration) as longest_call FROM cdr WHERE calldate >= DATE_SUB(CURDATE(), INTERVAL 30 DAY) AND calldate < CURDATE();

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

Отслеживайте попытки SIP-регистрации

Брутфорс SIP-регистраций часто предшествует полноценной компрометации:

-- Отслеживание неудачных SIP-регистраций по IP-адресу источника (за 24 часа) -- Требуется включённое логирование событий безопасности Asterisk SELECT SUBSTRING_INDEX( SUBSTRING_INDEX(channel, '/', 2), '/', -1 ) as source, COUNT(*) as attempts, MIN(calldate) as first_seen, MAX(calldate) as last_seen FROM cdr WHERE calldate >= DATE_SUB(NOW(), INTERVAL 24 HOUR) AND disposition = 'FAILED' GROUP BY source HAVING attempts > 10 ORDER BY attempts DESC;

Конфигурация Asterisk для логирования безопасности

Включите подробное логирование безопасности в конфигурации Asterisk:

; /etc/asterisk/logger.conf [logfiles] security => security full => notice,warning,error,verbose(3) messages => notice,warning,error [general] dateformat=%F %T.%3q
; /etc/asterisk/sip.conf (или pjsip.conf) [general] alwaysauthreject=yes ; Не раскрывать существующие внутренние номера allowguest=no ; Блокировать неаутентифицированные звонки
; /etc/asterisk/extensions.conf ; По умолчанию блокировать международный набор - разрешать только через выбранные транки [from-internal] ; Разрешать международные звонки только через утверждённый транк exten => _011.,1,NoOp(International call attempt: ${CALLERID(num)} -> ${EXTEN}) exten => _011.,n,Set(CDR(userfield)=INTL_ATTEMPT) exten => _011.,n,GotoIf($["${CHANNEL(peerip)}" = "10.0.0.100"]?allow:deny) exten => _011.,n(deny),Playback(ss-noservice) exten => _011.,n,Hangup() exten => _011.,n(allow),Dial(SIP/trunk/${EXTEN})

Мониторинг в реальном времени: что отслеживать

Вот метрики, которые действительно важны для контроля безопасности АТС:

МетрикаНормаПорог оповещенияЧто это значит
Неудачные SIP-регистрации в час< 10> 50Идёт перебор паролей
Международные звонки в деньВаш базовый уровень> 3x от базовогоВозможен toll fraud
Объём звонков вне рабочих часов< 5> 20Несанкционированная генерация звонков
Активные каналы (нерабочее время)0-2> 10Взломанная система совершает звонки
Новые PHP-файлы в корне веб-сервера0> 0Установка веб-шелла
Неудачные входы в админ-панель в час< 5> 15Перебор паролей к панели
Уникальные направления исходящих в час< 20> 100Работает бот-генератор звонков

Моё мнение: большинство статей о безопасности советуют «включить логирование». Это бесполезно, если логи никто (и ничто) не читает. Работает только автоматический мониторинг с оповещениями по порогам. Вы не станете подключаться к АТС по SSH в три часа ночи, чтобы посмотреть логи. А вот алерт в три часа ночи о 200 международных звонках вас разбудит.

Шаг 4. Соберите дашборд безопасности

Отдельные проверки полезны, но дашборд даёт единую картину состояния и безопасности АТС.

Что должно быть на дашборде

Панель реального времени:

  • Количество активных каналов (с подсветкой нерабочего времени)
  • Неудачные попытки авторизации (за последний час, с динамикой)
  • Объём международных и премиум-звонков
  • Нетипичные страны назначения

Ежедневная сводка:

  • Всего звонков против среднего за 30 дней
  • Доля международных звонков
  • Топ направлений (отмечать новые страны)
  • Неудачные SIP-регистрации по IP источника
  • Журнал доступа к админ-панели

Еженедельный аудит:

  • Версии модулей против последних доступных
  • Проверка целостности файлов (новые/изменённые PHP-файлы)
  • Статистика блокировок Fail2Ban
  • Тренд аномалий в CDR

Astervis для мониторинга безопасности АТС

Всё это можно собрать вручную: cron-скрипты, собственные SQL-запросы и инстанс Grafana. Это примерно 40 часов настройки, постоянное сопровождение и никакого доступа с мобильного.

Либо вы устанавливаете Astervis за 5 минут и получаете:

  • Аналитику CDR в реальном времени — каждый звонок видно сразу, с автоматическим обнаружением аномалий
  • 30+ готовых графиков — включая динамику объёма звонков, анализ направлений и активность вне рабочих часов
  • Учёт по операторам — понятно, какие внутренние номера генерируют неожиданный трафик
  • Мониторинг транков — злоупотребление SIP-транком заметно раньше, чем придёт счёт
  • Тепловые карты — визуализация паттернов звонков и мгновенное обнаружение аномалий

Astervis подключается напрямую к базе CDR вашего Asterisk. Он self-hosted (данные остаются на вашем сервере), устанавливается одной командой и даёт ту самую видимость, которая позволила бы предотвратить компрометацию каждой из инсталляций в кампании CVE-2025-64328.

-> Начните 14-дневный бесплатный период

Шире контекст: почему мониторинг безопасности АТС так важен

CVE-2025-64328 — не последняя уязвимость FreePBX. До неё была CVE-2025-57819 (CVSS 10.0) — брешь с неаутентифицированным доступом к админке, которую эксплуатировали с августа 2025 года. До этого — похожие уязвимости в Elastix и старых версиях FreePBX.

Схема всегда одна и та же:

  1. Уязвимость раскрыта
  2. Выпущен патч
  3. Большинство администраторов не ставят патч неделями или месяцами
  4. Группировки эксплуатируют это окно
  5. Администраторы узнают о взломе только когда приходит счёт за телефонию

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

Чек-лист безопасности: харденинг FreePBX после CVE-2025-64328

Используйте его как план действий:

  • Немедленно: проверить /var/www/html на веб-шеллы
  • Немедленно: проверить CDR на международные звонки, которых вы не узнаёте
  • Немедленно: проверить несанкционированные cron-задания пользователя asterisk
  • Сегодня: обновить Endpoint Manager до версии 17.0.3+
  • Сегодня: ограничить доступ к админ-панели только доверенными IP
  • Сегодня: сменить все административные пароли (FreePBX, SSH, MySQL)
  • На этой неделе: настроить Fail2Ban для FreePBX и Asterisk
  • На этой неделе: отключить неиспользуемые модули FreePBX
  • На этой неделе: настроить оповещения об аномалиях в CDR (скрипт или система мониторинга)
  • На этой неделе: включить логирование безопасности в Asterisk
  • На этой неделе: по умолчанию заблокировать международный набор в диалплане
  • Постоянно: ежедневно проверять CDR на аномалии по объёму и направлениям
  • Постоянно: еженедельно просматривать блокировки Fail2Ban
  • Постоянно: ежемесячно проверять обновления модулей FreePBX
  • Постоянно: запускать проверки целостности файлов в корне веб-сервера

Заключение

900+ скомпрометированных инсталляций FreePBX — это не статистика, а 900+ организаций, потерявших контроль над своей телефонией. Часть из них скомпрометирована прямо сейчас: на серверах работают веб-шеллы, о которых никто не знает, и генерируются звонки, за которые придётся заплатить.

Решение — не только закрыть CVE-2025-64328. Решение — сменить базовый подход с «настроил АТС и забыл» на «постоянно мониторю АТС». Любая другая инфраструктура в вашей сети под мониторингом: серверы, сети, приложения. Через вашу АТС проходят все телефонные разговоры компании. Она заслуживает такой же видимости.

Начните с чек-листа выше. Проверьте систему на компрометацию, обновите, защитите, а затем настройте мониторинг, который работает 24/7. Ваш счёт за телефонию — и ваша служба безопасности — скажут спасибо.


Astervis — аналитика колл-центра в реальном времени для АТС на базе Asterisk. Self-hosted, установка одной командой, 30+ графиков и та самая видимость, которая нужна вашей АТС. Попробуйте бесплатно 14 дней — без привязки карты.

Хватит гадать. Начни видеть.

Реальная картина вашего Asterisk колл-центра: время ожидания, активность операторов, нагрузка на транки и 30+ графиков. On-premise на вашем сервере. Установка за 5 минут. Без карты.

От $119/мес flat. Без ограничения на операторов. Триал 14 дней.

Поделиться