
Gigamon Unauth RCE (CVE-2026-36848)
Gigamon-VUE OS (GVOS) उपकरणों के पोर्ट 8089 पर चलने वाले वेब-आधारित प्रबंधन इंजन में एक गंभीर पाथ ट्रैवर्सल भेद्यता की पहचान की गई है। यह दोष persistd डेमॉन के अंदर विरासत (legacy) H-VUE सबसिस्टम में मौजूद है और सेवा तक नेटवर्क पहुँच रखने वाले किसी भी प्रमाणीकरण-रहित, दूरस्थ हमलावर को root विशेषाधिकारों के साथ सिस्टम पर मनमानी फ़ाइलें पढ़ने और आंशिक लेखन कार्य (मौजूदा फ़ाइलों को ओवरराइट करना संभव नहीं) करने की अनुमति देता है।
/opt/tms/persistd_py/persistd.pyroot उपयोगकर्ता के रूप में निष्पादित)पोर्ट 8089 पर चलने वाली TornadoHTTP वेब सेवा /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:
# 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)
चूंकि कोई सैनिटी फ़िल्टरिंग नहीं है (जैसे .. जैसी डायरेक्टरी ट्रैवर्सल अनुक्रमों की जाँच करना), 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()
# 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)
इनपुट सैनिटाइज़ेशन की यह संरचनात्मक कमी एक हमलावर को ट्रैवर्सल चरणों वाला पाथ प्रदान करने की अनुमति देती है, जिससे सेवा डेमॉन चलाने वाले root उपयोगकर्ता संदर्भ की अनुमतियों के साथ DBFILE_DIR की सीमाओं के बाहर मनमानी फ़ाइलें लिख सकती है।
यदि कोई हमलावर पाथ सेपरेटरों (/ को %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 का समर्थन 26 मई 2023 को समाप्त हो गया। 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 उत्पाद सुरक्षा और इंजीनियरिंग टीमों के प्रति अपनी कृतज्ञता व्यक्त करना चाहते हैं।