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 无需账户即可到达该路径。
如何修复?
- 升级到 FreeSWITCH 1.11.3 或更高版本。使用 SignalWire 软件包仓库,或从 v1.11.3 标签重新构建,然后重启 FreeSWITCH。发行说明列出了新的
enable-chat-api-proto参数和 To 用户分割的上限。 - 如果自行构建软件包,请重建每个运行
mod_sofia和mod_dptools的节点;修复位于两个模块和 vanilla 配置文件示例中。 - 如果无法升级,请对每个不需要入站聊天的配置文件禁用聊天:
<param name="enable-chat" value="false"/>将该行添加到/etc/freeswitch/sip_profiles/中的每个配置文件,然后重新加载配置文件或重启 FreeSWITCH。这会在处理程序解析协议选择器之前返回,从而关闭路径。代价是该配置文件停止投递所有入站 SIP MESSAGE 聊天,而不仅是api协议。 - 如果需要聊天且无法升级,请删除所有没有
password或a1-hash的目录用户,并将其余用户的allow-empty-password设为 false。与auth-messages结合可将攻击限制为已认证用户;但这不会关闭路径,因为任何账户仍可选择api。 disable_system_api_commands=true会移除systemAPI,但不会移除路径。攻击者仍可到达所有其他已注册 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 并执行。输出作为聊天回复返回。
如何被利用?
- 攻击者向接受入站聊天的配置文件发送 SIP MESSAGE,地址为
sip:api+system%20id@target或以相同方式编码的其他 API 命令。 - 如果配置文件要求 MESSAGE 认证,攻击者使用配置文件上的任何账户,或使用既没有密码也没有
a1-hash的标准default用户。 sofia_presence_handle_sip_i_message()在第一个+处分割 To 用户:左侧变为to_proto=api,右侧变为to=system%20id。- 聊天层将消息分发给
mod_dptools注册的api接口。 api_chat_send()对system%20id进行 URL 解码,分割为system和id,并调用switch_api_execute("system", "id")。- 命令以 FreeSWITCH 进程权限运行。攻击者可以运行其他
system命令、加载模块、发起呼叫或读取配置和凭据;在加载mod_lua时,带完整标准库的内联 Lua 是第二个执行点。
公告称已观察到该路径的在野利用。它没有给出日期、受害者数量、命令序列或指标,也没有列出公开的概念验证代码。
攻击如何展开?
To 用户以 api+ 开头的 SIP MESSAGE 选择命令执行聊天协议,加号后的地址作为 FreeSWITCH API 命令运行。
攻击者能做什么?
能够向受影响配置文件投递一条被接受的 MESSAGE 的攻击者,可以以 FreeSWITCH 进程权限运行 FreeSWITCH API 命令。这包括:
- 通过
systemAPI 运行操作系统命令,以 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 目录中;没有公开的指标或受害者细节。
常见问题
如果我只使用 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 日核查)