
UniFi OS ServerがCVE-2026-34908に対して脆弱かどうかを安全に検出します。
UniFi OS Server ≤ 5.0.6における未認証リモートコード実行チェーンの安全な検出ツールです。Ubiquiti セキュリティ勧告速報064で公開されました。
| CVE | 分類 | チェーンにおける役割 |
|---|---|---|
| CVE-2026-34908 / CVE-2026-34909 | 不適切なアクセス制御 / パストラバーサル | 認証ゲートウェイバイパス(足がかり) |
| CVE-2026-34910 | 不適切な入力検証 → コマンドインジェクション | バイパス経由で到達する未認証RCE |
UniFi OS Server 5.0.8で修正されました。
はい。この検出ツールは本番環境および評価用途向けに設計されています:
GET です。VULNERABLE の判定には、認証バイパスが脆弱なハンドラに到達したことと、ベースラインリクエスト(同じエンドポイント、バイパスなし)が正しく 401 で拒否されたことの両方が必要です。UniFi OSはサービスをnginxでフロントエンド化し、サブリクエストを介して認証を強制します。その認証チェックは、raw URIが /api/auth/validate-sso/ で始まるリクエストをパブリックとして扱いますが、nginxは正規化された URI(%2f→/ のパーセントデコードや ../ の解決など)を使用してバックエンドにルーティングします。次のようなリクエスト:
GET /api/auth/validate-sso/..%2f..%2f..%2fproxy/users/api/v2/ucs/update/latest_package
そのため、パブリックとして扱われ(rawプレフィックス)ながら、認証された内部のパッケージ更新エンドポイント(正規化パス)にルーティングされます。pkg_name がない場合、そのエンドポイントは query param pkg_name required と応答し、バイパスが機能し、脆弱なハンドラに到達可能であることを証明します。
検出ツールはまた、バイパスなしで同じエンドポイントにベースラインリクエストを送信し、ホストを脆弱と宣言する前にそれが 401 を返すことを要求します。このチェックは脆弱な動作を直接テストします。VULNERABLE の判定は、バイパスが実際にシンクに到達したことを意味します。
プローブが VULNERABLE または PATCHED を積極的に確認しない場合、検出ツールはルートページを取得し、UniFi OS管理ポータルのフィンガープリント(<title>UniFi OS</title>、window.UNIFI_OS_MANIFEST、id="portal-root"、id="site-manager_portal-container")を探します。これは 401 にも適用されます。バイパスに認証を強制するUniFi OSホストは INCONCLUSIVE ですが、単にすべてを 401 で返す非UniFiプロキシにはフィンガープリントがなく、UNAFFECTED と報告されます。したがって、「脆弱でない」というすべての結果はフィンガープリントに基づいています。マーカーあり→INCONCLUSIVE、マーカーなし→UNAFFECTED(CVEは適用されません)。
# 単一ホスト(デフォルトポート 11443)
./cve_2026_34908_check.py 192.168.1.10
# 明示的なポート / URL形式
./cve_2026_34908_check.py host-a:11443 https://host-b
# リストをスキャン、1行に1ターゲット('#' コメント可)、コンパクト出力
./cve_2026_34908_check.py -f targets.txt --brief
# パイプライン向けの機械可読出力
./cve_2026_34908_check.py -f targets.txt --json > results.json
脆弱なコンソール(詳細表示、デフォルト)。2行目は判定の詳細です。[!] マーカーと VULNERABLE はTTY上で赤く表示されます:
$ ./cve_2026_34908_check.py 192.168.1.10
[!] 192.168.1.10:11443: VULNERABLE
auth bypass reached the vulnerable handler (no command executed); baseline correctly 401
パッチ適用済みコンソール(5.0.8以上):
$ ./cve_2026_34908_check.py 192.168.1.11
[+] 192.168.1.11:11443: PATCHED
nginx rejected the normalized-path divergence (HTTP 400) — 5.0.8+ behavior
プローブが分類できなかった確認済みUniFi OSホスト → INCONCLUSIVE。詳細行で2つのケース(認証強制 vs 予期しない応答)を区別します:
$ ./cve_2026_34908_check.py 192.168.1.12 192.168.1.13
[?] 192.168.1.12:11443: INCONCLUSIVE
bypass blocked / auth enforced (HTTP 401) on a confirmed UniFi OS host — not confirmed vulnerable
[?] 192.168.1.13:11443: INCONCLUSIVE
UniFi OS detected, but probe returned an unexpected response: HTTP 302 text/html
まったくUniFi OSではないホスト → UNAFFECTED(勧告は適用されません):
$ ./cve_2026_34908_check.py 203.0.113.9:443
[-] 203.0.113.9:443: UNAFFECTED
no UniFi OS web fingerprint on / (probe HTTP 404) — target is not a UniFi OS Server
リストをスキャンし、ホストごとに位置揃えされた1行で表示(--brief)。いずれかのホストが VULNERABLE の場合は終了ステータス 1、それ以外は 0 — スクリプトで便利です:
$ ./cve_2026_34908_check.py -f targets.txt --brief; echo "exit: $?"
VULNERABLE 192.168.1.10:11443
PATCHED 192.168.1.11:11443
INCONCLUSIVE 192.168.1.12:11443
UNAFFECTED 203.0.113.9:443
ERROR 10.0.0.1:11443 timeout
exit: 1
パイプライン向けの機械可読出力(--json)。各結果には verdict とその背後にある bypass.state/bypass.detail が含まれます。ERROR 結果は bypass の代わりに error フィールドを持ちます:
$ ./cve_2026_34908_check.py 192.168.1.10 192.168.1.11 10.0.0.1 --json
[
{
"target": "192.168.1.10:11443",
"bypass": {
"state": "vulnerable",
"detail": "auth bypass reached the vulnerable handler (no command executed); baseline correctly 401"
},
"verdict": "VULNERABLE"
},
{
"target": "192.168.1.11:11443",
"bypass": {
"state": "patched",
"detail": "nginx rejected the normalized-path divergence (HTTP 400) — 5.0.8+ behavior"
},
"verdict": "PATCHED"
},
{
"target": "10.0.0.1:11443",
"verdict": "ERROR",
"error": "timeout"
}
]
| コード | 意味 |
|---|---|
0 | VULNERABLE を返したターゲットなし |
1 | 少なくとも1つのターゲットが VULNERABLE |
2 | 使用法エラー(不正な引数/読み取り不能なターゲットファイル) |
INCONCLUSIVE は安全性の保証ではありません — UniFi OSホストを確認したものの、分類できなかったことを示します(バイパスでの認証強制、または予期しない応答)。フィルタリングが厳しいホストや予期しないプロキシが前面にあるホストは、ネットワークだけでは分類できない場合があります。可能な限り実行中のバージョンを確認してください。UNAFFECTED は、ルートページにUniFi OSポータルのフィンガープリントがなかったことを意味します(フィンガープリントなしで 401 を返すホストを含む)。ポータルHTMLを除去または書き換えるリバースプロキシの背後に隠れたUniFi OSコンソールは誤って報告される可能性があるため、ターゲットがUniFi OSであると予想される場合は直接確認してください。UniFi OS Serverをバージョン5.0.8以降に更新してください。修正では、nginxのraw URIと正規化URIの比較(認証バイパスの閉鎖)とパッケージ更新パスでの入力検証(コマンドインジェクションの閉鎖)が追加されました。
このコードは MITライセンス の下で配布されています。
本ツールを事前の相互同意なしにターゲットへの攻撃に使用することは違法です。適用されるすべての地域、州、連邦の法律を遵守するのはエンドユーザーの責任です。開発者は一切の責任を負わず、本プログラムによって引き起こされた誤用や損害についても責任を負いません。
| プローブ応答 | 判定 |
|---|
200 + ハンドラエラーマーカー | VULNERABLE |
400 (nginxが不一致を拒否) | PATCHED (5.0.8+) |
401、UniFi OSフィンガープリントあり | INCONCLUSIVE (認証強制/バイパスブロック) |
401、UniFi OSフィンガープリントなし | UNAFFECTED (UniFi OS Serverではない) |
| その他、UniFi OSフィンガープリントなし | UNAFFECTED (UniFi OS Serverではない) |
| その他、UniFi OSフィンガープリントあり | INCONCLUSIVE (予期しない応答) |
| フラグ | 説明 |
|---|
targets | 1つ以上の host、host:port、または https://host:port |
-f, --targets-file FILE | ファイルからターゲットを読み込む(1行に1つ、# コメント可) |
--brief | ターゲットごとに位置揃えされた1行 — 多数のホストをスキャンするのに最適 |
--json | 構造化JSON結果を出力 |
--timeout SECS | リクエストごとのタイムアウト(デフォルト: 10) |
--no-color | カラー出力を無効にする(NO_COLOR および非TTYも優先) |
| 判定 | 意味 |
|---|
VULNERABLE | 認証バイパスが未認証で脆弱なハンドラに到達。5.0.8以上にパッチ適用。 |
PATCHED | nginxが正規化パスの不一致を拒否(5.0.8以上の動作)。 |
UNAFFECTED | ルートページにUniFi OSポータルのフィンガープリントがない — ターゲットはUniFi OS Serverではないため、勧告は適用されません。フィンガープリントなしで 401 を返すホスト(例:すべてを拒否する無関係なプロキシ)を含む。 |
INCONCLUSIVE | 分類できなかった確認済みUniFi OSホスト — 手動でバージョンを確認してください。判定の詳細行にどのケースかが示されます:(a) バイパスがブロックされた/認証が強制された(401)、または(b) プローブが予期しない応答を返した。 |
ERROR | 接続/タイムアウト/TLS失敗。 |