VYPR
Medium severity4.3GHSA Advisory· Published May 15, 2026

CVE-2026-45347

CVE-2026-45347

Description

Open WebUI is a self-hosted artificial intelligence platform designed to operate entirely offline. Prior to 0.5.11, there is a blind server side request forgery (SSRF) via the PDF generate function. In the PDF export, user inputs are interpreted as HTML and embedded into the PDF. According to tests, scripts and some potentially dangerous tags (iFrame, Object, etc.) are blocked, preventing server-side content from being read through this vulnerability. However, an image tag can be used to force a server-side request (SSRF), as shown in the following below. This vulnerability is fixed in 0.5.11.

Affected products

1

Patches

1
167c8bf00d16

Prevent SSRF and HTML injection

https://github.com/open-webui/open-webuiRodrigo AgundezFeb 10, 2025via ghsa
1 file changed · +7 6
  • backend/open_webui/utils/pdf_generator.py+7 6 modified
    @@ -2,6 +2,7 @@
     from io import BytesIO
     from pathlib import Path
     from typing import Dict, Any, List
    +from html import escape
     
     from markdown import markdown
     
    @@ -11,7 +12,6 @@
     from open_webui.env import STATIC_DIR, FONTS_DIR
     from open_webui.models.chats import ChatTitleMessagesForm
     
    -
     class PDFGenerator:
         """
         Description:
    @@ -41,13 +41,13 @@ def format_timestamp(self, timestamp: float) -> str:
     
         def _build_html_message(self, message: Dict[str, Any]) -> str:
             """Build HTML for a single message."""
    -        role = message.get("role", "user")
    -        content = message.get("content", "")
    +        role = escape(message.get("role", "user"))
    +        content = escape(message.get("content", ""))
             timestamp = message.get("timestamp")
     
    -        model = message.get("model") if role == "assistant" else ""
    +        model = escape(message.get("model") if role == "assistant" else "")
     
    -        date_str = self.format_timestamp(timestamp) if timestamp else ""
    +        date_str = escape(self.format_timestamp(timestamp) if timestamp else "")
     
             # extends pymdownx extension to convert markdown to html.
             # - https://facelessuser.github.io/pymdown-extensions/usage_notes/
    @@ -76,6 +76,7 @@ def _build_html_message(self, message: Dict[str, Any]) -> str:
     
         def _generate_html_body(self) -> str:
             """Generate the full HTML body for the PDF."""
    +        escaped_title = escape(self.form_data.title)
             return f"""
             <html>
                 <head>
    @@ -84,7 +85,7 @@ def _generate_html_body(self) -> str:
                 <body>
                 <div>
                     <div>
    -                    <h2>{self.form_data.title}</h2>
    +                    <h2>{escaped_title}</h2>
                         {self.messages_html}
                     </div>
                 </div>
    

Vulnerability mechanics

AI mechanics synthesis has not run for this CVE yet.

References

4

News mentions

0

No linked articles in our index yet.