Описание
In Soft Serve, an authenticated repo import can clone server-local private repositories
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:
- Start Soft Serve.
- As an admin, create a private repo:
- Create a second low-privilege user:
- Seed the private repo with secret content:
- Confirm the low-privilege user cannot access the private repo directly:
Expected result:
- As the low-privilege user, import the server-local bare repo path into a new repo:
- Clone the attacker-controlled imported repo and read the secret:
Expected result:
Notes:
- The
--lfs-endpointvalue 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
Пакеты
github.com/charmbracelet/soft-serve
>= 0.6.0, < 0.11.6
0.11.6
Связанные уязвимости
Soft Serve is a self-hostable Git server for the command line. From version 0.6.0 to before version 0.11.6, 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 issue has been patched in version 0.11.6.