CARVIEW |
Select Language
HTTP/2 200
date: Wed, 23 Jul 2025 16:47:25 GMT
content-type: text/html; charset=utf-8
vary: X-PJAX, X-PJAX-Container, Turbo-Visit, Turbo-Frame, X-Requested-With,Accept-Encoding, Accept, X-Requested-With
etag: W/"c42f8acefc0def30fa4963b6ce3e089c"
cache-control: max-age=0, private, must-revalidate
strict-transport-security: max-age=31536000; includeSubdomains; preload
x-frame-options: deny
x-content-type-options: nosniff
x-xss-protection: 0
referrer-policy: no-referrer-when-downgrade
content-security-policy: default-src 'none'; base-uri 'self'; child-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/; connect-src 'self' uploads.github.com www.githubstatus.com collector.github.com raw.githubusercontent.com api.github.com github-cloud.s3.amazonaws.com github-production-repository-file-5c1aeb.s3.amazonaws.com github-production-upload-manifest-file-7fdce7.s3.amazonaws.com github-production-user-asset-6210df.s3.amazonaws.com *.rel.tunnels.api.visualstudio.com wss://*.rel.tunnels.api.visualstudio.com objects-origin.githubusercontent.com copilot-proxy.githubusercontent.com proxy.individual.githubcopilot.com proxy.business.githubcopilot.com proxy.enterprise.githubcopilot.com *.actions.githubusercontent.com wss://*.actions.githubusercontent.com productionresultssa0.blob.core.windows.net/ productionresultssa1.blob.core.windows.net/ productionresultssa2.blob.core.windows.net/ productionresultssa3.blob.core.windows.net/ productionresultssa4.blob.core.windows.net/ productionresultssa5.blob.core.windows.net/ productionresultssa6.blob.core.windows.net/ productionresultssa7.blob.core.windows.net/ productionresultssa8.blob.core.windows.net/ productionresultssa9.blob.core.windows.net/ productionresultssa10.blob.core.windows.net/ productionresultssa11.blob.core.windows.net/ productionresultssa12.blob.core.windows.net/ productionresultssa13.blob.core.windows.net/ productionresultssa14.blob.core.windows.net/ productionresultssa15.blob.core.windows.net/ productionresultssa16.blob.core.windows.net/ productionresultssa17.blob.core.windows.net/ productionresultssa18.blob.core.windows.net/ productionresultssa19.blob.core.windows.net/ github-production-repository-image-32fea6.s3.amazonaws.com github-production-release-asset-2e65be.s3.amazonaws.com insights.github.com wss://alive.github.com api.githubcopilot.com api.individual.githubcopilot.com api.business.githubcopilot.com api.enterprise.githubcopilot.com; font-src github.githubassets.com; form-action 'self' github.com gist.github.com copilot-workspace.githubnext.com objects-origin.githubusercontent.com; frame-ancestors 'none'; frame-src viewscreen.githubusercontent.com notebooks.githubusercontent.com; img-src 'self' data: blob: github.githubassets.com media.githubusercontent.com camo.githubusercontent.com identicons.github.com avatars.githubusercontent.com private-avatars.githubusercontent.com github-cloud.s3.amazonaws.com objects.githubusercontent.com release-assets.githubusercontent.com secured-user-images.githubusercontent.com/ user-images.githubusercontent.com/ private-user-images.githubusercontent.com opengraph.githubassets.com copilotprodattachments.blob.core.windows.net/github-production-copilot-attachments/ github-production-user-asset-6210df.s3.amazonaws.com customer-stories-feed.github.com spotlights-feed.github.com objects-origin.githubusercontent.com *.githubusercontent.com; manifest-src 'self'; media-src github.com user-images.githubusercontent.com/ secured-user-images.githubusercontent.com/ private-user-images.githubusercontent.com github-production-user-asset-6210df.s3.amazonaws.com gist.github.com; script-src github.githubassets.com; style-src 'unsafe-inline' github.githubassets.com; upgrade-insecure-requests; worker-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/
server: github.com
content-encoding: gzip
accept-ranges: bytes
set-cookie: _gh_sess=u1zX0gQ6nFR9aEQ4xLGJRXcUjm1ecSt8zHgHF9VQEgm%2BGtYRTUH9V%2FTO%2FPp9pRbJB5AQTarKwcW6NwINwtG7OZRqXD%2FZpbARzhQfcSwBtedlwsFZbbWFSb6zKuqKFRU0B8j%2Bx43Uld7bSO8WiwzUZm%2BeTWnCSNJrYsH4Ro2Sm4ka9v%2F%2BwMf41ff5PhRU77uL9rkSQCj4p6naXynTgRjd7FihU11B9my%2FjSFjZUbts%2FmMVISmKJkOiMyQv2472rMV55lrWgsICf%2BzvcESIOoVew%3D%3D--hJLBD%2FijQYLXOUa6--RdQJV2Hk82A%2FNWigdi3ZlA%3D%3D; Path=/; HttpOnly; Secure; SameSite=Lax
set-cookie: _octo=GH1.1.2087549951.1753289244; Path=/; Domain=github.com; Expires=Thu, 23 Jul 2026 16:47:24 GMT; Secure; SameSite=Lax
set-cookie: logged_in=no; Path=/; Domain=github.com; Expires=Thu, 23 Jul 2026 16:47:24 GMT; HttpOnly; Secure; SameSite=Lax
x-github-request-id: DFFC:B5FA6:EC12AE:11730DB:6881121C
Untrusted search path under some conditions on Windows allows arbitrary code execution · Advisory · gitpython-developers/GitPython · GitHub
Skip to content
Navigation Menu
{{ message }}
-
-
Notifications
You must be signed in to change notification settings - Fork 950
Untrusted search path under some conditions on Windows allows arbitrary code execution
High
Description
Severity
High
/ 10
CVSS v3 base metrics
Attack vector
Local
Attack complexity
Low
Privileges required
None
User interaction
Required
Scope
Unchanged
Confidentiality
High
Integrity
High
Availability
High
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
CVE ID
CVE-2024-22190
Weaknesses
Weakness CWE-426
Untrusted Search Path
The product searches for critical resources using an externally-supplied search path that can point to resources that are not under the product's direct control. Learn more on MITRE.Credits
-
EliahKagan Reporter
You can’t perform that action at this time.
Summary
This issue exists because of an incomplete fix for CVE-2023-40590. On Windows, GitPython uses an untrusted search path if it uses a shell to run
git
, as well as when it runsbash.exe
to interpret hooks. If either of those features are used on Windows, a maliciousgit.exe
orbash.exe
may be run from an untrusted repository.Details
Although GitPython often avoids executing programs found in an untrusted search path since 3.1.33, two situations remain where this still occurs. Either can allow arbitrary code execution under some circumstances.
When a shell is used
GitPython can be told to run
git
commands through a shell rather than as direct subprocesses, by passingshell=True
to any method that accepts it, or by both settingGit.USE_SHELL = True
and not passingshell=False
. Then the Windowscmd.exe
shell process performs the path search, and GitPython does not prevent that shell from finding and runninggit
in the current directory.When GitPython runs
git
directly rather than through a shell, the GitPython process performs the path search, and currently omits the current directory by settingNoDefaultCurrentDirectoryInExePath
in its own environment during thePopen
call. Although thecmd.exe
shell will honor this environment variable when present, GitPython does not currently pass it into the shell subprocess's environment.Furthermore, because GitPython sets the subprocess CWD to the root of a repository's working tree, using a shell will run a malicious
git.exe
in an untrusted repository even if GitPython itself is run from a trusted location.This also applies if
Git.execute
is called directly withshell=True
(or afterGit.USE_SHELL = True
) to run any command.When hook scripts are run
On Windows, GitPython uses
bash.exe
to run hooks that appear to be scripts. However, unlike when runninggit
, no steps are taken to avoid finding and runningbash.exe
in the current directory.This allows the author of an untrusted fork or branch to cause a malicious
bash.exe
to be run in some otherwise safe workflows. An example of such a scenario is if the user installs a trusted hook while on a trusted branch, then switches to an untrusted feature branch (possibly from a fork) to review proposed changes. If the untrusted feature branch contains a maliciousbash.exe
and the user's current working directory is the working tree, and the user performs an action that runs the hook, then although the hook itself is uncorrupted, it runs with the maliciousbash.exe
.Note that, while
bash.exe
is a shell, this is a separate scenario from whengit
is run using the unrelated Windowscmd.exe
shell.PoC
On Windows, create a
git.exe
file in a repository. Then create aRepo
object, and call any method through it (directly or indirectly) that supports theshell
keyword argument withshell=True
:The
git.exe
executable in the repository directory will be run.Or use no
Repo
object, but do it from the location with thegit.exe
:The
git.exe
executable in the current directory will be run.For the scenario with hooks, install a hook in a repository, create a
bash.exe
file in the current directory, and perform an operation that causes GitPython to attempt to run the hook:The
bash.exe
executable in the current directory will be run.Impact
The greatest impact is probably in applications that set
Git.USE_SHELL = True
for historical reasons. (Undesired console windows had, in the past, been created in some kinds of applications, when it was not used.) Such an application may be vulnerable to arbitrary code execution from a malicious repository, even with no other exacerbating conditions. This is to say that, if a shell is used to rungit
, the full effect of CVE-2023-40590 is still present. Furthermore, as noted above, running the application itself from a trusted directory is not a sufficient mitigation.An application that does not direct GitPython to use a shell to run
git
subprocesses thus avoids most of the risk. However, there is no such straightforward way to prevent GitPython from runningbash.exe
to interpret hooks. So while the conditions needed for that to be exploited are more involved, it may be harder to mitigate decisively prior to patching.Possible solutions
A straightforward approach would be to address each bug directly:
NoDefaultCurrentDirectoryInExePath
into the subprocess environment, because in that scenario the subprocess is thecmd.exe
shell that itself performs the path search.NoDefaultCurrentDirectoryInExePath
in the GitPython process environment during thePopen
call made to run hooks with abash.exe
subprocess.These need only be done on Windows.