FreeSWITCH の SIP MESSAGE RCE、現実の悪用を確認 (CVE-2026-116779)
標準的な FreeSWITCH プロファイルへの SIP MESSAGE で API コマンドと OS コマンドを実行できます。1.11.3 で修正され、現実の悪用が確認されています。
要点
- FreeSWITCH プロファイルへの細工した SIP MESSAGE が
apiチャットプロトコルを選択し、FreeSWITCH プロセスの権限で API コマンドや OS コマンドを実行できます。SignalWire は 2026 年 11 月 5 日に CVE-2026-116779 を公開しました。 - 1.11.2 までのすべてのリリースが影響を受けます。標準の内部・外部プロファイルは受信 MESSAGE を既定で受け付け、パスワードのない標準の
defaultディレクトリユーザーがあると認証なしで攻撃できます。 - アドバイザリは CVSS v3.1 9.8 Critical と評価し、この経路の現実の悪用が確認されたと述べています。2026 年 11 月 6 日時点で CISA の KEV カタログには掲載されていません。
- FreeSWITCH 1.11.3 以降に更新してください。更新できない場合は、SIP チャットが不要なプロファイルに
enable-chat=falseを設定します。「修正方法」を参照してください。
影響を受けますか?
次のすべてに当てはまる場合にのみ影響を受けます。
- ホストが FreeSWITCH 1.11.2 以前を実行している。
- 少なくとも 1 つの SIP プロファイルが受信 MESSAGE を受け付ける。チャット処理はプロファイルが
enable-chat=falseを設定しない限り有効で、標準のconf/vanillaの内部・外部プロファイルは有効のままです。 - 攻撃者がそのプロファイルに SIP で到達できる、または到達できるトランクやピア経由で MESSAGE を届けられる。
- プロファイルが
apiチャットプロトコルをすでに拒否していない。1.11.3 より前にはenable-chat-api-proto設定がないため、MESSAGE を受け付けるすべてのプロファイルで経路が利用できます。
MESSAGE 認証は経路に到達できる人を変えますが、経路は残ります。FreeSWITCH 1.10.7 以降、auth-messages は既定で有効なので、プロファイル上の任意のアカウントで足ります。内線、電話機、登録できるトランクピアです。標準の 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 を再起動します。ハンドラがプロトコルセレクタを解析する前に戻るため、経路が閉じます。コストは、そのプロファイルがapiプロトコルだけでなく、すべての受信 SIP MESSAGE チャットを配信しなくなることです。 - チャットが必要で更新できない場合は、
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 デコードし、最初の空白で分割して、2 つの部分を 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:api+system%20id@targetまたは同じ方法でエンコードした別の API コマンド宛ての SIP MESSAGE を送ります。 - プロファイルが 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 が 2 つ目の実行経路になります。
アドバイザリはこの経路の現実の悪用が確認されたと述べています。日付、被害者数、コマンド列、指標は示されておらず、公開された概念実証コードも掲載されていません。
攻撃の流れは?
To ユーザーが api+ で始まる SIP MESSAGE がコマンド実行チャットプロトコルを選択し、プラス記号の後のアドレスが FreeSWITCH API コマンドとして実行されます。
攻撃者に何ができますか?
影響を受けるプロファイルに受け付けられる MESSAGE を 1 つ届けられる攻撃者は、FreeSWITCH プロセスの権限で FreeSWITCH API コマンドを実行できます。これには次が含まれます。
systemAPI による OS コマンド。FreeSWITCH ユーザーとして実行されます。- 設定と認証情報の漏えい。プロセスが読める SIP アカウントやトランクの認証情報を含みます。
- 通話の完全な制御。発信、ブリッジ、盗聴、切断です。
- モジュールの読み込みと他の登録 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 で応答され、送信元と要求されたコマンドがログに記録されます。プロトコルセレクタのないメッセージや別のチャットプロトコルは従来どおりルーティングされます。フラグは 4 つの 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 のスプールやスクリプトディレクトリの新しいファイル、変更されたダイヤルプラン、新しい SIP 登録、攻撃者が受け取った可能性のあるコマンド出力を確認してください。成功した要求を排除できない場合は、ホストを侵害されたものとして扱い、再構築し、SIP とトランクの認証情報を更新し、通話詳細記録を確認してください。
年表
- 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 トランクだけを使っています。FreeSWITCH は影響を受けますか?
はい。トランクがチャットを受け付けるプロファイルに MESSAGE を届けられる場合です。認証済みのトランクアカウントで足り、標準の default ユーザーは認証手順を完全に不要にできます。チャットが不要なプロファイルに enable-chat=false を設定するか、更新してください。
ホステッド PBX やコンタクトセンターのプロバイダーは影響を受けますか?
受信チャットを有効にして FreeSWITCH 1.11.2 以前を実行するプロバイダーは影響を受けます。修正はエンジン内にあるため、プロバイダーは更新するか、公開するプロファイルでチャットを無効にする必要があります。実行バージョンをプロバイダーに確認してください。
認証なしで攻撃できますか?
標準の conf/vanilla 構成では可能です。default ディレクトリユーザーにパスワードも a1-hash もないためです。そのユーザーを削除し、allow-empty-password を false にすると、攻撃者には内線やトランクピアなどプロファイル上のアカウントが 1 つ必要になります。それでも低い障壁です。
現実の悪用はありましたか?
アドバイザリはこの経路の現実の悪用が確認されたと述べています。日付、被害者数、指標は示していません。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 日確認)