Прямо сейчас более 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.
Схема всегда одна и та же:
- —Уязвимость раскрыта
- —Выпущен патч
- —Большинство администраторов не ставят патч неделями или месяцами
- —Группировки эксплуатируют это окно
- —Администраторы узнают о взломе только когда приходит счёт за телефонию
Разорвать этот цикл может только мониторинг. Если у вас есть видимость активности АТС в реальном времени, вы замечаете аномалии за часы, а не за месяцы. Вы видите всплеск неудачных авторизаций до того, как атакующий подберёт рабочие учётные данные. Вы видите первый мошеннический международный звонок до того, как их станет тысяча.
Чек-лист безопасности: харденинг 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 дней.
