我们的 AI 引擎 Neutron 在加州大学伯克利分校的 CyberGym 基准测试中取得了 97.1% 的成绩。 了解更多

深度解析

深度解析

FreeSWITCH SIP MESSAGE RCE,已在野利用 (CVE-2026-116779)

发往标准 FreeSWITCH 配置文件的 SIP MESSAGE 可执行 API 和系统命令;1.11.3 已修复,且已在野利用。

TL;DR

  • 发往 FreeSWITCH 配置文件的精心构造 SIP MESSAGE 可选择 api 聊天协议,并以 FreeSWITCH 进程权限执行 FreeSWITCH API 命令,包括系统命令。SignalWire 于 2026 年 11 月 5 日发布 CVE-2026-116779。
  • 1.11.2 及之前的所有版本都受影响。标准内部和外部配置文件默认接受入站 MESSAGE,而标准 default 目录用户没有密码,可使攻击无需认证。
  • 公告评分为 CVSS v3.1 9.8 Critical,并称已观察到该路径的在野利用。截至 2026 年 11 月 6 日,该 CVE 不在 CISA KEV 目录中。
  • 升级到 FreeSWITCH 1.11.3 或更高版本。如果无法升级,请对不需要 SIP 聊天的配置文件设置 enable-chat=false;参见“如何修复?”。

我受影响吗?

只有同时满足以下所有条件时才会受到影响:

  • 主机运行 FreeSWITCH 1.11.2 或更早版本。
  • 至少一个 SIP 配置文件接受入站 MESSAGE。除非配置文件设置 enable-chat=false,聊天处理默认开启,标准 conf/vanilla 的内部和外部配置文件都保持开启。
  • 攻击者可以通过 SIP 到达该配置文件,或通过能够到达的 trunk 或对等端投递 MESSAGE。
  • 配置文件尚未拒绝 api 聊天协议。1.11.3 之前的版本没有 enable-chat-api-proto 设置,因此每个接受 MESSAGE 的配置文件都可用该路径。

MESSAGE 认证改变谁能到达该路径,但不会移除它。自 FreeSWITCH 1.10.7 起,auth-messages 默认开启,因此配置文件上的任何账户都足够:分机、话机或可注册的 trunk 对等端。标准 conf/vanilla/directory/default/default.xml 定义了一个既没有 password 也没有 a1-hash 的 default 用户;两者都没有的目录用户会在 allow-empty-password 未设为 false 时通过认证。因此标准配置无需认证。

入站 ACL 不覆盖 MESSAGE,因此收紧 ACL 不会使配置文件脱离范围。设置 enable-chat=false 的配置文件不会到达有缺陷的处理程序。

分支 受影响版本 修复版本
FreeSWITCH 1.11 1.11.0 到 1.11.2 1.11.3(2026 年 8 月 28 日发布)
FreeSWITCH 1.10 及更早 1.11.3 之前的所有版本 1.11.3

检查主机运行的内容以及哪些配置文件接受聊天:

# FreeSWITCH version
fs_cli -x "version"
# If fs_cli is unavailable, run the binary directly
freeswitch -version

# Profiles and whether inbound chat is disabled
grep -R "enable-chat" /etc/freeswitch/sip_profiles/ 2>/dev/null

# Directory users with no password or a1-hash
grep -R -E "<user id=|<param name=\"(password|a1-hash)\"" /etc/freeswitch/directory/ 2>/dev/null

没有 enable-chat=false 行的配置文件在范围内。首先查找 default 用户:如果它既没有 password 也没有 a1-hash,MESSAGE 无需账户即可到达该路径。

如何修复?

  1. 升级到 FreeSWITCH 1.11.3 或更高版本。使用 SignalWire 软件包仓库,或从 v1.11.3 标签重新构建,然后重启 FreeSWITCH。发行说明列出了新的 enable-chat-api-proto 参数和 To 用户分割的上限。
  2. 如果自行构建软件包,请重建每个运行 mod_sofia 和 mod_dptools 的节点;修复位于两个模块和 vanilla 配置文件示例中。
  3. 如果无法升级,请对每个不需要入站聊天的配置文件禁用聊天: <param name="enable-chat" value="false"/> 将该行添加到 /etc/freeswitch/sip_profiles/ 中的每个配置文件,然后重新加载配置文件或重启 FreeSWITCH。这会在处理程序解析协议选择器之前返回,从而关闭路径。代价是该配置文件停止投递所有入站 SIP MESSAGE 聊天,而不仅是 api 协议。
  4. 如果需要聊天且无法升级,请删除所有没有 password 或 a1-hash 的目录用户,并将其余用户的 allow-empty-password 设为 false。与 auth-messages 结合可将攻击限制为已认证用户;但这不会关闭路径,因为任何账户仍可选择 api。
  5. disable_system_api_commands=true 会移除 system API,但不会移除路径。攻击者仍可到达所有其他已注册 API,包括模块加载和呼叫发起。请将其视为缓解措施,而不是修复。

根本原因是什么?

SIP MESSAGE 处理程序将 To 用户左侧视为聊天协议名,右侧视为地址,而 api 聊天协议将其地址作为 FreeSWITCH API 命令执行。在 src/mod/endpoints/mod_sofia/sofia_presence.c 中,sofia_presence_handle_sip_i_message() 执行以下操作:

if ((p = strchr(to_user, '+')) && p != to_user) {
    switch_copy_string(proto, to_user, sizeof(proto));
    p = strchr(proto, '+');
    *p++ = '\0';

    if ((to_addr = strdup(p))) {
        if ((p = strchr(to_addr, '+'))) {
            *p = '@';
        }
    }
} else {
    to_addr = switch_mprintf("%s@%s", to_user, to_host);
}

然后它将 proto 放入 to_proto 头,将 to_addr 放入 SWITCH_EVENT_MESSAGE 的 to 头。没有任何东西限制发送者选择的协议名。mod_dptools 在 event 旁边注册了 api 聊天接口:

SWITCH_ADD_CHAT(chat_interface, "event", event_chat_send);
SWITCH_ADD_CHAT(chat_interface, "api", api_chat_send);

api_chat_send() 取出 to 头,进行 URL 解码,在第一个空格处分割,并将两部分传给 switch_api_execute():

if (to) {
    char *v = NULL;
    switch_stream_handle_t stream = { 0 };
    char *cmd = NULL, *arg;

    if (!(v = switch_core_get_variable_dup(to))) {
        v = strdup(to);
    }

    cmd = v;
    switch_assert(cmd);

    switch_url_decode(cmd);

    if ((arg = strchr(cmd, ' '))) {
        *arg++ = '\0';
    }

    SWITCH_STANDARD_STREAM(stream);
    switch_api_execute(cmd, arg, NULL, &stream);

发往 sip:api+system%20id@example.com 的 MESSAGE 将 proto 设为 api,将 to_addr 设为 system%20id。api_chat_send() 将地址解码为 system id,分割为命令 system 和参数 id 并执行。输出作为聊天回复返回。

如何被利用?

  1. 攻击者向接受入站聊天的配置文件发送 SIP MESSAGE,地址为 sip:api+system%20id@target 或以相同方式编码的其他 API 命令。
  2. 如果配置文件要求 MESSAGE 认证,攻击者使用配置文件上的任何账户,或使用既没有密码也没有 a1-hash 的标准 default 用户。
  3. sofia_presence_handle_sip_i_message() 在第一个 + 处分割 To 用户:左侧变为 to_proto=api,右侧变为 to=system%20id。
  4. 聊天层将消息分发给 mod_dptools 注册的 api 接口。
  5. api_chat_send() 对 system%20id 进行 URL 解码,分割为 system 和 id,并调用 switch_api_execute("system", "id")。
  6. 命令以 FreeSWITCH 进程权限运行。攻击者可以运行其他 system 命令、加载模块、发起呼叫或读取配置和凭据;在加载 mod_lua 时,带完整标准库的内联 Lua 是第二个执行点。

公告称已观察到该路径的在野利用。它没有给出日期、受害者数量、命令序列或指标,也没有列出公开的概念验证代码。

攻击如何展开?

To 用户以 api+ 开头的 SIP MESSAGE 选择命令执行聊天协议,加号后的地址作为 FreeSWITCH API 命令运行。

flowchart LR A["发往 api+system%20id@target 的 SIP MESSAGE"] --> B["sofia_presence_handle_sip_i_message 分割 To 用户"] B --> C["to_proto=api,to=system%20id"] C --> D["api_chat_send 解码并调用 switch_api_execute"] D --> E["系统命令以 FreeSWITCH 身份运行"]

攻击者能做什么?

能够向受影响配置文件投递一条被接受的 MESSAGE 的攻击者,可以以 FreeSWITCH 进程权限运行 FreeSWITCH API 命令。这包括:

  • 通过 system API 运行操作系统命令,以 FreeSWITCH 用户身份执行。
  • 泄露配置和凭据,包括进程可读取的 SIP 账户和 trunk 凭据。
  • 完全控制通话:发起、桥接、窃听和拆除通话。
  • 加载模块和其他已注册 API,可扩大攻击者超出 system 命令的范围。
  • 在加载 mod_lua 时(标准配置如此)执行内联 Lua,拥有完整的 Lua 标准库。

条件完整列出:可到达且接受 MESSAGE 的 SIP 配置文件、enable-chat 不为 false,以及 MESSAGE 认证由任何账户满足,或存在没有密码和 a1-hash 的标准目录用户。进程通常以非特权 freeswitch 用户运行;公告未声称 root。影响仍然是完全控制电话服务及其可读取的数据。

为什么修复有效?

修复添加了一个默认关闭的每配置文件标志,并在分发消息前拒绝 api 协议:

+               if (!strcasecmp(proto, "api") && !sofia_test_pflag(profile, PFLAG_ENABLE_CHAT_API_PROTO)) {
+                   /* p is the rest of the To user, still percent-encoded and bounded by the proto buffer. */
+                   switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING,
+                                     "Profile [%s] rejected a MESSAGE from %s@%s (%s:%d) addressed to the 'api' chat proto [%s]. "
+                                     "Set enable-chat-api-proto=true on the profile to permit it.\n",
+                                     profile->name, switch_str_nil(from_user), switch_str_nil(from_host), network_ip, network_port, p);
+
+                   nua_respond(nh, SIP_403_FORBIDDEN, NUTAG_WITH_THIS_MSG(de->data->e_msg), TAG_END());
+
+                   if (full_from) {
+                       su_free(nua_handle_get_home(nh), full_from);
+                   }
+
+                   return;
+               }

比较不区分大小写,以匹配不区分大小写创建的聊天注册表。在没有该标志的配置文件上选择 api 的 MESSAGE 会收到 403,并记录来源和请求的命令。没有协议选择器或使用其他聊天协议的消息照常路由。该标志在四个 vanilla 配置文件和 mod_sofia 示例中以注释形式提供,因此默认关闭。修复对该路径是完整的;它没有移除 api 聊天接口,而是将其置于显式启用之后。

如何检查是否已遭入侵?

没有公开的入侵指标。以下检查查找请求模式和使路径可达的配置,而不是确认入侵:

# MESSAGE requests whose To user selects the api protocol
sudo grep -iE "MESSAGE.*api\+" /var/log/freeswitch/freeswitch.log

# On 1.11.3 and later, rejected attempts are logged with this text
sudo grep -i "addressed to the 'api' chat proto" /var/log/freeswitch/freeswitch.log

# Whether mod_lua is loaded, which adds the inline-Lua sink
fs_cli -x "module_exists mod_lua"

在 1.11.3 之前,成功请求可能不会留下警告,日志可能只记录一条普通 MESSAGE。请检查意外的外呼、FreeSWITCH spool 或脚本目录中的新文件、被修改的拨号计划、新的 SIP 注册,以及攻击者可能收到的任何命令输出。如果无法排除成功请求,请将主机视为已遭入侵,重建它,轮换 SIP 和 trunk 凭据,并审查通话详细记录。

时间线

  • 2026-08-26:修复在 PR #3135 中提交,添加 enable-chat-api-proto 和 403 响应。
  • 2026-08-28:FreeSWITCH 1.11.3 随修复发布。
  • 2026-10-28:GitHub 安全公告发布,并称已观察到该路径的在野利用。
  • 2026-11-05:CVE-2026-116779 以 CVSS v3.1 9.8 发布。
  • 2026-11-06:该 CVE 不在 CISA KEV 目录中;没有公开的指标或受害者细节。

修复于 2026 年 8 月 28 日发布,比公开公告早 61 天。
图 1:从 FreeSWITCH 修复到公开公告和 CVE。来源:FreeSWITCH v1.11.3 发行说明、提交 7015f6a7 和 GHSA-mg63-h38w-8p9p,2026 年 11 月 6 日核查

常见问题

如果我只使用 SIP trunk,我的 FreeSWITCH 会受影响吗?

会,如果 trunk 能向接受聊天的配置文件投递 MESSAGE。一个已认证的 trunk 账户就足够,而标准 default 用户可以完全移除认证步骤。对不需要聊天的配置文件设置 enable-chat=false,或升级。

这会影响托管 PBX 和联络中心提供商吗?

任何运行 FreeSWITCH 1.11.2 或更早版本且启用入站聊天的提供商都受影响。修复在引擎中,因此提供商必须升级或在其暴露的配置文件上禁用聊天。请询问提供商运行哪个版本。

攻击是否需要认证?

在标准 conf/vanilla 配置中不需要,因为 default 目录用户没有密码和 a1-hash。如果删除该用户并将 allow-empty-password 设为 false,攻击者需要配置文件上的一个账户,例如分机或 trunk 对等端。门槛仍然很低。

它被在野利用了吗?

公告称已观察到该路径的在野利用。它没有给出日期、受害者数量或指标。截至 2026 年 11 月 6 日,该 CVE 不在 CISA KEV 目录中。

disable_system_api_commands=true 能修复吗?

不能。它移除了 system API,但路径仍可到达所有其他已注册 API,包括模块加载和呼叫发起。仅将其作为额外的缓解措施,不能替代升级。

修复会破坏正常的 SIP 聊天吗?

不会。除非配置文件设置 enable-chat-api-proto=true,否则它只阻止 api 协议。没有协议选择器或使用其他聊天协议的消息照常路由。

使用 Ostorlab 发现暴露的 SIP 服务

Ostorlab 的攻击面发现会清点你暴露在互联网上的主机及其服务。用它列出在 SIP 端口响应的系统,然后优先检查它们的 FreeSWITCH 版本和配置文件设置。

参考文献

  • FreeSWITCH 安全公告 GHSA-mg63-h38w-8p9p,2026 年 10 月 28 日发布,根本原因、受影响配置、规避措施和利用声明:https://github.com/signalwire/freeswitch/security/advisories/GHSA-mg63-h38w-8p9p (2026 年 11 月 6 日核查)
  • CVE-2026-116779 记录,2026 年 11 月 5 日发布,CVSS v3.1 9.8 和受影响范围:https://www.cve.org/CVERecord?id=CVE-2026-116779 (2026 年 11 月 6 日核查)
  • FreeSWITCH 提交 7015f6a73ab3d67fed5fbfc277ecfb88a74c2a86,“Add enable-chat-api-proto to gate the api chat proto”,2026 年 8 月 26 日:https://github.com/signalwire/freeswitch/commit/7015f6a73ab3d67fed5fbfc277ecfb88a74c2a86 (2026 年 11 月 6 日核查)
  • FreeSWITCH 拉取请求 #3135,修复和 vanilla 配置文件更改:https://github.com/signalwire/freeswitch/pull/3135 (2026 年 11 月 6 日核查)
  • FreeSWITCH v1.11.3 发行说明,2026 年 8 月 28 日,新参数和 To 用户分割上限:https://github.com/signalwire/freeswitch/releases/tag/v1.11.3 (2026 年 11 月 6 日核查)
  • FreeSWITCH sofia_presence.c,v1.11.2,有缺陷的 To 用户分割:https://github.com/signalwire/freeswitch/blob/v1.11.2/src/mod/endpoints/mod_sofia/sofia_presence.c (2026 年 11 月 6 日核查)
  • FreeSWITCH mod_dptools.c,v1.11.2,api 聊天接口和 api_chat_send():https://github.com/signalwire/freeswitch/blob/v1.11.2/src/mod/applications/mod_dptools/mod_dptools.c (2026 年 11 月 6 日核查)
  • FreeSWITCH 项目页面,关于其为运营商和联络中心提供动力的说明:https://freeswitch.com/ (2026 年 11 月 6 日核查)
  • Docker Hub,safarov/freeswitch,1,366,696 次拉取,社区镜像使用规模:https://hub.docker.com/r/safarov/freeswitch (2026 年 11 月 6 日核查)
  • GitHub,signalwire/freeswitch,5,283 个星标,仓库使用规模:https://github.com/signalwire/freeswitch (2026 年 11 月 6 日核查)
  • CISA Known Exploited Vulnerabilities 目录 JSON 源,2026 年 11 月 6 日核查 CVE-2026-116779(未列出):https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json (2026 年 11 月 6 日核查)