<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Most recent entries from all</title>
    <link>https://vulnerability.circl.lu</link>
    <description>Contains only the most 10 recent entries.</description>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Tue, 29 Sep 2026 10:29:21 +0000</lastBuildDate>
    <item>
      <title>CVE-2026-55546 — QWED-MCP: Unsafe SymPy `parse_expr()` Remote Code Execution via Unsanitized Math Expression Input</title>
      <link>https://vulnerability.circl.lu/vuln/cve-2026-55546</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; QWED-AI qwed-mcp&lt;/p&gt;
&lt;p&gt;QWED-MCP is a deterministic verification gateway for MCP. Prior to 0.2.1, verify_math_expression() in src/qwed_mcp/engines/math_engine.py passes attacker-controlled expression and claimed_result strings directly to SymPy&amp;#39;s parse_expr() after only normalizing caret syntax to Python exponent syntax, without restricting global_dict, removing Python built-ins, or validating the expression AST. Because parse_expr() calls Python&amp;#39;s eval() with built-ins available, an attacker who can cause a downstream caller to pass untrusted input to this public library function can use Python import functionality to execute arbitrary operating-system commands as the qwed-mcp process user, read or modify accessible data, exfiltrate process secrets, or reach internal services. The default MCP tool registry does not expose verify_math_expression(), so exploitation requires a downstream integration that invokes the library API with attacker-controlled input. This issue is fixed in version 0.2.1.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; QWED-AI qwed-mcp&lt;/p&gt;
&lt;p&gt;QWED-MCP is a deterministic verification gateway for MCP. Prior to 0.2.1, verify_math_expression() in src/qwed_mcp/engines/math_engine.py passes attacker-controlled expression and claimed_result strings directly to SymPy&amp;#39;s parse_expr() after only normalizing caret syntax to Python exponent syntax, without restricting global_dict, removing Python built-ins, or validating the expression AST. Because parse_expr() calls Python&amp;#39;s eval() with built-ins available, an attacker who can cause a downstream caller to pass untrusted input to this public library function can use Python import functionality to execute arbitrary operating-system commands as the qwed-mcp process user, read or modify accessible data, exfiltrate process secrets, or reach internal services. The default MCP tool registry does not expose verify_math_expression(), so exploitation requires a downstream integration that invokes the library API with attacker-controlled input. This issue is fixed in version 0.2.1.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/cve-2026-55546</guid>
    </item>
    <item>
      <title>PYSEC-2026-3915 — qwed-mcp has Unsafe SymPy `parse_expr()` Remote Code Execution via Unsanitized Math Expression Input</title>
      <link>https://vulnerability.circl.lu/vuln/pysec-2026-3915</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: qwed-mcp&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;`verify_math_expression()` in `qwed-mcp` v0.2.0 passes attacker-controlled strings directly to SymPy&amp;#39;s `parse_expr()` without restricting `global_dict` or validating the expression&amp;#39;s AST. Because `parse_expr()` internally calls `eval()` and Python automatically injects the current module&amp;#39;s `__builtins__` when no explicit restriction is set, an attacker can embed arbitrary Python expressions — including `__import__(&amp;#39;os&amp;#39;).system(...)` — to execute OS commands in the context of the running process. Confirmed exploitation in a Docker container yields root-level arbitrary command execution with no authentication or special configuration required.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;The vulnerability resides in `src/qwed_mcp/engines/math_engine.py`. The public function `verify_math_expression(expression, claimed_result, operation)` accepts both the `expression` and `claimed_result` arguments as raw strings and passes them — after a trivial `^` → `**` substitution — to `sympy.parsing.sympy_parser.parse_expr()`:&lt;/p&gt;
&lt;p&gt;```python
# math_engine.py:50-54
expr = parse_expr(
    expression.replace(&amp;#34;^&amp;#34;, &amp;#34;**&amp;#34;),
    local_dict={&amp;#34;x&amp;#34;: x, &amp;#34;y&amp;#34;: y, &amp;#34;z&amp;#34;: z, &amp;#34;pi&amp;#34;: pi, &amp;#34;e&amp;#34;: E},
    transformations=transformations
)
```&lt;/p&gt;
&lt;p&gt;```python
# math_engine.py:64-68
claimed = parse_expr(
    claimed_result.replace(&amp;#34;^&amp;#34;, &amp;#34;**&amp;#34;),
    local_dict={&amp;#34;x&amp;#34;: x, &amp;#34;y&amp;#34;: y, &amp;#34;z&amp;#34;: z, &amp;#34;pi&amp;#34;: pi, &amp;#34;e&amp;#34;: E},
    transformations=transformations
)
```&lt;/p&gt;
&lt;p&gt;`local_dict` only adds math symbols to the evaluation namespace; it does **not** remove `__builtins__`…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: qwed-mcp&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;`verify_math_expression()` in `qwed-mcp` v0.2.0 passes attacker-controlled strings directly to SymPy&amp;#39;s `parse_expr()` without restricting `global_dict` or validating the expression&amp;#39;s AST. Because `parse_expr()` internally calls `eval()` and Python automatically injects the current module&amp;#39;s `__builtins__` when no explicit restriction is set, an attacker can embed arbitrary Python expressions — including `__import__(&amp;#39;os&amp;#39;).system(...)` — to execute OS commands in the context of the running process. Confirmed exploitation in a Docker container yields root-level arbitrary command execution with no authentication or special configuration required.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;The vulnerability resides in `src/qwed_mcp/engines/math_engine.py`. The public function `verify_math_expression(expression, claimed_result, operation)` accepts both the `expression` and `claimed_result` arguments as raw strings and passes them — after a trivial `^` → `**` substitution — to `sympy.parsing.sympy_parser.parse_expr()`:&lt;/p&gt;
&lt;p&gt;```python
# math_engine.py:50-54
expr = parse_expr(
    expression.replace(&amp;#34;^&amp;#34;, &amp;#34;**&amp;#34;),
    local_dict={&amp;#34;x&amp;#34;: x, &amp;#34;y&amp;#34;: y, &amp;#34;z&amp;#34;: z, &amp;#34;pi&amp;#34;: pi, &amp;#34;e&amp;#34;: E},
    transformations=transformations
)
```&lt;/p&gt;
&lt;p&gt;```python
# math_engine.py:64-68
claimed = parse_expr(
    claimed_result.replace(&amp;#34;^&amp;#34;, &amp;#34;**&amp;#34;),
    local_dict={&amp;#34;x&amp;#34;: x, &amp;#34;y&amp;#34;: y, &amp;#34;z&amp;#34;: z, &amp;#34;pi&amp;#34;: pi, &amp;#34;e&amp;#34;: E},
    transformations=transformations
)
```&lt;/p&gt;
&lt;p&gt;`local_dict` only adds math symbols to the evaluation namespace; it does **not** remove `__builtins__`…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/pysec-2026-3915</guid>
    </item>
  </channel>
</rss>
