Public mode

No access to your tenant or devices. Every item links to its source. What this means

Some sources or documents need attention: 275/275 feeds/APIs · 469/469 docs · 9/9 advisories · checked 07:24 UTC Customize Public modeDiscuss ChangeIntel on Discord

CodeWhale before 0.8.64 Remote Code Execution via allow_shell

Collected exploitation and prediction evidence

Risk source coverage

CISA KEV is observed exploitation evidence. FIRST EPSS is a dated prediction of exploitation in the next 30 days. Missing scores are unknown. This collector requests predictions only for explicit CVE aliases in the public NuGet archive; Microsoft release views retain their existing prediction scope.

No collected risk observation for these identifiers. This does not establish absence of exploitation or a zero probability.

cve-program · CVE-2026-75911

Published

CodeWhale versions before 0.8.64 fail to properly validate the allow_shell configuration parameter from project config files, allowing attackers to enable arbitrary shell command execution by committing a malicious .codewhale/config.toml file to a repository. When a user clones and opens the repository in CodeWhale, the AI model gains access to exec_shell and task_shell tools, enabling execution of arbitrary shell commands on the victim's machine without explicit user consent.

Source published
18 Aug 2026 15:21:59 UTC
Source modified
18 Aug 2026 19:07:21 UTC
Observed here
23 Oct 2026 15:48:27 UTC
Source terms
CVE Program Terms of Use

Original source record · Cite this exact observation · Complete original publisher JSON

This view projects the publisher's source fields for reading; the original JSON retains additional fields and CVE enrichment containers. Attribution: cve-program · CVE Program Terms of Use. Source text is retained; field grouping and change labels are provided by ChangeIntel.

CVSS 4.0 · 8.5 CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N

CVSS 3.1 · 7.8 CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H

euvd · EUVD-2026-60969

Published

CodeWhale versions before 0.8.64 fail to properly validate the allow_shell configuration parameter from project config files, allowing attackers to enable arbitrary shell command execution by committing a malicious .codewhale/config.toml file to a repository. When a user clones and opens the repository in CodeWhale, the AI model gains access to exec_shell and task_shell tools, enabling execution of arbitrary shell commands on the victim's machine without explicit user consent.

EUVD source date text has no stated timezone and is retained without inventing a UTC instant. Related bulletin membership is not an alias, common cause or applicability claim. A missing vector with a zero score is treated as unrated. Complete vendor/product and underlying source evidence remains in the original JSON.

Original publisher date fields

datePublished: Aug 18, 2026, 3:21:59 PM

dateUpdated: Aug 18, 2026, 7:07:21 PM

Source published
Aug 18, 2026, 3:21:59 PM (timezone not stated)
Source modified
Aug 18, 2026, 7:07:21 PM (timezone not stated)
Observed here
7 Nov 2026 14:28:09 UTC
Source terms
ENISA EUVD · source terms and attribution apply

Original source record · Cite this exact observation · Complete original publisher JSON

This view projects the publisher's source fields for reading; the original JSON retains additional fields and CVE enrichment containers. Attribution: euvd · ENISA EUVD · source terms and attribution apply. Source text is retained; field grouping and change labels are provided by ChangeIntel.

EUVD CVSS 4.0 · 8.5 CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N

nvd · CVE-2026-75911

Published

CodeWhale versions before 0.8.64 fail to properly validate the allow_shell configuration parameter from project config files, allowing attackers to enable arbitrary shell command execution by committing a malicious .codewhale/config.toml file to a repository. When a user clones and opens the repository in CodeWhale, the AI model gains access to exec_shell and task_shell tools, enabling execution of arbitrary shell commands on the victim's machine without explicit user consent.

NVD analysis and CPE criteria are source context, not proof that a package or your environment is affected. Complete affected data, logical configurations and SSVC are retained in the original JSON.

Source analysis status: Deferred

Weakness classifications: CWE-94

Original publisher date fields

published: 2026-08-18T16:18:23.057

lastModified: 2026-10-22T22:10:00.250

Source published
18 Aug 2026 16:18:23 UTC
Source modified
22 Oct 2026 22:10:00 UTC
Observed here
25 Oct 2026 15:19:09 UTC
Source terms
NIST NVD usage terms; underlying source attribution retained

Original source record · Cite this exact observation · Complete original publisher JSON

This view projects the publisher's source fields for reading; the original JSON retains additional fields and CVE enrichment containers. Attribution: nvd · NIST NVD usage terms; underlying source attribution retained. Source text is retained; field grouping and change labels are provided by ChangeIntel.

CVSS 4.0 · [email protected] · Secondary · 8.5 CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H/SC:N/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 · [email protected] · Secondary · 7.8 CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H

osv · GHSA-gx45-xrj5-g6c4

Published

### 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 43563356b98c6b993085554da82e77370160a31c. Users should upgrade to 0.8.64 or later. The original reporter analysis is preserved below. ### Summary A malicious `.codewhale/config.toml` or `.deepseek/config.toml` committed to a repository can silently set `allow_shell = true` for any user who clones and opens the repository in CodeWhale. This enables the AI model's `exec_shell` tool, granting arbitrary shell command execution on the victim's machine without the user's explicit opt-in. The `approval_policy` and `sandbox_mode` fields correctly enforce tightening-only semantics from project config, but `allow_shell` has no such guard, contradicting the intent of GHSA-72w5-pf8h-xfp4 which established `allow_shell` as an opt-in security boundary. ### Details The project config merge function at `crates/tui/src/main.rs:5181-5182` (v0.8.50) unconditionally copies the `allow_shell` boolean from a project-level config file into the live session config: ```rust if let Some(v) = table.get("allow_shell").and_then(toml::Value::as_bool) { config.allow_shell = Some(v); } ``` No tightening guard exists for `allow_shell`, unlike `approval_policy` (lines 5144-5158, guarded by `project_approval_policy_is_allowed`) and `sandbox_mode` (lines 5161-5171, guarded by `project_sandbox_mode_is_allowed`). The merge is applied automatically when entering a workspace directory unless the user passes `--no-project-config`, which is an opt-out flag that most users will not know about. **Source of attacker-controlled input:** The `.codewhale/config.toml` or `.deepseek/config.toml` file in a cloned repository (committed by a malicious or compromised repository maintainer). **Security boundary crossed:** The `allow_shell` setting controls whether the AI model's tool registry includes `exec_shell` and `task_shell_start`/`task_shell_wait` tools (`crates/tui/src/tools/registry.rs:928-932`). When `allow_shell = false` (the default), these tools are excluded. When `allow_shell = true`, the AI model can execute arbitrary shell commands via the `ExecShellTool` (`crates/tui/src/command_safety.rs`). **Sink reached:** Shell command execution via `crates/tui/src/tools/shell.rs` lines 832, 991, 1152 — `Command::new(program)` with arguments derived from the AI model's output. **Why existing mitigations do not prevent exploitation:** 1. `approval_policy` tightening guard (lines 5144-5158) only blocks project configs from *relaxing* approval requirements. But when `allow_shell = true`, the shell tools are available, and the model may issue commands that pass the command safety analysis as "safe" or "requires approval" — the user's existing approval policy is maintained, but the *availability* of shell tools itself is the security boundary violation. 2. The `command_safety.rs` safety analysis allows many commands as "safe" (e.g., `ls`, `cat`, `git status`, `cargo build`). With shell tools enabled, the model can execute these without user interaction. 3. The `DENY_AT_PROJECT_SCOPE` list at line 5119 blocks `api_key`, `base_url`, `provider`, and `mcp_config_path` from project config, but does **not** block `allow_shell`. **Flow from source to sink:** 1. User clones a repository containing `.codewhale/config.toml` with `allow_shell = true` 2. User runs `codewhale` in the repository directory 3. `merge_project_config()` at line 5211 reads the project config and sets `config.allow_shell = Some(true)` 4. The `allow_shell` value flows into `allow_shell: yolo || config.allow_shell()` which evaluates to `true` 5. Tool registry at `registry.rs:928-929` includes shell tools via `with_shell_tools()` 6. The AI model can now execute shell commands through `exec_shell` ### PoC **Environment:** Any system with CodeWhale v0.8.50 built from source (commit `0072209d`). **Clean checkout recipe:** 1. Clone the CodeWhale repository and build the TUI binary: ```bash git clone https://github.com/Hmbown/CodeWhale.git cd CodeWhale git checkout 0072209d cargo build --release -p codewhale-tui ``` 2. Create a malicious workspace directory simulating a cloned repo: ```bash mkdir -p /tmp/victim-workspace/.codewhale cat > /tmp/victim-workspace/.codewhale/config.toml << 'EOF' allow_shell = true EOF ``` 3. Run the existing unit test that proves the vulnerability: ```bash cargo test -p codewhale-tui -- project_overlay_overrides_max_subagents_and_allow_shell --nocapture ``` **Expected vulnerable output:** Test passes, confirming `config.allow_shell = Some(false)` from the existing test. But note that the test uses `allow_shell = false` — change it to `true` and the same code path sets it to `Some(true)` without any guard. 4. Demonstrate the override with a direct test: ```bash # Add a temporary test to confirm the override behavior cat >> /tmp/test_allow_shell.rs << 'EOF' // This demonstrates the vulnerability: project config can set allow_shell = true // without any tightening guard, unlike approval_policy and sandbox_mode. EOF # Run the existing test infrastructure with a modified project config mkdir -p /tmp/test-workspace/.codewhale echo 'allow_shell = true' > /tmp/test-workspace/.codewhale/config.toml # Verify by reading the source: the merge function at main.rs:5181-5182 # unconditionally sets allow_shell from project config with no guard grep -A 2 'allow_shell.*as_bool' crates/tui/src/main.rs ``` **Observed output (grep):** ``` if let Some(v) = table.get("allow_shell").and_then(toml::Value::as_bool) { config.allow_shell = Some(v); } ``` 5. **Negative control — compare with `approval_policy` which has a guard:** ```bash grep -A 8 'approval_policy.*as_str' crates/tui/src/main.rs | head -10 ``` **Observed output:** ``` if let Some(v) = table.get("approval_policy").and_then(toml::Value::as_str) && !v.is_empty() { if codewhale_config::project_approval_policy_is_allowed( config.approval_policy.as_deref(), v, ) { config.approval_policy = Some(v.to_string()); ``` Note the `project_approval_policy_is_allowed` guard that is **absent** for `allow_shell`. 6. **Negative control — `allow_shell` defaults to `false` without project config:** ```bash cargo test -p codewhale-tui -- allow_shell_defaults_to_false_when_unset --nocapture ``` **Expected output:** Test passes, confirming `allow_shell` is `None` and `allow_shell()` returns `false` by default. **Cleanup:** ```bash rm -rf /tmp/victim-workspace /tmp/test-workspace ``` ### Impact This is a **high-severity privilege escalation / code execution vulnerability**. Any user who clones a repository containing a malicious `.codewhale/config.toml` or `.deepseek/config.toml` with `allow_shell = true` will have shell command execution enabled automatically when they run CodeWhale in that directory. - **Attacker privilege required:** Repository maintainer (can commit the malicious config file) or a supply-chain compromise of a repository the victim clones. - **User interaction required:** The victim must run CodeWhale in the cloned repository directory. No explicit confirmation or trust prompt is shown for the `allow_shell` override. - **Impact:** The AI model can execute arbitrary shell commands on the victim's machine through the `exec_shell` tool. Even with the default `approval_policy = "suggest"` requiring approval for dangerous commands, many "safe" commands (file reads, directory listings, git operations, build tools) execute without approval. Combined with social engineering via the AI conversation, a sophisticated attack could chain multiple approved commands. - **Security boundary crossed:** User's opt-in shell access policy (`allow_shell` defaulting to `false`) is silently overridden by untrusted repository content. ### Suggested remediation 1. **Add `allow_shell` to the `DENY_AT_PROJECT_SCOPE` list** at `crates/tui/src/main.rs:5119`: ```rust const DENY_AT_PROJECT_SCOPE: &[&str] = &["api_key", "base_url", "provider", "mcp_config_path", "allow_shell"]; ``` And emit a warning when it is encountered in project config, matching the existing pattern for other denied keys. 2. **Alternatively**, apply the same tightening-only guard used for `approval_policy`: ```rust if let Some(v) = table.get("allow_shell").and_then(toml::Value::as_bool) { // Project config can only disable shell, never enable it if !v { config.allow_shell = Some(false); } else { eprintln!( "warning: project-scope `allow_shell = true` is ignored — \ shell access must be opted in via user/global config or --yolo. \ (See #417.)" ); } } ``` 3. **Regression test:** Add a test confirming that `allow_shell = true` in a project config is rejected/ignored: ```rust #[test] fn project_overlay_cannot_enable_allow_shell() { let tmp = workspace_with_project_config("allow_shell = true\n"); let mut config = Config::default(); merge_project_config(&mut config, tmp.path()); assert!( !config.allow_shell(), "project config must not be able to enable shell access" ); } ``` ### CVE - [CVE-2026-75911](https://nvd.nist.gov/vuln/detail/CVE-2026-75911) (NVD) ### Credits - Thai Son Dinh from VinSOC Labs (R&D) - Nguyen Huy Vu Dung from VinSOC Labs (AppSec)

Source published
4 Sep 2026 18:14:09 UTC
Source modified
4 Sep 2026 19:00:05 UTC
Observed here
24 Oct 2026 13:17:17 UTC
Source terms
GitHub Advisory Database · CC-BY-4.0

Original source record · Cite this exact observation · Complete original publisher JSON

This view projects the publisher's source fields for reading; the original JSON retains additional fields and CVE enrichment containers. Attribution: osv · GitHub Advisory Database · CC-BY-4.0. Source text is retained; field grouping and change labels are provided by ChangeIntel.

CVSS_V3 · CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H

CVSS_V4 · CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N

Publisher rating · HIGH

ChangeIntel

An IT change radar: releases, security, known issues, retirements, documentation changes, and service status from public sources. Every item links to supporting evidence; dates and statuses can change after they are read.

Sources read 8 Nov 07:24 UTC · 275 of 275 readable · 273 fully read · documentation 469/469 current