<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Jupyterlab-Git &lt;= 0.53.0 - CraftedSignal Threat Feed</title><link>https://feed.craftedsignal.io/products/jupyterlab-git--0.53.0/</link><description>Trending threats, MITRE ATT&amp;CK coverage, and detection metadata. Fed continuously.</description><generator>Hugo</generator><language>en</language><managingEditor>hello@craftedsignal.io</managingEditor><webMaster>hello@craftedsignal.io</webMaster><lastBuildDate>Fri, 19 Jun 2026 19:59:42 +0000</lastBuildDate><atom:link href="https://feed.craftedsignal.io/products/jupyterlab-git--0.53.0/feed.xml" rel="self" type="application/rss+xml"/><item><title>JupyterLab-Git excluded_paths Case-Sensitivity Bypass (CVE-2026-54528)</title><link>https://feed.craftedsignal.io/briefs/2026-06-jupyterlab-git-exclusion-bypass/</link><pubDate>Fri, 19 Jun 2026 19:59:42 +0000</pubDate><author>hello@craftedsignal.io</author><guid isPermaLink="true">https://feed.craftedsignal.io/briefs/2026-06-jupyterlab-git-exclusion-bypass/</guid><description>An authenticated user can bypass the admin-configured `excluded_paths` security control in `jupyterlab-git` versions up to 0.53.0 by exploiting a case-sensitivity flaw on case-insensitive filesystems (e.g., macOS APFS, Windows NTFS), allowing unauthorized read access to git history and file content in explicitly excluded directories.</description><content:encoded><![CDATA[<p>A critical vulnerability, tracked as CVE-2026-54528, has been discovered in <code>jupyterlab-git</code> versions up to 0.53.0, a popular Git extension for JupyterLab environments. This flaw allows an authenticated user to bypass security controls designed to restrict access to sensitive directories. The vulnerability stems from the <code>jupyterlab-git</code> extension's use of <code>fnmatch.fnmatchcase()</code> for enforcing <code>excluded_paths</code> configurations. Unlike <code>fnmatch.fnmatch()</code>, <code>fnmatch.fnmatchcase()</code> is unconditionally case-sensitive. This design choice enables attackers on case-insensitive filesystems (such as Windows NTFS or macOS APFS) to craft URLs with case-varied path segments (e.g., <code>/project/Secrets</code> instead of <code>/project/secrets</code>), thereby circumventing the exclusion logic and gaining unauthorized read access to Git repositories and file contents within directories explicitly forbidden by administrators. This directly impacts data confidentiality and integrity.</p>
<h2 id="attack-chain">Attack Chain</h2>
<ol>
<li>An authenticated user with valid access to a JupyterLab instance, running a vulnerable version of <code>jupyterlab-git</code> (&lt;=0.53.0), is present on a system with a case-insensitive filesystem (Windows NTFS or macOS APFS).</li>
<li>An administrator has configured <code>c.JupyterLabGit.excluded_paths</code> to deny access to sensitive directories (e.g., <code>[&quot;/project/secrets&quot;, &quot;/project/secrets/*&quot;]</code>).</li>
<li>The attacker identifies a sensitive path that should be excluded (e.g., <code>/project/secrets</code>) and crafts an HTTP <code>POST</code> request to a <code>jupyterlab-git</code> endpoint (e.g., <code>/git/{path}/status</code>) using a case-varied version of the path (e.g., <code>/git/project/Secrets/status</code>).</li>
<li>The <code>jupyterlab-git</code> backend, specifically <code>GitHandler.prepare()</code>, checks the crafted path against <code>excluded_paths</code> using <code>fnmatch.fnmatchcase()</code>. Due to the unconditional case-sensitivity of <code>fnmatch.fnmatchcase()</code>, the path <code>/project/Secrets</code> does not match the configured <code>/project/secrets</code>, bypassing the exclusion check.</li>
<li>On the case-insensitive filesystem, the <code>url2localpath()</code> function resolves <code>/project/Secrets</code> to the same disk location as <code>/project/secrets</code>, allowing the request to proceed to the target directory.</li>
<li>The attacker first confirms the bypass by sending a <code>POST</code> request to an information-gathering endpoint like <code>/git/project/Secrets/status</code>, which returns a <code>200 OK</code> status instead of the expected <code>404</code> error.</li>
<li>With confirmed access, the attacker sends a <code>POST</code> request to the <code>/git/project/Secrets/content</code> endpoint, providing a filename (e.g., <code>{&quot;filename&quot;: &quot;./cred.txt&quot;, &quot;reference&quot;: {&quot;git&quot;: &quot;HEAD&quot;}}</code>), to exfiltrate the contents of sensitive files.</li>
<li>The JupyterLab server returns the content of the sensitive file (e.g., <code>sk-PROD-a8f2x9q-LIVE-KEY</code>), resulting in unauthorized data exposure.</li>
</ol>
<h2 id="impact">Impact</h2>
<p>Successful exploitation of CVE-2026-54528 leads to the unauthorized disclosure of sensitive information. An authenticated attacker can access Git history, working tree files, and status information for any directory that an administrator intended to exclude, provided the underlying filesystem is case-insensitive. This directly compromises the confidentiality of data stored in affected repositories, including credentials, proprietary code, or confidential documents. The observed impact demonstrates the exfiltration of a simulated API key from an excluded <code>secrets</code> directory. Organizations using <code>jupyterlab-git</code> on Windows or macOS systems are at risk, with the potential for widespread data breaches if critical information is stored in such Git-managed directories.</p>
<h2 id="recommendation">Recommendation</h2>
<p>Prioritize patching and detection to mitigate CVE-2026-54528.</p>
<ul>
<li>Immediately upgrade <code>jupyterlab-git</code> to a version greater than 0.53.0 to apply the fix for CVE-2026-54528.</li>
<li>Deploy the provided Sigma rules &quot;Detects CVE-2026-54528 Exploitation - JupyterLab-Git Status Bypass&quot; and &quot;Detects CVE-2026-54528 Exploitation - JupyterLab-Git Content Exfiltration Bypass&quot; to your SIEM solution to detect attempts to bypass <code>excluded_paths</code> via case-varied URLs.</li>
<li>Ensure detailed <code>webserver</code> logging is enabled for all JupyterLab instances to capture HTTP <code>POST</code> requests, URI stems, and status codes for analysis.</li>
<li>Review web server logs for <code>POST</code> requests to <code>/git/*/status</code> and <code>/git/*/content</code> endpoints returning <code>200 OK</code> where paths contain common sensitive keywords (e.g., <code>secrets</code>, <code>config</code>) with mixed casing, cross-referencing with your <code>excluded_paths</code> configuration.</li>
</ul>
]]></content:encoded><category domain="severity">high</category><category domain="type">advisory</category><category>web-vulnerability</category><category>path-traversal</category><category>data-exfiltration</category><category>jupyterlab</category><category>python</category></item></channel></rss>