<?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>Mon, 28 Sep 2026 16:04:51 +0000</lastBuildDate>
    <item>
      <title>fkie_cve-2026-55640</title>
      <link>https://vulnerability.circl.lu/vuln/fkie_cve-2026-55640</link>
      <description>&lt;p&gt;Nextcloud MCP Server is a production-ready MCP server that connects AI assistants to a Nextcloud instance. Prior to 0.117.2, the POST /webhooks/nextcloud endpoint in nextcloud_mcp_server/vector/webhook_receiver.py has no authentication by default because WEBHOOK_SECRET defaults to None and startup validation does not require it. When WEBHOOK_SECRET is unset, handle_nextcloud_webhook() accepts unauthenticated requests. The payload[&amp;#34;user&amp;#34;][&amp;#34;uid&amp;#34;] field parsed in nextcloud_mcp_server/vector/webhook_parser.py is attacker-controlled and is used without an authenticated-session cross-check for Qdrant operations, allowing a network attacker to delete or trigger re-indexing of vector embeddings for any user and to destroy the semantic search index by sending forged deletion events. This issue is fixed in version 0.117.2.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Nextcloud MCP Server is a production-ready MCP server that connects AI assistants to a Nextcloud instance. Prior to 0.117.2, the POST /webhooks/nextcloud endpoint in nextcloud_mcp_server/vector/webhook_receiver.py has no authentication by default because WEBHOOK_SECRET defaults to None and startup validation does not require it. When WEBHOOK_SECRET is unset, handle_nextcloud_webhook() accepts unauthenticated requests. The payload[&amp;#34;user&amp;#34;][&amp;#34;uid&amp;#34;] field parsed in nextcloud_mcp_server/vector/webhook_parser.py is attacker-controlled and is used without an authenticated-session cross-check for Qdrant operations, allowing a network attacker to delete or trigger re-indexing of vector embeddings for any user and to destroy the semantic search index by sending forged deletion events. This issue is fixed in version 0.117.2.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/fkie_cve-2026-55640</guid>
    </item>
    <item>
      <title>GHSA-8vh3-g2qg-2h2c — nextcloud-mcp-server: Unauthenticated `POST /webhooks/nextcloud` allows arbitrary vector data deletion when `WEBHOOK_SE…</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-8vh3-g2qg-2h2c</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: nextcloud-mcp-server&lt;/p&gt;
&lt;p&gt;## Summary
The `POST /webhooks/nextcloud` endpoint has no authentication by default: `WEBHOOK_SECRET` defaults to `None` and is never required by startup validation. When unset, the receiver accepts any unauthenticated POST. The `user_id` is taken directly from the attacker-supplied payload and passed to Qdrant, allowing an unauthenticated attacker to delete or corrupt vector embeddings for any user.&lt;/p&gt;
&lt;p&gt;## Details
**Vulnerable file:** `nextcloud_mcp_server/vector/webhook_receiver.py`, function `handle_nextcloud_webhook()`, **lines 55-67**&lt;/p&gt;
&lt;p&gt;**Root cause 1**: Auth check is guarded by `if secret`: - skipped entirely when `WEBHOOK_SECRET` is unset.&lt;/p&gt;
&lt;p&gt;**Root cause 2**: `webhook_secret: str | None = None` in config - no startup validator enforces it, even when vector sync is enabled.&lt;/p&gt;
&lt;p&gt;**Trusted field**: `payload[&amp;#34;user&amp;#34;][&amp;#34;uid&amp;#34;]` in `webhook_parser.py` is used as-is for all Qdrant operations - no cross-check against an authenticated session.&lt;/p&gt;
&lt;p&gt;`webhook_receiver.py`, **lines 55-67**:
```python
secret = get_settings().webhook_secret  # None by default
if secret:                           # skipped entirely when unset
    ... validate Bearer header ...
else:
    _warn_missing_secret_once()     # just logs, still processes
```
`webhook_parser.py`, **line 57**:
```python
user_id = payload[&amp;#34;user&amp;#34;][&amp;#34;uid&amp;#34;]     # attacker-controlled
```
## PoC
**No credentials required**. Works on any deployment where `WEBHOOK_SECRET` is not explicitly set (the default).
```json
POST /webhooks/nextcloud
Content-…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: nextcloud-mcp-server&lt;/p&gt;
&lt;p&gt;## Summary
The `POST /webhooks/nextcloud` endpoint has no authentication by default: `WEBHOOK_SECRET` defaults to `None` and is never required by startup validation. When unset, the receiver accepts any unauthenticated POST. The `user_id` is taken directly from the attacker-supplied payload and passed to Qdrant, allowing an unauthenticated attacker to delete or corrupt vector embeddings for any user.&lt;/p&gt;
&lt;p&gt;## Details
**Vulnerable file:** `nextcloud_mcp_server/vector/webhook_receiver.py`, function `handle_nextcloud_webhook()`, **lines 55-67**&lt;/p&gt;
&lt;p&gt;**Root cause 1**: Auth check is guarded by `if secret`: - skipped entirely when `WEBHOOK_SECRET` is unset.&lt;/p&gt;
&lt;p&gt;**Root cause 2**: `webhook_secret: str | None = None` in config - no startup validator enforces it, even when vector sync is enabled.&lt;/p&gt;
&lt;p&gt;**Trusted field**: `payload[&amp;#34;user&amp;#34;][&amp;#34;uid&amp;#34;]` in `webhook_parser.py` is used as-is for all Qdrant operations - no cross-check against an authenticated session.&lt;/p&gt;
&lt;p&gt;`webhook_receiver.py`, **lines 55-67**:
```python
secret = get_settings().webhook_secret  # None by default
if secret:                           # skipped entirely when unset
    ... validate Bearer header ...
else:
    _warn_missing_secret_once()     # just logs, still processes
```
`webhook_parser.py`, **line 57**:
```python
user_id = payload[&amp;#34;user&amp;#34;][&amp;#34;uid&amp;#34;]     # attacker-controlled
```
## PoC
**No credentials required**. Works on any deployment where `WEBHOOK_SECRET` is not explicitly set (the default).
```json
POST /webhooks/nextcloud
Content-…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-8vh3-g2qg-2h2c</guid>
    </item>
    <item>
      <title>PYSEC-2026-3866 — nextcloud-mcp-server: Unauthenticated `POST /webhooks/nextcloud` allows arbitrary vector data deletion when `WEBHOOK_SE…</title>
      <link>https://vulnerability.circl.lu/vuln/pysec-2026-3866</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: nextcloud-mcp-server&lt;/p&gt;
&lt;p&gt;## Summary
The `POST /webhooks/nextcloud` endpoint has no authentication by default: `WEBHOOK_SECRET` defaults to `None` and is never required by startup validation. When unset, the receiver accepts any unauthenticated POST. The `user_id` is taken directly from the attacker-supplied payload and passed to Qdrant, allowing an unauthenticated attacker to delete or corrupt vector embeddings for any user.&lt;/p&gt;
&lt;p&gt;## Details
**Vulnerable file:** `nextcloud_mcp_server/vector/webhook_receiver.py`, function `handle_nextcloud_webhook()`, **lines 55-67**&lt;/p&gt;
&lt;p&gt;**Root cause 1**: Auth check is guarded by `if secret`: - skipped entirely when `WEBHOOK_SECRET` is unset.&lt;/p&gt;
&lt;p&gt;**Root cause 2**: `webhook_secret: str | None = None` in config - no startup validator enforces it, even when vector sync is enabled.&lt;/p&gt;
&lt;p&gt;**Trusted field**: `payload[&amp;#34;user&amp;#34;][&amp;#34;uid&amp;#34;]` in `webhook_parser.py` is used as-is for all Qdrant operations - no cross-check against an authenticated session.&lt;/p&gt;
&lt;p&gt;`webhook_receiver.py`, **lines 55-67**:
```python
secret = get_settings().webhook_secret  # None by default
if secret:                           # skipped entirely when unset
    ... validate Bearer header ...
else:
    _warn_missing_secret_once()     # just logs, still processes
```
`webhook_parser.py`, **line 57**:
```python
user_id = payload[&amp;#34;user&amp;#34;][&amp;#34;uid&amp;#34;]     # attacker-controlled
```
## PoC
**No credentials required**. Works on any deployment where `WEBHOOK_SECRET` is not explicitly set (the default).
```json
POST /webhooks/nextcloud
Content-…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: nextcloud-mcp-server&lt;/p&gt;
&lt;p&gt;## Summary
The `POST /webhooks/nextcloud` endpoint has no authentication by default: `WEBHOOK_SECRET` defaults to `None` and is never required by startup validation. When unset, the receiver accepts any unauthenticated POST. The `user_id` is taken directly from the attacker-supplied payload and passed to Qdrant, allowing an unauthenticated attacker to delete or corrupt vector embeddings for any user.&lt;/p&gt;
&lt;p&gt;## Details
**Vulnerable file:** `nextcloud_mcp_server/vector/webhook_receiver.py`, function `handle_nextcloud_webhook()`, **lines 55-67**&lt;/p&gt;
&lt;p&gt;**Root cause 1**: Auth check is guarded by `if secret`: - skipped entirely when `WEBHOOK_SECRET` is unset.&lt;/p&gt;
&lt;p&gt;**Root cause 2**: `webhook_secret: str | None = None` in config - no startup validator enforces it, even when vector sync is enabled.&lt;/p&gt;
&lt;p&gt;**Trusted field**: `payload[&amp;#34;user&amp;#34;][&amp;#34;uid&amp;#34;]` in `webhook_parser.py` is used as-is for all Qdrant operations - no cross-check against an authenticated session.&lt;/p&gt;
&lt;p&gt;`webhook_receiver.py`, **lines 55-67**:
```python
secret = get_settings().webhook_secret  # None by default
if secret:                           # skipped entirely when unset
    ... validate Bearer header ...
else:
    _warn_missing_secret_once()     # just logs, still processes
```
`webhook_parser.py`, **line 57**:
```python
user_id = payload[&amp;#34;user&amp;#34;][&amp;#34;uid&amp;#34;]     # attacker-controlled
```
## PoC
**No credentials required**. Works on any deployment where `WEBHOOK_SECRET` is not explicitly set (the default).
```json
POST /webhooks/nextcloud
Content-…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/pysec-2026-3866</guid>
    </item>
  </channel>
</rss>
