← back
CVE-2025-48384highunder attackCWE-436CWE-59

Git allows arbitrary code execution through broken config quoting

73Vexday Risk Score

Prioritize patching. It under exploitation confirmed by CISA and has a public proof of concept.

ssvc Actcvss 8.1epss 2.8%
from disclosure to weapon0 days
Published on NVDJul 8
1st PoCJul 8
CISA KEV+48d
exploitation probability
2.8%top 15% of all CVEs
observed exploitation
yesCISA + VulnCheck
68 public exploit(s)
Action required by CISAfederal deadline: 2025-09-15

Apply mitigations per vendor instructions, follow applicable BOD 22-01 guidance for cloud services, or discontinue use of the product if mitigations are unavailable.

Summary

Falha no parsing de arquivos de configuração do Git (.gitmodules) permite execução arbitrária de código ao clonar um repositório malicioso com submódulos. O Git remove CR/LF ao ler um valor de config, mas não citava (quota) valores com CR final ao escrever — criando uma divergência que permite mascarar o caminho real de um submódulo. Está no catálogo KEV da CISA com exploração confirmada, mas o vetor exige interação do usuário (clone recursivo) e checkout de um submódulo malicioso, não é RCE remoto sem ação da vítima.

Technical detail

O bug está na camada de leitura/escrita de config do Git. Ao ler um valor de configuração, o parser descarta qualquer CRLF/CR final à direita. Ao escrever um valor de config que termine em CR, o Git não envolve o valor em aspas — então essa proteção que deveria preservar o CR é perdida na próxima leitura. O resultado prático: um caminho de submódulo definido em .gitmodules com um CR final é gravado sem quoting no config interno e, quando lido de volta, o CR desaparece silenciosamente, alterando efetivamente o caminho resultante do submódulo em relação ao que o atacante originalmente declarou.

How it’s exploited

O atacante cria um repositório com um submódulo cujo path em .gitmodules contém um CR à direita. Quando a vítima clona esse repositório de forma recursiva (com --recurse-submodules, ou faz `git submodule update --init` depois), o Git inicializa o submódulo no caminho alterado (sem o CR) em vez do caminho declarado. Se o repositório também contém um symlink que aponta esse caminho alterado para o diretório .git/hooks/ do submódulo, e o submódulo possui um hook post-checkout executável, esse hook pode ser executado sem intenção explícita da vítima logo após o checkout — resultando em execução de código com os privilégios do usuário que fez o clone.

Versions

Affected
v2.50.0; v2.49.0; v2.48.0–v2.48.1; v2.47.0–v2.47.2; v2.46.0–v2.46.3; v2.45.0–v2.45.3; v2.44.0–v2.44.3; v2.43.6 e anteriores.
Fixed in
v2.43.7, v2.44.4, v2.45.4, v2.46.4, v2.47.3, v2.48.2, v2.49.1 e v2.50.1. Backports de distribuição: Debian 11 (bullseye) em 1:2.30.2-1+deb11u5 (DLA-4323-1). Apple corrigiu a cópia do Git distribuída com Xcode 26 (sem número de versão específico do Git divulgado pela Apple).

How to protect

A correção definitiva é atualizar o Git para a versão corrigida do ramo correspondente. Como paliativo quando não é possível atualizar imediatamente, o advisory oficial recomenda evitar clonar recursivamente submódulos de repositórios não confiáveis (não usar --recurse-submodules nem `git submodule update --init` em repositórios de origem desconhecida). Não existe flag de configuração ou controle de linha de comando documentado que neutralize a falha sem a correção de código — a mitigação real é a atualização binária do Git ou a abstenção de operações recursivas com submódulos em fontes não confiáveis. Distribuições backportaram a correção em pacotes próprios (ex.: Debian 11 em 1:2.30.2-1+deb11u5, via DLA-4323-1); a Apple corrigiu o Git empacotado no Xcode 26.

How to detect

Procure em repositórios clonados por entradas em .gitmodules cujo campo `path` termine em caractere de controle (CR, 0x0D) — isso não é visível em editores comuns e exige inspeção binária/hexdump do arquivo. Outro sinal é a presença de symlinks dentro do repositório apontando para dentro do diretório .git/hooks/ de um submódulo, combinada com um hook post-checkout executável no submódulo — essa combinação é o indicador estrutural do ataque. Não há assinatura de rede confiável, pois a exploração ocorre inteiramente no processamento local do repositório clonado; monitorar execução inesperada de processos filhos do `git` (via hooks) após operações de clone/submodule update em ambientes de CI é o sinal comportamental mais prático.

Researched and written with AI from the vendor advisory and public analysis, with the sources above. Always confirm the fixed version in the official advisory before acting.
Git is a fast, scalable, distributed revision control system with an unusually rich command set that provides both high-level operations and full access to internals. When reading a config value, Git strips any trailing carriage return and line feed (CRLF). When writing a config entry, values with a trailing CR are not quoted, causing the CR to be lost when the config is later read. When initializing a submodule, if the submodule path contains a trailing CR, the altered path is read resulting in the submodule being checked out to an incorrect location. If a symlink exists that points the altered path to the submodule hooks directory, and the submodule contains an executable post-checkout hook, the script may be unintentionally executed after checkout. This vulnerability is fixed in v2.43.7, v2.44.4, v2.45.4, v2.46.4, v2.47.3, v2.48.2, v2.49.1, and v2.50.1.
CVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:C/C:H/I:H/A:H
Affected products
git · git
public PoCs found68
githubgithub.com/acheong08/CVE-2025-4838452githubgithub.com/liamg/CVE-2025-4838421githubgithub.com/zr0n/CVE-2025-48384-main1githubgithub.com/zr0n/CVE-2025-48384-sub1githubgithub.com/IK-20211125/CVE-2025-483841githubgithub.com/vinieger/vinieger-CVE-2025-48384-Dockerfile1githubgithub.com/beishanxueyuan/CVE-2025-48384-test1githubgithub.com/ppd520/CVE-2025-483840githubgithub.com/NigelX/CVE-2025-483840githubgithub.com/greatyy/CVE-2025-48384-p0githubgithub.com/testdjshan/CVE-2025-483840githubgithub.com/altm4n/cve-2025-483840githubgithub.com/altm4n/cve-2025-48384-hub0githubgithub.com/p1026/CVE-2025-483840githubgithub.com/simplyfurious/CVE-2025-48384-submodule_test0githubgithub.com/Anezatraa/CVE-2025-48384-submodule0githubgithub.com/elprogramadorgt/CVE-2025-483840githubgithub.com/f1shh/CVE-2025-483840githubgithub.com/fluoworite/CVE-2025-483840githubgithub.com/fluoworite/CVE-2025-48384-sub0githubgithub.com/beishanxueyuan/CVE-2025-483840githubgithub.com/replicatorbot/CVE-2025-483840githubgithub.com/replicatorbot/CVE-2025-48384-POC0githubgithub.com/eliox01/CVE-2025-483840githubgithub.com/jacobholtz/CVE-2025-48384-poc0githubgithub.com/jacobholtz/CVE-2025-48384-submodule0githubgithub.com/butyraldehyde/CVE-2025-48384-PoC-Part20githubgithub.com/butyraldehyde/CVE-2025-48384-PoC0githubgithub.com/arun1033/CVE-2025-483840githubgithub.com/s41r4j/CVE-2025-483840githubgithub.com/s41r4j/CVE-2025-48384-submodule0githubgithub.com/vignesh21-git/CVE-2025-483840githubgithub.com/vignesh21-git/CVE-2025-48384-submodule0githubgithub.com/DayDayDayDreaming/backup-exec-cve-483840githubgithub.com/sathish46-lab/CVE-2025-48384-submodule0githubgithub.com/ECHO6789/CVE-2025-48384-submodule0githubgithub.com/Fomovet/cve-2025-483840githubgithub.com/nguyentranbaotran/cve-2025-48384-poc0githubgithub.com/admin-ping/CVE-2025-48384-RCE0githubgithub.com/fishyyh/CVE-2025-483840githubgithub.com/kallydev/cve-2025-48384-hook0githubgithub.com/fishyyh/CVE-2025-48384-POC0githubgithub.com/liamg/CVE-2025-48384-submodule0vulncheckvulncheck.com/xdb/583eeb993f62unverifiedvulncheckvulncheck.com/xdb/696491bce452unverifiedvulncheckvulncheck.com/xdb/820b0dfc1e72unverifiedvulncheckvulncheck.com/xdb/e8327a39e5a8unverifiedvulncheckvulncheck.com/xdb/c44ed6b9f03bunverifiedvulncheckvulncheck.com/xdb/4b879217fcabunverifiedvulncheckvulncheck.com/xdb/a0f8a326d3daunverifiedvulncheckvulncheck.com/xdb/5e1fdf8f7625unverifiedvulncheckvulncheck.com/xdb/4e8aef84594cunverifiedvulncheckvulncheck.com/xdb/7af8ce70961bunverifiedvulncheckvulncheck.com/xdb/7144f44519e1unverifiedvulncheckvulncheck.com/xdb/524ca30fc382unverifiedvulncheckvulncheck.com/xdb/93bba35073c8unverifiedvulncheckvulncheck.com/xdb/fe9eebc482d0unverifiedvulncheckvulncheck.com/xdb/1f087a80ac05unverifiedvulncheckvulncheck.com/xdb/3f2582c2d65bunverifiedvulncheckvulncheck.com/xdb/072dd40624a7unverifiedvulncheckvulncheck.com/xdb/23fc2dbed681unverifiedvulncheckvulncheck.com/xdb/1b8612e9755bunverifiedvulncheckvulncheck.com/xdb/83191f028f8dunverifiedvulncheckvulncheck.com/xdb/4d2d6d214e95unverifiedvulncheckvulncheck.com/xdb/d7a347c87e0cunverifiedvulncheckvulncheck.com/xdb/3a7d4c49b3c9unverifiedvulncheckvulncheck.com/xdb/e40fcc37d9a0unverifiedvulncheckvulncheck.com/xdb/85ecac734ebaunverified
⚠ Public resources, to assess the exposure of systems you control or are authorized to test. Test only with authorization.