<?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 21:30:33 +0000</lastBuildDate>
    <item>
      <title>GHSA-vmhf-c436-hxj4 — JupyterLab: Stored XSS in extension manager through package metadata unsanitized URI protocol</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-vmhf-c436-hxj4</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: jupyterlab&lt;/p&gt;
&lt;p&gt;A malicious PyPI package can place a `javascript:` URL in its `[project.urls]` metadata. JupyterLab&amp;#39;s Extension Manager renders this as the extension&amp;#39;s home-page link without validating the protocol, so a user who clicks the extension name executes attacker-controlled JavaScript in the JupyterLab origin.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;One of the PyPI package&amp;#39;s URL (jupyterlab/extensions/pypi.py) is copied straight into the `homepage_url` rendered by the frontend in packages/extensionmanager/src/widget.tsx#L77-L88.&lt;/p&gt;
&lt;p&gt;```python
best_guess_home_url = (
    homepage_url            # home_page / [project.urls] Homepage
    or data.get(&amp;#34;project_url&amp;#34;)
    or data.get(&amp;#34;package_url&amp;#34;)
    or documentation_url    # docs_url / [project.urls] Documentation
    or source_url           # [project.urls] Source Code
    or bug_tracker_url      # bugtrack_url / [project.urls] Bug Tracker
)&lt;/p&gt;
&lt;p&gt;# homepage_url=best_guess_home_url
```&lt;/p&gt;
&lt;p&gt;```tsx
{entry.homepage_url ? (
  &amp;lt;a href={entry.homepage_url} target=&amp;#34;_blank&amp;#34; rel=&amp;#34;noopener noreferrer&amp;#34; ...&amp;gt;
    {entry.name}
  &amp;lt;/a&amp;gt;
) : ( &amp;lt;div&amp;gt;{entry.name}&amp;lt;/div&amp;gt; )}
```&lt;/p&gt;
&lt;p&gt;### Impact&lt;/p&gt;
&lt;p&gt;An attacker needs to publish a package to PyPI (no access to the target). When the package appears in a victim&amp;#39;s extension manager list and the victim clicks the extension name, the payload runs in the JupyterLab origin.&lt;/p&gt;
&lt;p&gt;Preconditions: Extension Manager enabled with the default PyPI source, the malicious package appears in the victim&amp;#39;s list/search results.&lt;/p&gt;
&lt;p&gt;### Patches
Patched in [4.5.9](https://github.c…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: jupyterlab&lt;/p&gt;
&lt;p&gt;A malicious PyPI package can place a `javascript:` URL in its `[project.urls]` metadata. JupyterLab&amp;#39;s Extension Manager renders this as the extension&amp;#39;s home-page link without validating the protocol, so a user who clicks the extension name executes attacker-controlled JavaScript in the JupyterLab origin.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;One of the PyPI package&amp;#39;s URL (jupyterlab/extensions/pypi.py) is copied straight into the `homepage_url` rendered by the frontend in packages/extensionmanager/src/widget.tsx#L77-L88.&lt;/p&gt;
&lt;p&gt;```python
best_guess_home_url = (
    homepage_url            # home_page / [project.urls] Homepage
    or data.get(&amp;#34;project_url&amp;#34;)
    or data.get(&amp;#34;package_url&amp;#34;)
    or documentation_url    # docs_url / [project.urls] Documentation
    or source_url           # [project.urls] Source Code
    or bug_tracker_url      # bugtrack_url / [project.urls] Bug Tracker
)&lt;/p&gt;
&lt;p&gt;# homepage_url=best_guess_home_url
```&lt;/p&gt;
&lt;p&gt;```tsx
{entry.homepage_url ? (
  &amp;lt;a href={entry.homepage_url} target=&amp;#34;_blank&amp;#34; rel=&amp;#34;noopener noreferrer&amp;#34; ...&amp;gt;
    {entry.name}
  &amp;lt;/a&amp;gt;
) : ( &amp;lt;div&amp;gt;{entry.name}&amp;lt;/div&amp;gt; )}
```&lt;/p&gt;
&lt;p&gt;### Impact&lt;/p&gt;
&lt;p&gt;An attacker needs to publish a package to PyPI (no access to the target). When the package appears in a victim&amp;#39;s extension manager list and the victim clicks the extension name, the payload runs in the JupyterLab origin.&lt;/p&gt;
&lt;p&gt;Preconditions: Extension Manager enabled with the default PyPI source, the malicious package appears in the victim&amp;#39;s list/search results.&lt;/p&gt;
&lt;p&gt;### Patches
Patched in [4.5.9](https://github.c…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-vmhf-c436-hxj4</guid>
    </item>
  </channel>
</rss>
