技術 約6分で読めます

nginx-uiのMCPエンドポイント認証欠如(CVE-2026-33032)が実攻撃に、パッチなし

いけさん目次

nginx-uiをセルフホストしている環境は今すぐ対応が必要だ。CVE-2026-33032(CVSS 9.8)は、Webブラウザからnginxを管理できるオープンソースツール「nginx-ui」に存在する認証バイパスで、2026年4月時点で実際の攻撃が確認されている。パッチはまだ公開されていない。

発見はPluto Securityのyotampe氏で、脆弱性は “MCPwn” とも呼ばれている。
Shodan(インターネット接続デバイスの検索エンジン)の調査では約2,600〜2,689件のインスタンスがインターネットに露出しており、中国・米国・インドネシア・ドイツ・香港に多く分布している。

nginx-uiとは

nginx-uiは、nginxのWebベース管理インターフェースを提供するオープンソースツールだ。ブラウザ上でnginx設定ファイルの編集・追加・削除、nginxの起動・停止・再起動を行えるほか、証明書の管理(Let’s Encrypt連携)や設定のシンタックスハイライト、アクセスログのリアルタイム表示などの機能を持つ。Go製で、デフォルトはポート9000でリッスンする。個人VPSからチームのインフラ管理まで幅広く利用されている。

問題のバージョン2.x系では、Anthropicが策定したMCP(Model Context Protocol)の統合が追加された。AIエージェントがnginxをツールとして操作できるようにする機能だが、このエンドポイントの実装に重大な欠陥があった。

脆弱性の技術的詳細

エンドポイント間の認証の非対称性

nginx-ui v2.3.5以前は、MCP関連のHTTPエンドポイントを2つ公開している。

エンドポイントIPホワイトリスト認証(AuthRequired)
/mcp適用必須
/mcp_message適用なし

両エンドポイントは同じハンドラ mcp.ServeHTTP() を呼び出す。つまり、/mcp_message を経由すれば /mcp が要求する認証を完全に回避できる。

IPホワイトリストの「フェイルオープン」挙動

もう一方の制御であるIPホワイトリストにも致命的な設定デフォルト値の問題がある。ホワイトリストが空(デフォルト状態)の場合、ミドルウェアは「全許可」として動作する。

// IPホワイトリストミドルウェアの実装(概略)
if len(settings.AuthSettings.IPWhiteList) == 0 {
    c.Next()  // ← リストが空 = 全IPを許可
    return
}

結果として、デフォルト設定のまま稼働しているインスタンスは、IPアドレスによる制限もなく、認証もなく、インターネット上の誰からでも /mcp_message エンドポイントにアクセスできる状態になっている。

CVSSベクタ

CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H

  • 攻撃元(AV): ネットワーク(リモートから)
  • 攻撃複雑度(AC): 低
  • 必要権限(PR): なし
  • ユーザー操作(UI): 不要
  • 機密性(C)・完全性(I)・可用性(A): すべて高

CVSS v3.1で9.8というスコアは「認証なし・ネットワーク越し・操作不要・完全乗っ取り可能」の組み合わせが揃って初めて出る数値だ。

攻撃で利用できるMCPツール

/mcp_message 経由で未認証のまま呼び出せるMCPツールの一覧を示す。

カテゴリツール名操作内容
設定管理nginx_config_add設定ファイルの新規作成
設定管理nginx_config_modify既存設定の書き換え
設定管理nginx_config_delete設定ファイルの削除
設定管理nginx_config_renameファイル名変更
設定管理nginx_config_read設定の読み取り(バックエンド構成の漏洩)
ディレクトリ操作directory_createディレクトリ作成
サービス制御nginx_restartnginxの再起動
サービス制御nginx_reload設定の即時反映
監視ステータス確認サービス稼働状況の取得

これらを組み合わせると、攻撃者は次のことが可能になる。

  • リバースプロキシ設定を挿入してHTTPリクエストを傍受・改ざん
  • 設定ファイルから内部のバックエンドサーバーのアドレスや構成を読み取る
  • 意図的に壊れた設定をプッシュしてnginxをサービス停止させる
  • 正常な設定を削除してサービスを崩壊させる

攻撃チェーンの例

graph TD
    A[攻撃者] -->|JSON-RPC 2.0リクエスト<br/>ポート9000| B[/mcp_messageエンドポイント]
    B -->|IPホワイトリスト空<br/>= 全許可| C[認証チェックをスキップ]
    C -->|nginx_config_addを呼び出し| D[悪意ある設定ファイルを注入]
    D -->|nginx_reloadを呼び出し| E[設定を即時反映]
    E --> F[トラフィック傍受<br/>認証情報窃取]
    E --> G[バックエンド構成の漏洩]
    E --> H[サービス停止<br/>設定の破壊]

実際の攻撃はJSON-RPC 2.0形式のリクエスト1本から始まる。認証ヘッダー不要、ユーザーの操作も不要で、公開インスタンスであれば外部から即座に実行できる。

現状とGitHub Advisory

脆弱性は2026年3月28日にGitHub Security Advisory(GHSA-h6c2-x2m2-mwhf)として公開された。
執筆時点(2026年4月16日)でパッチは存在しない。米国サイバーセキュリティ・インフラセキュリティ庁(CISA)とVulnCheckはどちらも実際の悪用を確認したと報告している。

修正のために必要なコード変更はシンプルだ。/mcp_message ルートに AuthRequired() ミドルウェアを追加すればよい。

// 修正後のルーティング(例)
r.Any("/mcp_message", middleware.IPWhiteList(), middleware.AuthRequired(), handler)

加えて、IPホワイトリストが空の場合のデフォルト動作を「全許可」から「全拒否」に変更することも同時に必要だ。現状のフェイルオープン設計は、IPホワイトリストを防御として期待している運用者を誤解させる。

緩和策

パッチが出るまでの当面の対応として以下を検討する。

即時対応

nginx-uiをインターネットに直接公開している場合は、今すぐファイアウォールで9000番ポートへの外部アクセスを遮断する。
管理インターフェースはVPN経由かローカルネットワーク内からのみアクセスできる構成にすべきだ。

MCPエンドポイントの無効化

nginx-uiの設定でMCP統合を無効化できる場合は無効にする。AIエージェントからの操作を利用していないなら、エンドポイントを公開する理由はない。

ネットワーク分離

ShodanやCensysでインスタンスが公開されていないか確認する。
管理ツールのポートがパブリックIPに直接バインドされているケースは、この脆弱性に限らずリスクが高い。

ログ監査

既に侵害されている可能性を想定して、nginx-uiのアクセスログで /mcp_message への不審なPOSTリクエストを確認する。
過去のアクセス記録と設定ファイルの変更履歴を照合して、意図しない設定変更がないかチェックしたい。

MCPサーバーのセキュリティ問題は以前から指摘されている。
オープンソースMCPサーバー50件のスキャン調査では61%で入力バリデーション欠如が検出されており、「エンドポイントに認証を付け忘れる」タイプの問題はnginx-uiに限った話ではない。
MCPを実装したツールを導入する際は、公開エンドポイントと認証の有無を自分で確認しておきたい。