Описание
jupyterlab-git has a command injection vulnerability in "Open Git Repository in Terminal"
Overview
On many platforms, a third party can create a Git repository under a name that includes a shell command substitution 1 string in the syntax $(<command>)
. These directory names are allowed in macOS and a majority of Linux distributions 2. If a user starts jupyter-lab
in a parent directory of this inappropriately-named Git repository, opens it, and clicks "Git > Open Git Repository in Terminal" from the menu bar, then the injected command <command>
is run in the user's shell without the user's permission.
This issue is occurring because when that menu entry is clicked, jupyterlab-git
opens the terminal and runs cd <git-repo-path>
through the shell to set the current directory 3. Doing so runs any command substitution strings present in the directory name, which leads to the command injection issue described here. A previous patch provided an incomplete fix 4.
Scope of Impact
This issue allows for arbitrary code execution via command injection. A wide range of actions are permitted by this issue, including but not limited to: modifying files, exfiltrating data, halting services, or compromising the server's security rules.
We have scanned the source code of jupyterlab-git
for other command injection risks, and have not found any at the time of writing.
This issue was reproduced on the latest release of jupyterlab-git
, v0.51.0. The steps taken to reproduce this issue are described in the "Proof-of-concept" section below.
Proof-of-concept
-
Create a new directory via
mkdir test/ && cd test/
. -
Create a new Git repository under
test/
with a command substitution string in the directory name by running these commands:
- Start JupyterLab from
test/
by running jupyter lab. - With JupyterLab open in the browser, double click on
$(touch pwned.txt)
in the file browser. - From the top menu bar, click "Git > Open Git Repository in Terminal".
- Verify that
pwned.txt
is created undertest/
. This demonstrates the command injection issue described here.
Proof-of-concept mitigation
The issue can be mitigated by the patch shown below.
Patch (click to expand)
This patch removes the cd <git-repo-path>
shell command that causes the issue. To preserve the existing behavior, the cwd
argument is set to <git-repo-path>
when a terminal session is created via the terminal:create-new
JupyterLab command. This preserves the existing application behavior while mitigating the command injection issue.
We have verified that this patch works when applied to a local installation of jupyterlab-git
. We have also verified that the cwd
argument is available in all versions of JupyterLab 4, so this patch should be fully backwards-compatible.
Workarounds
We recommend that users upgrade to the patched versions listed on this GHSA. However, if a user is unable to upgrade, there are 3 different ways to mitigate this vulnerability without upgrading to a patch.
-
Disable terminals on
jupyter-server
level:c.ServerApp.terminals_enabled = False -
Disable the terminals server extension:
jupyter server extension disable jupyter_server_terminals -
Disable the lab extension:
jupyter labextension disable @jupyterlab/terminal-extension
Footnotes
Ссылки
- https://github.com/jupyterlab/jupyterlab-git/security/advisories/GHSA-cj5w-8mjf-r5f8
- https://nvd.nist.gov/vuln/detail/CVE-2025-30370
- https://github.com/jupyterlab/jupyterlab-git/pull/1196
- https://github.com/jupyterlab/jupyterlab-git/commit/b46482993f76d3a546015c6a94ebed8b77fc2376
- https://github.com/jupyterlab/jupyterlab-git/blob/7eb3b06f0092223bd5494688ec264527bbeb2195/src/commandsAndMenu.tsx#L175-L184
Пакеты
jupyterlab-git
< 0.51.1
0.51.1
Связанные уязвимости
jupyterlab-git is a JupyterLab extension for version control using Git. On many platforms, a third party can create a Git repository under a name that includes a shell command substitution string in the syntax $(<command>). These directory names are allowed in macOS and a majority of Linux distributions. If a user starts jupyter-lab in a parent directory of this inappropriately-named Git repository, opens it, and clicks "Git > Open Git Repository in Terminal" from the menu bar, then the injected command <command> is run in the user's shell without the user's permission. This issue is occurring because when that menu entry is clicked, jupyterlab-git opens the terminal and runs cd <git-repo-path> through the shell to set the current directory. Doing so runs any command substitution strings present in the directory name, which leads to the command injection issue described here. A previous patch provided an incomplete fix. This vulnerability is fixed in 0.51.1.
jupyterlab-git is a JupyterLab extension for version control using Git. On many platforms, a third party can create a Git repository under a name that includes a shell command substitution string in the syntax $(<command>). These directory names are allowed in macOS and a majority of Linux distributions. If a user starts jupyter-lab in a parent directory of this inappropriately-named Git repository, opens it, and clicks "Git > Open Git Repository in Terminal" from the menu bar, then the injected command <command> is run in the user's shell without the user's permission. This issue is occurring because when that menu entry is clicked, jupyterlab-git opens the terminal and runs cd <git-repo-path> through the shell to set the current directory. Doing so runs any command substitution strings present in the directory name, which leads to the command injection issue described here. A previous patch provided an incomplete fix. This vulnerability is fixed in 0.51.1.
Уязвимость элемента управления «Open Git Repository in Terminal» («Открыть репозиторий Git в терминале») расширения jupyterlab-git веб-ориентированной интерактивной среды разработки JupyterLab, позволяющая нарушителю получить доступ на чтение и изменение данных и выполнить произвольные команды