CVE-2026-75912
CodeWhale before 0.8.64 Argument Injection via git_blame
CodeWhale versions before 0.8.64 contain an argument injection vulnerability in the git_blame tool that allows attackers to read arbitrary files by injecting git options into the unvalidated rev parameter. Attackers can supply rev values like --contents=/path/to/file to exfiltrate sensitive files such as SSH keys and credentials through the tool output returned to the model.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- Passive
What an attacker can affect
- Confidentiality
- High
- Integrity
- None
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
8.3
CodeWhale before 0.8.64 Argument Injection via git_blame
CodeWhale versions before 0.8.64 contain an argument injection vulnerability in the git_blame tool that allows attackers to read arbitrary files by injecting git options into the unvalidated rev parameter. Attackers can supply rev values like --contents=/path/to/file to exfiltrate sensitive files such as SSH keys and credentials through the tool output returned to the model.
- Record
CVE-2026-75912- CVSS 4.0
- 8.3 High
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:N/VA:N/SC:H/SI:N/SA:N - CVSS 3.1
- 7.4 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:N/A:N - Weakness
- CWE-88
- Updated
- 2026-11-02
EUVDEUVD-2026-60970
8.3
CodeWhale versions before 0.8.64 contain an argument injection vulnerability in the git_blame tool that allows attackers to read arbitrary files by injecting git options into the unvalidated rev parameter. Attackers can supply rev values like --contents=/path/to/file to exfiltrate sensitive files such as SSH keys and credentials through the tool output returned to the model.
- Record
EUVD-2026-60970- CVSS 4.0
- 8.3 High
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:N/VA:N/SC:H/SI:N/SA:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-c6mw-8xh8-gpq6
8.3
CodeWhale: Argument Injection in `git_blame` Tool Allows Arbitrary File Read Without Approval
Maintainer resolution
The CodeWhale maintainers validated this report. The affected package ranges are recorded in the advisory metadata. Version 0.8.64 contains the fix in commit 9a34b5034d29f05d1f28fa61b04719ca6a741020. Users should upgrade to 0.8.64 or later. The original reporter analysis is preserved below.
Argument Injection in git_blame Tool Allows Arbitrary File Read Without Approval
Overview
The git_blame tool in DeepSeek-TUI passes the model-supplied rev parameter unvalidated into the argv of git blame. git blame accepts --contents=<file>, which causes it to use the file's contents in place of the working tree and echo each line verbatim in the blame output. A rev value of --contents=/path/to/secret therefore exfiltrates the targeted file's contents into the tool result, which is returned to the model and displayed in the chat transcript.
The tool is registered with ApprovalRequirement::Auto and declares ToolCapability::ReadOnly. The read is in-scope for the capability label, but the target of the read is not the user expects git_blame to read files inside the workspace, not arbitrary paths on the host.
This is a sibling of the git_show argument-injection vulnerability filed separately, sharing the same root cause (missing --end-of-options sentinel and unvalidated rev).
Impact
Arbitrary file read at the privilege of the user running DeepSeek-TUI, via malicious repository content combined with prompt injection (the threat model already documented in CVE-2026-45311).
Reachable as the invoking user:
~/.ssh/id_rsa,~/.ssh/id_ed25519, and other private keys~/.aws/credentials,~/.config/gh/hosts.yml,~/.netrc.envfiles anywhere in the filesystem- Any project file outside the workspace the tool would normally restrict to
The leaked contents land in the model's context. The same model that obeyed the prompt-injection in step one can be instructed to forward the leak via fetch_url (network-policy permitting), summarize it in chat, or write it into a tool output the attacker can later retrieve.
Technical Details
Root Cause
crates/tui/src/tools/git_history.rs:
// L314-316
fn approval_requirement(&self) -> ApprovalRequirement {
ApprovalRequirement::Auto
}
// L322-358 (excerpt)
async fn execute(&self, input: Value, context: &ToolContext) -> Result<ToolResult, ToolError> {
let path_str = required_str(&input, "path")?;
let resolved_path = context.resolve_path(path_str)?; // path is bounded to workspace
...
let rev = optional_str(&input, "rev").unwrap_or("HEAD"); // rev is NOT bounded
...
let mut args = vec![
"blame".to_string(),
"--date=iso".to_string(),
format!("-L{start_line},{end_line}"),
];
if porcelain { args.push("--line-porcelain".to_string()); }
args.push(rev.to_string()); // unvalidated, no sentinel
args.push("--".to_string());
args.push(pathspec.display().to_string());
...
}
path correctly flows through context.resolve_path, which enforces workspace containment (spec.rs:342). rev does not and the -- separator after rev only ends pathspec parsing, it does not stop option parsing of rev itself.
The JSON schema for rev (L283-285) is {"type": "string"} with no constraints.
Why --contents Works
git blame --contents=<file> -- <pathspec> blames the working tree path as if its contents were the supplied file. Each line of the supplied file appears verbatim in the porcelain or human-readable output, prefixed with the attribution marker 00000000 (External file (--contents) <date> N). The full line content is preserved.
Two secondary primitives in the same parser also leak data, with smaller yield:
--ignore-revs-file=<file>: surfaces parse errors that disclose partial content when the file is not a valid revs list.-S <file>,--reverse <rev1>..<rev2>: not directly exploitable for read but expand…
- Record
GHSA-c6mw-8xh8-gpq6- CVSS 4.0
- 8.3 High
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:N/VA:N/SC:H/SI:N/SA:N - CVSS 3.1
- 7.4 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:N/A:N - Weakness
- CWE-88, CWE-200
- Updated
- 2026-11-02
NVD
8.3
CodeWhale versions before 0.8.64 contain an argument injection vulnerability in the git_blame tool that allows attackers to read arbitrary files by injecting git options into the unvalidated rev parameter. Attackers can supply rev values like --contents=/path/to/file to exfiltrate sensitive files such as SSH keys and credentials through the tool output returned to the model.
- Record
CVE-2026-75912- CVSS 4.0
- 8.3 High
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:N/VA:N/SC:H/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - CVSS 3.1
- 7.4 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:N/A:N - Weakness
- CWE-88
- Updated
- 2026-11-02
OSV
8.3
CodeWhale before 0.8.64 Argument Injection via git_blame
CodeWhale versions before 0.8.64 contain an argument injection vulnerability in the git_blame tool that allows attackers to read arbitrary files by injecting git options into the unvalidated rev parameter. Attackers can supply rev values like --contents=/path/to/file to exfiltrate sensitive files such as SSH keys and credentials through the tool output returned to the model.
- Record
CVE-2026-75912- CVSS 4.0
- 8.3 High
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:N/VA:N/SC:H/SI:N/SA:N - Weakness
- CWE-88
- Updated
- 2026-11-02
OSVGHSA-c6mw-8xh8-gpq6
8.3
CodeWhale: Argument Injection in `git_blame` Tool Allows Arbitrary File Read Without Approval
Maintainer resolution
The CodeWhale maintainers validated this report. The affected package ranges are recorded in the advisory metadata. Version 0.8.64 contains the fix in commit 9a34b5034d29f05d1f28fa61b04719ca6a741020. Users should upgrade to 0.8.64 or later. The original reporter analysis is preserved below.
Argument Injection in git_blame Tool Allows Arbitrary File Read Without Approval
Overview
The git_blame tool in DeepSeek-TUI passes the model-supplied rev parameter unvalidated into the argv of git blame. git blame accepts --contents=<file>, which causes it to use the file's contents in place of the working tree and echo each line verbatim in the blame output. A rev value of --contents=/path/to/secret therefore exfiltrates the targeted file's contents into the tool result, which is returned to the model and displayed in the chat transcript.
The tool is registered with ApprovalRequirement::Auto and declares ToolCapability::ReadOnly. The read is in-scope for the capability label, but the target of the read is not the user expects git_blame to read files inside the workspace, not arbitrary paths on the host.
This is a sibling of the git_show argument-injection vulnerability filed separately, sharing the same root cause (missing --end-of-options sentinel and unvalidated rev).
Impact
Arbitrary file read at the privilege of the user running DeepSeek-TUI, via malicious repository content combined with prompt injection (the threat model already documented in CVE-2026-45311).
Reachable as the invoking user:
~/.ssh/id_rsa,~/.ssh/id_ed25519, and other private keys~/.aws/credentials,~/.config/gh/hosts.yml,~/.netrc.envfiles anywhere in the filesystem- Any project file outside the workspace the tool would normally restrict to
The leaked contents land in the model's context. The same model that obeyed the prompt-injection in step one can be instructed to forward the leak via fetch_url (network-policy permitting), summarize it in chat, or write it into a tool output the attacker can later retrieve.
Technical Details
Root Cause
crates/tui/src/tools/git_history.rs:
// L314-316
fn approval_requirement(&self) -> ApprovalRequirement {
ApprovalRequirement::Auto
}
// L322-358 (excerpt)
async fn execute(&self, input: Value, context: &ToolContext) -> Result<ToolResult, ToolError> {
let path_str = required_str(&input, "path")?;
let resolved_path = context.resolve_path(path_str)?; // path is bounded to workspace
...
let rev = optional_str(&input, "rev").unwrap_or("HEAD"); // rev is NOT bounded
...
let mut args = vec![
"blame".to_string(),
"--date=iso".to_string(),
format!("-L{start_line},{end_line}"),
];
if porcelain { args.push("--line-porcelain".to_string()); }
args.push(rev.to_string()); // unvalidated, no sentinel
args.push("--".to_string());
args.push(pathspec.display().to_string());
...
}
path correctly flows through context.resolve_path, which enforces workspace containment (spec.rs:342). rev does not and the -- separator after rev only ends pathspec parsing, it does not stop option parsing of rev itself.
The JSON schema for rev (L283-285) is {"type": "string"} with no constraints.
Why --contents Works
git blame --contents=<file> -- <pathspec> blames the working tree path as if its contents were the supplied file. Each line of the supplied file appears verbatim in the porcelain or human-readable output, prefixed with the attribution marker 00000000 (External file (--contents) <date> N). The full line content is preserved.
Two secondary primitives in the same parser also leak data, with smaller yield:
--ignore-revs-file=<file>: surfaces parse errors that disclose partial content when the file is not a valid revs list.-S <file>,--reverse <rev1>..<rev2>: not directly exploitable for read but expand…
- Record
GHSA-c6mw-8xh8-gpq6- CVSS 4.0
- 8.3 High
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:N/VA:N/SC:H/SI:N/SA:N - CVSS 3.1
- 7.4 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:N/A:N - Weakness
- CWE-200, CWE-88
- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
deepseek-tuicrates.io |
0.3.27 to 0.8.41 | None known |
deepseek-tuinpm |
0.3.27 up to 0.8.41 | 0.8.41 |
codewhale-tuicrates.io |
0.8.41 up to 0.8.64 | 0.8.64 |
codewhalenpm |
0.8.41 up to 0.8.64 | 0.8.64 |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-75912 is a high vulnerability (CVSS 8.3) in Hmbown Codewhale, published August 18, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.45%, the 39th percentile. Fixed in deepseek-tui 0.8.41.
References
github.com/Hmbown/CodeWhale/security/advisories/GHSA-c6mw-8xh8-gpq6
github.com/Hmbown/CodeWhale/commit/9a34b5034d29f05d1f28fa61b04719ca6a741020
vulncheck.com/advisories/codewhale-before-argument-injection-via-git-blame
nvd.nist.gov/vuln/detail/CVE-2026-75912
github.com/advisories/GHSA-c6mw-8xh8-gpq6
github.com/CVEProject/cvelistV5/tree/main/cves/2026/75xxx/CVE-2026-75912.json
github.com/Hmbown/CodeWhale
Left out here: the rest of 2 source descriptions. The JSON record has them.