<?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, 05 Oct 2026 23:01:11 +0000</lastBuildDate>
    <item>
      <title>GHSA-hxpf-9xvq-wph8 — netlicensing-mcp: REST Path Traversal Bypasses Token Redaction</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-hxpf-9xvq-wph8</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: netlicensing-mcp&lt;/p&gt;
&lt;p&gt;## REST Path Traversal Bypasses Token Redaction in netlicensing-mcp&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;The `netlicensing_get_product` MCP tool in `netlicensing-mcp` interpolates a caller-controlled `product_number` argument directly into a REST URL path without any validation. Passing `../token` as the product number causes `httpx` to normalize `/product/../token` into `/token`, silently redirecting the request to the NetLicensing token endpoint instead of the intended product endpoint. The response is then serialized through the generic `_wrap_json` wrapper rather than the token-specific `_wrap_json_token_read` wrapper, bypassing all APIKEY `number` and SHOP `shopURL` redaction. An authenticated MCP client can recover plaintext API key values that the token read tools intentionally mask, including admin-level APIKEY credentials.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;The vulnerability is a path traversal (CWE-22) that exploits the interaction between unsanitized string interpolation and `httpx`&amp;#39;s WHATWG URL normalization.&lt;/p&gt;
&lt;p&gt;**Source — `src/netlicensing_mcp/tools/products.py:22`**&lt;/p&gt;
&lt;p&gt;```python
async def get_product(product_number: str) -&amp;gt; dict:
    &amp;#34;&amp;#34;&amp;#34;Get a single product by its number.&amp;#34;&amp;#34;&amp;#34;
    return strip_output_fields(await nl_get(f&amp;#34;/product/{product_number}&amp;#34;))
```&lt;/p&gt;
&lt;p&gt;`product_number` is inserted directly into the REST path with no validation. A value of `../token` produces the path `/product/../token`.&lt;/p&gt;
&lt;p&gt;**Sink — `src/netlicensing_mcp/client.py:143`**&lt;/p&gt;
&lt;p&gt;```python
async def nl_get(path: str, params: dict[str, str] | None =…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: netlicensing-mcp&lt;/p&gt;
&lt;p&gt;## REST Path Traversal Bypasses Token Redaction in netlicensing-mcp&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;The `netlicensing_get_product` MCP tool in `netlicensing-mcp` interpolates a caller-controlled `product_number` argument directly into a REST URL path without any validation. Passing `../token` as the product number causes `httpx` to normalize `/product/../token` into `/token`, silently redirecting the request to the NetLicensing token endpoint instead of the intended product endpoint. The response is then serialized through the generic `_wrap_json` wrapper rather than the token-specific `_wrap_json_token_read` wrapper, bypassing all APIKEY `number` and SHOP `shopURL` redaction. An authenticated MCP client can recover plaintext API key values that the token read tools intentionally mask, including admin-level APIKEY credentials.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;The vulnerability is a path traversal (CWE-22) that exploits the interaction between unsanitized string interpolation and `httpx`&amp;#39;s WHATWG URL normalization.&lt;/p&gt;
&lt;p&gt;**Source — `src/netlicensing_mcp/tools/products.py:22`**&lt;/p&gt;
&lt;p&gt;```python
async def get_product(product_number: str) -&amp;gt; dict:
    &amp;#34;&amp;#34;&amp;#34;Get a single product by its number.&amp;#34;&amp;#34;&amp;#34;
    return strip_output_fields(await nl_get(f&amp;#34;/product/{product_number}&amp;#34;))
```&lt;/p&gt;
&lt;p&gt;`product_number` is inserted directly into the REST path with no validation. A value of `../token` produces the path `/product/../token`.&lt;/p&gt;
&lt;p&gt;**Sink — `src/netlicensing_mcp/client.py:143`**&lt;/p&gt;
&lt;p&gt;```python
async def nl_get(path: str, params: dict[str, str] | None =…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-hxpf-9xvq-wph8</guid>
    </item>
    <item>
      <title>PYSEC-2026-3489 — netlicensing-mcp: REST Path Traversal Bypasses Token Redaction</title>
      <link>https://vulnerability.circl.lu/vuln/pysec-2026-3489</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: netlicensing-mcp&lt;/p&gt;
&lt;p&gt;## REST Path Traversal Bypasses Token Redaction in netlicensing-mcp&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;The `netlicensing_get_product` MCP tool in `netlicensing-mcp` interpolates a caller-controlled `product_number` argument directly into a REST URL path without any validation. Passing `../token` as the product number causes `httpx` to normalize `/product/../token` into `/token`, silently redirecting the request to the NetLicensing token endpoint instead of the intended product endpoint. The response is then serialized through the generic `_wrap_json` wrapper rather than the token-specific `_wrap_json_token_read` wrapper, bypassing all APIKEY `number` and SHOP `shopURL` redaction. An authenticated MCP client can recover plaintext API key values that the token read tools intentionally mask, including admin-level APIKEY credentials.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;The vulnerability is a path traversal (CWE-22) that exploits the interaction between unsanitized string interpolation and `httpx`&amp;#39;s WHATWG URL normalization.&lt;/p&gt;
&lt;p&gt;**Source — `src/netlicensing_mcp/tools/products.py:22`**&lt;/p&gt;
&lt;p&gt;```python
async def get_product(product_number: str) -&amp;gt; dict:
    &amp;#34;&amp;#34;&amp;#34;Get a single product by its number.&amp;#34;&amp;#34;&amp;#34;
    return strip_output_fields(await nl_get(f&amp;#34;/product/{product_number}&amp;#34;))
```&lt;/p&gt;
&lt;p&gt;`product_number` is inserted directly into the REST path with no validation. A value of `../token` produces the path `/product/../token`.&lt;/p&gt;
&lt;p&gt;**Sink — `src/netlicensing_mcp/client.py:143`**&lt;/p&gt;
&lt;p&gt;```python
async def nl_get(path: str, params: dict[str, str] | None =…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: netlicensing-mcp&lt;/p&gt;
&lt;p&gt;## REST Path Traversal Bypasses Token Redaction in netlicensing-mcp&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;The `netlicensing_get_product` MCP tool in `netlicensing-mcp` interpolates a caller-controlled `product_number` argument directly into a REST URL path without any validation. Passing `../token` as the product number causes `httpx` to normalize `/product/../token` into `/token`, silently redirecting the request to the NetLicensing token endpoint instead of the intended product endpoint. The response is then serialized through the generic `_wrap_json` wrapper rather than the token-specific `_wrap_json_token_read` wrapper, bypassing all APIKEY `number` and SHOP `shopURL` redaction. An authenticated MCP client can recover plaintext API key values that the token read tools intentionally mask, including admin-level APIKEY credentials.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;The vulnerability is a path traversal (CWE-22) that exploits the interaction between unsanitized string interpolation and `httpx`&amp;#39;s WHATWG URL normalization.&lt;/p&gt;
&lt;p&gt;**Source — `src/netlicensing_mcp/tools/products.py:22`**&lt;/p&gt;
&lt;p&gt;```python
async def get_product(product_number: str) -&amp;gt; dict:
    &amp;#34;&amp;#34;&amp;#34;Get a single product by its number.&amp;#34;&amp;#34;&amp;#34;
    return strip_output_fields(await nl_get(f&amp;#34;/product/{product_number}&amp;#34;))
```&lt;/p&gt;
&lt;p&gt;`product_number` is inserted directly into the REST path with no validation. A value of `../token` produces the path `/product/../token`.&lt;/p&gt;
&lt;p&gt;**Sink — `src/netlicensing_mcp/client.py:143`**&lt;/p&gt;
&lt;p&gt;```python
async def nl_get(path: str, params: dict[str, str] | None =…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/pysec-2026-3489</guid>
    </item>
  </channel>
</rss>
