同じ日に KEV へ入った境界装置3件 — CVSS の 1 文字で 8.1 と 9.8 が分かれる

2026年9月9日、CISA の KEV(Known Exploited Vulnerabilities)カタログに、境界に置く装置の脆弱性が3件まとめて収載された。いずれも是正期限は2026年9月12日、つまり収載から3日である。

CVE 製品 CVSS CWE
CVE-2026-20079 Cisco Secure Firewall Management Center (FMC) 10.0(CVSS 3.1・Cisco PSIRT) CWE-288
CVE-2026-19490 Citrix NetScaler ADC / Gateway 9.3(CVSS 4.0) CWE-288
CVE-2025-25249 Fortinet FortiOS / FortiSwitchManager 9.8(NVD)/ 8.1(Fortinet) CWE-122, CWE-787

この記事で扱うのは3つである。①3件のうち2件が CWE-288 であることの意味、②CVSS のスコアがなぜこうも割れるのかを計算式を実装して確かめる、③当てるまでの間に何ができるか。攻撃コードは書かない。

1. CWE-288 とは何か — 「認証を破る」ではなく「認証を通らない」

3件のうち Cisco と Citrix の2件は、CWE の分類が同じである。CWE-288: Authentication Bypass Using an Alternate Path or Channel、日本語では「代替パスまたは代替チャネルを使った認証バイパス」である。

用語を先に押さえておく。認証にまつわる脆弱性はいくつかの型に分かれる。

  • CWE-287(不適切な認証) … 認証の処理そのものに欠陥がある。たとえば比較の仕方が甘い
  • CWE-307(総当たりの制限不足) … 認証は正しく動くが、何度でも試せる
  • CWE-288(代替パスによる認証バイパス)認証は正しく動いている。ただし、そこを通らずに済む別の入口がある

3つ目が今回の型である。ここが重要なのは、利用者側で普通に打つ対策がほぼ効かないためだ。

多要素認証を入れても効かない。パスワードを長くしても効かない。総当たりを検知するレート制限も効かない。そのどれもが「認証の入口」に付いている対策であって、攻撃者はそこを通らないからである。玄関の鍵をいくら増やしても、勝手口が開いていれば意味がない、というのがこの型の全体像である。

実際の記述を見ると、そのとおりのことが書いてある。Cisco のアドバイザリはこう述べている。

A vulnerability in the web interface of Cisco Secure Firewall Management Center (FMC) Software could allow an unauthenticated, remote attacker to bypass authentication and execute script files on an affected device to obtain root access to the underlying operating system. This vulnerability is due to an improper system process that is created at boot time.

原因が「起動時に作られるシステムプロセスが適切でない」という点に注目したい。認証コードのバグではなく、認証とは別の場所に、認証を経ずに叩ける処理が存在していたという構図である。攻撃者は細工した HTTP リクエストを送るだけでそこに届く。

Citrix 側も条件の書き方が具体的である。

Citrix NetScaler ADC and NetScaler Gateway contain an authentication-bypass vulnerability involving an alternate path or channel. When the NetScaler appliance is configured as an AAA virtual server or as a Gateway (SSL VPN, ICA Proxy, CVPN, or RDP Proxy), an unauthenticated remote threat actor may be able to bypass authentication.

AAA 仮想サーバとして、または Gateway として構成されている場合」と条件が付いている。これは NetScaler の中でも、社外から社内へ人を通す役割で使っている構成を名指ししている。純粋なロードバランサとしてだけ使っている構成とは、露出も影響も違う。まず自分の構成がどちらかを確認するのが最初の一歩になる。

そして両方に共通する、この3件で最も重い事実がある。壊されるのが「守られている側」ではなく「守っている側」である。 FMC は個々のファイアウォールではなく、それらを束ねて管理する装置である。ここで root を取られるということは、配下のファイアウォール群のポリシーを書き換えられる、ログを消せる、新しい経路を通せる、ということを意味する。

2. スコアはなぜ割れるのか — 計算式を実装して確かめる

表を見て気づくのは、同じ「深刻」なのにスコアがそろっていないことである。10.0、9.3、9.8。しかも Fortinet の1件は、NVD が 9.8、ベンダーの Fortinet が 8.1 と、同じ CVE に2つの値が付いている。

これは評価が雑だからではない。ベクタの1文字が違うと、計算結果がここまで動くというだけの話である。実際に計算してみるのが早い。

CVSS 3.1 の基本値を実装する

CVSS 3.1 の基本値(Base Score)は公開された式である。仕様どおりに Python で書ける。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import math

AV = {"N": 0.85, "A": 0.62, "L": 0.55, "P": 0.2}
AC = {"L": 0.77, "H": 0.44}
PR_U = {"N": 0.85, "L": 0.62, "H": 0.27} # Scope: Unchanged のとき
PR_C = {"N": 0.85, "L": 0.68, "H": 0.50} # Scope: Changed のとき
UI = {"N": 0.85, "R": 0.62}
CIA = {"H": 0.56, "L": 0.22, "N": 0.0}

def roundup(x):
"""CVSS 3.1 の Roundup: 0.1 刻みで切り上げる(浮動小数の誤差を避ける整数演算版)"""
i = int(round(x * 100000))
return i / 100000.0 if i % 10000 == 0 else (math.floor(i / 10000) + 1) / 10.0

def base(av, ac, pr, ui, s, c, i, a):
iss = 1 - (1 - CIA[c]) * (1 - CIA[i]) * (1 - CIA[a])
if s == "U":
impact = 6.42 * iss
prv = PR_U[pr]
else:
impact = 7.52 * (iss - 0.029) - 3.25 * (iss - 0.02) ** 15
prv = PR_C[pr]
expl = 8.22 * AV[av] * AC[ac] * prv * UI[ui]
if impact <= 0:
return 0.0, impact, expl
if s == "U":
return roundup(min(impact + expl, 10)), impact, expl
return roundup(min(1.08 * (impact + expl), 10)), impact, expl

式の読み方だけ補足する。基本値は Impact(影響度)Exploitability(攻撃容易性) の足し算である。

  • Impact は C/I/A の3つだけで決まる。3つとも H なら最大になる
  • Exploitability は AV(攻撃経路)・AC(攻撃条件の複雑さ)・PR(必要な権限)・UI(利用者の関与)の掛け算である
  • Scope(S) だけが例外で、Impact の式そのものと、PR の重み表と、最後の 1.08 倍の3か所を同時に切り替える

掛け算だという点が効いてくる。1つの項が半分になれば、Exploitability も丸ごと半分近くになる。

Fortinet の 9.8 と 8.1 を再現する

Fortinet の CVE-2025-25249 に付いている2つのベクタを並べる。

  • NVD(Primary): CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
  • Fortinet(Secondary): CVSS:3.1/AV:N/**AC:H**/PR:N/UI:N/S:U/C:H/I:H/A:H

違いは AC の1文字だけである。走らせてみる。

1
2
3
for label, ac in (("NVD (AC:L)", "L"), ("Fortinet (AC:H)", "H")):
sc, im, ex = base("N", ac, "N", "N", "U", "H", "H", "H")
print(f"{label:16s} base={sc} impact={im:.4f} exploitability={ex:.4f}")

実行結果は次のとおりである。

1
2
NVD (AC:L)       base=9.8  impact=5.8731  exploitability=3.8870
Fortinet (AC:H) base=8.1 impact=5.8731 exploitability=2.2212

Impact は 5.8731 で完全に一致している。壊れるものは同じだからである。動いたのは Exploitability だけで、3.8870 が 2.2212 になった。AC の重みが 0.77 から 0.44 へ、およそ 0.571 倍になったぶんがそのまま効いている(3.8870 × 0.571 ≒ 2.219)。

つまり NVD と Fortinet が争っているのは「どれだけ壊れるか」ではなく「どれだけ簡単に届くか」だけである。ヒープオーバーフローの悪用にはメモリ配置の把握が要るので AC:H とする Fortinet の見方にも理由はある。ただし、CISA が KEV に載せたということは、その難しさを現実の攻撃者が越えたということでもある。運用側の判断としては、高いほうを採るのが安全側である。

Cisco の 10.0 は S:C の1文字で出ている

もう一方の疑問、Cisco の 10.0 も同じ方法で確かめられる。ベクタは CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H で、NVD の Fortinet 版(9.8)と比べて違うのは S の1文字だけである。

1
2
3
4
sc, im, ex = base("N", "L", "N", "N", "C", "H", "H", "H")
print(f"S:C -> base={sc} impact={im:.4f} exploitability={ex:.4f}")
sc, _, _ = base("N", "L", "N", "N", "U", "H", "H", "H")
print(f"同じ条件で S:U なら base={sc}")
1
2
S:C -> base=10.0  impact=6.0477  exploitability=3.8870
同じ条件で S:U なら base=9.8

Scope が Changed になると、Impact の式が 6.42 * ISS から 7.52*(ISS-0.029) - 3.25*(ISS-0.02)**15 に変わって 5.8731 → 6.0477 に上がり、さらに合計に 1.08 が掛かる。この2か所で 9.8 が 10.0 に届く。

S:C は「壊れる範囲が、脆弱なコンポーネントの外へ出る」ことを表す。 FMC の場合、Web インターフェースの欠陥が基盤 OS の root 権限に化ける。権限の境界を越えているので Changed である。CWE-288 の話とここでつながる。「守っている側の装置で、権限の境界を越える」という2つが重なったのが、この 10.0 である。

Citrix の 9.3 は物差しが違う

Citrix の CVE-2026-19490 だけは注意が要る。この 9.3 は CVSS 3.1 ではなく CVSS 4.0 の値である。ベクタも別物である。

1
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:L/SI:L/SA:L

3.1 の C/I/A が、4.0 では脆弱なシステム側の VC/VI/VA後続システム側の SC/SI/SA に分かれている。ここでは前者が全部 H、後者が全部 L である。加えて AT(Attack Requirements)という項目が増えている。計算方法も、3.1 のような閉じた式ではなく、事前に定義された対応表からの参照なので、上のコードでは再現できない。

実務上の含意は1つである。3.1 の 9.8 と 4.0 の 9.3 を「0.5 の差」として比べてはいけない。物差しが違う。同じ版のスコアどうしでしか大小は比較できない。

3. 当てるまでに何ができるか

3件とも回避策は無いか、あっても限定的である。Cisco は「There are no workarounds that address this vulnerability」と明記している。それでも、期限までにできることはある。

まず、既に侵害されていないかを見る

Cisco は侵害指標を具体的に公開している点が親切である。expert モードで次を実行する。

1
2
3
> expert
admin@firepower:~$ sudo su
root@firepower:/home/admin# zgrep "package_info.*license" /var/log/messages*

出力に /var/tmp/license.tmp を含む行があれば、この脆弱性が悪用された可能性がある。

ここが最も見落とされやすい点だが、Cisco は「ホットフィックスは今後の悪用を防ぐためのものであり、既に成立している侵害には対処しない」と書いている。指標が見つかった場合は、パッチを当てて終わりにせず、Cisco TAC に連絡して復旧手順の指示を仰ぐ必要がある。

Fortinet 側も同様である。NVD の参照には SOCRadar による「PivotC2 / FortiGate RAT」の記事が並んでいて、侵害された FortiGate に常駐する遠隔操作ツールの存在が報告されている。設定 (show full-configuration) の差分、とくに管理者アカウント・admin プロファイル・自動スクリプト・VPN 設定の予期しない追加を見る。あわせて、FortiGate 自身が発信元になっている外向きの常時接続を確認する。

Citrix については、認証バイパスの痕跡は「認証ログに対応が無いのに張られているセッション」という形で出る。AAA / Gateway のセッション記録と認証記録を突き合わせるのが確認手段になる。

次に、露出を減らす

これは修正ではなく、パッチを当てるまでの時間稼ぎである。

Cisco は「FMC の管理インターフェースがインターネットから到達できなければ、この脆弱性に関わる攻撃面は縮小する」と注記している。管理インターフェースが公開されている構成なら、まずそこを閉じる。

ただしこの手が効かない相手もいることは押さえておきたい。Citrix の Gateway 仮想サーバは公開しているのが本来の用途である。閉じられるのは管理面(NSIP)だけで、攻撃面そのものは残る。Fortinet も同様で、細工したパケットが攻撃経路である以上、FortiGate 自体が受け口である構成では絞り込みの効果は限られる。

修正版の確認

パッチ情報は、必ず一次情報で確認してほしい。

  • Cisco … アドバイザリ cisco-sa-onprem-fmc-authbypass-5JPp45V2 にホットフィックスのファイル名が FMC 7.0 / 7.2 / 7.4 / 7.6 / 7.7 / 10.0 の6系列ぶん載っている。SCC Firewall Management は SaaS で、Cisco 側が既に修正を展開済み(利用者の操作は不要)
  • Citrix … NVD の適用範囲は ADC / Gateway の 14.1 系が 73.32 まで13.1 系が 63.21 まで。修正版ビルドは KB CTX696939 を参照する
  • Fortinet … FortiOS 7.6.0〜7.6.3 / 7.4.0〜7.4.8 / 7.2.0〜7.2.11 / 7.0.0〜7.0.17、および 6.4 は全版。FortiSwitchManager は 7.2.0〜7.2.6 / 7.0.0〜7.0.5。詳細は FG-IR-25-084

Fortinet の 6.4 が「全版」である点だけ、他と性質が違う。範囲に上限が書かれていないということは、修正版が存在しないということである。6.4 系を使っている場合、対応は 7.x 系への移行しかない。

まとめ

  • 2026年9月9日、境界装置の脆弱性が3件同時に KEV へ収載され、是正期限はいずれも9月12日である
  • うち2件(Cisco・Citrix)は CWE-288認証を破るのではなく、認証を通らずに済む別の入口がある型で、MFA もパスワード強度もレート制限も効かない
  • 壊されるのが守っている側の装置である点が、この3件の重さの本体である
  • CVSS のスコアの割れは、ベクタ1文字の違いで説明がつく。Fortinet の 9.8 と 8.1 は AC の1文字だけの差で、Impact は 5.8731 で一致している。Cisco の 10.0 は S:C の1文字が計算式の3か所を同時に変えた結果である
  • Citrix の 9.3 は CVSS 4.0 の値で、3.1 のスコアとは物差しが違う。直接比較してはいけない
  • 回避策は無い。まず侵害指標を確認し、次に露出を減らし、そのうえで一次情報どおりの修正版を当てる

数字の根拠はすべて公式アドバイザリと NVD で確認できる。この記事のコードは実際に走らせて出力を確かめてある。掲載中の CVE の一覧と各クラウドでの対応状況は 脆弱性対応ウォッチ に置いている。


同じ日に KEV へ入った境界装置3件 — CVSS の 1 文字で 8.1 と 9.8 が分かれる
https://blog.hashito.biz/2026/09/10/kev-2026-09-09-cwe288-boundary-devices-cvss-scope-ac/
著者
hashito
作成日
2026年9月10日
著作権