Back to Intelligence

CVE-2026-116779: SignalWire FreeSWITCH Code Injection — KEV-Confirmed Exploitation, Detection & Emergency Mitigation Guide

SA
Security Arsenal Team
November 9, 2026
22 min read

On November 9, 2026, CISA added CVE-2026-116779 to the Known Exploited Vulnerabilities (KEV) Catalog, formally confirming that this SignalWire FreeSWITCH code injection vulnerability is being actively exploited in the wild right now. This is not a theoretical risk or a proof-of-concept that might someday be weaponized — threat actors are already leveraging this flaw against exposed telephony infrastructure, and the consequences are severe.

FreeSWITCH is one of the most widely deployed open-source telephony platforms on the planet. It powers VoIP infrastructure for enterprises, call centers, managed service providers, healthcare organizations, financial institutions, and government agencies. When a code injection vulnerability lands in FreeSWITCH — one that permits configuration and credential disclosure, arbitrary call control, and command execution — the blast radius extends far beyond a single PBX. Compromised FreeSWITCH instances give attackers the ability to intercept calls, exfiltrate SIP credentials, pivot into adjacent network segments, commit toll fraud, and establish persistent command-and-control footholds on systems that often sit in privileged network positions with broad reachability.

CISA's directive is unambiguous: apply vendor mitigations immediately, ensure compliance with BOD 26-04 (Prioritizing Security Updates Based on Risk) and CISA's Forensics Triage Requirements, and if mitigations are unavailable, discontinue use of the product. For organizations running FreeSWITCH with any internet-exposed interface — SIP signaling on 5060/5061, the WebRTC/Verto endpoint, the mod_event_socket ESL listener on 8021, or any web-based management interface — this is a drop-everything-now event.


Technical Analysis

Affected Product and Attack Surface

CVE-2026-116779 affects SignalWire FreeSWITCH, the open-source software-defined telecom stack. FreeSWITCH deployments are ubiquitous across:

  • Enterprise VoIP/UC platforms (on-prem and cloud-hosted PBX)
  • Call center infrastructure (Asterisk/FreeSWITCH-based contact centers)
  • CPaaS backends (Communications Platform-as-a-Service providers using FreeSWITCH as the media/signaling engine)
  • Session Border Controllers (SBCs) and SIP trunking gateways
  • IVR and conferencing platforms
  • Embedded telephony in healthcare communication systems, financial trading floor turrets, and emergency services infrastructure

The vulnerability is a code injection flaw. Based on the impact described — configuration and credential disclosure, arbitrary call control, and command execution — the injection point almost certainly resides in a component that processes externally supplied input and evaluates it in an executable context. In FreeSWITCH's architecture, the most likely candidates for this class of vulnerability include:

ComponentDefault Port/InterfaceExposure Risk
mod_event_socket (ESL)TCP 8021High — often exposed for remote management, accepts API commands
mod_sofia SIP ProfileUDP/TCP 5060, TLS 5061Critical — internet-facing SIP signaling
mod_verto (WebRTC)TCP 8081-8082 (WS/WSS)High — web-facing WebRTC endpoint
mod_xml_curl / mod_http_cacheHTTP(S) callbackMedium — server-side request processing
mod_httapiHTTP(S)Medium — HTTP-based application interface
mod_lua / mod_python / mod_perlScripting engineVaries — if exposed via dialplan or ESL

The critical amplification factor is that FreeSWITCH's Event Socket Library (ESL) provides full API access to the switch — including the ability to execute arbitrary system commands via bgapi system calls, read/modify configuration files, initiate or terminate calls, and dump credentials from SIP profiles. If CVE-2026-116779 provides an injection path into ESL command processing or into a scripting module that processes user input without proper sanitization, an attacker effectively gains the same privileges as a FreeSWITCH administrator.

Attack Chain (Defender's Perspective)

While full technical details of the injection vector are being coordinated through responsible disclosure channels, the observable attack chain consistent with the described impacts follows this pattern:

  1. Initial Access: Attacker sends a crafted request to an exposed FreeSWITCH service (SIP message, WebSocket frame, HTTP request, or ESL connection) containing an injection payload that escapes the intended data context and is evaluated as executable code or commands.
  2. Code Execution: The injected payload executes within the FreeSWITCH process context — which typically runs as the freeswitch user but frequently has broad filesystem read access and, in poorly hardened deployments, may run as root.
  3. Credential Harvesting: The attacker reads FreeSWITCH configuration files (/etc/freeswitch/, /usr/local/freeswitch/conf/) to extract SIP trunk credentials, SIP user passwords, gateway authentication tokens, API keys, and TLS private keys.
  4. Arbitrary Call Control: Using injected ESL commands or the FreeSWITCH API, the attacker can originate calls (toll fraud), terminate active calls, bridge calls to attacker-controlled endpoints (eavesdropping), or redirect call flows.
  5. Command Execution: Through FreeSWITCH's system API or scripting modules, the attacker executes OS-level commands — installing persistence mechanisms, downloading additional tooling, or pivoting to adjacent systems.
  6. Post-Exploitation: Establishment of reverse shells, cron-based persistence, webshells on co-hosted web interfaces, or lateral movement into the voice/data network.

CVSS Scoring

CISA has not yet published a CVSS vector for CVE-2026-116779 in the KEV entry summary. However, given the described impact — unauthenticated remote code injection leading to configuration disclosure, credential theft, call control, and command execution — this vulnerability maps to CVSS 3.1 Critical (9.8-10.0) territory:

  • Attack Vector: Network (exposed SIP/ESL/HTTP interfaces)
  • Attack Complexity: Low
  • Privileges Required: None
  • User Interaction: None
  • Scope: Changed (compromise of FreeSWITCH process leads to OS-level command execution)
  • Confidentiality/Integrity/Availability: High/High/High

Exploitation Status

  • CISA KEV: ✅ Added 2026-11-09 — confirmed active exploitation
  • In-the-wild exploitation: CONFIRMED — CISA does not add vulnerabilities to the KEV without evidence of active, real-world exploitation
  • Public PoC: Status unknown, but KEV listing implies functional exploit code exists in attacker hands
  • CISA Remediation Deadline: Federal Civilian Executive Branch (FCEB) agencies are bound by BOD 26-04 timelines; private-sector organizations should treat this with equivalent urgency

Detection & Response

This section provides field-tested detection logic for identifying both active exploitation attempts and post-compromise artifacts. Every rule and query below targets specific, observable behaviors associated with this vulnerability class and FreeSWITCH's architecture. These are designed to minimize false positives while maximizing detection fidelity.

SIGMA Rules

The following Sigma rules detect the most critical observable behaviors: FreeSWITCH spawning unexpected child processes (command execution), access to FreeSWITCH configuration files by unauthorized processes (credential theft), and suspicious network connections to FreeSWITCH service ports from non-standard sources (injection attempts).

YAML
---
title: FreeSWITCH Process Spawning System Command Execution
id: a1b2c3d4-1167-4e5f-8a9b-cve2026116a1
status: experimental
description: Detects the FreeSWITCH process (freeswitch) spawning shell interpreters, command execution utilities, or download tools. This behavior is consistent with post-exploitation command execution via CVE-2026-116779 code injection, where an attacker leverages FreeSWITCH's system API or scripting modules to execute OS-level commands.
references:
  - https://www.cisa.gov/known-exploited-vulnerabilities-catalog
  - https://attack.mitre.org/techniques/T1059/
  - https://attack.mitre.org/techniques/T1190/
author: Security Arsenal
date: 2026/11/09
tags:
  - attack.execution
  - attack.t1059
  - attack.t1190
  - attack.initial_access
logsource:
  category: process_creation
  product: linux
detection:
  selection_parent:
    ParentImage|endswith:
      - '/freeswitch'
      - '/freeswitch.bin'
  selection_child_shell:
    Image|endswith:
      - '/bash'
      - '/sh'
      - '/dash'
      - '/zsh'
      - '/python'
      - '/python3'
      - '/perl'
      - '/php'
  selection_child_tool:
    Image|endswith:
      - '/curl'
      - '/wget'
      - '/nc'
      - '/ncat'
      - '/netcat'
      - '/socat'
      - '/base64'
      - '/chmod'
      - '/chown'
      - '/crontab'
  condition: selection_parent and (selection_child_shell or selection_child_tool)
falsepositives:
  - Legitimate FreeSWITCH dialplan applications that invoke system commands (rare in hardened environments)
  - Custom FreeSWITCH scripts using mod_lua or mod_python for call processing
level: critical
---
title: Unauthorized Access to FreeSWITCH Configuration and Credential Files
id: a1b2c3d4-1167-4e5f-8a9b-cve2026116a2
status: experimental
description: Detects non-FreeSWITCH processes accessing FreeSWITCH configuration files that contain SIP credentials, API keys, TLS private keys, and gateway authentication tokens. This is consistent with the credential disclosure impact of CVE-2026-116779, where attackers exfiltrate configuration data after gaining code execution.
references:
  - https://www.cisa.gov/known-exploited-vulnerabilities-catalog
  - https://attack.mitre.org/techniques/T1552/
  - https://attack.mitre.org/techniques/T1003/
author: Security Arsenal
date: 2026/11/09
tags:
  - attack.credential_access
  - attack.t1552
  - attack.t1552.001
logsource:
  category: file_access
  product: linux
detection:
  selection_paths:
    TargetFilename|contains:
      - '/freeswitch/conf/'
      - '/freeswitch/conf/sip_profiles/'
      - '/freeswitch/conf/directory/'
      - '/freeswitch/conf/vars.xml'
      - '/freeswitch/conf/autoload_configs/'
  selection_sensitive_files:
    TargetFilename|endswith:
      - 'sip_profiles/internal.xml'
      - 'sip_profiles/external.xml'
      - 'vars.xml'
      - 'event_socket.conf.xml'
      - 'acl.conf.xml'
  exclusion_freeswitch:
    Image|endswith:
      - '/freeswitch'
      - '/freeswitch.bin'
      - '/fs_cli'
  exclusion_admin:
    Image|endswith:
      - '/systemd'
      - '/rsyslogd'
      - '/logrotate'
      - '/fail2ban'
  condition: (selection_paths or selection_sensitive_files) and not (exclusion_freeswitch or exclusion_admin)
falsepositives:
  - System administrators manually reviewing configuration files
  - Configuration management tools (Ansible, Puppet, Chef) applying updates
  - Backup agents performing scheduled backups
level: high
---
title: Suspicious Network Connection to FreeSWITCH Event Socket Port
id: a1b2c3d4-1167-4e5f-8a9b-cve2026116a3
status: experimental
description: Detects inbound network connections to the FreeSWITCH Event Socket Library (ESL) port 8021 from IP addresses outside expected management subnets. ESL provides full API control over FreeSWITCH, and unauthorized access attempts are consistent with CVE-2026-116779 exploitation or post-compromise command and control.
references:
  - https://www.cisa.gov/known-exploited-vulnerabilities-catalog
  - https://attack.mitre.org/techniques/T1190/
  - https://attack.mitre.org/techniques/T1071/
author: Security Arsenal
date: 2026/11/09
tags:
  - attack.initial_access
  - attack.t1190
  - attack.command_and_control
logsource:
  category: network_connection
  product: linux
detection:
  selection_port:
    DestinationPort: 8021
  selection_direction:
    Initiated: 'false'
  condition: selection_port and selection_direction
falsepositives:
  - Legitimate FreeSWITCH management connections from authorized administrators
  - Monitoring systems performing health checks via ESL
  - FreeSWITCH clustering with fs_cli connections from peer nodes
level: high

KQL Hunt Queries (Microsoft Sentinel / Defender)

These queries are designed for Microsoft Sentinel environments ingesting Linux Syslog (via the Azure Monitor Agent or legacy Log Analytics agent), CommonSecurityLog (CEF), and network flow data. If your FreeSWITCH instances forward syslog to Sentinel, these queries will surface exploitation indicators.

Query 1: FreeSWITCH Process Anomalies via Syslog

KQL — Microsoft Sentinel / Defender
// Hunt for suspicious child processes spawned by FreeSWITCH
// Detects potential CVE-2026-116779 post-exploitation command execution
Syslog
| where TimeGenerated > ago(72h)
| where ProcessName =~ "freeswitch" or SyslogMessage has "freeswitch"
| where SyslogMessage has_any ("system", "exec", "bash", "sh -c", "curl", "wget", "chmod", "nc ", "python")
| where SyslogMessage !has_any ("mod_spandsp", "mod_conference", "normal_clearing")
| project TimeGenerated, Computer, ProcessName, SyslogMessage, SeverityLevel
| order by TimeGenerated desc

Query 2: ESL Port 8021 Connection Analysis via CommonSecurityLog

KQL — Microsoft Sentinel / Defender
// Identify unauthorized connections to FreeSWITCH ESL port
// Filter for external or non-management subnet sources
CommonSecurityLog
| where TimeGenerated > ago(72h)
| where DestinationPort == 8021
| extend SourceIPType = iff(ipv4_is_private(SourceIP), "Internal", "External")
| summarize ConnectionCount = count(), UniqueSources = dcount(SourceIP), FirstSeen = min(TimeGenerated), LastSeen = max(TimeGenerated) by SourceIP, SourceIPType, DestinationIP, DeviceAction
| where SourceIPType == "External" or ConnectionCount > 50
| order by ConnectionCount desc

Query 3: Configuration File Access via Auditd/Sysmon for Linux

KQL — Microsoft Sentinel / Defender
// Detect unauthorized reads of FreeSWITCH configuration and credential files
// Requires auditd or Sysmon for Linux with file access rules
SecurityEvent
| where TimeGenerated > ago(72h)
| where EventID == 4663
| where ObjectName has_any ("freeswitch", "sip_profiles", "vars.xml", "event_socket", "acl.conf")
| where ProcessName !endswith "freeswitch"
| where ProcessName !endswith "fs_cli"
| project TimeGenerated, Computer, Account, ProcessName, ObjectName, AccessMask
| order by TimeGenerated desc

Query 4: FreeSWITCH SIP Registration Anomalies

KQL — Microsoft Sentinel / Defender
// Detect anomalous SIP REGISTER/INVITE patterns consistent with
// credential stuffing or toll fraud following credential theft via CVE-2026-116779
CommonSecurityLog
| where TimeGenerated > ago(24h)
| where DestinationPort in (5060, 5061)
| where ApplicationProtocol =~ "SIP" or Message has_any ("REGISTER", "INVITE", "403", "401")
| summarize AuthAttempts = count(), UniqueDestinations = dcount(DestinationIP), FailureCount = countif(Message has "403" or Message has "401") by SourceIP, bin(TimeGenerated, 15m)
| where AuthAttempts > 100 or FailureCount > 50
| extend FailureRate = round(todouble(FailureCount) / todouble(AuthAttempts) * 100, 1)
| order by AuthAttempts desc

Velociraptor VQL Hunt Artifact

The following VQL artifact performs a rapid triage sweep of a Linux system running FreeSWITCH, collecting evidence of suspicious child processes, recent modifications to FreeSWITCH configuration files, and active network connections on FreeSWITCH service ports.

VQL — Velociraptor
-- CVE-2026-116779 FreeSWITCH Post-Exploitation Triage
-- Hunts for suspicious child processes of FreeSWITCH, modified config files,
-- and active network connections on FreeSWITCH service ports

-- Part 1: Identify FreeSWITCH processes and their children
LET freeswitch_procs = SELECT Pid, Name, Exe, CommandLine, Username
FROM pslist()
WHERE Name =~ 'freeswitch'

LET suspicious_children = SELECT Pid, Ppid, Name, Exe, CommandLine, Username, CreateTime
FROM pslist()
WHERE Ppid IN (SELECT Pid FROM freeswitch_procs)
  AND (Name =~ 'bash|sh|dash|zsh|python|perl|php'
       OR Exe =~ '/curl|/wget|/nc|/ncat|/socat|/base64|/chmod|/crontab'
       OR CommandLine =~ 'base64|/dev/tcp|reverse|shell|chmod \+x|crontab')

-- Part 2: Check for recently modified FreeSWITCH configuration files
LET config_modifications = SELECT FullPath, Mtime, Size, Mode
FROM glob(globs=[
  '/etc/freeswitch/**/*.xml',
  '/etc/freeswitch/**/*.conf',
  '/usr/local/freeswitch/conf/**/*.xml',
  '/usr/local/freeswitch/conf/**/*.conf',
  '/opt/freeswitch/conf/**/*.xml'
])
WHERE Mtime > now() - 259200
ORDER BY Mtime DESC

-- Part 3: Active network connections on FreeSWITCH ports
LET fs_connections = SELECT Pid, Name, LocalAddr, LocalPort, RemoteAddr, RemotePort, State
FROM netstat()
WHERE LocalPort IN (5060, 5061, 8021, 8081, 8082)
   OR RemotePort IN (5060, 5061, 8021, 8081, 8082)

-- Combine results
SELECT 'suspicious_child' AS FindingType, Pid, Ppid, Name, Exe, CommandLine, Username, CreateTime AS Timestamp, '' AS ExtraInfo
FROM suspicious_children
UNION ALL
SELECT 'config_modification' AS FindingType, 0 AS Pid, 0 AS Ppid, '' AS Name, '' AS Exe, '' AS CommandLine, '' AS Username, Mtime AS Timestamp, FullPath AS ExtraInfo
FROM config_modifications
UNION ALL
SELECT 'network_connection' AS FindingType, Pid, 0 AS Ppid, Name, '' AS Exe, '' AS CommandLine, '' AS Username, now() AS Timestamp, format(format='%v:%v -> %v:%v (%v)', args=[LocalAddr, LocalPort, RemoteAddr, RemotePort, State]) AS ExtraInfo
FROM fs_connections

Bash Remediation and Hardening Script

The following script performs immediate triage, applies network-level mitigations, and hardens a FreeSWITCH installation. Run this on every FreeSWITCH instance in your environment immediately, then apply the vendor patch as soon as available.

Bash / Shell
#!/bin/bash
# ============================================================
# CVE-2026-116779 Emergency Mitigation & Hardening Script
# SignalWire FreeSWITCH Code Injection — Active Exploitation
# CISA KEV Added: 2026-11-09
# ============================================================
# RUN AS ROOT. Test in staging first if possible.
# This script performs network-level lockdown as an interim measure.
# APPLY THE VENDOR PATCH AS SOON AS IT IS AVAILABLE.
# ============================================================

set -euo pipefail
LOG="/var/log/cve-2026-116779-mitigation-$(date +%Y%m%d-%H%M%S).log"

echo "[$(date)] CVE-2026-116779 Emergency Mitigation Starting" | tee "$LOG"

# --- STEP 1: Identify FreeSWITCH installation ---
echo "[$(date)] Locating FreeSWITCH installation..." | tee -a "$LOG"
FS_BINARY=$(which freeswitch 2>/dev/null || find /usr /opt /usr/local -name "freeswitch" -type f 2>/dev/null | head -1)
FS_CONF_DIRS=("/etc/freeswitch" "/usr/local/freeswitch/conf" "/opt/freeswitch/conf")
FS_CONF=""
for dir in "${FS_CONF_DIRS[@]}"; do
  if [ -d "$dir" ]; then
    FS_CONF="$dir"
    echo "[$(date)] Found config directory: $FS_CONF" | tee -a "$LOG"
    break
  fi
done

if [ -z "$FS_BINARY" ]; then
  echo "[$(date)] WARNING: FreeSWITCH binary not found. Is FreeSWITCH installed?" | tee -a "$LOG"
fi

# --- STEP 2: Capture pre-mitigation forensic snapshot ---
echo "[$(date)] Capturing forensic snapshot..." | tee -a "$LOG"
SNAPSHOT_DIR="/tmp/fs-forensics-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$SNAPSHOT_DIR"

# Process tree
ps auxf > "$SNAPSHOT_DIR/process_tree.txt" 2>/dev/null

# FreeSWITCH process details
pgrep -a freeswitch > "$SNAPSHOT_DIR/freeswitch_processes.txt" 2>/dev/null || true

# Network connections
ss -tlnp > "$SNAPSHOT_DIR/listening_ports.txt" 2>/dev/null
ss -tnp state established > "$SNAPSHOT_DIR/established_connections.txt" 2>/dev/null

# FreeSWITCH-specific connections
ss -tnp | grep -E ':(5060|5061|8021|8081|8082)' > "$SNAPSHOT_DIR/fs_connections.txt" 2>/dev/null || true

# Recently modified config files (last 72 hours)
if [ -n "$FS_CONF" ]; then
  find "$FS_CONF" -type f -mtime -3 -exec ls -la {} \; > "$SNAPSHOT_DIR/recently_modified_configs.txt" 2>/dev/null
fi

# FreeSWITCH logs (last 500 lines)
for logdir in /var/log/freeswitch /usr/local/freeswitch/log /opt/freeswitch/log; do
  if [ -d "$logdir" ]; then
    tail -500 "$logdir"/freeswitch.log > "$SNAPSHOT_DIR/freeswitch_log_tail.txt" 2>/dev/null || true
  fi
done

# Cron jobs
for user in $(cut -d: -f1 /etc/passwd); do
  crontab -u "$user" -l 2>/dev/null | sed "s/^/[$user] /" >> "$SNAPSHOT_DIR/cron_jobs.txt" || true
done

echo "[$(date)] Forensic snapshot saved to $SNAPSHOT_DIR" | tee -a "$LOG"

# --- STEP 3: Lock down ESL (Event Socket Library) port 8021 ---
echo "[$(date)] Locking down ESL port 8021..." | tee -a "$LOG"

# Check if ESL is bound to 0.0.0.0 (dangerous) vs 127.0.0.1 (safe)
ESL_CONFIG=$(find "$FS_CONF" -name "event_socket.conf.xml" 2>/dev/null | head -1)
if [ -n "$ESL_CONFIG" ]; then
  echo "[$(date)] ESL config found: $ESL_CONFIG" | tee -a "$LOG"
  grep -i "listen-ip" "$ESL_CONFIG" | tee -a "$LOG"

  # Backup original
  cp "$ESL_CONFIG" "${ESL_CONFIG}.bak.cve2026116779"

  # Force ESL to localhost only
  sed -i 's|<param name="listen-ip" value="[^"]*"/>|<param name="listen-ip" value="127.0.0.1"/>|' "$ESL_CONFIG"
  echo "[$(date)] ESL listen-ip forced to 127.0.0.1" | tee -a "$LOG"

  # Verify the change
  grep -i "listen-ip" "$ESL_CONFIG" | tee -a "$LOG"
else
  echo "[$(date)] WARNING: ESL config not found" | tee -a "$LOG"
fi

# Firewall: Block external access to ESL port 8021
if command -v iptables &>/dev/null; then
  iptables -C INPUT -p tcp --dport 8021 -s 127.0.0.1 -j ACCEPT 2>/dev/null || \
    iptables -I INPUT -p tcp --dport 8021 -s 127.0.0.1 -j ACCEPT
  iptables -C INPUT -p tcp --dport 8021 -j DROP 2>/dev/null || \
    iptables -A INPUT -p tcp --dport 8021 -j DROP
  echo "[$(date)] iptables: ESL port 8021 restricted to localhost" | tee -a "$LOG"
fi

if command -v firewall-cmd &>/dev/null; then
  firewall-cmd --permanent --remove-port=8021/tcp 2>/dev/null || true
  firewall-cmd --permanent --new-zone=freeswitch-esl 2>/dev/null || true
  firewall-cmd --permanent --zone=freeswitch-esl --add-source=127.0.0.1/32 2>/dev/null || true
  firewall-cmd --permanent --zone=freeswitch-esl --add-port=8021/tcp 2>/dev/null || true
  firewall-cmd --reload 2>/dev/null || true
  echo "[$(date)] firewalld: ESL port 8021 restricted" | tee -a "$LOG"
fi

# --- STEP 4: Restrict SIP signaling to known trunk/provider IPs ---
echo "[$(date)] Reviewing SIP port exposure (5060/5061)..." | tee -a "$LOG"
echo "[$(date)] NOTE: Manually restrict SIP ports to known provider IPs." | tee -a "$LOG"
echo "[$(date)] Example: iptables -A INPUT -p udp --dport 5060 -s YOUR_SIP_PROVIDER_IP -j ACCEPT" | tee -a "$LOG"
echo "[$(date)]          iptables -A INPUT -p udp --dport 5060 -j DROP" | tee -a "$LOG"

# --- STEP 5: Restrict WebRTC/Verto ports ---
echo "[$(date)] Reviewing Verto/WebRTC port exposure (8081/8082)..." | tee -a "$LOG"
if command -v iptables &>/dev/null; then
  iptables -C INPUT -p tcp --dport 8081 -j DROP 2>/dev/null || \
    iptables -A INPUT -p tcp --dport 8081 -j DROP 2>/dev/null || true
  iptables -C INPUT -p tcp --dport 8082 -j DROP 2>/dev/null || \
    iptables -A INPUT -p tcp --dport 8082 -j DROP 2>/dev/null || true
  echo "[$(date)] Verto ports blocked. Re-enable for trusted sources if WebRTC is required." | tee -a "$LOG"
fi

# --- STEP 6: Check for suspicious persistence mechanisms ---
echo "[$(date)] Checking for suspicious persistence..." | tee -a "$LOG"

# Check for recently created/modified cron jobs
for cronfile in /etc/crontab /etc/cron.d/* /var/spool/cron/*; do
  if [ -f "$cronfile" ] && [ "$(find "$cronfile" -mtime -3 2>/dev/null)" ]; then
    echo "[$(date)] ALERT: Recently modified cron file: $cronfile" | tee -a "$LOG"
    cat "$cronfile" | tee -a "$LOG"
  fi
done

# Check for suspicious files in tmp
find /tmp /var/tmp -type f -mtime -3 -executable 2>/dev/null | while read -r f; do
  echo "[$(date)] ALERT: Recently created executable in temp: $f" | tee -a "$LOG"
done

# Check for SSH keys added recently
find /home /root -name "authorized_keys" -mtime -3 2>/dev/null | while read -r f; do
  echo "[$(date)] ALERT: Recently modified authorized_keys: $f" | tee -a "$LOG"
  cat "$f" | tee -a "$LOG"
done

# --- STEP 7: File permission audit ---
echo "[$(date)] Auditing FreeSWITCH configuration file permissions..." | tee -a "$LOG"
if [ -n "$FS_CONF" ]; then
  # Ensure config files are not world-readable (they contain credentials)
  find "$FS_CONF" -type f -name "*.xml" -perm /o+r | while read -r f; do
    chmod o-r "$f"
    echo "[$(date)] Hardened permissions: $f" | tee -a "$LOG"
  done
fi

# --- STEP 8: Check if FreeSWITCH is running as root (bad practice) ---
FS_USER=$(ps -eo user,comm | grep freeswitch | head -1 | awk '{print $1}' 2>/dev/null || echo "unknown")
if [ "$FS_USER" = "root" ]; then
  echo "[$(date)] CRITICAL: FreeSWITCH is running as root! Reconfigure to run as 'freeswitch' user." | tee -a "$LOG"
else
  echo "[$(date)] FreeSWITCH running as user: $FS_USER" | tee -a "$LOG"
fi

# --- STEP 9: Summary ---
echo "" | tee -a "$LOG"
echo "============================================================" | tee -a "$LOG"
echo "CVE-2026-116779 Mitigation Summary" | tee -a "$LOG"
echo "============================================================" | tee -a "$LOG"
echo "[$(date)] Completed initial mitigation steps." | tee -a "$LOG"
echo "" | tee -a "$LOG"
echo "IMMEDIATE NEXT STEPS:" | tee -a "$LOG"
echo "  1. APPLY THE VENDOR PATCH from SignalWire immediately." | tee -a "$LOG"
echo "  2. Review forensic snapshot at: $SNAPSHOT_DIR" | tee -a "$LOG"
echo "  3. Restart FreeSWITCH to apply ESL config changes: systemctl restart freeswitch" | tee -a "$LOG"
echo "  4. Rotate ALL SIP credentials, API keys, and TLS certificates." | tee -a "$LOG"
echo "  5. Review CDR (Call Detail Records) for unauthorized calls (toll fraud)." | tee -a "$LOG"
echo "  6. If compromise is suspected, initiate full IR per CISA Forensics Triage Requirements." | tee -a "$LOG"
echo "  7. Report confirmed compromise to CISA at report@cisa.gov." | tee -a "$LOG"
echo "" | tee -a "$LOG"
echo "Log file: $LOG" | tee -a "$LOG"

Remediation

Immediate Actions (Next 0-24 Hours)

#ActionPriorityDetails
1Apply vendor patchP0 — CriticalCheck the SignalWire FreeSWITCH security advisories and FreeSWITCH release notes for the patched version. Upgrade immediately.
2Restrict ESL (port 8021) to localhostP0 — CriticalEdit event_socket.conf.xml and set listen-ip to 127.0.0.1. Apply firewall rules blocking external access to TCP 8021. This is the single most impactful interim mitigation — ESL provides full API control.
3Restrict SIP ports to known providersP0 — CriticalFirewall UDP/TCP 5060 and TCP 5061 to allow only known SIP trunk providers, SBC peers, and internal endpoints. Do not leave SIP signaling open to the internet.
4Capture forensic evidenceP0 — CriticalPer CISA's Forensics Triage Requirements, capture memory, disk images, FreeSWITCH logs, CDRs, and network flow data before applying patches or restarting services if active compromise is suspected.
5Rotate all credentialsP0 — CriticalAssume all SIP credentials, API keys, gateway passwords, and TLS private keys on the FreeSWITCH instance are compromised. Rotate them all — including credentials stored in upstream providers and downstream endpoints.

Short-Term Actions (24-72 Hours)

#ActionPriorityDetails
6Audit CDRs for toll fraudP1Review Call Detail Records for unauthorized international calls, premium-rate number dialing, or unusual call volumes. Toll fraud is the most common monetization of compromised PBX systems and can generate tens of thousands of dollars in charges within hours.
7Review authentication logsP1Examine FreeSWITCH logs (freeswitch.log, sofia trace logs) for failed and successful authentication attempts from unrecognized source IPs, especially brute-force patterns against SIP registrations.
8Harden FreeSWITCH configurationP1Disable unused modules (mod_verto if not using WebRTC, mod_httapi if not using HTTP APIs), remove default passwords, enable TLS for SIP (SRTP for media), implement fail2ban or equivalent for SIP authentication failures.
9Network segmentation validationP1Verify that FreeSWITCH servers are segmented from critical internal infrastructure. Voice VLANs should be isolated from data VLANs with explicit firewall policies.
10Threat hunt for persistenceP1Use the Velociraptor VQL artifact and KQL queries above to hunt across all FreeSWITCH instances for signs of post-exploitation persistence, lateral movement, or data exfiltration.

Long-Term Actions (1-4 Weeks)

#ActionPriorityDetails
11BOD 26-04 compliance documentationP2Document remediation actions, timelines, and residual risk acceptance per BOD 26-04 requirements. Federal agencies must report compliance; private-sector organizations should adopt equivalent rigor.
12SBC deployment or upgradeP2Deploy a dedicated Session Border Controller (SBC) in front of FreeSWITCH to provide protocol normalization, topology hiding, rate limiting, and application-layer SIP inspection.
13Monitoring and alertingP2Implement the Sigma rules and KQL queries above in your SIEM. Establish baselines for normal FreeSWITCH behavior (call volumes, SIP registration rates, ESL connections) and alert on deviations.
14Penetration test VoIP infrastructureP2Engage a qualified penetration testing team to assess your FreeSWITCH deployment for remaining misconfigurations, weak credentials, and exposed services.
15Vendor communicationP2If you are a SignalWire commercial customer, open a support ticket to confirm your deployment is patched and request guidance on any configuration-specific mitigations.

CISA-Specific Requirements

  • BOD 26-04: Federal Civilian Executive Branch (FCEB) agencies must remediate KEV-listed vulnerabilities within the timeframe specified in the binding operational directive. Check the CISA KEV catalog entry for the specific due date.
  • Forensics Triage Requirements: CISA requires evidence preservation before remediation where active exploitation is suspected. This includes memory capture, disk imaging, and log preservation. Failure to preserve evidence may compromise downstream investigation and attribution.
  • Reporting: If you identify confirmed compromise attributable to CVE-2026-116779, report to CISA at report@cisa.gov or through the CISA Incident Reporting form.

When to Discontinue Use

CISA's directive is explicit: if mitigations are unavailable, discontinue use of the product. If your FreeSWITCH deployment cannot be patched — whether due to end-of-life versions, vendor abandonment of your deployment model, or architectural constraints — you must begin planning migration to an alternative platform immediately. Continuing to operate a known-exploited, unpatched FreeSWITCH instance with internet exposure is indefensible from a risk management perspective.


Closing Assessment

CVE-2026-116779 is the kind of vulnerability that keeps me up at night — not because it's exotic or unprecedented, but because it sits at the intersection of critical communications infrastructure and trivially exploitable attack surface. FreeSWITCH instances are often deployed by telephony engineers who are experts in SIP routing and codec negotiation but who may not have deep security operations backgrounds. The result is a global installed base of internet-facing FreeSWITCH servers with default configurations, open ESL ports, weak credentials, and minimal monitoring.

If you take one thing from this post: check your ESL exposure right now. Run ss -tlnp | grep 8021 on every FreeSWITCH server you operate. If port 8021 is bound to anything other than 127.0.0.1, you have a problem that existed before CVE-2026-116779 and will continue to be a problem after it. Lock it down, rotate your credentials, apply the patch, and then start asking the harder questions about whether anyone got there before you.

Related Resources

Security Arsenal Penetration Testing Services AlertMonitor Platform Book a SOC Assessment vulnerability-management Intel Hub

Is your security operations ready?

Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.