Zyxel GS1900の認証前RCE、実環境で悪用される(CVE-2026-107441)
Zyxel GS1900の2.90パッチ3より前のファームウェアでは、認証なしのHTTPリクエストでrootコマンドが実行されます。この脆弱性はゼロデイとして悪用済みです。
要点
- GS1900スイッチの
dispatcher.cgiにある境界外書き込みにより、攻撃者は認証なしでオペレーティングシステムのコマンドをrootとして実行できます。Binarlyは攻撃者のツールキットでエクスプロイトを発見し、実機で検証しました。 - ファームウェア2.90(xxx.2)C0以前を実行する10モデルのGS1900が影響を受けます。Zyxelは2026年10月22日に修正版2.90(xxx.3)C0を公開し、11月3日にアドバイザリを公開しました。
- ZyxelはCVSS v3.1で8.8 High、Binarlyは9.8 Criticalと評価しています。GreyNoiseは996台のスイッチが悪用されたことを観測しました。CVE-2026-107441は2026年11月4日時点でCISA KEVに掲載されていません。CVE-2026-7273は2026年9月21日から掲載されています。
- 一覧の各モデルを今すぐ2.90(xxx.3)C0に更新してください。設定による回避策は脆弱性を塞ぎません。変更作業の日程を調整する間の露出低減については「修正方法」を参照してください。
影響を受けますか?
スイッチが露出するには、次の条件がすべて満たされる必要があります。
- 対象がZyxelの一覧にある10モデルのGS1900のいずれかで、ファームウェアが2.90(xxx.2)C0以前である。
- スイッチのWeb管理インターフェースに、攻撃者が利用できるネットワークから到達できる。Zyxelは攻撃者をローカルネットワーク上かつ隣接していると説明しています。Binarlyは、エクスプロイトには管理サービスへのHTTP到達性だけが必要で、プロトコル上の隣接性は不要だと述べています。
- そのモデルのファームウェア2.90(xxx.3)C0がインストールされていない。2026年6月の2.90(xxx.2)C0更新はこの脆弱性を修正しません。
Zyxelは、アドバイザリに記載のない現行製品は影響を受けないとしています。アドバイザリは各モデルとバージョンの組み合わせを列挙しています。
| モデル | 影響を受けるバージョン | 修正バージョン |
|---|---|---|
| GS1900-8 | 2.90(AAHH.2)C0以前 | 2.90(AAHH.3)C0 |
| GS1900-8HP | 2.90(AAHI.2)C0以前 | 2.90(AAHI.3)C0 |
| GS1900-10HP | 2.90(AAZI.2)C0以前 | 2.90(AAZI.3)C0 |
| GS1900-16 | 2.90(AAHJ.2)C0以前 | 2.90(AAHJ.3)C0 |
| GS1900-24 | 2.90(AAHL.2)C0以前 | 2.90(AAHL.3)C0 |
| GS1900-24E | 2.90(AAHK.2)C0以前 | 2.90(AAHK.3)C0 |
| GS1900-24EP | 2.90(ABTO.2)C0以前 | 2.90(ABTO.3)C0 |
| GS1900-24HPv2 | 2.90(ABTP.2)C0以前 | 2.90(ABTP.3)C0 |
| GS1900-48 | 2.90(AAHN.2)C0以前 | 2.90(AAHN.3)C0 |
| GS1900-48HPv2 | 2.90(ABTQ.2)C0以前 | 2.90(ABTQ.3)C0 |
スイッチが実行しているものを確認します。
- スイッチのWeb設定画面にログインします。Getting Started画面にModel NameとFirmware Versionが表示され、
2.90(AAHL.2)C0のような文字列になっています。 - モデルとバージョンをアドバイザリの一覧と比較します。一覧のモデルでは、
.3)C0より前のすべてのバージョンが影響を受けます。.2)C0、.1)C0、.0)C0も含まれます。11月の修正が含まれるのは.3)C0で終わるバージョンだけです。 - スイッチにパッケージマネージャーはありません。同じ型番でも複数のファームウェアを実行できるため、バージョンを資産管理に記録してください。
修正方法
- Zyxelのダウンロードライブラリから、正確なモデル用のファームウェア2.90(xxx.3)C0をダウンロードします。モデル固有の接尾辞が重要です。GS1900-8はAAHH、GS1900-24はAAHLを使用します。11月3日のアドバイザリはモデル表とリリース告知にリンクしています。
- Web設定画面でMaintenance > Firmware Upgradeを開き、HTTPを選び、そのモデルの
.bixファイルを選択して適用します。更新前に取得した設定バックアップを保管してください。 - 再起動後、Getting Startedに戻り、Firmware Versionが
.3)C0になっていることを確認します。 - インターネットに面した1台だけでなく、一覧の全モデルを修正します。エクスプロイトには管理インターフェースへの到達性が必要で、フラットな管理VLANは何らかの侵入後にその到達性を与えます。
ベンダーの回避策で脆弱性を塞ぐものはありません。変更作業の予定がない場合は、次のように露出を減らします。
- 管理インターフェースを専用の管理VLANに移します。
- 既知の管理者ホストだけを許可するファイアウォールルールでアクセスを制限します。
- 機器が提供する場合は、WAN管理とリモート管理を無効にします。
- スイッチの設定変更と予期しない再起動を監視します。
これらの措置は、脆弱なサービスに到達できる相手を減らすだけです。境界チェックの欠如は修正されず、Zyxelはパーサーを安全にする設定を公開していません。到達可能なままのスイッチは、依然として悪用可能です。
根本原因は何ですか?
dispatcher.cgiは、スイッチのWeb設定ページを支えるCGIプログラムです。Boa Webサーバー上で動作し、HTTP POSTの本文をreqParametersというグローバルバッファーに解析します。バッファーは0x23000バイトで、1024バイトのスロット140個に分かれています。もう一つのグローバル変数countが、解析済みのパラメーター数を記録します。
Binarlyはファームウェア2.90(AAHH.1)C0を逆コンパイルし、脆弱なループを公開しました。コピーには長さのチェックがなく、カウンターには上限がありません。
for ( pos = strchr(src, '&'); pos != nullptr; pos = strchr(pos + 1, '&') )
{
dest = &reqParameters[1024 * count];
memcpy(dest, src, pos - src);
dest[pos - src] = 0;
v10 = strchr(dest, '=');
if ( v10 != nullptr )
{
if ( v10[1] == '&' )
dest[512] = 0;
else
urlDecode(dest + 512, v10 + 1);
*v10 = 0;
}
src = pos + 1;
++count;
}
srcはリクエスト本文で、posは次の&を示します。各フィールドについて、ループは&reqParameters[1024 * count]を計算し、区切り文字までの内容をコピーしてcountを増やします。1024バイトを超えるフィールドはスロットを越えます。countが140未満であることを確認する処理はありません。
2つのグローバル変数は.bssセクションで隣接しています。BinarlyのIDAリストは配置を示しています。
.bss:10003BC0 reqParameters: .space 0x23000
.bss:10026BC0 count: .space 4
140番目のフィールドが引き金です。countが139のとき、コピーは最後のスロットreqParameters[1024 * 139]から始まり、1028バイトのフィールドがバッファーの末尾を4バイト越えて書き込みます。その4バイトがcountです。攻撃者がその位置に32ビット値を送ると、パラメーターカウンターが任意の数値に置き換わります。
ループの後、末尾に&がない最後のフィールドを処理する2番目のブロックがあります。このブロックは破壊されたcountを再利用します。
if ( -src < strlen(src) )
{
dest = &reqParameters[1024 * count];
len = strlen(src);
memcpy(dest, src, len);
dest[strlen(src)] = 0;
...
++count;
}
countは符号付き32ビット式で1024倍されます。0x013bffffのような値では積がオーバーフローして負のオフセットになり、destはreqParametersの内側ではなく手前を指します。書き込みはプロセスのグローバルオフセットテーブル、つまり解決済み関数アドレスの表に届きます。エクスプロイトはstrcmpのエントリを選びます。
その後、プログラムはweb_util_paramVal_retを呼び、strcmp(reqParameters, param)でパラメーター配列を走査します。攻撃者が制御する最初のパラメーターが実行するコマンドです。strcmpのエントリがsystemのアドレスに置き換わると、比較はsystem("id")になり、Binarlyがrootと検証したCGIプロセスの権限で実行されます。
2つ目のエクスプロイトモードは、GOTではなく保存レジスターと戻りアドレスを破壊します。機器のuClibcのガジェットを経由してsystemを呼び出します。どちらのモードも、同じチェックされていないコピーで同じカウンターを破壊します。取得されたエクスプロイトには2.10から2.90までのファームウェア用の固定アドレスが含まれ、最初にGS1900-24を標的にします。
どのように悪用されますか?
- 攻撃者は
/cgi-bin/dispatcher.cgiにHTTP POSTを送ります。取得された本文には、コマンドを格納する最初のフィールド、139個の&区切り、1024バイトのフィールドとそれに続く32ビットのカウンター値、区切り、そしてGOTに置きたいアドレスが含まれます。 web_util_initParaPairsは各フィールドを長さのチェックなしでreqParametersにコピーします。140番目のフィールドが最後のスロットを越え、countを32ビット値で上書きします。- ループ外のブロックが破壊されたカウンターで
&reqParameters[1024 * count]を計算します。符号付きの積がオーバーフローし、宛先はグローバルバッファーの手前、選ばれたGOTエントリを指します。 - 同じブロックが最後のフィールドをそのアドレスにコピーし、
strcmpのエントリをsystemのアドレスに置き換えます。 web_util_paramVal_retが最初のパラメーターでstrcmpを呼びます。呼び出しはsystemに届き、最初のパラメーターがrootとして実行されます。
リクエストにはセッション、資格情報、ユーザー操作が必要ありません。Binarlyは実機とエミュレートしたファームウェアでエクスプロイトを検証し、リクエストの配置と2つのモードを公開しました。取得されたサンプルはPyArmorで難読化されたPythonスクリプトで、GreyNoiseは同じスクリプトを難読化解除し、同じパラメーターカウンターの破壊を確認しました。
攻撃の流れは?
1つの認証なしHTTPリクエストがパラメーターカウンターを破壊し、GOTの関数ポインターをリダイレクトし、次の比較をrootコマンドに変えます。
攻撃者に何ができますか?
Webインターフェースに到達した攻撃者は、スイッチ上でオペレーティングシステムのコマンドをrootとして実行できます。BinarlyはCGIプロセスでsystem("id")によるコマンド実行を示し、作業コンテキストをrootと検証しました。Zyxelのアドバイザリは、細工したHTTPリクエストでOSコマンドを実行できるとしています。
影響には、スイッチ設定の読み取りと変更が含まれます。GreyNoiseは、攻撃者が48か国996台のスイッチから設定データ、rootパスワードのハッシュ、ネットワーク情報を取得したことを観測しました。これらの記録は、攻撃者に管理トポロジーとオフラインで攻撃できるパスワードハッシュを与えます。
ZyxelのCVEレコードは、攻撃を隣接ネットワークとして扱うため、CVSS v3.1 8.8、CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:Hと評価しています。Binarlyは、管理サービスがHTTPであり、そこへの経路があれば十分だとして、9.8 Critical、CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:Hと評価しています。
条件は「影響を受けますか?」と同じです。管理インターフェースへのネットワーク到達性があり、認証がなく、ユーザー操作もありません。Zyxelは攻撃者をローカルネットワーク上かつ隣接していると説明しています。Binarlyは、サービスがHTTPで、ルーターやNATルールがローカルセグメントの外に公開できるため、攻撃ベクトルをネットワークと評価しています。
この記事では2つの悪用の主張を分けて扱います。GreyNoiseは8月の活動を、Zyxelが6月に修正したCVE-2026-7273に結び付けました。Binarlyは、取得されたエクスプロイトが後にCVE-2026-107441として割り当てられたパーサーの不具合を標的にしており、6月に修正された10バージョンすべてが依然として脆弱だったことを突き止めました。
攻撃者のアクセスとデータ窃取はGreyNoiseが立証しています。攻撃者が意図したCVEのラベルよりも、6月の修正が経路を塞いでいなかった事実の方が重要です。
修正が機能する理由
11月の修正は、宛先を計算する前にカウンターを確認し、上限のないコピーを上限付きのヘルパーに置き換えます。Binarlyは新しいループを公開しました。
for ( pos = strchr(queries, '&'); pos != nullptr; pos = strchr(pos + 1, '&') )
{
dest = &reqParameters[1024 * counter];
if ( counter >= 140 ) // the global counter is checked before the copy
return 0;
web_util_paramCopy(&reqParameters[1024 * counter], 512, src, pos - src);
...
++counter;
}
counter >= 140のテストはコピーの前に実行されるため、140番目のフィールドはcountを保持するスロットに到達できません。web_util_paramCopyは各フィールドを511バイトに制限するため、フィールドが1024バイトのスロットを越えることもありません。2つの変更が、カウンターの破壊と上限のないコピーという不具合の両半分を塞ぎます。
6月の修正はそうしていませんでした。次のチェックを追加していました。
if ( ++counter == 140 )
return 0;
...
if ( counter >= 141 )
counter = 140;
最初のチェックはcounterを破壊するコピーの後に実行されます。値が上書きされると等値テストは失敗し、ループ外のブロックは依然として実行されます。2番目のチェックは、すでに宛先の計算に使われたカウンターをリセットするだけです。Binarlyは2026年9月28日に6月修正版10個を検証し、すべてが悪用可能だと確認しました。
Binarlyのアドバイザリは、GOTを読み取り専用にするFull RELROの有効化も推奨しています。Zyxelのアドバイザリは、新しいビルドがそれを有効にしているか述べていません。修正は実証された書き込みプリミティブを塞ぎます。GOTを不変にはしないため、Full RELROは更新の代替ではなく多層防御として扱ってください。
侵害されたかどうかを確認するには?
スイッチは、脆弱性を引き起こすPOST本文を記録しない場合があります。まずマルウェアとコマンドアンドコントロール基盤を調べ、次にスイッチが保持していた情報を確認します。
Binarlyは、JITTERLYバックドアとそれが展開するSIXZUTルートキットのハッシュを公開しました。アドバイザリと記事に記載されたSHA-256値は次のとおりです。
- JITTERLY:
0f6e757e82c4d91df5bd249f775b9970b59dee42cc0dfe40f879d77fc16821c6、663a8088faca8e126a11648f5671fcf4eaf96435e10daf63a1d1b17d8385154c、82d072ab03d90c0131b06a576eadf2c986a51f0de986d50db4e49be01bf125cb。 - SIXZUT:
295133156b6a7d95b9c92f832f49e35235f1fbd3906e75c9202ef4cd65d1018c、64677002011bc2e4bc642a4154a20fdb95620ebd0144b98fc60f917901ec8b92、728810b07e911b235f6450e784391e39f68819a0a5d209662162916ffea25146。
攻撃者は981666[.]xyzドメインを次のホストで使用しました。
p1.981666[.]xyz、p2.981666[.]xyz、p3.981666[.]xyz。s0.981666[.]xyzからs9.981666[.]xyz。
Binarlyの分析には、104.223.65[.]148、203.88.123[.]148、104.225.153[.]141、166.88.227[.]181 というIPアドレスが記載されています。マルウェアはTCP 443、6443、8080、8082、5432、6379を使用しました。Binarlyは記事でJITTERLYとSIXZUTのYARAルールを公開しています。
スイッチが到達可能で未修正だった場合は、設定とrootパスワードハッシュが取得されたと想定してください。ローカル管理者パスワード、SNMPコミュニティ文字列、設定に保存されたRADIUS、TACACS+、VPNのシークレットを変更します。
スイッチのログで設定変更、新しいローカルユーザー、予期しない再起動を確認します。失敗した試行は機器に痕跡を残さないことがあるため、ログエントリがないことはスイッチが無傷だった証拠ではありません。
年表
最初の修正はそれを置き換えるアドバイザリより140日前に公開され、Binarlyはその最初の修正から104日後に、修正済み10バージョンが依然として脆弱だと確認しました。
- 2026-06-16:ZyxelがCVE-2026-7273のアドバイザリと修正版2.90(xxx.2)C0を公開。
- 2026-08-17:この日前後、GreyNoiseが48か国996台のGS1900スイッチからデータを取得する攻撃者を観測。
- 2026-09-21:CISAがCVE-2026-7273をKnown Exploited Vulnerabilitiesカタログに追加。
- 2026-09-28:BinarlyがCVE-2026-7273の修正として告知された10バージョンすべてが依然として脆弱だと確認。
- 2026-09-29:BinarlyがZyxelの製品セキュリティチームに通知。
- 2026-10-11:Zyxelが新しい脆弱性を確認し、CVE-2026-107441を予約。
- 2026-10-22:Zyxelが10モデル向けファームウェア2.90(xxx.3)C0を公開。
- 2026-11-03:Zyxelがアドバイザリを、BinarlyがBRLY-2026-057を公開し、CVEレコードが公開される。
よくある質問
CVE-2026-7273の更新はGS1900スイッチを保護しますか?
いいえ。2026年6月16日の2.90(xxx.2)C0更新は脆弱なコピーの後にチェックを追加し、Binarlyは2026年9月28日に修正済み10バージョンすべてが依然として悪用可能だと確認しました。スイッチには2.90(xxx.3)C0が必要です。
CVE-2026-107441はCISA KEVに掲載されていますか?
いいえ。2026年11月4日時点で、新しいCVEはKnown Exploited Vulnerabilitiesカタログにありません。古いCVE-2026-7273は2026年9月21日から掲載され、連邦機関の期限は2026年9月24日です。
どのGS1900モデルが影響を受けますか?
Zyxelが列挙する10モデルが2.90(xxx.2)C0以前で影響を受けます。Zyxelはアドバイザリにない現行製品は影響を受けないとしているため、製品ファミリー名ではなくモデルとファームウェアの組み合わせを確認してください。
実環境の攻撃はCVE-2026-107441を使用しましたか?
GreyNoiseは8月の活動をCVE-2026-7273に結び付けました。Binarlyは、取得されたエクスプロイトが後にCVE-2026-107441として割り当てられたパラメーターカウンターの不具合を標的にしており、6月の修正がそれを遮断していなかったことを突き止めました。どちらのラベルも同じパーサーを指し、11月のファームウェアがBinarlyの実証した経路を最初に塞ぐ版です。
管理インターフェースを制限すれば攻撃を防げますか?
インターフェースを制限すると、脆弱なサービスに到達できる相手は減りますが、境界チェックの欠如は修正されません。Zyxelはパーサーを安全にする回避策を公開していません。どのインターフェースでも到達可能なままのスイッチは悪用可能なので、ファームウェア更新を計画してください。
修正は完全ですか?
11月の修正はコピーの前にカウンターを確認し、各フィールドを511バイトに制限するため、Binarlyが実証した2つの書き込みプリミティブを塞ぎます。BinarlyはGOTの上書きを防ぐFull RELROも推奨しています。Zyxelのアドバイザリは新しいビルドがそれを有効にしているか述べていないため、ファームウェアを適用し、RELROは追加の制御として扱ってください。
Ostorlabで露出したZyxel GS1900スイッチを見つける
Ostorlabの攻撃対象領域の検出は、ネットワーク機器を含むインターネットに露出した管理インターフェースを棚卸しし、どのスイッチを先に修正すべきか分かるようにします。攻撃者より先に、自社が公開しているGS1900の管理ページを見つけるために使用してください。
参考資料
- Zyxel, "Zyxel security advisory for out-of-bounds write vulnerability in GS1900 series switches"(2026年11月3日). https://www.zyxel.com/global/en/support/security-advisories/zyxel-security-advisory-for-out-of-bounds-write-vulnerability-in-gs1900-series-switches-11-03-2026 (2026年11月4日確認)
- Zyxel, "Zyxel security advisory for stack-based buffer overflow vulnerability in GS1900 series switches"(2026年6月16日). https://www.zyxel.com/global/en/support/security-advisories/zyxel-security-advisory-for-stack-based-buffer-overflow-vulnerability-in-gs1900-series-switches-06-16-2026 (2026年11月4日確認)
- Binarly, "Pre-Auth RCE in Zyxel GS1900 Exploited in the Wild as a Zero-Day"(2026年11月3日). https://www.binarly.io/blog/zyxel-gs1900-rce-cve-2026-107441 (2026年11月4日確認)
- Binarly, "BRLY-2026-057: Out-of-bounds write vulnerability in Zyxel GS1900 switches"(2026年11月3日). https://www.binarly.io/advisories/brly-2026-057 (2026年11月4日確認)
- GreyNoise, "Open Season on Kapibala: Attacker Steals Over 18,000 Government Records Through WordPress Exploitation"(2026年9月28日)、ZyXEL GS1900へのキャンペーンの節:48か国の996台のスイッチ、CVE-2026-7273によるものとされています. https://www.greynoise.io/blog/open-season-on-kapibala-attacker-steals-government-records-wordpress-exploitation (2026年11月4日確認)
- CVE Program, "CVE-2026-107441"(2026年11月3日公開). https://www.cve.org/CVERecord?id=CVE-2026-107441 (2026年11月4日確認)
- CVE Program, "CVE-2026-7273"(2026年6月16日公開). https://www.cve.org/CVERecord?id=CVE-2026-7273 (2026年11月4日確認)
- Zyxel, "GS1900 Series User's Guide, V2.90 edition 2"(61ページと242ページ). https://download.zyxel.com/GS1900-8/user_guide/GS1900-8_V2.90_Ed2.pdf (2026年11月4日確認)
- CISA, "Known Exploited Vulnerabilities Catalog"(フィードを2026年11月4日に確認). https://www.cisa.gov/known-exploited-vulnerabilities-catalog (2026年11月4日確認)